您的代码存在许多问题(有些与您的问题无关):
一个。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. 检查你的路由......你有两个平行的组,你只是说我想要那个组上的这些合成器和另一个组之后的这些其他..你真正想说的是我想要这些Synth
s 在那些Synth
s之后那个组。
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};
});