我编写了以下代码来播放带有轮廓低通滤波器的音符:
var ac = new AudioContext;
var master = ac.createGain();
master.connect(ac.destination);
master.gain.value = 0.7;
var filter = ac.createBiquadFilter();
filter.connect(master);
filter.type = 'lowpass';
filter.Q.value = 2;
var osc = ac.createOscillator();
osc.connect(filter);
osc.type = 'square';
osc.frequency.value = 55;
var now = ac.currentTime;
osc.start(now);
//osc.stop(now+0.2);
filter.frequency.setValueAtTime(0, now);
filter.frequency.linearRampToValueAtTime(440, now+0.02);
filter.frequency.linearRampToValueAtTime(0, now+0.12);
音符按预期发出声音(滤波器快速打开,然后完全关闭得慢一点)但在最后,我可以听到咔嗒声。音符越低,咔嗒声越大。
我已经尝试取消注释注释行,并为主人添加轮廓,但没有任何效果。
编辑:通过“向主人添加轮廓”我的意思是我尝试在过滤器达到0的同时将主增益降低到0 正好。不行。
如何阻止音符末尾的点击?
答案 0 :(得分:1)
直观地说,将滤波器降低到零应该切断所有信号,滤波器不会切断"切断"所有信号高于指定频率。因此,即使使用您已创建的过滤器,您也应该期望信号中存在一些能量。
然而,滤波器DO切断信号与这些信号离截止频率的距离成正比。因此,完全合理的是,信号越低,关闭它的声音就越大(因为较低的频率更接近零截止值,因此滤波器的衰减更少)。
您可以通过在调度信号完全停止之前立即对信号的GAIN进行线性斜坡来解决此问题。您可以在最后一毫秒左右减速以避免弹出。
答案 1 :(得分:0)
描述"为主人添加轮廓"装置
在您的示例中,我会在滤波器频率变为0之前将主增益降至零。