【问题标题】:How to programmatically stop sound playback in SuperCollider如何以编程方式在 SuperCollider 中停止声音播放
【发布时间】:2013-01-01 17:44:52
【问题描述】:

我有以下一段代码,它应该播放一个合成器功能一秒钟,停止它,一秒钟后再次播放,依此类推:

    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。这里有什么问题,如何停止正在播放的合成器?

【问题讨论】:

    标签: audio supercollider


    【解决方案1】:

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

    【讨论】:

    • 如何在 score nrt 中做到这一点
    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多