#javascript #web-audio-api #howler.js #tone.js #pitch-shifting
Вопрос:
Мне нравится использовать Howler.js для моего (метеорного) приложения. Однако функция скорости воспроизведения вызывает сдвиг высоты тона, которого я не хочу (я просто хочу растянуть время и сохранить высоту тона). Поэтому мое решение состояло в том, чтобы реализовать сдвиг высоты тона, чтобы «исправить» высоту тона. Казалось достаточно простым, вот почему я решил использовать https://tonejs.github.io/
Единственная проблема в том, что я ни за что на свете не смогу заставить его работать правильно. После нескольких часов чтения веб-аудио API и Tone.js документация и онлайн-форумы для обсуждения/устранения неполадок, наиболее близким к потенциальному решению, которое я получил, было что-то вроде этого (вызывается во время рендеринга моего приложения, на случай, если проблема связана с преждевременной загрузкой):
Tone.setContext(Howler.ctx); //set tone's context to the Howler.js audiocontext
var pShift = new Tone.PitchShift(3); //create the PitchShift effect, 3 semi-tones transposition
pShift.context = Howler.ctx; //set the PitchShift's context to the Howler.js audiocontext
pShift.connect(Howler.ctx.destination); //connect the PitchShift's output to the Howler's destination
Howler.masterGain.connect(pShift); //connect the Howler's master GainNode output to the PitchShift effect
//For debugging purposes:
console.log(Howler.masterGain)
console.log(pShift);
Когда я запускаю это, я получаю это сообщение об ошибке:
Исключение из функции afterFlush трекера: meteor.js?hash=857dafb4b9dff17e29ed8498a22ea5b1a3d6b41d:Ошибка типа 1059: Не удалось выполнить «подключение» на «AudioNode»: Не удалось разрешить перегрузку.
Я также заметил, что команды console.log (), приведенные ниже, как ни странно, даже не отображаются в консоли. Однако они появляются, когда я удаляю последнюю строку (mastergain.подключаюсь к pShift).
Я попробовал несколько других методов, таких как https://github.com/mmckegg/soundbank-pitch-shift/ (который работал, но он играл на поле сместился звук и не сдвинуты шаг звук, независимо от того, какие настройки я ставлю на это), или просто через AudioBufferSourceNode.расстроить (я не смог выяснить, как заставить его работать с Howler.js потому что Ревун только имеет функции, которые могут подвергнуть GainNode и AudioContext, не смог выяснить, как читать вывод оттуда, а еще через Ревун).
Любая помощь/зацепки будут очень признательны!
Ответ №1:
Я думаю, что вам не нужна 3-я строка в вашем фрагменте. Так как ваша первая строчка говорит Tone.js для использования AudioContext
созданного howler.js уже. Поэтому pShift.context
должно быть равно Howler.ctx
. Но, возможно, имеет смысл перепроверить.
console.assert(pShift.context === Howler.ctx);
masterGain
Подвергшиеся воздействию howler.js является собственным аудиоузлом. Это означает, что он не может быть подключен к узлу, созданному с помощью Tone.js непосредственно, так как это не собственные аудиоузлы. Но Tone.js предлагает помощника для этого.
Tone.connect(Howler.masterGain, pShift);
Я думаю, что вам также нужно позвонить disconnect()
masterGain
, чтобы удалить все существующие соединения.
Следующий фрагмент должен работать.
Tone.setContext(Howler.ctx);
const pShift = new Tone.PitchShift(3);
Howler.masterGain.disconnect();
Tone.connect(Howler.masterGain, pShift);
pShift.toDestination();
Комментарии:
1. Спасибо, вы спасли мне жизнь!! Можно ли издавать определенные звуки, не подверженные изменению высоты тона? Когда я пытаюсь быстро переключить звуки, которые я не хочу переключать, перед их воспроизведением, а затем вернуться после, это оставляет этот «двойной звук», когда один звук отстает на крошечную долю секунды.
2. Я не уверен, что правильно понял ваш вопрос.
Tone.PitchShift
вызывает небольшую задержку. Может быть, это то, что вы испытываете. Существует также возможность обойти эффект с помощьюwet
параметра. Но я думаю, что лучше всего превратить это в новый вопрос, чтобы все здесь могли ответить.3. Справедливый. Тогда я задам еще один вопрос, спасибо вам за помощь.