Как конвертировать wavetable для использования с `OscillatorNode.setPeriodicWave`? - PullRequest
0 голосов
/ 20 января 2020

Я хотел бы использовать пользовательский сигнал с WebAudio OscillatorNode. Я новичок в синтезе звука и до сих пор много борюсь с математикой (я могу, по крайней мере, программировать).

Формы сигналов определены как функции, поэтому у меня есть сама функция, и я могу сэмплировать волна. Однако для метода OscillatorNode.createPeriodicWave требуются два массива (real и imag), которые определяют форму волны в частотной области.

В AnalyserNode есть методы FFT для вычисления массива (байтов или чисел с плавающей запятой) ) в частотной области, но он работает с сигналом от другого узла.

Я не могу придумать, как правильно подать волновую таблицу в AnalyserNode, но если бы я мог, он возвращает только один массив в то время как для OscillatorNode.createPeriodicWave требуется два.

TLDR Начиная с функции periodi c, как вычислить соответствующие аргументы для OscillatorNode.createPeriodicWave?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

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

Я не писал никакой документации, но записал несколько видео (Видео 1) (Видео 2) (Видео 3) меня, кодирующего проект вживую. Они должны быть довольно очевидными. Там есть пара ошибок, которые я исправил позже. Для рабочей версии, пожалуйста, обратитесь к ссылке на github.

1 голос
/ 20 января 2020

Поскольку у вас есть периодический сигнал c, определенный функцией, вы можете вычислить ряд Фурье для этой функции. Если ряд содержит бесконечное число терминов, вам нужно его усечь.

Это немного работы, но именно так вычисляются предопределенные типы осцилляторов. Например, см. Определение прямоугольной волны для OscillatorNode. Коэффициенты PeriodicWave для прямоугольной волны были рассчитаны именно таким образом.

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

Или вы можете просто предположить, что частота дискретизации AudioContext (обычно 44,1 кГц или 48 кГц) достаточно высока, и просто производить выборку сигнала каждый раз 1/44100 или 1/48000 se c и вычислите БПФ полученных образцов.

...