Подтвердить что ты не робот

Как сдвинуть/модулировать частоту звукового буфера с помощью API веб-аудио

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

Проблема заключается в том, что я видел множество алгоритмов для изменения синтезированных греческих волн, но ничего не изменил частоту звукового образца. Вот пример моего кода, чтобы лучше понять, как я пытаюсь реализовать это:

// Guitar chord buffer    
var chordBuffer = null;

// Create audio context
var context = new webkitAudioContext();

// Load sound sample
var request = new XMLHttpRequest();
request.open('GET', 'chord.mp3', true);
request.responseType = 'arraybuffer';
request.onload = loadChord;
request.send();

// Handle guitar string "pluck"
$('.string').mouseenter(function(e){
    e.preventDefault();

    var source = context.createBufferSource();
    source.buffer = chordBuffer;

    // Create javaScriptNode so we can get at raw audio buffer
    var jsnode = context.createJavaScriptNode(1024, 1, 1);
    jsnode.onaudioprocess = changeFrequency;

    // Connect nodes and play
    source.connect(jsnode);
    jsnode.connect(context.destination);
    source.noteOn(0);
});

function loadChord() {
    context.decodeAudioData(
        request.response,
        function(pBuffer) { chordBuffer = pBuffer; },
        function(pError) { console.error(pError); }
    );
}

function changeFrequency(e) {
    var ib = e.inputBuffer.getChannelData(0);
    var ob = e.outputBuffer.getChannelData(0);
    var n = ib.length;

    for (var i = 0; i < n; ++i) {
        // Code needed...
    }
}

Итак, у вас есть это - я могу воспроизвести звук просто отлично, но я немного потеряю, когда придет к созданию кода в функции changeFrequency, которая изменит частоту выборки аккордов, поэтому это звучало как другая позиция лада на струне. Любая помощь с этим кодом была бы оценена или мнения о том, что я пытаюсь сделать, даже возможно.

Спасибо!

4b9b3361

Ответ 2

playbackRate изменит высоту звука, а также время воспроизведения.

Если вы хотите изменить только высоту тона, возможно, вы можете использовать сдвиг высоты тона. Проверьте мою реализацию javacript pitch shifter здесь и ее использование с JavascriptNode в этом плагине