1

当我有 2 个阶段的多个并行合成器时,我可以将它与一组总线连接起来。(感谢 Dan S 对上一个问题的回答)。当有 3 个阶段时,这似乎不起作用。

(
SynthDef(\siny, { arg freq, outBus=0; Out.ar( outBus, SinOsc.ar(freq!2,0,0.2) ) } ).send(s);
SynthDef(\filter, { arg cFreq,q=0.8, inBus, outBus=0; Out.ar( outBus, BPF.ar(In.ar(inBus), cFreq!2, 1/q ) ) } ).send(s);
)

(
var z = [100,500,1000,1500,200];
~sourceOut = z.collect{ Bus.audio(s) };
~sineOut = z.collect{ Bus.audio(s) };
~sine_Group = ParGroup.new;
~myGroup    = ParGroup.new;

{
z.do({ arg val, index; Synth( \siny, [\freq: val, \outBus: ~sourceOut[index]], ~sine_Group ) });
z.do({ arg val, index; Synth.after(~sine_Group, \filter, [\inBus: ~sourceOut[index], \outBus: ~sineOut[index],\cFreq: 200, \q: 20 ], ~myGroup) });
z.do({ arg val, index; Synth.after(~myGroup, \filter, [\inBus: ~sineOut[index], \cFreq: 200, \q: 20]) });

}.play;
)

我在这里做的另一个危害是,每次我停止并运行合成器时,都会创建新的总线实例并最终用完音频总线。我该如何解决这个问题?

4

1 回答 1

0

您的代码存在许多问题(有些与您的问题无关):

一个。send(s)让人想起过去,现在add更可取 - 您可以查阅文档以了解它们的差异。

湾。除非有充分的理由,否则将局部变量var与环境变量(例如)混合不是一个好习惯。~sourceOut

C。.collect(func)(或者直接collect{/*function body here*/})发送到一个数组结果到另一个数组,其中每个元素都是func原始数组的相应元素作为参数传递的结果。所以在这里:

var z = [100,500,1000,1500,200];
~sourceOut = z.collect{ Bus.audio(s) };
~sineOut = z.collect{ Bus.audio(s) };

您不会在任何地方使用原始数字,您只需创建两个数组,每个数组包含 5 个音频总线。直接这样做会更容易混淆和更明确:

~sourceOut = Array.fill(5,{Bus.audio(s)});
~sineOut = Array.fill(5,{Bus.audio(s)});

d。调用 z.do 三次是没有意义的。你可以只调用一次,然后将其余的放在同一个函数中。

e. 检查你的路由......你有两个平行的组,你只是说我想要那个组上的这些合成器和另一个组之后的这些其他..你真正想说的是我想要这些Synths 在那些Synths之后那个组。

F。完成后你不会释放你的总线或合成器......这是内存泄漏:)

G。你调用play一个真正想要评估的函数......你应该调用value

这段代码在 don 时确实会产生声音并清理所有内容,但请注意,结果很无聊,因为您已经过滤了所有高端。

s.waitForBoot({ // this is a routine

    var frequencies = [100,500,1000,1500,200];
    var sources = Array.fill(frequencies.size,{Bus.audio(s)});
    var filters = Array.fill(frequencies.size,{Bus.audio(s)});
    var parGroups = Array.fill(2,{ParGroup.new});
    var sineSynths;
    var firstOrderFilters;
    var secondOrderFilters;

    SynthDef(\siny, {
        arg freq, outBus=0;
        Out.ar( outBus, SinOsc.ar(freq!2,0,0.2));
    }).add;
    SynthDef(\filter, {
        arg cFreq,q=0.8, inBus, outBus=0;
        Out.ar( outBus, BPF.ar(In.ar(inBus), cFreq!2, 1/q ) )
    }).add;
    s.sync; // wait for the synthdefs to load

    frequencies.do{ arg freq, index;
        sineSynths = sineSynths.add( Synth(\siny, [\freq: freq.postln, \outBus: sources[index]],
            parGroups[0])); // create synths and add them in the sineSynths Array
        firstOrderFilters = firstOrderFilters.add(
            Synth.after(sineSynths[index], \filter, [\inBus: sources[index],
                \outBus: filters[index], \cFreq: 200, \q: 20 ], parGroups[1]));
        secondOrderFilters = secondOrderFilters.add(
            Synth.after(firstOrderFilters[index], \filter, [\inBus: filters[index],
                \outBus: 0, \cFreq: 200, \q: 20 ], parGroups[1]));
    };

    10.wait; // wait 10 seconds;

    // clean up everything
    sineSynths.do{arg i; i.free};
    firstOrderFilters.do{arg i; i.free};
    secondOrderFilters.do{arg i; i.free};
    sources.do{arg i; i.free};
    filters.do{arg i; i.free};
});
于 2016-02-10T16:06:50.473 回答