如何防止在笔记末尾单击?

How can I prevent a click at the end of a note?

我编写了以下代码来使用波状低通滤波器播放音符:

    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);

音符听起来和预期的一样(过滤器打开很快,然后完全关闭的速度稍微慢一点)但在它的最后我能听到咔嗒声。音符越低,咔嗒声越大。

我已经尝试取消对注释行的注释,以及向母版添加轮廓,但没有任何效果。

编辑: "adding contour to the master" 我的意思是我尝试将主增益降低到 0 正好 同时过滤器达到 0。这不起作用。

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

描述 "adding a contour to the master" 的意思。

在你的例子中,我会在滤波器频率变为 0 之前将主增益降低到零。

虽然从直觉上讲,将滤波器降低到零应该会切断所有信号,但滤波器不会 "cut off" 所有高于指定频率的信号。因此,即使使用您创建的过滤器,您也应该期望信号中有一些能量。

但是,滤波器的截止频率与这些信号与截止频率的距离成正比。因此,完全有道理的是,你的信号越低,关闭它时的爆裂声就越大(因为较低的频率更接近你的零截止频率,因此被滤波器衰减得更少)。

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