我很神秘。在这段代码中:
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
。其他值也无效:0
,nil
等。
然而,等式测试myParam == myParam
和\something == \something
确实有效,所以在这些情况下,我会得到一个单调的旋律。
我只能猜测Pbind
在某种包装器中发送每个值,但我不知道如何从合成器内部检查它们。有人可以帮忙吗?
答案 0 :(得分:3)
首先:你不能将符号发送到合成控件。你只能发送号码。
第二:你的例子没有说明如果测试是假的,应该是什么样的频率。实际上,您应该使用更多的数据流样式来编写它,例如:
freq = if(testcondition, 200, 300);
这就是合成器中可以使用的那种东西。
第三个是sc语言中的一个令人沮丧的事情,即==
消息总是在synthdef 编译时进行评估 - 检查相等性,然后再检查一次。为了进行“实时”等式检查,您可以使用这个稍微笨重的表达式:
BinaryOpUGen("==", thinga, thingb)
总而言之,你可以写
freq = if(BinaryOpUGen("==", myParam, 1), 200, 300);