Connecting multiple stages of parallel synths, with array of buses, in superCollider

时间:2016-02-03 03:13:24

标签: supercollider

When I have 2 stages of multiple parallel synths, I am able to connect it with an array of buses. (Thanks to Dan S for the answer to a previous question). When there is a 3 stage, this doesn't seem to work.

(
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;
)

Another harm that I am doing here is, everytime I stop and run the synth, new instances of busses are created and eventually run out of audio buses. How can I solve this?

1 个答案:

答案 0 :(得分:0)

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

一个。 send(s)让人想起过去,这些日子只是add更可取 - 您可以查阅文档中的差异。

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

℃。 .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三次是没有意义的......你只需要调用一次,然后将其余部分放在同一个函数中。

即检查你的路线...你有两个平行组,你只是说我想在这个组中使用这些合成器而这些其他之后那个其他组..你是什么人我真的想说的是,我希望在该组Synth之后的这些Synth s。

F。完成后你不会释放你的公共汽车或你的合成器......这是一个内存泄漏:)

克。你在想要评估的函数上调用play ......你应该调用value

这段代码确实可以产生声音并清理掉所有内容,但请注意,结果非常无聊,因为您已经过滤了所有高端内容。

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};
});