Web音频API - 具有“三角”形状的LFO连接到biquadFilter点击

时间:2017-02-16 21:29:41

标签: web-audio

我有一个连接到biquadFilter的LFO。

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

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

biquadFilter上有一个信封,因此在按下键盘上的音符后,频率会上下扫描。

这就是我的想法:

LFO cutting through envelope value.

这就是我想要发生的事情: LFO respecting the filter.

这是一个最小的例子: 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);
  }

4 个答案:

答案 0 :(得分:1)

  

如果我更改了我的codepen示例代码:

     

lfoGain.connect(filter.frequency);

     

到:

     

lfoGain.connect(filter.detune);

     

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

     

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

当您将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和323之间的值。

在包络攻击之后,振荡中的最小计算频率约为31Hz,在维持时,最小值约为0.62Hz,并且在包络释放后,计算出的频率范围在0和0之间(0 / 323,0 * 323)。

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

答案 1 :(得分:0)

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

当音频信号下降过强时,会发生咔嗒声。也许你的LFO中有一个逻辑错误=>当LFO低于0时,它开始点击。这是非常正常的行为。请访问我的网站gtube.de并在数据库中选择" dubstep,如2"如果你从#34; GAIN 2"中减少了数量,你也可以听到咔嗒声。作为放大器到1999年你不会越过滤波器的0边界,它不会点击。

=>如果你想听听midi目前工作不正确的例子。

答案 2 :(得分:0)

如果我更改了我的codepen示例代码:

lfoGain.connect(filter.frequency);

到:

lfoGain.connect(filter.detune);

声音点击消失了,合成器听起来像我想要的那样。

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

答案 3 :(得分:0)

如果我改为

lfoGain.connect(filter.detune); 

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

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

 lfoGain.gain.value = 2000; 

然后它没有点击,你有这个漂亮的“wable”效果。

或者你只是不想要这种效果?

你也可以减少wable所需的时间:

lfo.frequency.value = 1;

所以它不会点击。如果声音下降太快,则会发生咔嗒声。如果曲线下降太快而不是点击。每个合成器总是到处都是!这是正确答案:)