407 lines
6.8 KiB
Text
407 lines
6.8 KiB
Text
class:: DemandEnvGen
|
|
summary:: Demand rate envelope generator
|
|
related:: Classes/Demand, Classes/Duty, Classes/TDuty
|
|
categories:: UGens>Demand, UGens>Envelopes
|
|
|
|
Description::
|
|
Plays back break point envelope contours (levels, times, shapes) given by demand ugens. The next values are called when the next node is reached.
|
|
|
|
classmethods::
|
|
private:: categories
|
|
|
|
method::ar, kr
|
|
|
|
argument::level
|
|
|
|
A demand UGen or any other UGen returning level values. If this ends, the
|
|
|
|
code::doneAction:: is evaluated.
|
|
|
|
|
|
argument::dur
|
|
|
|
A demand UGen or any other UGen returning time values. If this ends, the
|
|
|
|
code::doneAction:: is evaluated.
|
|
|
|
|
|
argument::shape
|
|
|
|
A demand UGen or any other UGen: the number given is the shape
|
|
number according to link::Classes/Env::.
|
|
|
|
|
|
argument::curve
|
|
|
|
A demand UGen or any other UGen returning curve values. if shape is 5, this is the
|
|
curve factor.
|
|
|
|
The possible values are:
|
|
table::
|
|
## 0 || flat segments
|
|
## 1 || linear segments, the default
|
|
## 2 || natural exponential growth and decay. In this case, the levels must all be nonzero and the have the same sign.
|
|
## 3 || sinusoidal S shaped segments.
|
|
## 4 || sinusoidal segments shaped like the sides of a Welch window.
|
|
## a Float || a curvature value for all segments.
|
|
## An Array of Floats || curvature values for each segments.
|
|
::
|
|
|
|
argument::gate
|
|
|
|
If gate is x ≥ 1, the UGen runs.
|
|
|
|
|
|
If gate is 0 > x > 1, the UGen is released at the next
|
|
level (doneAction).
|
|
|
|
|
|
If gate is x < 0, the UGen is sampled and held.
|
|
|
|
|
|
argument::reset
|
|
|
|
If reset crosses from non-positive to positive, the UGen is reset
|
|
at the next level. If it is > 1, it is reset immediately.
|
|
|
|
|
|
argument::levelScale
|
|
|
|
demand ugen returning level scaling values
|
|
|
|
|
|
argument::levelBias
|
|
|
|
demand ugen returning level offset values
|
|
|
|
|
|
argument::timeScale
|
|
|
|
demand ugen returning time scaling values
|
|
|
|
|
|
argument::doneAction
|
|
|
|
A doneAction that is evaluated when level or duration stream
|
|
ends. See link::Classes/Done:: for more detail.
|
|
|
|
|
|
Examples::
|
|
|
|
code::
|
|
// frequency envelope with random times
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.ar(
|
|
Dseq([204, 400, 201, 502, 300, 200], inf),
|
|
Drand([1.01, 0.2, 0.1, 2], inf) * MouseY.kr(0.01, 3, 1),
|
|
7 // cubic interpolation
|
|
);
|
|
SinOsc.ar(freq * [1, 1.01]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
// frequency modulation
|
|
(
|
|
{
|
|
var freq, list;
|
|
list = { exprand(200, 1000.0) } ! 32;
|
|
freq = DemandEnvGen.ar(
|
|
{ Dseq(list.scramble, inf) } ! 2,
|
|
SampleDur.ir * MouseY.kr(1, 3000, 1),
|
|
5, // curve interpoaltion
|
|
MouseX.kr(-0.01, -4) // curve must be negative for fast interpol.
|
|
);
|
|
SinOsc.ar(freq) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
|
|
// gate
|
|
// mouse x on right side of screen toggles gate
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dwhite(300, 1000, inf).round(100),
|
|
0.1,
|
|
5, 0.3, // curve: 0.3
|
|
MouseX.kr > 0.5,
|
|
1
|
|
);
|
|
SinOsc.ar(freq * [1, 1.21]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
// sample and hold (0.5 > gate > 0)
|
|
// mouse x on right side of screen toggles gate
|
|
// mouse y scales frequency
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dwhite(300, 1000, inf).round(100),
|
|
0.1,
|
|
5, 0.3,
|
|
MouseX.kr > 0.5 + 0.1
|
|
);
|
|
SinOsc.ar(freq * [1, 1.21]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
// gate
|
|
// mouse x on right side of screen toggles gate
|
|
// mouse button does soft reset
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dseq([Dseries(400, 200, 5), 500, 800, 530, 4000, 900], 2),
|
|
Dseq([0.2, 0.1, 0.2, 0.3, 0.1], inf),
|
|
Dseq([1, 0, 0, 6, 1, 1, 0, 2], inf), // shapes
|
|
0,
|
|
MouseX.kr > 0.5, // gate
|
|
MouseButton.kr > 0.5, // reset
|
|
doneAction: Done.none
|
|
);
|
|
SinOsc.ar(freq * [1, 1.001]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
|
|
// gate
|
|
// mouse x on right side of screen toggles sample and hold
|
|
// mouse button does hard reset
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dseq([Dseries(400, 200, 5), 500, 800, 530, 4000, 900], 2),
|
|
0.1,
|
|
3, 0,
|
|
MouseX.kr > 0.5 - 0.1, // gate: sample and hold
|
|
MouseButton.kr > 0.5 * 2, // hard reset
|
|
doneAction: Done.none
|
|
);
|
|
SinOsc.ar(freq * [1, 1.001]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// short sequence with doneAction, linear
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dseq([1300, 500, 800, 300, 400], 1),
|
|
0.2,
|
|
1,
|
|
doneAction: Done.freeSelf
|
|
);
|
|
SinOsc.ar(freq * [1, 1.01]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
// short sequence with doneAction, step
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dseq([1300, 500, 800, 300, 400], 1),
|
|
0.2,
|
|
0,
|
|
doneAction: Done.freeSelf
|
|
);
|
|
SinOsc.ar(freq * [1, 1.01]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
|
|
|
|
// a linear ramp
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dseq([300, 800], 1),
|
|
1,
|
|
1
|
|
);
|
|
SinOsc.ar(freq * [1, 1.01]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
|
|
|
|
// random gate: release. gate low level > 0.
|
|
// only end points are kept as release levels
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dseq([500, 800], inf),
|
|
0.03,
|
|
1,0, // linear
|
|
ToggleFF.kr(Dust.kr(5)) + 0.1 // gate
|
|
|
|
|
|
);
|
|
SinOsc.ar(freq * [1, 1.01]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
// random gate: sample and hold. gate low level = 0.
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
Dseq([500, 800, 600], inf),
|
|
0.03,
|
|
1,0, // linear
|
|
ToggleFF.kr(Dust.kr(5)), // gate
|
|
0 // reset
|
|
|
|
);
|
|
SinOsc.ar(freq * [1, 1.01]) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
|
|
|
|
|
|
|
|
// lfnoise1
|
|
(
|
|
{
|
|
DemandEnvGen.ar(
|
|
Dwhite(-0.1, 0.1, inf),
|
|
SampleDur.ir * MouseY.kr(0.5, 20),
|
|
5,
|
|
-4
|
|
);
|
|
|
|
|
|
}.play;
|
|
)
|
|
|
|
// lfbrownnoise
|
|
(
|
|
{
|
|
DemandEnvGen.ar(
|
|
Dbrown(-0.1, 0.1, 0.1, inf),
|
|
SampleDur.ir * MouseY.kr(1, 100, 1)
|
|
);
|
|
|
|
|
|
}.play;
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// hardsyncing a saw
|
|
(
|
|
{
|
|
|
|
DemandEnvGen.ar(
|
|
Dseq([Dseries(-0.1, 0.01, 20)], inf),
|
|
SampleDur.ir * MouseY.kr(1, 100, 1),
|
|
1, 0,
|
|
K2A.ar(1),
|
|
Impulse.ar(MouseX.kr(1, SampleRate.ir * MouseX.kr(0.002, 1, 1), 1), 0, 1.5)
|
|
|
|
)
|
|
|
|
|
|
}.scope;
|
|
)
|
|
|
|
|
|
// softsyncing a saw
|
|
(
|
|
{
|
|
|
|
DemandEnvGen.ar(
|
|
Dseq([Dseries(-0.1, 0.01, 20)], inf),
|
|
SampleDur.ir * MouseY.kr(1, 100, 1),
|
|
1, 0,
|
|
K2A.ar(1),
|
|
Impulse.ar(MouseX.kr(1, SampleRate.ir * MouseX.kr(0.002, 1, 1), 1)) + [0, 0.3]
|
|
|
|
)
|
|
|
|
|
|
}.scope;
|
|
)
|
|
|
|
|
|
|
|
// hardsyncing a saw, some random elements
|
|
(
|
|
{
|
|
|
|
DemandEnvGen.ar(
|
|
Dseq([Dseries(-0.1, 0.01, 20), Dseries(-0.1, 0.01, 20), Dwhite(-0.1, 0.1, 5)], inf),
|
|
SampleDur.ir * MouseY.kr(1, 100, 1),
|
|
3, 0,
|
|
1,
|
|
Impulse.ar(MouseX.kr(1, SampleRate.ir * MouseX.kr(0.002, 1, 1), 1), 0, 1.5)
|
|
|
|
)
|
|
|
|
|
|
}.scope;
|
|
)
|
|
|
|
// softsyncing a saw, some random elements
|
|
(
|
|
{
|
|
|
|
DemandEnvGen.ar(
|
|
Dseq([Dseries(-0.1, 0.01, 20), Dseries(-0.1, 0.01, 20), Dwhite(-0.1, 0.1, 5)], inf),
|
|
SampleDur.ir * MouseY.kr(1, 100, 1),
|
|
1, 0, // linear interpolation
|
|
1,
|
|
Impulse.ar(MouseX.kr(1, SampleRate.ir * MouseX.kr(0.002, 1, 1), 1))
|
|
|
|
)
|
|
|
|
|
|
}.scope;
|
|
)
|
|
|
|
|
|
// multichannel expansion
|
|
// mouse x on right side of screen toggles gate
|
|
// mouse y controls speed
|
|
|
|
(
|
|
{
|
|
var freq;
|
|
freq = DemandEnvGen.kr(
|
|
{ Dseq([300, 800, Drand([1000, 460, 300], 1), 400], inf) + 3.0.rand } ! 2,
|
|
MouseY.kr(0.001, 2, 1),
|
|
5, -4,
|
|
MouseX.kr > 0.5
|
|
);
|
|
SinOsc.ar(freq) * 0.1
|
|
|
|
}.play;
|
|
)
|
|
::
|