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.
Frecuencia:
Detune CENTS:
Forma de onda:
Reproducir
Volumen:
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.