SuperCollider -- Synthdef 混合了可变数量的 SinOsc
SuperCollider -- Synthdef with mix of variable amount of SinOsc's
此代码 returns 是一个错误,但如果我从第 4 行删除 "arg" 则它会起作用。我该怎么做才能使 n 成为参数而不出现错误?
(
SynthDef("test",
{
arg n=8;
f=Mix.fill(n, {
arg index;
var freq, amp;
freq=440*((7/6)**index);
//freq.postln;
amp=(1-(index / n)) / (n*(n+1) / (2*n));
SinOsc.ar(freq,0,0.2*amp)
});
//f=SinOsc.ar(440,0,0.2);
Out.ar(0,f)
}).add;
)
SynthDefs 总是固定的 "wiring",所以你不能改变 SinOscs 的数量。这是一个你无法避免的硬约束。
您可以为每个基数按程序生成合成定义:
(
(2..10).do{|num|
SynthDef("wiggler%".format(num), {|freq=440, amp=0.1|
var oscs;
oscs = Mix.fill(num, {|index|
SinOsc.ar(freq * index)
});
Out.ar(0, oscs * amp);
}).add;
}
)
x = Synth("wiggler2")
x.free
x = Synth("wiggler10")
x.free
如果您有 n 的上限(比方说 n<=16
),那么您可以创建一个连续截止数组,将其与谐波相乘。
(
SynthDef("test",
{
arg n=8;
var cutoff = tanh( (1..16)-n-0.5 *100 ) * -1 / 2 + 0.5; // this
f=Mix.fill(16, { // run it through the upper bound
arg index;
var freq, amp;
freq=440*((7/6)**index);
//freq.postln;
amp=(1-(index / n)) / (n*(n+1) / (2*n));
cutoff[index] * SinOsc.ar(freq,0,0.2*amp) // multiply with cutoff
});
//f=SinOsc.ar(440,0,0.2);
Out.ar(0,f)
}).add;
)
如果 index<n
,截止数组的值为 1,之后为零。让我们说 n=3
,然后 cutoff==[1,1,1,0,0,0,...]
。
此代码 returns 是一个错误,但如果我从第 4 行删除 "arg" 则它会起作用。我该怎么做才能使 n 成为参数而不出现错误?
(
SynthDef("test",
{
arg n=8;
f=Mix.fill(n, {
arg index;
var freq, amp;
freq=440*((7/6)**index);
//freq.postln;
amp=(1-(index / n)) / (n*(n+1) / (2*n));
SinOsc.ar(freq,0,0.2*amp)
});
//f=SinOsc.ar(440,0,0.2);
Out.ar(0,f)
}).add;
)
SynthDefs 总是固定的 "wiring",所以你不能改变 SinOscs 的数量。这是一个你无法避免的硬约束。
您可以为每个基数按程序生成合成定义:
(
(2..10).do{|num|
SynthDef("wiggler%".format(num), {|freq=440, amp=0.1|
var oscs;
oscs = Mix.fill(num, {|index|
SinOsc.ar(freq * index)
});
Out.ar(0, oscs * amp);
}).add;
}
)
x = Synth("wiggler2")
x.free
x = Synth("wiggler10")
x.free
如果您有 n 的上限(比方说 n<=16
),那么您可以创建一个连续截止数组,将其与谐波相乘。
(
SynthDef("test",
{
arg n=8;
var cutoff = tanh( (1..16)-n-0.5 *100 ) * -1 / 2 + 0.5; // this
f=Mix.fill(16, { // run it through the upper bound
arg index;
var freq, amp;
freq=440*((7/6)**index);
//freq.postln;
amp=(1-(index / n)) / (n*(n+1) / (2*n));
cutoff[index] * SinOsc.ar(freq,0,0.2*amp) // multiply with cutoff
});
//f=SinOsc.ar(440,0,0.2);
Out.ar(0,f)
}).add;
)
如果 index<n
,截止数组的值为 1,之后为零。让我们说 n=3
,然后 cutoff==[1,1,1,0,0,0,...]
。