processing - SuperCollider - 限制 Synth 实例

标签 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. 每次收到“/hitXsmall”时,您都会启动一个新的合成器。在这种情况下,您可能希望在 EnvGen 中使用 doneAction:2 以便合成器自动释放自身。参见 the EnvGen helpfilethe doneActions helpfile获取信息和示例。

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

在您的代码示例中,您有一个合成器,它是关于创建单个有界音符的,所以我推荐第一种方法。使用 doneAction:2 让合成器在完成后自行释放,一切都很好。

关于processing - SuperCollider - 限制 Synth 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22670465/

相关文章:

java - 如何在 JCollider 中构造具有超过 5 个参数的 UGen

command-line - 如何在 SuperCollider 的命令行 REPL 中进行多行输入?

python - 如何为 Beta 测试人员打包 SC 仪器?

java - Processing(二维图形)是否适合大型项目?

javascript - 当一个数字上升时如何降低另一个数字?

Kinect - 跟踪人群中的人 - 运动运动跟踪

java - 如何从 pde 文件创建处理库

javascript - 删除所选之前数组中的所有元素

java - 获取Android应用程序li​​b目录

audio - 在处理中获取多个音频输入