У меня есть LFO, связанный с biquadFilter.Веб-аудио API - LFO с треугольной формой, связанной с кликами biquadFilter
Когда коэффициент усиления 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);
}
Можете ли вы создать небольшой пример? Мне не нравится читать и понимать, как использовать все библиотеки, которые вы используете. –
Да, я могу создать минимальное воспроизведение. Я не использую никаких веб-аудио-библиотек, а только стандартную библиотеку, когда речь заходит об аудио. Библиотеки, которые я использую, предназначены только для пользовательского интерфейса. – looshi
Это было бы замечательно. Благодаря! –