Кто-нибудь советует программировать синтез звука в реальном времени? - PullRequest
7 голосов
/ 15 ноября 2010

В настоящее время я работаю над личным проектом: создание библиотеки для синтеза звука в реальном времени во Flash.Вкратце: инструменты для подключения волновых генераторов, фильтров, микшеров и т. Д. Друг к другу и обеспечения звуковой карты необработанными данными (в реальном времени).Что-то вроде max / msp или Reaktor.

У меня уже есть кое-что работающее, но мне интересно, правильная ли базовая настройка, которую я написал.Я не хочу позже сталкиваться с проблемами, которые вынуждают меня изменить ядро ​​моего приложения (хотя это всегда может случиться).

По сути, сейчас я начинаю с конца цепочки,в месте, где (необработанные) звуковые данные выходят (на звуковую карту).Чтобы сделать это, мне нужно записать куски байтов (ByteArrays) в объект, и чтобы получить этот блок, я спрашиваю, какой модуль подключен к моему модулю «Sound Out», чтобы дать мне его блок.Этот модуль выполняет тот же запрос к модулю, который подключен к его входу, и это продолжается до тех пор, пока не будет достигнут начало цепочки.

Это правильный подход?Я могу вообразить столкновение с проблемами, если есть обратная связь, или если есть другой модуль без выхода: если бы я где-нибудь подключил спектруманализатор, это было бы тупиком в цепи (модуль без выходов, просто вход).В моей текущей настройке такой модуль не будет работать, потому что я только начинаю вычисления с модуля вывода звука.

Кто-нибудь имел опыт программирования чего-то подобного?Я был бы очень заинтересован некоторыми мыслями о правильном подходе.(Для ясности: я не ищу конкретных реализаций Flash, и поэтому я не пометил этот вопрос в flash или actionscript)

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

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

Спектрометр был спроектирован как вставной модуль, то есть он работал бы только в том случае, еслии его вход, и его выход были подключены, и он передавал свой вход на выход без изменений.

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

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

0 голосов
/ 01 декабря 2010

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

Один из примеров: расширение его для передачи данных на диск или с него. Другой пример было бы то, что переменные управления низкой скоростью передачи данных, такие как одна управляющая задержка эхо-сигнала, могут позже стать частью вашей сети. Возможно, вы не хотите обрабатывать управляющие переменные с той же частотой, с которой вы обрабатываете аудиопакеты, но они все еще находятся в режиме реального времени и являются частью функциональной сети. Например, они могут нуждаться в сглаживании, чтобы избежать внезапных переходов.

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

  • Для спектрометра у вас есть вопрос нескольких стоков для данные, но это не проблема. Введите фиктивную ссылку на него от настоящая раковина. Фиктивная ссылка может вызвать запрос данных, которые не честь. Пока фиктивная ссылка знает это дурачок и его не волнует отсутствие данных, все будет ХОРОШО. Это стандартный метод сведения нескольких приемников или источников к одному.

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

Итак, эти две проблемы, которые вас интересуют, легко решаются в рамках вашей текущей структуры.

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

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

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

...