我有一个连接到biquadFilter的LFO。
当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);
}
答案 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;
所以它不会点击。如果声音下降太快,则会发生咔嗒声。如果曲线下降太快而不是点击。每个合成器总是到处都是!这是正确答案:)