Compresor

% Completo

Descripción

El compresor de rango dinámico es una herramienta muy común en la producción musical y el desarrollo de aplicaciones interactivas de audio.

Nos permite reducir los niveles más altos de señal para prevenir la distorsión.

En este ejemplo se ha colocado un nodo compresor al final de la cadena de audio, un nodo analizador para dibujar el espectro de frecuencias y un medidor experimental de dB.

Compresor:

  •  Volumen:

     x 1+0dB

  •  Zoom 

    Tamaño de la muestra de frecuencia 2*∫ x 

El nodo analizador, que toma los datos de señal de audio del nodo compresor, calcula el máximo valor y lo presenta en pantalla sobre un elemento canvas, a modo de indicador de nivel de dB de salida.

Para crear un nodo compresor de señal utilizamos la interfaz createDynamicsCompressor a la que podemos pasar los siguientes atributos para ajustar la dinámica de nuestra señal:

threshold // en Decibelios
Valor en decibelios sobre los que la compresión comienza a hacer efecto
knee; // en Decibelios
Rango sobre el umbral (threshold) en el que el compresor comienza a hacer efecto
ratio; // en enteros
cantidad de dBs en que cambia la entrada para un cambio de 1 dB en la salida
reduction; // en Decibelios
reducción de ganancia en dBs a aplicar
attack; // en segundos
Tiempo para reducir la ganancia 10 dBs
release; // en segundos
Tiempo para incrementar la ganancia 10 dBs

Para medir la reducción del compresor de forma gráfica, se ha creado un medidor de nivel de dB que grafica la señal de audio a la salida del compresor. Mediante un cálculo matemático básico se escalan los datos de amplitud de la señal de valores lineales a logarítmicos, en decibelios.

Para realizar esta operación se utiliza el nodo de procesado de Javascript o ScriptProcessorNode, el cual permite trabajar los datos de la señal de audio en las mismas coordenadas de tiempo que nuestro Contexto de Audio y realizar cualquier tipo de operación matemática de forma eficiente.

A partir el método .onaudioprocess, que permite a nuestra función de procesado JavaScript ejecutarse a la par que la cadena de audio, se han extraído porciones de la señal de audio en el dominio del tiempo, en intervalos de 1024 muestras.

  
// Crea una instancia de Audio Buffer con los datos de audio a la entrada
// Devuelve un Float 32 Array con los valores de la PCM entre -1 y 1
contextoDeAudio.procesador.onaudioprocess = function(audio){
var   entrada = audio.inputBuffer.getChannelData(0)