Я экспериментирую с SuperCollider и Processing, по сути просто заставляя Processing отправлять сообщения в SC (воспроизвести эту заметку, в это время и т. д.).
Тем не менее, у меня возникли проблемы с пониманием одной вещи с SC: если я создаю SynthDef
и, скажем, у меня есть различные MIDI-ноты, поступающие из Processing, невозможно ли просто иметь ОДИН экземпляр синтезатора, обрабатывающий воспроизведение всех нот ?
Прямо сейчас 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.