0

此代码返回错误,但如果我从第 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;
)
4

2 回答 2

0

如果你有一个 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;
)

如果 ,则截止数组的值为 1 index<n,之后为 0。可以说n=3,那么cutoff==[1,1,1,0,0,0,...]

于 2019-07-27T21:23:52.927 回答
0

SynthDefs 总是有固定的“接线”,所以你不能改变 SinOscs 的数量。这是您无法避免的硬约束。

您可以做的是为每个基数程序生成 synthdef:

(
(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
于 2015-12-14T08:23:09.747 回答