Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Web音频API创建10频段均衡器_Javascript_Html5 Audio_Equalizer_Web Audio Api - Fatal编程技术网

Javascript 使用Web音频API创建10频段均衡器

Javascript 使用Web音频API创建10频段均衡器,javascript,html5-audio,equalizer,web-audio-api,Javascript,Html5 Audio,Equalizer,Web Audio Api,我正在尝试使用Web音频API来重新创建类似的内容 Winamp的10波段均衡器 (来源:) 根据我能收集到的信息,我必须创建10个,分别将其类型设置为,并将其频率设置为[60、170、310、600、1000、3000、6000、12000、14000、16000]。一旦我做到了这一点(这是我有点困惑的地方),我就会为每个频率“频带”创建一个单独的频带,并将其值绑定到一个滑块上 <input id="someFreqBand" type="range&qu

我正在尝试使用Web音频API来重新创建类似
的内容 Winamp的10波段均衡器


(来源:)

根据我能收集到的信息,我必须创建10个,分别将其
类型设置为,并将其
频率设置为
[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个增益节点连接到音频上下文
目的地
(我想这将使所有10个频率“频带”混合/同步在一起)。这是创建Web音频10频段均衡器的正确方法吗

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

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

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

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

然而,我想说的是,您可能希望使用类型5(峰值)的滤波器,它允许所有频率通过,并且仅在您设置相应filter.frequency.value的频率下放大/减小。这样,您就可以将过滤器串联起来,这样就不需要10条单独的音频路径。你也可以考虑使用一个低货架过滤器作为第一个过滤器,和一个HI货架过滤器作为第十,这是相当常见的均衡器。不过,我不记得winamp是否就是这么做的


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

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

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

除非我弄错了,否则所有图形均衡器都使用带通滤波器。参见第4页此处:低架/高架/峰值滤波器允许您直接在滤波器节点上调整增益,但不允许带通滤波器…我不确定是否所有图形均衡器都使用带通滤波器,但我确信,使用串联峰值过滤器将更容易获得您所追求的行为。正如Jagi提到的,过滤器应该串联连接。是的,我也是。:)当规范说:
numberOfInputs:1时,文档似乎很糟糕。numberOfOutputs:1.
当使用
1
时,它们的意思是
many
。我承认这可能更清楚,但该文档仍然是正确的。一个输出可以连接到多个输入。更像是考虑输出端口的数量,而不是输出。