Создание 10-полосного эквалайзера с помощью Web Audio API
Я пытаюсь обернуть голову с помощью веб-аудио API, чтобы воссоздать что-то вроде
10-полосный эквалайзер Winamp.
из того, что я могу собрать, я должен создать 10 Biquad Фильтров задайте их type
to 2 (для полосового фильтра) и установить их frequency
to [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-полосного эквалайзера?
главное, что меня смущает, - это то, как я "подключаю" источник к 10 частотным полосовым фильтрам (+ связанный узел усиления), поскольку все узлы имеют только один вход или выход (включая назначение).
3 ответов
Как сказал Мэтт D, не должно быть никаких проблем с подключением фильтров к тому же месту назначения.
однако я бы сказал, что вы, вероятно, хотите использовать фильтры с типом 5 (пик), который пропускает все частоты и только усиливает/уменьшает частоту, на которой вы установили соответствующий фильтр.частота.значение. Это позволяет подключать фильтры последовательно, так что вам не нужно 10 отдельных звуковых путей. Вы также можете рассмотреть возможность использования фильтра с низкой полкой в качестве первого фильтра и фильтр hi-shelf как десятый, который довольно распространен в эквалайзерах. Я не могу вспомнить, делает ли это winamp.
наконец, если вы идете с фильтрами пика последовательно, вам не нужен отдельный узел усиления для каждой частоты, вы просто устанавливаете фильтр.прибыль.значение для конкретных фильтров.
подключив каждый фильтр к месту назначения, вы создаете 5 путей (маршрутов), чтобы услышать пятикратное усиление исходного звука. Это неправильный путь. Вы должны соединить каждый фильтр в одну линию.
source.connect(filter1);
filter1.connect(filter2);
filter2.connect(filter3);
filter3.connect(filter4);
filter4.connect(filter5);
filter5.connect(context.destination);
главное, что меня смущает, - это то, как я "подключаю" источник к 10 частотным полосовым фильтрам (+ связанный узел усиления), поскольку все узлы имеют только один вход или выход (включая назначение).
это правда, но не думайте об этом как о физическом выходе, который может быть подключен только к другому физическому входу. Один выход узла веб-аудио может быть подключен к нескольким узлам, и узел также может получать несколько входов. Например, предположим, вы хотите связать входной узел через 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);
ключевое понимание здесь-это вызов .подключить несколько раз не переключит выход на другой узел, а просто добавить дополнительные выходные соединения. Другими словами, это система" fan out/fan in".