我正在试验 SuperCollider 和 Processing,本质上只是让 Processing 向 SC 发送消息(此时播放此音符等)。
但是,我在理解 SC 的一件事时遇到了麻烦:如果我制作了一个SynthDef
,并且假设我有各种来自 Processing 的 MIDI 音符,是否不可能只有一个合成器实例来处理播放所有音符?
现在,SC 正在为每个音符创建一个新的 Synth 实例,因此不可避免地,我得到了大量的实例。我一直在尝试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 音符。但是每次触发监听器时,我都会得到一个 Synth 的新实例