在该代码中, 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 中更改它。