ТРИ.Аудиофильтр не увеличивается с linearRampToValueAtTime

#three.js #web-audio-api

#three.js #web-audio-api

Вопрос:

У меня возникли небольшие проблемы при работе с linearRampToValueAtTime в биквадфильтре, применяемом к веб-аудио.
Звук работает нормально, и применяется начальный фильтр нижних частот.
Проблема в том, что как только я использую метод linearRamp для увеличения частоты, он, похоже, игнорирует параметр EndTime (или, что лучше, неправильно указывает время).

Некоторый код, чтобы объяснить это лучше.
Вот пример:

 this.audioLoader.load( 'public/media/soundtrack-es_cobwebs_in_the_sky.mp3', buffer => {
    this.sounds.soundtrack = new THREE.Audio(this.listener);
    const audioContext = this.sounds.soundtrack.context;

    this.biquadFilter = audioContext.createBiquadFilter();
    this.biquadFilter.type = "lowpass"; // Low pass filter
    this.biquadFilter.frequency.setValueAtTime(200, audioContext.currentTime);

    this.sounds.soundtrack.setBuffer(buffer);
    this.sounds.soundtrack.setFilter(this.biquadFilter);
    this.sounds.soundtrack.setVolume(0.5);
    this.sounds.soundtrack.play();
})
  

Пока все выглядит нормально. Звук воспроизводится приглушенным по мере необходимости.
Затем, после определенного события, происходит переход камеры, где я хочу, чтобы звук постепенно открывался.

В качестве параметра времени окончания я передаю 2 секунды дельту внутреннего контекста.

 this.sounds.soundtrack.filters[0].frequency.linearRampToValueAtTime(2400, 2   this.sounds.soundtrack.context.currentTime);
  

Ожидал услышать увеличение через две секунды, но звук открывается сразу.
Чего мне не хватает?

Ответ №1:

Линейное увеличение будет применено с использованием предыдущего события в качестве startTime . В вашем случае это будет audioContext.currentTime в тот момент времени, когда вы создали фильтр. Если это было достаточно давно, это будет звучать так, как будто рампа переходит прямо к конечному значению. Вы можете исправить это, вставив новое событие прямо перед увеличением.

 const currentTime = this.sounds.soundtrack.context.currentTime;
const filter = this.sounds.soundtrack.filters[0];

filter.frequency.setValueAtTime(200, currentTime);
filter.frequency.linearRampToValueAtTime(2400, currentTime   2);