## Cottle Chapter 11 - Time Variant Control Sources, Offset and Scaling with Mul and Add

[Cottle examples]

## 11. Time Variant Control Sources, Offset and Scaling with Mul and Add

```//11.1 add and mul; offset and scale

// No plot examples!
// see the text for the examples and plots

//11.2 confusing; mul: 300, add: 100, range: 200 to 400

//11.3 less confusing?

// here I am correcting an error in Cottle's code.
// It is not necessary to do (h - l) / 2 + l
// (h - l) / 2 + l = (h - l + (2*l)) / 2 = (h + l) / 2
// Fewer operators, faster operation.

//var low, high;
//low = 200;
//high = 400;
//{SinOsc.ar(mul: (high - low)/2, add: (high + low)/2 )}.scope;

// If you do it this way, bear in mind that if high and low are constants as here,
// the arithmetic will be done when the synthdef is compiled, resulting in the bare
// minimum number of UGens. If they're synth arguments or other UGens,
// each math operation will result in a BinaryOpUGen, which takes server time
// to calculate. BinaryOpUGens are pretty fast but not cost-free. This is why
// for static values, it's better to calculate them on the client side and pass them
// already calculated into synth args.

// 11.4 SinOsc as vibrato

// Cottle says to use audio rate for the SinOsc as frequency control, but
// this wastes processor cycles.
// LFO's can almost always be .kr (control rate), so I change it here.

SinOsc.kr(freq: 5, mul: 5, add: 440)

//11.5 vibrato

s = Server.internal.boot;

(
{	var vibrato;
vibrato = SinOsc.kr(freq: 5, mul: 5, add: 440);
SinOsc.ar(vibrato, mul: 0.5)
}.scope;
)

//11.6 Line.kr

//Vibrato
(
{
var vibrato;
vibrato = 	SinOsc.kr(freq: 5, 	mul: Line.kr(0, 5, 3), add: 440);
SinOsc.ar(
vibrato,
mul: 0.5)
}.scope
)
```