#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);