Изменение скорости звука с использованием API веб-аудио без изменения высоты тона

Можно ли изменить темп звука (в виде загруженных файлов MP3) без изменения высоты тона с помощью API веб-аудио?

Я знаю свойство playbackRate в AudioBufferSourceNode, но это также изменяет высоту тона. Я также знаю свойство playbackRate для элементов <audio> и <video>, но мне нужно использовать API веб-аудио.

Я очень новичок в API веб-аудио. Есть ли что-нибудь, что я могу сделать?

Ответ 1

Есть способ сделать это - он называется гранулярный синтез (ссылка указывает на ссылку в теории pd, но теория универсальна). Идея гранулярного синтеза заключается в том, что звук сэмплируется с исходной скоростью, но он воспроизводится с различной скоростью от каждой точки сэмплирования, однако с тем преимуществом, что высота звука не изменяется.

Эти ссылки на Github Web Audio Granular Synthesizer могут помочь вам (первая лучше): 1. Web-Audio-Granular-синтез 2. Еще одна ссылка на Github2

В случае неудачи с WebAudio, есть альтернатива; перенесите mp3 в Audacity и измените темп таким образом, а затем используйте новый файл! ;)

Поверьте, я понимаю вашу боль, я провел недели в универе, пытаясь сделать то же самое с pd-extended. Подошел, чтобы вырвать мои волосы. Мой профессор познакомил меня с концепцией гранулярного синтеза - спас день!

Удачи!

Ответ 2

Это не изначально (легко) поддерживается текущей версией WebAudio, но это возможно при использовании Tone.js:

let semitones = 3;
let source = new Tone.Player(AudioBuffer);
let shift = new Tone.PitchShift(semitones);
source.connect(shift);
shift.toMaster();
source.start();