Тон.переключение высоты и Howler.js проблемы

#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. Справедливый. Тогда я задам еще один вопрос, спасибо вам за помощь.