Processing 超对撞机限制合成实例

Processing 超对撞机限制合成实例,processing,supercollider,Processing,Supercollider,我正在试验超级对撞机和处理,基本上只是让处理向SC发送消息(此时播放此音符等) 然而,我在理解SC时遇到了一个问题:如果我制作了一个SynthDef,并且假设我有各种MIDI音符从处理中传入,那么仅仅有一个synth实例,处理播放所有音符,这是不可能的吗 现在,SC正在为每个音符创建一个新的Synth实例,因此不可避免地,我得到了大量实例。我一直在尝试Synth(和Synth.new),但每种情况似乎都会为收到的消息创建一个新实例 代码示例: ( SynthDef('simple', {

我正在试验超级对撞机和处理,基本上只是让处理向SC发送消息(此时播放此音符等)

然而,我在理解SC时遇到了一个问题:如果我制作了一个
SynthDef
,并且假设我有各种MIDI音符从处理中传入,那么仅仅有一个synth实例,处理播放所有音符,这是不可能的吗

现在,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和一个监听器。从处理中接收整数,这些整数被映射到数组键以确定要播放的MIDI音符。但是每次触发监听器时,我都会得到一个Synth的新实例。是的,这是可能的。您只需对其进行编程!您可以从这里选择两种常见的设计模式:

  • 每次收到“/hitXsmall”时,您都会启动一个新的synth。在这种情况下,您可能希望在EnvGen中使用doneAction:2,以便synth自动释放自己。有关信息和示例,请参阅和

  • 在代码开始时,您启动一个永无止境的synth,并将对它的引用存储在一个变量中,例如
    x=synth(…)
    。然后,每次收到“/hitXsmall”,您都会使用set消息告诉synth要使用的新参数,例如
    x.set(\freq,440,\amp,0.5)

  • 在您的代码示例中,您有一个synth,它完全是关于创建单个有界音符的,因此我建议使用第一种方法。使用
    doneAction:2
    使synth在完成后释放自己,一切正常