Я экспериментирую с 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, которая изменит частоту выборки аккордов, поэтому это звучало как другая позиция лада на струне. Любая помощь с этим кодом была бы оценена или мнения о том, что я пытаюсь сделать, даже возможно.
Спасибо!