gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:23:52 32 4
gpt4 key购买 nike

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

    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 不会告诉合成器停止播放。

相反,为什么不写一个带有 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 中更改它。

关于audio - 如何以编程方式停止 SuperCollider 中的声音播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391742/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com