SuperCollider — Ограничение экземпляров Synth

Я экспериментирую с 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.


person djt    schedule 26.03.2014    source источник


Ответы (1)


Да, это возможно. Вы просто должны запрограммировать его! У вас есть два распространенных шаблона проектирования на выбор:

  1. Каждый раз, когда получен '/hitXsmall', вы запускаете новый синтезатор. В этом случае вы, вероятно, захотите использовать doneAction:2 в своем EnvGen, чтобы синтезатор автоматически освобождался. См. файл справки EnvGen и файл справки doneActions для информации и примеров.

  2. В начале вашего кода вы запускаете один единственный бесконечный синтезатор и сохраняете ссылку на него в переменной, например. x = Synth(...). Затем каждый раз, когда принимается '/hitXsmall', вы используете сообщение set, чтобы сообщить синтезатору новые параметры для использования, например. x.set(\freq, 440, \amp, 0.5).

В вашем примере кода у вас есть синтезатор, который предназначен для создания одной ограниченной заметки, поэтому я бы рекомендовал первый подход. Используйте doneAction:2, чтобы синтезаторы освободились, когда закончите, и все в порядке.

person Dan Stowell    schedule 27.03.2014