网络音频 API - 具有 'triangle' 形状的 LFO 连接到 biquadFilter clicks

Web audio API - LFO with 'triangle' shape connected to biquadFilter clicks

我有一个低频振荡器连接到双二阶滤波器。

当 LFO 增益大于当前 biquadFilter.frequency.value 时,会导致明显的音频点击。

有没有办法阻止这种点击?

biquadFilter 上面有一个包络,所以在键盘上按下一个音符后,频率会上下扫描。

这就是我认为正在发生的事情:

这是我希望发生的事情:

这是一个最小的例子: http://codepen.io/js-bs/pen/bgyZPx

var audioContext = new AudioContext();
var masterGain = audioContext.createGain()
masterGain.connect(audioContext.destination)
masterGain.gain.value = .3;

// Filter
var filter = audioContext.createBiquadFilter();
filter.type = 'lowpass'
filter.frequency.value = 0;
filter.connect(masterGain);

// Oscillator
var osc = audioContext.createOscillator();
osc.frequency.value = 440;
osc.type = 'square';
osc.start();
osc.connect(filter);

// LFO
var lfo = this.audioContext.createOscillator();
var lfoGain = this.audioContext.createGain();
lfo.type = 'triangle';
lfo.start();
lfo.connect(lfoGain);
lfo.frequency.value = 5;
lfoGain.gain.value = 10000;
lfoGain.connect(filter.frequency);

document.addEventListener('click', function(e){
  if(e.target.id==='lfo' && e.target.checked){
    lfo.connect(lfoGain);
  } else if (e.target.id==='lfo') {
    lfo.disconnect();
  }
})

document.addEventListener('mousedown', filterEnvelopeOn);
document.addEventListener('mouseup', filterEnvelopeOff);

function filterEnvelopeOn () {
  let now = audioContext.currentTime;
  let frequency = filter.frequency;
  let attack = 0.5;
  let decay = 0.4;
  let sustain = 200;

  let freq = 10000;
  frequency.cancelScheduledValues(0)
  frequency.setValueAtTime(60, now)
  frequency.linearRampToValueAtTime(freq, now + attack)
  frequency.linearRampToValueAtTime(sustain, now + attack + decay)
}

 function filterEnvelopeOff () {
   filter.frequency.cancelScheduledValues(0);
   let now = audioContext.currentTime;
   let frequency = filter.frequency;
   let release = 0.1;
   frequency.cancelScheduledValues(0);
   frequency.setValueAtTime(frequency.value, now);
   frequency.linearRampToValueAtTime(0, now + release);
  }

答案不会让你满意,但就是这样。

当音频信号下降太强时会发生咔哒声。也许您的 LFO 中存在逻辑错误 => 当 LFO 降至 0 以下时,它开始发出咔哒声。这是很正常的行为。请参阅我的网站 gtube.de 和数据库 "dubstep like 2" 中的 select,如果您随后将用作放大器的 "GAIN 2" 的数量减少到 1999,您也可以听到咔嗒声不要越过过滤器的 0 边界,它不会点击。

=> 如果您想听听示例,midi 目前无法正常工作。

如果我更改我的代码笔示例代码:

lfoGain.connect(filter.frequency);

至:

lfoGain.connect(filter.detune);

咔嗒声消失了,合成器听起来像我想要的那样。

如果有人能解释为什么这样做会有所帮助,我会将您的回答标记为已接受。

如果我改成

lfoGain.connect(filter.detune); 

声音本身对我来说已经消失了。我无法重现它。

如果你想让点击消失,我将增益量减少到

 lfoGain.gain.value = 2000; 

然后它就不会点击了,你就得到了很好的 "wable" 效果。

或者您只是不想要这种摇摆效果?

您还可以将 wable 所需的时间减少到:

lfo.frequency.value = 1;

所以它没有点击。如果声音下降得太快,就会发生咔哒声。如果曲线下降得太快而不是点击。每个合成器上始终无处不在!这是正确的答案:)

If I change my codepen example code from :

lfoGain.connect(filter.frequency);

to :

lfoGain.connect(filter.detune);

The audible clicking is gone, and the synth sounds as I intend it to.

If anyone can explain why this works that would be helpful and I'll mark your answer as accepted.

当您将 AudioNodes 连接到 AudioParam 时,该 AudioParam 将其值作为 AudioNodes 的所有输出加上它自己的值。在你的例子中,你的 lfoGain 输出的值范围从 -10000 到 +10000,因为振荡器的输出范围从 -1 到 1,然后这些值乘以你的 lfoGain.gain 值。

当你将 lfoGain 连接到频率时,你告诉频率在包络起音后立即在 0Hz 和 +20000Hz (10000 ± 10000) 之间振荡,在 -9800Hz 和 +10200Hz (200 ± 10000) 在你的延音下,在你的包络释放后在 -10000Hz 和 +10000Hz ( 0 ± 10000 ) 之间。

当您改为将 lfoGain 连接到失谐器时,计算出的频率将与您使用包络设置的频率值成比例地振荡。

computedFrequency(t) = frequency(t) * pow(2, detune(t) / 1200)

你现在告诉失谐值在 -10000cents 和 +10000cents (0 ± 10000) 之间振荡,这种振荡不是增加频率,而是将它乘以大约在 1/323 和 +10000cents 之间的值323.

紧接在包络起音后,振荡中计算的最小频率约为 31Hz,在延音时,最小值约为 0.62Hz,释放包络后,计算的频率范围在 0 和 0 之间(0/323, 0*323)。

这至少是它被告知要做的,实际实施可能会有所不同。