如何以编程方式停止SuperCollider中的声音播放

时间:2013-01-18 02:57:18

标签: audio supercollider

我有以下代码,它应该播放一秒钟的合成函数,停止它,一秒后再播放它,依此类推:

    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不会停止播放,而是在服务器上启动了另外一个。这里有什么问题,如何停止播放合成器?

1 个答案:

答案 0 :(得分:3)

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