SuperCollider Synthdef со смесью переменного количества SinOsc

Этот код возвращает ошибку, но он работает, если я удалю "arg" из строки 4. Что я могу сделать, чтобы сделать 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;
)

person Joshua Meyers    schedule 13.12.2015    source источник


Ответы (2)


SynthDef всегда имеет фиксированную «проводку», поэтому вы не можете изменять количество SinOsc. Это жесткое ограничение, которого вы не можете избежать.

Что вы можете сделать, так это процедурно сгенерировать synthdefs для каждой кардинальности:

(
(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
person Dan Stowell    schedule 14.12.2015

Если у вас есть верхняя граница для 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, и нули после этого. Допустим, n=3, затем cutoff==[1,1,1,0,0,0,...].

person grault    schedule 27.07.2019