【问题标题】:Web Audio API - Removing filterWeb Audio API - 移除过滤器
【发布时间】:2016-04-14 08:53:09
【问题描述】:

我正在构建具有多种图形模式的可视化器。对于其中一些,我需要计算正在播放的曲目的节拍,据我所知,然后我需要应用如下所示的低通滤波器,以增强最有可能保持鼓声的频率:

var filter = context.createBiquadFilter();

source.connect(filter);
filter.connect(context.destination);

filter.type = 'lowpass';

但是如果我想关闭过滤器怎么办?每次我需要卸下过滤器时,是否必须重新连接信号源?这会对性能产生负面影响吗?

相关问题:如果我有两个来自同一音频源的两个源并将过滤器应用于其中一个,我会遇到多少性能损失?

【问题讨论】:

  • 我不明白。为什么不能直接将单个音频源连接到目标,连接到过滤器,然后再连接到用于确定 bpm 的任何东西?
  • @JohnWhite 我的问题是我想在对所有频率做出反应的可视化器和仅对节拍做出反应的可视化器之间切换。你是说我总是有两个来源,一个总是连接到过滤器?

标签: javascript html5-audio web-audio-api


【解决方案1】:

如果我有两个来自同一个音频源的两个源并将过滤器应用于其中一个,我会遇到多少性能损失

您可以将单个音频节点连接到多个目标,因此您永远不需要复制源来扩展连接它。如果您同时需要过滤和原始音频,您可以相应地设置您的连接:

var filter = context.createBiquadFilter();

source.connect(filter);
source.connect(context.destination);
filter.connect(context.destination);

filter.type = "lowpass";

无论如何,将 FilterNode 的 type 属性设置为 "allpass" 将有效地禁用所有过滤,而无需重新连接:

filter.type = "allpass"

【讨论】:

  • 谢谢!我在考虑全通,但根据 MDN,它“让所有频率通过,但改变了各个频率之间的相位关系”。我害怕相变。
【解决方案2】:

根据文章WebAudio intro | html5rocks,我必须通过断开源和自身来打开和关闭过滤器,如下所示:

  this.source.disconnect(0);
  this.filter.disconnect(0);
  // Check if we want to enable the filter.
  if (filterShouldBeEnabled) {
    // Connect through the filter.
    this.source.connect(this.filter);
    this.filter.connect(context.destination);
  } else {
    // Otherwise, connect directly.
    this.source.connect(context.destination);
  }

【讨论】:

  • 如果有人提出更好的解决方案,我将保留我的问题。
  • 另一种选择:在滤波器输出和 context.destination 之间粘贴一个增益节点。当您不再关心滤波器输出时,将增益设置为 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2020-02-22
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多