AVAudioEngine график выборки точных изменений параметров

Я пытаюсь создать приложение, используя комбинацию экземпляров AVAudioPlayerNode и других AUAudioUnits для эквалайзера, сжатия и т. Д. Все хорошо подключается, и использование версии API версии V3, безусловно, упрощает настройку для соединения узлов вместе. Однако во время воспроизведения я хотел бы иметь возможность автоматизировать изменения параметров, такие как усиление на микшере, так, чтобы изменения были плавными (например, постепенным исчезновением или постепенным увеличением.) И чувствовали себя уверенными в том, что изменения являются точными для выборки.
Одним из решений, которое я рассмотрел, является установка отвода на узел (возможно, узел микшера двигателя) и внутри него регулировка усиления для данного модуля, но, поскольку ответвление находится на выходе модуля, всегда будет слишком поздно, чтобы иметь желаемый эффект (я думаю) без выполнения вычислений смещения, а затем с задержкой воспроизведения исходного звука, чтобы соответствовать изменениям параметров. Я также посмотрел на scheduleParameterBlock собственность на AUAudioUnit но, похоже, мне нужно было бы реализовать свой собственный модуль, чтобы использовать его, а не использовать встроенные модули, даже если это было упомянуто в

Сессия 508 WWDC: " ... Таким образом, первый аргумент для создания расписания - это время выборки, значение параметра может меняться со временем, если аудиоустройство объявило, что оно является линейным. Например, Apple Mixer делает это. И последний два параметра, конечно, являются функциональными параметрами, это адрес изменяемого параметра и новое значение параметра.... "

Возможно, это означало, что внутренне Apple Mixer использует его, а не то, что мы можем задействовать любые безудержные возможности. Я не могу найти много документов или примеров, кроме реализации пользовательского аудиоустройства, как в примере Apple, приложенном к этому докладу.

Другие возможные решения, которые я видел, включают использование NSTimer, CADisplayLink или же dispatchAfter... но эти решения чувствуют себя хуже и с меньшей точностью выборки, чем смещение от установленного блока ответвлений на выходе блока.

Я чувствую, что упустил что-то очень очевидное, так как есть другие части нового API AVAudioEngine, которые имеют большой смысл, и старый API AUGraph предоставил больший доступ к образцу точного секвенирования и изменения параметров.

1 ответ

Это не так очевидно, как вы надеетесь. К сожалению, в моих тестах параметр рампы на scheduleParameterBlock(или даже основной AudioUnitScheduleParameters) просто ничего не делает. Очень странно для такого зрелого API.

Суть в том, что вы можете установить значение параметра только в пределах одного буфера, а не на уровне семпла. Установка значения параметра в шаге расчета будет автоматически изменяться от текущего значения до нового значения к концу содержащего буфера. Кажется, нет никакого способа отключить это автоматическое линейное изменение.

Более длинные затухания должны выполняться в секциях, устанавливая дробные значения в нескольких буферах и отслеживая относительный прогресс затухания. В действительности, для фейдов нормальной длительности это расхождение во времени вряд ли будет проблемой, потому что точность выборки будет чрезмерной.

Подводя итог, можно сказать, что изменения параметров на уровне семпла кажутся невозможными, но изменения параметров на уровне буфера даются легко. Если вам нужно сделать очень короткие фейды (в пределах одного буфера или нескольких буферов), то это можно сделать на уровне сэмпла, манипулируя отдельными семплами через AURenderCallback.

Другие вопросы по тегам