Audio 如何在超级对撞机中以编程方式停止声音播放

Audio 如何在超级对撞机中以编程方式停止声音播放,audio,supercollider,Audio,Supercollider,我有下面一段代码,它应该播放synth函数一秒钟,停止它,一秒钟后再播放,依此类推: t = Task({{ var a; a = {[0,0,SinOsc.ar(852, 0, 2.2)+SinOsc.ar(1633, 0, 2.2), 0]} ; a.play; 1.wait; a.release(5); 1.wait; }.loop}); t.play; 问题是,a并没有停止播放,而是在服务器上启动了额外的a。这里有

我有下面一段代码,它应该播放synth函数一秒钟,停止它,一秒钟后再播放,依此类推:

    t = Task({{
    var a;
    a =  {[0,0,SinOsc.ar(852, 0, 2.2)+SinOsc.ar(1633, 0, 2.2), 0]} ;
    a.play;
    1.wait;
    a.release(5);
    1.wait;
   }.loop});

   t.play;

问题是,a并没有停止播放,而是在服务器上启动了额外的a。这里有什么问题,如何停止播放合成器?

在该代码中,a是一个函数,因此a.release不会告诉合成器停止播放

相反,为什么不在SynthDef上写一个5秒长的信封呢

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行中设置它

然后,当您想要结束synth时,将其发送到0门。这会告诉信封释放,它会在5秒钟内释放,然后doneAction会从服务器上删除synth。请注意,一次播放多个synth,因为释放时间比等待时间长


此外,您已将正弦的振幅设置为大于1。我没有在上面的synthdef中更改它。

如何在score nrt中执行此操作