Env {
// envelope specification for an EnvGen,
Env is not a UGen itself
// you must not change an envelope while
an EnvGen is running.
// Therefore these inst vars are read
only.
var <levels;
var <times;
var <curves = 'linear'; //
can also be 'exponential', 'sine', a float curve value,
//
or an array of curve values
var <releaseNode; // index of release level, if nil then ignore
release;
var <loopNode; // index of loop start level, if nil then does
not loop;
*new { arg levels=#[0,1,0], times=#[1,1],
curve='linear', releaseNode, loopNode;
^super.new.init(levels, times, curve, releaseNode, loopNode)
}
init { arg argLevelsArray, argTimesArray,
argCurvesArray, argReleaseNode, argLoopNode;
levels = argLevelsArray;
times = argTimesArray;
curves = argCurvesArray;
releaseNode = argReleaseNode;
loopNode = argLoopNode;
}
// methods to make some typical shapes
:
// fixed duration envelopes
*linen { arg attack=1.0, sustain=2.0,
release=1.0, level=1.0, curve='linear';
// trapezoid
^this.new(
[0, level, level, 0],
[attack, sustain, release],
curve
)
}
*triangle { arg dur=1.0, level=1.0;
dur = dur * 0.5;
^this.new(
[0, level, 0],
[dur, dur]
)
}
*sine { arg dur=1.0, level=1.0;
dur = dur * 0.5;
^this.new(
[0, level, 0],
[dur, dur],
'sine'
)
}
*perc { arg attack=0.01, release=1.0,
level=1.0, curve = -4.0;
^this.new(
[0, level, 0],
[attack, release],
curve
)
}
// envelopes with sustain
*adsr { arg attack=0.01, decay=0.3,
sustain=0.5, release=1.0,
level=1.0, curve = -4.0;
^this.new(
[0, level, level * sustain, 0],
[attack, decay, release],
curve,
2
)
}
*asr { arg attack=0.01, sustain=1.0,
release=1.0, level=1.0, curve = -4.0;
^this.new(
[0, level * sustain, 0],
[attack, release],
curve,
1
)
}
// blend two envelopes
blend { arg argAnotherEnv, argBlendFrac=0.5;
^this.class.new(
levels.blend(argAnotherEnv.levels, argBlendFrac),
times.blend(argAnotherEnv.times, argBlendFrac),
curves.blend(argAnotherEnv.curves, argBlendFrac),
releaseNode,
loopNode
)
}
plot {
var timeScale;
timeScale = 0.01 / times.sum;
Synth.plot({ arg synth;
synth.releaseTime = 0.005;
EnvGen.ar(this, 1, 0, 1, 0, timeScale)
}, 0.01)
}
test { arg releaseTime = 3.0;
Synth.play({ arg synth;
synth.releaseTime = releaseTime;
EnvGen.ar(this, FSinOsc.ar(800,
0.3))
})
}
}
Cutoff {
// applies a cutoff envelope to a continuous
sound
*ar { arg in, sustain = 1.0,
decay = 0.01, curve = 'linear';
var env;
env = Env.new(#[1.0, 1.0,
0.0], [sustain, decay], curve);
^in * EnvGen.ar(env);
}
}
This page was created by SimpleText2Html 1.0.3 on 22-Feb-100.