sto sperimentando con l'API Audio Web e il mio obiettivo è quello di creare una chitarra digitale dove ogni stringa ha una sorgente sonora iniziale di una chitarra reale suonare la corda libera e quindi vorrei generare dinamicamente tutti gli altri suoni di posizione del tasto. Dopo alcune ricerche sull'argomento (questo è tutto abbastanza nuovo per me) sembrava che questo potesse essere ottenuto alterando la frequenza del campione sonoro sorgente.Come spostare/modulare la frequenza del buffer audio utilizzando API Web Audio
Il problema è che ho visto un sacco di algoritmi per alterare le onde peccato sintetizzati ma nulla per modificare la frequenza di un campione audio. Ecco un esempio del mio codice per dare una migliore idea di come sto cercando di implementare questa:
// 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...
}
}
Così là lo avete - posso giocare il suono bene, ma sono ad un po 'di perdere quando si tratta di creare il codice nella funzione changeFrequency che cambierebbe la frequenza dei campioni di accordi in modo che suonasse come un altro tasto sulla corda. Qualsiasi aiuto con questo codice sarebbe apprezzato o opinioni su se quello che sto tentando di fare è anche possibile.
Grazie!
Stai facendo un campionatore. Hai intenzione di volere molti più campioni di una singola stringa. Come minimo, vorrai due campioni per ottava se vuoi un suono decente. Anche allora, una chitarra è uno strumento molto complesso da ricreare con semplici campioni. – Brad