17

我正在尝试使用 Web Audio API 重新创建类似
Winamp 的 10 波段均衡器的东西。

Winamp 的 10 段均衡器
(来源:head-fi.org

据我所知,我必须创建 10 个双二阶滤波器,将它们设置type2(对于带通滤波器)并将它们分别设置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 个频率“波段”并将它们混合/同步在一起)。这是创建 Web 音频 10 频段均衡器的正确方法吗?

我感到困惑的主要事情是我如何将源“连接”到 10 个频带滤波器(+ 相关的增益节点),因为所有节点只有一个输入或输出(包括目标)。

4

3 回答 3

15

通过将每个过滤器与目标连接,您将创建 5 条路径(路线),因此您将听到源声音的五倍放大。这不是正确的方法。您必须将每个过滤器连接成一行。

source.connect(filter1);
filter1.connect(filter2);
filter2.connect(filter3);
filter3.connect(filter4);
filter4.connect(filter5);
filter5.connect(context.destination);
于 2013-04-09T06:36:22.983 回答
10

正如 Matt D 所说,将过滤器连接到同一目的地应该没有问题。

但是,我会说您可能想要使用类型为 5(峰值)的滤波器,它允许所有频率通过,并且仅在您设置相应 filter.frequency.value 的频率处放大/降低。这使您可以串联过滤器,因此您不需要 10 个单独的音频路径。您还可以考虑将低架滤波器用作第一个滤波器,将高架滤波器用作第十个滤波器,这在均衡器中很常见。不过,我不记得这是否是 winamp 所做的。

最后,如果您串联使用峰值滤波器,则不需要为每个频率单独设置增益节点,只需为特定滤波器设置 filter.gain.value。

于 2012-10-10T12:29:03.350 回答
2

我感到困惑的主要事情是我如何将源“连接”到 10 个频带滤波器(+ 相关的增益节点),因为所有节点只有一个输入或输出(包括目标)。

确实如此,但不要将其视为只能连接到另一个物理输入的物理输出。Web Audio 节点的单个输出可以连接多个节点,一个节点也可以接收多个输入。例如,假设您想通过 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 不会将输出切换到不同的节点,而只会添加额外的输出连接。换句话说,它是一个“扇出/扇入”系统。

于 2012-10-09T19:47:44.367 回答