3

私は SuperCollider と Processing を試しています。基本的には、Processing から SC にメッセージを送信するだけです (このメモを再生する、この時点でなど)。

ただし、SC で 1 つのことを理解するのに問題がSynthDefあります。 を作成し、Processing からさまざまな MIDI ノートが入っているとしましょう。シンセの 1 つのインスタンスだけで、すべてのノートの再生を処理することはできませんか?

現在、SC はすべてのノートに対してシンセの新しいインスタンスを作成しているため、必然的にインスタンスが膨大に蓄積されます。私は試してみましたSynth(Synth.new、すべての状況で、受信したメッセージごとに新しいインスタンスが作成されるようです。

コード例:

(
SynthDef('simple', {
    arg pitch = 200, msg = 50;
    var sound = SinOsc.ar(pitch);
    var linen = Env.linen(attackTime: 0, sustainTime:0.1, releaseTime:1);
    var env = EnvGen.kr(linen);
    Out.ar(0, sound * env);
}).add;

)

(
var choices = [50, 52, 54, 55, 57, 59, 61, 62, 64 ,66, 67, 69, 71, 73, 74, 76, 78, 79, 81, 83, 85];

OSCdef('listenerXsmall', {
    arg msg;
    msg.postln;
    Synth('simple', [pitch: choices[msg[1]].midicps])
    }, '/hitXsmall');

)

基本的に、SynthDef とリスナーを作成します。Processing から整数を受け取り、それを配列キーにマッピングして、再生する MIDI ノートを決定します。しかし、リスナーがトリガーされるたびに、シンセの新しいインスタンスを取得します

4

1 に答える 1

3

はい、可能です。プログラミングするだけです!ここから選択できる 2 つの一般的な設計パターンがあります。

  1. 「/hitXsmall」を受信するたびに、新しいシンセを起動します。この場合、シンセが自動的に解放されるように、EnvGen でdoneAction:2を使用することをお勧めします。情報と例については、 EnvGenヘルプファイルとdoneActions ヘルプファイルを参照してください。

  2. コードの開始時に、終わりのないシンセを 1 つ起動し、それへの参照を変数に保存しますx = Synth(...)。次に、「/hitXsmall」が受信されるたびに、setメッセージを使用して、使用する新しいパラメーターをシンセに伝えますx.set(\freq, 440, \amp, 0.5)

あなたのコード例では、単一の境界付きノートを作成するためのすべてのシンセを持っているので、最初のアプローチをお勧めします。doneAction:2完了時にシンセを解放するために使用します。すべて問題ありません。

于 2014-03-27T08:44:31.477 に答える