1

我很迷惑。在这段代码中:

SynthDef(\acid,
    {
        |out, gate = 1, freq, myParam, amp, cutoff, resonance, filtEnvAmt|
        var env, audio, filtEnv;
        if (myParam == \something, { freq = 200; });
        env = Linen.kr(gate, 0, 1, 0, doneAction: 2);
        audio = LFSaw.ar(freq, mul: amp);
        filtEnv = Line.kr(midicps(cutoff + filtEnvAmt), midicps(cutoff),  0.2);
        audio = RLPFD.ar(audio, ffreq: filtEnv + MouseX.kr(0, 5000), res: MouseY.kr(0, 1), dist: 0);
        Out.ar(out, audio * env);
    }
).add;

b = Pbind(*[
    out: 0,
    instrument: \acid,
    stepsPerOctave: 19,
    scale: [0, 3, 5, 8, 11, 14, 17],
    octave: 3,
    degree: Pseq([0, \, 3, 3, 4, 4, 9, 4, 4]),
    myParam: \something,
    //prevFreq: Pseq([0, 0, 0, 0, 9, 0, 0, 0, 0]),
    dur: Pseq([0.4, 0.4, 0.1, 0.1, 0.1, 0.1, 0.2, 0.1, 0.1]),
    cutoff: Pseq([60, \, 50, 60, 80, 60, 90, 80, 50]),
    filtEnvAmt: Pseq([20, \, 20, 20, 20, 20, -10, 20, 20]),
    resonance: Pseq([0.5, \, 0.5, 0.5, 0.5, 0.5, 0.3, 0.5, 0.5])
]);

b.play;

..平等测试myParam == \something永远不会返回true,尽管每次Pbind都清楚地发送。\something也没有其他值可以工作:0nil

然而,平等测试myParam == myParam并且\something == \something确实有效,所以在这些情况下,我得到一个单调的旋律。

我只能猜测 aPbind在某种包装器中发送每个值,但我不知道如何从合成器内部检查它们。任何人都可以帮忙吗?

4

1 回答 1

3

第一:您不能将符号发送到合成器控件。您只能发送号码。

第二:如果测试为假,您的示例没有说明 freq 应该是什么。实际上,您应该以更多的数据流样式编写它,例如:

 freq = if(testcondition, 200, 300);

这就是在 synthdef 中可以使用的东西。

第三是在 sc 语言中有点令人沮丧的事情,那就是==消息总是在 synthdef编译时评估- 相等性被检查一次,然后再也不检查了。为了进行“实时”相等检查,您可以使用这个略显笨拙的表达式:

   BinaryOpUGen("==", thinga, thingb)

所以总而言之,你可以写

 freq = if(BinaryOpUGen("==", myParam, 1), 200, 300);
于 2013-09-15T10:03:49.220 回答