Я пытаюсь перебрать массив буферов, каждый из которых содержит образец звука, считанный с диска, но у меня возникают проблемы с получением SynthDef для сброса указателя на буферы.
Я сделал следующее:
Предположим, у меня есть папка со звуковыми файлами, и я прочитал их все в массиве буферов, называемых «~ буферами».
Я просто хочу пройтись по массиву по порядку, воспроизведя образцы подряд и остановившись после последнего.
Я определяю простой SynthDef, а затем помещаю Synth, который вызывает его, в процедуру:
( SynthDef(\playBuffer,{arg out = 0, buf; var sig; sig = PlayBuf.ar(2, buf, doneAction: Done.freeSelf); Out.ar(out, sig); }).add ~routine = Routine({ ~buffers.do({ arg item; var synth; synth = Synth(\playBuffer, [\buf, item]); item.duration.wait; synth.free; }); }); ~routine.play; )
Это не работает должным образом --- синтезаторы всегда воспроизводят один и тот же звук, первый, хотя длительность соответствует разным семплам.
Я думаю, проблема может заключаться в том, что функция внутри моего \playbuffer SynthDef (по крайней мере, согласно файлам справки) не переоценивается с другим аргументом bufnum внутри цикла.
На самом деле я могу перебирать буферы, если использую Buffer.play, который создает synthDef и Synth на лету. Замена моей процедуры этим кодом работает:
(
~routine2 = Routine({
~buffers.do({
arg item;
item.play;
item.duration.wait;
});
});
~routine2.play;
)
НО: это очень грубо, так как теперь я не могу манипулировать выводом буфера, кроме изменения амплитуды через параметр mul в Buffer.play. Что я хотел бы сделать, так это воспроизвести поведение Buffer.play --- создание SynthDef и Synth на лету --- в моем собственном коде. Но мне с этим не везет. На самом деле я не уверен, с чего начать, возможно, потому, что я не полностью понимаю, как сервер SuperCollider обрабатывает функции. Должен ли я сделать функцию создания синтезатора и использовать ее внутри цикла подпрограммы? Или я должен переместить определение SynthDef внутрь цикла (что кажется эквивалентным)? Я пробовал последний, но все равно играл тот же звук.
Возможно, я иду по неправильному пути --- я очень новичок в SuperCollider.