Okay my approach was wrong here. Much better to use VarLag
when you want to continually change the same synth instance.
1
Synth def should have something like this… note the control names are important for the next few steps.
SynthDef(\glisser, {
var laggedCtl = {|name, def=0|
VarLag.kr(
in: NamedControl.kr(name, def),
time: NamedControl.kr(name ++ 'Lag', 1),
curvature: NamedControl.kr(name ++ 'Curve', 0),
start: def
)
};
var freq = laggedCtl.(\freq, 220);
var snd = SinOsc.ar(freq) * 0.1;
var env = Env.adsr(2).kr(doneAction:2, gate: \gate.kr(1));
Out.ar(0, snd!2 * env);
}).add;
2
Task owns the synths and frees them at the end. It looks through the \laggedArgs
keys to find which keys in should be setting - they must all have a min, max, lag and curve suffix defined.
Tdef(\player, {
|envir|
var ownedSynths = 10.collect{ Synth(\glisser) };
var getE = { |name, postfix| envir[(name ++ postfix).asSymbol] };
var setFromEnvir = { |name| [
(name).asSymbol, exprand(getE.(name, 'Min'), getE.(name, 'Max')),
(name ++ 'Lag').asSymbol, getE.(name, 'Lag'),
(name ++ 'Curve').asSymbol, getE.(name, 'Curve')
]};
s.sync;
while {envir[\shouldLoop]}
{
ownedSynths.do{|synth|
envir[\laggedArgs].do{ |argname|
synth.set( *setFromEnvir.(argname).postln )
};
(envir.waitTime ? 0.1).wait
};
};
ownedSynths.do(_.set(\gate,0))
});
3
Set up Tdef
( // make sure all this is set before you play the tdef
Tdef(\player).set(\laggedArgs, [\freq]);
Tdef(\player).set(\freqMin, 800, \freqMax, 1100, \freqLag, 20, \freqCurve, 2);
Tdef(\player).set(\waitTime, 1);
Tdef(\player).set(\shouldLoop, true);
)
4
Change values on the fly…
Tdef(\player).play
Tdef(\player).set(\freqMin, 800, \freqMax, 1100, \freqLag, 2, \freqCurve, 2);
Tdef(\player).set(\freqMin, 200, \freqMax, 400, \freqLag, 12, \freqCurve, -6);
Tdef(\player).set(\waitTime, 0.1)
Tdef(\player).set(\shouldLoop, false) // end and release synths
As one block of code
s.waitForBoot {
SynthDef(\glisser, {
var laggedCtl = {|name, def=0|
VarLag.kr(
in: NamedControl.kr(name, def),
time: NamedControl.kr(name ++ 'Lag', 1),
curvature: NamedControl.kr(name ++ 'Curve', 0),
start: def
)
};
var freq = laggedCtl.(\freq, 220);
var snd = SinOsc.ar(freq) * 0.1;
var env = Env.adsr(2).kr(doneAction:2, gate: \gate.kr(1));
Out.ar(0, snd!2 * env);
}).add;
Tdef(\player, {
|envir|
var ownedSynths = 10.collect{ Synth(\glisser) };
var getE = { |name, postfix| envir[(name ++ postfix).asSymbol] };
var setFromEnvir = { |name| [
(name).asSymbol, exprand(getE.(name, 'Min'), getE.(name, 'Max')),
(name ++ 'Lag').asSymbol, getE.(name, 'Lag'),
(name ++ 'Curve').asSymbol, getE.(name, 'Curve')
]};
s.sync;
while {envir[\shouldLoop]}
{
ownedSynths.do{|synth|
envir[\laggedArgs].do{ |argname|
synth.set( *setFromEnvir.(argname).postln )
};
(envir.waitTime ? 0.1).wait
};
};
ownedSynths.do(_.set(\gate,0))
});
// make sure all this is set before you play the tdef
Tdef(\player).set(\laggedArgs, [\freq]);
Tdef(\player).set(\freqMin, 800, \freqMax, 1100, \freqLag, 20, \freqCurve, 2);
Tdef(\player).set(\waitTime, 1);
Tdef(\player).set(\shouldLoop, true);
Tdef(\player).play;
};
Tdef(\player).set(\freqMin, 800, \freqMax, 1100, \freqLag, 2, \freqCurve, 2);
Tdef(\player).set(\freqMin, 200, \freqMax, 400, \freqLag, 12, \freqCurve, -6);
Tdef(\player).set(\waitTime, 0.1)
Tdef(\player).set(\shouldLoop, false)