Функция «Изменить аудиоплеер» стала аудиовходом Live Web с эффектом Pitch Shift - PullRequest
2 голосов
/ 18 марта 2019

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

Я пытался, но все равно не работает.Мне нужна помощь.

Это код:

function playSoundpitch(file, speed = 2, pitchShift = 1, loop = false, autoplay = true) {
    if (pitchShift) {
        audioCtx = new(window.AudioContext || window.webkitAudioContext)();
        source = audioCtx.createBufferSource();


        var gainNodex = audioCtx.createGain();
        gainNodex.gain.value = 2; // double the volume


        request = new XMLHttpRequest();

        request.open('GET', file, true);

        request.responseType = 'arraybuffer';


        request.onload = function() {
            var audioData = request.response;

            audioCtx.decodeAudioData(audioData, function(buffer) {
                    myBuffer = buffer;
                    songLength = buffer.duration;
                    source.buffer = myBuffer;
                    source.playbackRate.value = speed;
                    source.loop = loop;
                    //source.connect(audioCtx.destination);

                    source.connect(gainNodex);
                    gainNodex.connect(audioCtx.destination);

                    source.onended = function() {};
                },

                function(e) {
                    "Error with decoding audio data" + e.error
                });

        }

        request.send();
        source.play = source.start

    } else {
        source = new Audio(file)
        source.playbackRate = speed
        source.loop = loop
    }
    if (autoplay) {
        source.play()
    }
    return source
}

var source;
source = playSoundpitch('https://sampleswap.org/samples-ghost/VOCALS%20and%20SPOKEN%20WORD/Native%20American/1392[kb]sheshone-native-vox2.wav.mp3', pitch = 0.8);

1 Ответ

0 голосов
/ 18 марта 2019

Посмотрите на эту страницу: https://alligator.io/js/first-steps-web-audio-api/

Часть, относящаяся к вашему вопросу, находится внизу:

/* The frequency (in Hz) of Bb4 is 466.16 */
oscillator
  .frequency
  .setValueAtTime(466.16, audioContext.currentTime);

Примечаниезаключается в том, что сначала создается объект «осциллятор», а затем в коде шаг узла можно регулировать в потоке с помощью приведенного выше кода.Вы уже создали свой узел (то, что вы называете своим audioCtx объектом).Этот объект имеет значение частоты, которое должно быть изменено на лету.Случай выше для статического изменения высоты тона.Вам нужно будет одновременно получить частоту, а затем изменить ее по разнице желаемой высоты тона и использовать setValueAtTime для обновления этого значения.

В качестве альтернативы, вы можете установить этот пакет и использовать его дляработать с изменением высоты тона проще:

https://github.com/mmckegg/soundbank-pitch-shift

Наконец, есть другое решение, использующее объект AudioContext, найденный здесь (с использованием метода detune): https://codepen.io/qur2/pen/emVQwW

...