javascript - the - Cómo desplazar/modular la frecuencia del búfer de audio con Web Audio API
web audio api play mp3 (2)
Estoy experimentando con Web Audio API y mi objetivo es crear una guitarra digital donde cada cuerda tenga una fuente de sonido inicial de una guitarra real tocando la cuerda abierta y luego me gustaría generar el resto de los sonidos de la posición del traste dinámicamente. Después de algunas investigaciones sobre el tema (todo esto es bastante nuevo para mí), parecía que esto podría lograrse alterando la frecuencia de la muestra de sonido fuente.
El problema es que he visto muchos algoritmos para alterar las ondas sintetizadas sin nada que altere la frecuencia de una muestra de audio. Aquí hay una muestra de mi código para dar una mejor idea de cómo estoy tratando de implementar esto:
// 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...
}
}
Así que ahí lo tiene - Puedo reproducir el sonido bien pero estoy un poco perdido cuando se trata de crear el código en la función changeFrequency que cambiaría la frecuencia de las muestras de acordes, por lo que sonaba como otra posición de traste en la cuerda. Cualquier ayuda con este código sería apreciada o las opiniones sobre si lo que estoy tratando de hacer es incluso posible.
¡Gracias!
playbackRate cambiará el tono del sonido, pero también su tiempo de reproducción.
Si quiere cambiar solo el tono, quizás pueda usar un pitch shifter. Comprueba aquí la implementación de mi cambio de tono de JavaScript y su uso con un JavascriptNode en este complemento
Puede obtener el comportamiento deseado configurando playbackRate
, pero como dice Brad, tendrá que usar multi-sampling. También vea esta pregunta ASÍ: establezca playbackRate en el elemento de audio conectado a la API de audio web .