Web Audio API - 播放时删除过滤器

时间:2017-11-18 16:15:40

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

是否可以在不中断播放的情况下删除过滤节点? 据我所知,必须重建节点图以“关闭某些东西”?

我的图表如下所示:

Source-->GainNode-->LowpassFilter-->HighshelfFilter-->Destination

所以我想打开/关闭HighshelfFilter,但是如果不停止播放音频,它似乎无法正常工作。

我也尝试设置filter.type = 'allpass';,但这会导致一些奇怪的声学效果。

1 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是设置并行连接,一个使用过滤,一个直接连接,然后在它们之间交叉淡入淡出(即每个都有一个增益节点,其中一个增益节点设置为0.0,一个设置为1.0 )。路由看起来像这样:

Source-->GainNode1-->LowpassFilter-->HighshelfFilter-->Destination
      ↳->GainNode2-----------------------------------↗︎

首先将其中一个增益节点设置为0.0,将其中一个设置为1.0,然后在它们之间切换,如下所示:

// activate the filters - using setTarget to do a fast crossfade will avoid clicks
gainNode1.gain.setTargetAtTime(1.0, audioCtx.currentTime + 1, 0.001);
// deactivate the direct line
gainNode2.gain.setTargetAtTime(0.0, audioCtx.currentTime + 1, 0.001);

您可以按照建议对过滤器本身进行更改,使其不会产生任何重大影响。而不是全通,可能尝试使用.gain为0.0的高峰"类型过滤器?我不确切地知道这将如何影响所有相位关系(这就是为什么allpass听起来很奇怪)。

最后,一种不推荐的方法 - 您可以断开连接并重新连接节点。如果有活动音频,这将导致咔嗒声或砰砰声。 (这就是上面提到的样本。)