Oscilador simple

Pulsa el botón reproducir

Descripción

Con este nodo podremos generar una fuente de audio con una forma de onda periódica. También nos permitirá generar tonos de frecuencia arbitraria.

Los osciladores son un elementos básicos en la síntesis de audio. Nuestro nodo oscilador, comenzará a emitir cuando le apliquemos el método start(), y contaremos con varios atributos para variar la forma de onda y la frecuencia, e incluso un detune para hacer un ajuste fino de frecuencia.

Nodo Oscilador

  • Frecuencia:

  •  440  Hz

  • Detune CENTS:

  •  440  CENTS

  • Forma de onda:

  •  Volumen:

  •  x  0,02

  • Amplitud de la muestra:  0
  • El valor de ganancia  es:  0  dB
  • Al aplicar el factor de ganancia de 0.5 obtenemos -6dB
  • 20log10(0,5) =    dB

En este ejemplo, para visualizar la forma de onda, utilizamos el método getByteTimeDomainData, que copia los datos de la forma de onda al array que le pasemos. En este caso un array del tamaño del buffer: 512 muestras, la mitad del tamaño de nuestra resolución de la FFT (1024). Cada muestra se almacena en un Byte (256 niveles). El piso es 128 = 0dB.


    function playOsc() {
    	// Los controles son variables de los nodos
        var FREQUENCIA = document.querySelector('#freq').value;
        var ESCALA = document.querySelector('#volumen').value
		
        // Creamos los nodos
        misNodos.osc = contextoDeAudio.createOscillator();
        misNodos.osc.frequency.value = FREQUENCIA;
        misNodos.ganancia = contextoDeAudio.createGain();
        misNodos.ganancia.gain.value = ESCALA;
        
        //Los datos del nodo analizador nos sirven para dibujar en pantalla
        misNodos.analizador= contextoDeAudio.createAnalyser();
        misNodos.analizador.fftSize = 1024;
		
        //conectar
        misNodos.osc.connect(misNodos.ganancia);
        misNodos.ganancia.connect(misNodos.analizador);
        misNodos.analizador.connect(contextoDeAudio.destination);
		
        // comenzar ya.
        misNodos.osc.start(0);
	    requestAnimationFrame(visualizar.bind(this));
	    }
            

Con las variables FRECUENCIA y ESCALA ajustamos el valor de los potenciómetros o controles. A continuación creamos los nodos con sus parámetros básicos y los conectamos entre sí. De la fuente, que en este caso viene definida por nuestro nodo oscilador misNodos.osc = contextoDeAudio.createOscillator() al destino contextoDeAudio.destination. El nodo oscilador genera formas de onda periodicas. y cuenta con algunos atributos, como la frecuencia frequency o el detune, ajuste fino de frecuencia en partes porcentuales.

El nodo analizador es el encargado de muestrear la señal en el dominio del tiempo y proveernos un array de 1024 muestras para graficarlo mediante la declaración:


var muestras = new Uint8Array(misNodos.analizador.frequencyBinCount);
misNodos.analizador.getByteTimeDomainData(muestras);

A continuación se utiliza la API requestAnimationFrame para visualizar la señal y hacer algunos cálculos, como el nivel de dB de referencia de la señal. Pulsa el botón explorar código para ver con detalle el proceso de visualización.