Подтвердить что ты не робот

Создание 10-полосного эквалайзера с использованием API веб-аудио

Я пытаюсь обернуться, используя API-интерфейс Web Audio для воссоздания чего-то вроде
Winamp 10-полосный эквалайзер.

Winamp's 10-band equalizer
(источник: head-fi.org)

Из того, что я могу собрать, я должен создать 10 биквадорных фильтров, установить их type на 2 (для полосового фильтра) и установить их frequency на [60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000] соответственно, Как только я это сделал (и здесь, где я немного запутался), я бы создал отдельный узел усиления для каждой частотной "полосы" и привязал его значение к ползунку.

<input id="someFreqBand" type="range" min="-12" max="12" step="0.1" value="0" onchange="slide()"/>

Если предположить, что все это правильно, то единственный оставшийся шаг - подключить все 10 узлов усиления к аудио-контексту destination (который, я думаю, возьмет все 10 частотных "полос" и смешает/синхронизирует их вместе). Правильный ли это способ создания 10-полосного эквалайзера Web Audio?

Главное, что меня смущает, это то, как я "соединяю" источник с 10 фильтрами частотных диапазонов (+ связанный узел усиления), поскольку все узлы имеют только один вход или выход (включая пункт назначения).

4b9b3361

Ответ 1

Как сказал Matt D, не должно быть проблем с подключением фильтров к одному и тому же месту назначения.

Я бы сказал, что вы, вероятно, захотите использовать фильтры с типом 5 (peaking), который позволяет всем частотам проходить и только усиливать/уменьшать на частоте, на которой вы установили соответствующий filter.frequency.value. Это позволяет вам последовательно подключать фильтры, поэтому вам не нужны 10 отдельных аудиодорожек. Вы могли бы также рассмотреть использование фильтра с низкой полкой в ​​качестве первого фильтра, а фильтр с высокой пропускной способностью - десятый, что довольно часто встречается в эквалайзерах. Я не могу вспомнить, если это то, что делает winamp.

Наконец, если вы используете последовательные фильтры, вам не нужен отдельный коэффициент усиления node для каждой частоты, вы просто установите filter.gain.value для конкретных фильтров.

Ответ 2

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

source.connect(filter1);
filter1.connect(filter2);
filter2.connect(filter3);
filter3.connect(filter4);
filter4.connect(filter5);
filter5.connect(context.destination);

Ответ 3

Самое главное, с чем я запутался, - это то, как я "подключаю" источник к 10 фильтрам полосы частот (+ связанный коэффициент усиления node), поскольку все узлы имеют только один вход или выход (включая назначение).

Это правда, но не думайте об этом, как о физическом выходе, который может быть подключен только к другому физическому входу. Один вывод веб-аудио node может быть подключен к нескольким узлам, а node также может принимать несколько входов. Например, скажем, вы хотели бы параллельно подключить вход node через 5 фильтров, а затем объединить их вместе. Вы можете сделать что-то вроде этого:

source.connect(filter1);
source.connect(filter2);
source.connect(filter3);
source.connect(filter4);
source.connect(filter5);

filter1.connect(context.destination);
filter2.connect(context.destination);
filter3.connect(context.destination);
filter4.connect(context.destination);
filter5.connect(context.destination);

Ключевое понимание здесь заключается в том, что вызов .connect несколько раз не переключает вывод на другой node, а просто добавляет дополнительные выходные соединения. Другими словами, это "система вентилятора/вентилятора".