そのコードでは、aは関数であるため、a.releaseはシンセに再生を停止するように指示しません。
代わりに、5秒の単独エンベロープを含むSynthDefを作成してみませんか。
SynthDef(\sines, {arg out = 0, release_dur, gate =1, amp = 0.2;
var sines, env;
env = EnvGen.kr(Env.asr(0.01, amp, release_dur), gate, doneAction:2);
sines = SinOsc.ar(852, 0, 2.2)+SinOsc.ar(1633, 0, 2.2);
Out.ar(out, sines * env);
}).add
t = Task({{
var a;
a = Synth.new(\sines, [\release_dur, 5, \out, 0, \amp, 0.2, \gate, 1]);
1.wait;
a.set(\gate, 0);
1.wait;
}.loop});
t.play;
リリース期間を引数として渡すので、以下のタスクのa=Synth行で設定できます。
次に、シンセを終了する場合は、ゲート0を送信します。これにより、エンベロープにリリースするように指示されます。これは5秒以上実行され、doneActionはサーバーからシンセを削除します。リリース時間は待機時間よりも長いため、一度に複数のシンセが再生されることに注意してください。
また、サインの振幅を1より大きく設定しました。上記のsynthdefではこれを変更しませんでした。