私は 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 ノートを決定します。しかし、リスナーがトリガーされるたびに、シンセの新しいインスタンスを取得します