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\something0nil

myParam == myParamただし、等価性テスト\something == \somethingは機能するため、これらのケースでは単調なメロディーが得られます。

Pbindaが何らかのラッパーで各値を送信すると推測することしかできませんが、シンセ内からそれらをチェックする方法がわかりません。誰でも助けることができますか?

4

1 に答える 1

3

まず、シンボルをシンセ コントロールに送信することはできません。番号のみ送信できます。

2番目:テストがfalseの場合、あなたの例はfreqがどうあるべきかを示していません。実際には、次のようなデータフロー スタイルで記述する必要があります。

 freq = if(testcondition, 200, 300);

それは、synthdef で機能するようなものです。

3 番目は、sc 言語で少しイライラすることです。これは、==メッセージが常に synthdefコンパイル時に評価されることです。等価性は一度チェックされ、その後は二度とチェックされません。「ライブ」等価チェックを行うために、次のやや不格好な式を使用できます。

   BinaryOpUGen("==", thinga, thingb)

したがって、要約すると、次のように書くことができます

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