El Buffer

El Buffer de Audio

Según su especificación, esta interfaz representa la capacidad de memoria de audio a utilizar para procesar la señal. El formato de codificación que utiliza es una PCM lineal de 32 Bits normalizada a +-1, y puede contener uno o más canales.

Atributos

  • Frecuencia de muestreo: o sampleRate, la frecuencia de muestreo de la señal PCM de audio en muestras por segundo
  • Longitud: Tendremos acceso a la longitud de la la señal PCM de audio en muestras o samples mediante el atributo length.
  • Duración: Duración de la señal de audio PCM en segundos.
  • Numero de canales de audio: número de canales del buffer.

Métodos y parámetros

  • getChannel: este método nos devuelve un vector o array de 32 bits de valores reales (float) que representa la los datos de la señal PCM de audio de un canal específico

Nodo Fuente de Buffer de Audio

La interfaz representa una fuente de audio de la memoria del Buffer de Audio. Es útil para reproducir fragmentos de audio cortos en un entorno que requiera flexibilidad. Iniciaremos los sonidos con el método start() y la salida representará el flujo de datos de audio. Cuando El buffer de datos haya sido reproducido por completo, se cortará la reproducción.

Atributos

  • Buffer: Representa la porción de audio a reproducir.
  • Ratio de reproducción: o playBackrate, para definir la velocidad con que se renderiza la cadena de audio.
  • Loop: Indica si el audio se repite definidamente.
  • Comienzo y fin del loop: con los atributos loopStart y loopEnd. Un valor opcional en segundos.

Métodos y parámetros

  • Start: Lo utilizamos para programar la reproducir el sonido. Podemos especificar cuándo se reproducirá el sonido, con el parámetro when, en segundos, en la coordenada de tiempo actual del contexto de audio, la que podemos extraer con AudioContext.currentTime. También podremos especificar un retraso con el parámetro offset y una duración, con duration.
  • Stop: Describe a qué tiempo el sonido dejará de reproducirse. En la misma coordenada de tiempo del Contexto de Audio, podremos ejecutarlo siempre después de un start()
  • .

Cargando sonidos

La Web Audio API utiliza un AudioBuffer para los sonidos de corta y media longitud. El enfoque básico de carga es el uso de XMLHttpRequest, una petición vía http al servidor, para buscar los archivos de sonido.

En nuestro contexto de audio, podemos utilizar archivos de datos de audio en varios formatos, como WAV, MP3, AAC, OGG y otros. La compatibilidad con navegadores para diferentes formatos de audio varía según esta tabla.

El siguiente código muestra la carga de un archivo de sonido:


        // Damos la instrucción de ejeuctar inciar(); más adelante
        windiow.onload= iniciar();
        var mibuffer;
        var contextoDeAudio;
        // Declaramos la función cargarSonido(), que requerirá el archivo por petición asíncorna XMLHTTP
     function cargarSonido(url) {
        var peticion = new XMLHttpRequest();
        peticion.open('GET', url, true);

        // Especificamos el tipo de respuesta:
        peticion.responseType = 'arraybuffer';
		 //cuando cargue decodificamos los datos de audio y los introducimos como una PCM en la variable mi buffer
		 peticion.onload = function(){
			contextoDeAudio.decodeAudioData(peticion.response, function(elbuffer){
				mibuffer=elbuffer;
				});
			}
    	peticion.send();
	}
            

Los datos de audio del archivo son binarios (no de texto), por lo que establecemos el tipo de respuesta responseType de la solicitud como 'arraybuffer', para almacenarlos temporalmente y poder trabajar con ellos. Para obtener más información acerca de ArrayBuffers, puedes leer la especificación sobre las peticiones XMLHttpRequest.

Una vez que los datos del archivo de audio (no decodificado) han sido recibidos, que pueden conservarse para una decodificación posterior, o puede ser decodificado de forma inmediata utilizando el método AudioContext decodeAudioData(). Este método toma del ArrayBuffer los datos del archivo de audio almacenados en peticion.response, la respuesta de nuestra petición, y decodifica de forma asíncrona (no bloquea el proceso principal de JavaScript en ejecución).

Cuando decodeAudioData() ha terminado, se llama a una función de devolución que proporciona los datos de audio PCM decodificado como AudioBuffer.

El siguiente fragmento de código muestra el proceso general para reproducir un sonido:

  1. Cargamos el sonido
  2. Creamos una fuente de audio con los datos contenidos en el buffer con el método createBufferSource.
  3. Conectamos la fuente al destino, en este caso el nodo contextoDeAudio.destination que representa el final de la cadena de audio y será lo que escuchemos en los altavoces del dispositivo.

        // Damos la instrucción de ejeuctar inciar(); más adelante
        function iniciar(){
        //Cramos el contexto de audio
        contextoDeAudio = new webkitAudioContext;
        //Llamamos a la función cargar sonido con la ruta de nuestro archivo de audio
        cargarSonido(/nuestroaudio.mp3);
        //creamos la fuente
        var fuente = contextoDeAudio.createBufferSource();
        fuente.connect(contextoDeAudio.destination);
        //Reproducimos la fuente desde el segundo 0
        fuente.start(0);
        
        }