为什么我不能对synth参数进行相等测试?

时间:2013-09-14 16:58:17

标签: supercollider

我很神秘。在这段代码中:

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确实有效,所以在这些情况下,我会得到一个单调的旋律。

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

1 个答案:

答案 0 :(得分:3)

首先:你不能将符号发送到合成控件。你只能发送号码。

第二:你的例子没有说明如果测试是假的,应该是什么样的频率。实际上,您应该使用更多的数据流样式来编写它,例如:

 freq = if(testcondition, 200, 300);

这就是合成器中可以使用的那种东西。

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

   BinaryOpUGen("==", thinga, thingb)

总而言之,你可以写

 freq = if(BinaryOpUGen("==", myParam, 1), 200, 300);