如何防止笔记末尾的点击?

时间:2017-04-28 20:29:45

标签: javascript web-audio

我编写了以下代码来播放带有轮廓低通滤波器的音符:

    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 正好。不行。

如何阻止音符末尾的点击?

2 个答案:

答案 0 :(得分:1)

直观地说,将滤波器降低到零应该切断所有信号,滤波器不会切断"切断"所有信号高于指定频率。因此,即使使用您已创建的过滤器,您也应该期望信号中存在一些能量。

然而,滤波器DO切断信号与这些信号离截止频率的距离成正比。因此,完全合理的是,信号越低,关闭它的声音就越大(因为较低的频率更接近零截止值,因此滤波器的衰减更少)。

您可以通过在调度信号完全停止之前立即对信号的GAIN进行线性斜坡来解决此问题。您可以在最后一毫秒左右减速以避免弹出。

答案 1 :(得分:0)

描述"为主人添加轮廓"装置

在您的示例中,我会在滤波器频率变为0之前将主增益降至零。