Web Audio API - правильный способ остановки генератора, подключенного к огибающей выпуска
Я создаю полифонический синтезатор, используя WebAudioAPI
а также WebMIDIAPI
, У меня есть узел усиления для каждого из моих двух генераторов, который затем подключается к главному узлу усиления.
Мне было интересно, как правильно остановить (и удалить при необходимости?) Генератор после выпуска. Я не уверен, стоит ли звонить oscillator.stop()
а также delete
осциллятор из массивов.
Если я это сделаю, конверт релиза не работает, и заметка немедленно останавливается. Если нет, конверт релиза работает, но иногда нота может продолжать играть вечно.
РЕДАКТИРОВАТЬ: Кажется, что когда .stop()
функциональность не реализована, и две ноты одновременно воспроизводятся вместе, один из генераторов всегда будет включен. Не уверен, что это мой код или??
Мой код для noteOff
функция ниже:
/**
* Note is being released
*/
this.noteOff = function (frequency, velocity, note){
var now = this.context.currentTime;
// Get the release values
var osc1ReleaseVal = now + this.osc1Release;
var osc2ReleaseVal = now + this.osc2Release;
// Cancel scheduled values
this.oscGain.gain.cancelScheduledValues(now);
this.osc2Gain.gain.cancelScheduledValues(now);
// Set the value
this.oscGain.gain.setValueAtTime(this.oscGain.gain.value, now);
this.osc2Gain.gain.setValueAtTime(this.osc2Gain.gain.value, now);
// Release the note
this.oscGain.gain.linearRampToValueAtTime(0.0, osc1ReleaseVal);
this.osc2Gain.gain.linearRampToValueAtTime(0.0, osc2ReleaseVal);
// ----- IF I COMMENT THE `forEach` Loop the release works correctly but with side-effects!
// Stop the oscillators
this.oscillators[frequency].forEach(function (oscillator) {
oscillator.stop(now);
oscillator.disconnect();
delete oscillator;
});
};
Любая помощь будет принята с благодарностью, спасибо!
1 ответ
Не использовать oscillator.stop(now)
, использование oscillator.stop(osc1ReleaseVal)
запланировать остановку генератора одновременно с усилением, равным 0.
Вам не нужно отключать и удалять генераторы. После остановки генератор может самостоятельно отключиться от узла усиления. Если вы отбросите ссылку на осциллятор, это может быть мусором.