我尝试SuperCollider和处理,本质上只是让处理发送消息给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的新实例。
发布于 2014-03-27 08:44:31
是的是可能的。你只需要编程就行了!这里有两种常见的设计模式可供选择:
x = Synth(...)。然后,每次收到'/hitXsmall‘时,都使用set消息告诉synth要使用的新参数,例如x.set(\freq, 440, \amp, 0.5)。在您的代码示例中,您已经得到了一个synth,它的全部内容是创建一个有界注释,因此我建议使用第一种方法。使用doneAction:2使合成器在完成时自由,一切都很好。
https://stackoverflow.com/questions/22670465
复制相似问题