2010-11-15 1 views
7

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

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

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

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

У кого-нибудь есть опыт программирования чего-то подобного? Мне было бы очень интересно узнать о правильном подходе. (Для ясности: я не ищу конкретные Flash-реализации, и именно поэтому я не помещал этот вопрос под флэш-память или actioncript)

ответ

1

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

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

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

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

0

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

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

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

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

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

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

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

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

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

Смежные вопросы