I’m hoping to be able to retrigger a sustained envelope as its being sustained. I couldn’t find a method for it.
I was able to figure out how to do it using two envelopes, while fading between them:
(
SynthDef(\retrigEnv, { |out|
var sig, env1, env2, toggleEnv, hold1, hold2, env, hold, trig, flux;
//// parameter controls
///////////////////////
var att = \att.kr(0.01),
dec = \dec.kr(0.3),
sus = \sus.kr(0.5),
rel = \rel.kr(1),
crv = \crv.kr(-2),
del = \del.kr(0),
timeScale = \timeScale.kr(1),
offset = \offset.kr(0),
peak = \peak.kr(1);
//// inputs
///////////
hold = \hold.kr(1);
trig = \trig.tr;
toggleEnv = ToggleFF.kr(trig);
hold1 = hold.min(ToggleFF.kr(trig + Impulse.kr(0))); // start high
hold2 = hold.min(toggleEnv);
//// signal generation
//////////////////////
env = Env.adsr(att, dec, sus, rel, 1, crv);
env2 = env.kr(0, hold2, timeScale, peak, offset);
env1 = env.kr(0, hold1, timeScale, peak, offset);
sig = LinXFade2.kr(env1, env2, toggleEnv.lag2(0.015) * 2 - 1);
//// output
///////////
Out.kr(out, sig)
}).add
)
z = Bus.control;
a = { SinOsc.ar ! 2 * \amp.kr }.play(args: [amp: z.asMap])
b = Synth(\retrigEnv, [att: 0.5, dec: 0.5, sus: 0.7, peak: 0.1, out: z])
b.set(\trig, 1)
b.set(\trig, 1)
b.set(\trig, 1)
b.set(\trig, 1)
b.set(\hold, 0) // gate - release control
b.set(\hold, 1) // gate - release control
z.free
But I’m wondering if there’s a better way?