SuperCollider - 限制合成实例

时间:2014-03-26 18:50:34

标签: processing supercollider

我正在试验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的新实例

1 个答案:

答案 0 :(得分:3)

是的,这是可能的。你只需要编程吧!您有两种常见的设计模式可供选择:

  1. 每次' / hitXsmall'收到后,你启动一个新的合成器。在这种情况下,您可能希望在EnvGen中使用 doneAction:2 ,以便合成器自动释放自身。有关信息和示例,请参阅the EnvGen helpfilethe doneActions helpfile

  2. 在代码开始时,您启动一​​个永不停止的合成器,并在变量中存储对它的引用,例如: x = Synth(...)。然后,每次' / hitXsmall'收到后,您使用设置消息告诉合成器使用的新参数,例如: x.set(\freq, 440, \amp, 0.5)

  3. 在你的代码示例中,你有一个合成器,它是关于创建一个有界音符,所以我建议第一种方法。 <完成后使用doneAction:2使合成器自由释放,一切都很好。