首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SuperCollider -限制Synth实例

SuperCollider -限制Synth实例
EN

Stack Overflow用户
提问于 2014-03-26 18:50:33
回答 1查看 454关注 0票数 3

我尝试SuperCollider和处理,本质上只是让处理发送消息给SC (此时播放这个音符等等)。

然而,我很难理解SC的一件事:如果我做了一个SynthDef,并且说我有来自处理的各种MIDI注释,难道就不能只有一个synth的实例来处理所有的音符吗?

现在,SC正在为每个音符创建一个新的Synth实例,因此不可避免地,我得到了大量的实例。我一直在尝试Synth(Synth.new,但是每种情况似乎都会为接收到的消息创建一个新的实例。

代码示例:

代码语言:javascript
复制
(
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的新实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-27 08:44:31

是的是可能的。你只需要编程就行了!这里有两种常见的设计模式可供选择:

  1. 每次收到'/hitXsmall‘时,您都会启动一个新的synth。在本例中,您可能希望在您的中使用:2,以便合成器自动释放自己。有关信息和示例,请参见EnvGen帮助文件doneActions帮助文件
  2. 在代码开始时,启动一个永无止境的合成器,并将对它的引用存储在一个变量中,例如x = Synth(...)。然后,每次收到'/hitXsmall‘时,都使用set消息告诉synth要使用的新参数,例如x.set(\freq, 440, \amp, 0.5)

在您的代码示例中,您已经得到了一个synth,它的全部内容是创建一个有界注释,因此我建议使用第一种方法。使用doneAction:2使合成器在完成时自由,一切都很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22670465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档