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.

Вам не нужно отключать и удалять генераторы. После остановки генератор может самостоятельно отключиться от узла усиления. Если вы отбросите ссылку на осциллятор, это может быть мусором.

Другие вопросы по тегам