网络音频 API - 播放时删除过滤器
Web Audio API - Removing filter while playing
是否可以在不中断播放的情况下删除过滤器节点?
据我了解,节点图必须重建为 "turn something off"?
我的图表如下所示:
Source-->GainNode-->LowpassFilter-->HighshelfFilter-->Destination
所以我想打开/关闭 HighshelfFilter,但如果不停止播放音频,它似乎不起作用。
我也尝试设置 filter.type = 'allpass';
但这会导致一些奇怪的声学效果。
最好的方法是设置并行连接,一个带过滤,一个直接,然后在它们之间交叉淡入淡出(即每个都有一个增益节点,其中一个增益节点设置为 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 的 "peaking" 型滤波器?不过,我不知道这将如何影响所有相位关系(这就是全通听起来很奇怪的原因)。
最后,一个不推荐的方法——您可以断开并重新连接节点。如果有活动音频,这将导致咔哒声或爆裂声。 (这就是上面指向的示例所做的。)
是否可以在不中断播放的情况下删除过滤器节点? 据我了解,节点图必须重建为 "turn something off"?
我的图表如下所示:
Source-->GainNode-->LowpassFilter-->HighshelfFilter-->Destination
所以我想打开/关闭 HighshelfFilter,但如果不停止播放音频,它似乎不起作用。
我也尝试设置 filter.type = 'allpass';
但这会导致一些奇怪的声学效果。
最好的方法是设置并行连接,一个带过滤,一个直接,然后在它们之间交叉淡入淡出(即每个都有一个增益节点,其中一个增益节点设置为 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 的 "peaking" 型滤波器?不过,我不知道这将如何影响所有相位关系(这就是全通听起来很奇怪的原因)。
最后,一个不推荐的方法——您可以断开并重新连接节点。如果有活动音频,这将导致咔哒声或爆裂声。 (这就是上面指向的示例所做的。)