Web Audio API
La API de Audio Web provee un sistema poderoso y versatil para controlar audio en la Web, permitiendo a los desarrolladores escoger fuentes de audio, agregar efectos al audio, crear visualizaciones de audios, aplicar efectos espaciales (como paneo) y mucho más.
Conceptos y uso de audio Web
La API de Audio Web involucra manejar operaciones de audio dentro de un contexto de audio, y ha sido diseñada para permitir enrutamiento modular. Las operaciones de audio básicas son realizadas con nodos de audio, que están enlazados juntos para formar un gráfico de enrutamiento de audio. Muchas fuentes — con diferentes tipos de diseño de canales — están soportadas incluso dentro de un único contexto. Este diseño modular provee flexibilidad para crear funciones de audio complejas con efectos dinámicos.
Los nodos de audio están enlazados en cadenas y redes simples por sus entradas y salidas. Éstos típicamente empiezan con una o más fuentes. Las fuentes provee matrices de intensidades de sonidos (muestras) en segmentos de tiempo muy pequeños, a menudo decenas de miles de éstos por segundo. Éstos podrían ser calculados matemáticamente (como OscillatorNode
(en-US)), o pueden ser grabaciones de archivos de audio o video (como AudioBufferSourceNode
(en-US) y MediaElementAudioSourceNode
(en-US)) y transmisiones de audio (MediaStreamAudioSourceNode
). De hecho, los archivos de sonido son sólo grabaciones de intensidades de sonido, que vienen desde micrófonos o instrumentos eléctricos, y mezclados en una onda única y complicada.
Los resultados de éstos nodos podrían ser enlazados a las entradas de otros, que mezclan o modifican estas transmisiones de muestras de audio en diferentes transmisiones. Una modificación común es multiplicar las muestras por un valor para hacerlas más fuertes o silenciosas (como es el caso con GainNode
(en-US)). Una vez que el sonido ha sido lo suficientemente procesado por el efecto necesario, puede ser enlazados a la entrada de un destino(AudioContext.destination
(en-US)), que enviá el sonido a los altavoces o auriculares. Esta última conexión sólo es necesaria si el usuario debe escuchar el audio.
Un diagrama de flujo simple y típico para el audio web se vería algo como esto:
- Crear contexto de audio
- Dentro del contexto, crear fuentes — como
<audio>
, oscillator, stream - Crear nodos de efectos, tales como reverberación, filtro biquad, panner, compresor
- Escoge el destino final del audio, por ejemplo tu sistema de altavoces
- Conecta las fuentes a los efectos, y los efectos al destino.
El tiempo es controlado con alta precisión baja latencia, permitiendo a los desarrolladores escribir código que responda con precisión a los eventos y sea capaz de apuntar a muestras específicas, incluso en una alta frecuencia de muestreo. Por lo tanto, las aplicaciones como las cajas de ritmos y los secuenciadores están a su alcance.
El API de Audio Web también nos permite controlar cómo el audio es espacializado. Usando un sistema basado en un modelo fuente-oyente, esto permite controlar el modeo de paneo y que se ocupa de la atenuación inducida por distancia o desplazamiento doppler inducido por una fuente en movimiento (o un oyente en movimiento).
Nota: Puedes leear sobre la teoría del API de Audio Web con más detalle en nuestro artículo Conceptos Básicos detrás del API de Audio Web (en-US).
Interfaces del API de Audio Web
La API de Audio Web tiene un número de interfaces y eventos asociados, que han sido divididos en nueve categorias de funcionalidad.
Definición general del gráfico de audio
Contenedores y definiciones generales que dan forma a los gráficos de audio en el uso de Web Audio API.AudioContext
(en-US)
La interfaz AudioContext
representa un gráfico de procesamiento de audio construido de módulos de audio enlazados juntos, cada uno representado por un AudioNode
. Un contexto de audio controla la creación de los nodos que contiene y la ejecución del procesamiento del audio, or decoding. Necesitas crear un AudioContext
antes de hacer cualquier cosa, ya que todo pasa dentro de un contexto de audio.AudioNode
La interfaz AudioNode
representa un módulo de procesamiento de audio como una fuente de audio (por ejemplo un ejemplo HTML <audio>
or <video>
), destino de audio, módulo de procesamiento intermedio (por ejemplo un filtro como BiquadFilterNode
(en-US), o control de volumen como GainNode
(en-US)).AudioParam
(en-US)
La interfaz AudioParam
representa un parámetro relacionado al audio, como uno de un AudioNode
. Esto puede ser establecido a un valor específico o un cambio de valor, y puede ser agendado para que ocurra en un momento específico y siguiendo un patrón específico.AudioParamMap
(en-US)
Provee una interfaz como para mapear a un grupo de interfaces AudioParam
(en-US), lo que significa que proporciona los métodos forEach()
, get()
, has()
, keys()
, y values()
, como también una propiedad size
.BaseAudioContext
La interfaz BaseAudioContext
actúa como una definición base para procesamiento de gráficos de audio en y fuera de línea, como lo representa AudioContext
(en-US) y OfflineAudioContext
(en-US) resepectivamente. No tendrás que usar BaseAudioContext
directamente — tendrás que usar sus características a través de una de éstas dos interfaces heredadas.El evento ended
(en-US)
El evento ended
es lanzado cuando la reproducción se detiene porque se alcanzó el fin del archivo de medio.
Definiendo fuentes de audio
Las interfaces que definen fuentes de audio para usar en la API de Web.AudioScheduledSourceNode
(en-US)
La interfaz AudioScheduledSourceNode
es una interfaz padre para muchos tipos de interfaces de nodos de fuentes de audio. Es un AudioNode
.OscillatorNode
(en-US)
La interfaz OscillatorNode
representa una forma de onda periódica, como una onda sinusoidal o triangular. Es un módulo de procesamiento de audio AudioNode
que causa que se cree una frecuencia de onda determinada.AudioBuffer
La interfaz AudioBuffer
representa un recurso de audio corto que reside en la memoria, creado desde un archivo de audio usando el método AudioContext.decodeAudioData()
(en-US), o creado con datos sin procesar usando AudioContext.createBuffer()
(en-US). Una vez decodificado en esta forma, el audio puede ser colocado en un AudioBufferSourceNode
(en-US).AudioBufferSourceNode
(en-US)
La interfaz AudioBufferSourceNode
representa una fuente de audio que consiste en una datos de audio en la memoria, almacenada en un AudioBuffer
. Es un AudioNode
que actúa como una fuente de audio.MediaElementAudioSourceNode
(en-US)
La interfaz MediaElementAudioSourceNode
representa una fuente de audio que consiste en un elemento <audio>
o <video>
de HTML5. Es un AudioNode
que actúa como una fuente de audio.MediaStreamAudioSourceNode
La interfaz MediaStreamAudioSourceNode
representa una fuente de audio que consiste en un MediaStream
(en-US) de WebRTC (en-US) (como una cámara web, micrófono, o una transmisión siendo enviada a una computadora remota). Es un AudioNode
que actúa como una fuente de audio.
Definiendo filtros de efectos de audio
Interfaces para definir efectos que quieras aplicar a tus fuentes de audio.BiquadFilterNode
(en-US)
La interfaz BiquadFilterNode
representa una filtro de bajo orden sencillo. Es un AudioNode
que puede representar diferentes tipos de filtros, dispositivos de control de tono, o ecualizadores gráficos. Un BiquadFilterNode
siempre tiene exactamente una entrada y una salida.ConvolverNode
(en-US)
La interfaz ConvolverNode
es un AudioNode
que realiza una Convolución Lineal en un AudioBuffer
determinado, y es usado a menudo para lograr un efecto de reverberación.DelayNode
(en-US)
La interfaz DelayNode
representa una línea de detardo; un módulo de procesamiento de audio de AudioNode
que causa un retardo entre la llegada de una entrada de datos y su propagación a la salida.DynamicsCompressorNode
(en-US)
La intefaz DynamicsCompressorNode
proporciona un efecto de compresión, que reduce el volumen de las partes más ruidosas de la señal para ayudar a evitar el recorte y la distorsión que pueden ocurrir cuando se reproducen y multiplexan múltiples sonidos a la vez.GainNode
(en-US)
La intefaz GainNode
representa un cambio de volumen. Es un módulo de procesamiento de audio de AudioNode
que causa que una ganancia determinada para ser aplicada a la entrada de datos antes de su propacación a la salida.WaveShaperNode
(en-US)
La interfaz WaveShaperNode
representa un la interfaz representa un distorsionador no lineal. Es un AudioNode
que usa una curva para aplicar una distorsión en forma de onda a la señal. Además de los obvios efectos de distorsión, a menudo se usa para agregar una sensación cálida a la señal.PeriodicWave
(en-US)
Describe una forma de onda periódica que puede ser usada para dar forma a la salida de un OscillatorNode
(en-US).IIRFilterNode
(en-US)
Implementa un filtro de respuesta de pulso infinito (IIR) general; este tipo de filtro se puede usar para implementar dispositivos de control de tono y ecualizadores gráficos también.
Definición de destinos de audio
Una vez que haya terminado de procesar su audio, estas interfaces definen dónde emitirlo.AudioDestinationNode
(en-US)
La interfaz AudioDestinationNode
representa el destino final de una fuente de audio en contexto determinado — usualmente los altavoces de tu dispositivo.MediaStreamAudioDestinationNode
(en-US)
La interfaz MediaStreamAudioDestinationNode
representa un destino de audio que consiste en un MediaStream
(en-US) de WebRTC (en-US) con un AudioMediaStreamTrack
sencillo, que puede ser usado de una manera similiar a un MediaStream
(en-US) obtenido desde getUserMedia()
. Es un AudioNode
que actúa como un destino de audio.
Análisis y visualización de datos
Si quieres extraer el tiempo, frecuencia, y otros datos de tu audio, AnalyserNode
es lo que necesitas.AnalyserNode
La interfaz AnalyserNode
representa un nodo capáz de proveer la frecuencia en tiempo real y la información del análisis del dominio de tiempo, para propósitos de análisis y visualización de datos.
División y fusión de canales de audio
Para dividir y fusionar canales de audio, deberás usar estas interfaces.ChannelSplitterNode
(en-US)
La interfaz ChannelSplitterNode
separa los diferentes canales de una fuente de audio enn un conjunto de salidas mono.ChannelMergerNode
(en-US)
La interfaz ChannelMergerNode
reune las diferentes salidas mono en una sola salida. Cada entrada deberá ser usada para llenar un canal de la salida.
Espacialización de audio
Estas interfaces te permiten agregar efectos de paneo de especialización de audio a tus fuentes de audio.AudioListener
(en-US)
La interfaz AudioListener
representa la posición y orientación de la única persona escuchando la escena de audio usada en la espacialización de audio.PannerNode
(en-US)
La interfaz PannerNode
representa la posición y comportamiento de una señal de fuente de audio en un espacio 3D, permitiéndote crear efectos de paneo complejos.StereoPannerNode
(en-US)
La interfaz StereoPannerNode
representa un nodo de panner estéreo simple que se puede usar para panoramizar un flujo de audio hacia la izquierda o hacia la derecha.
Procesamiento de audio en JavaScript
Usando worklets de audio (pequeñas tareas), puedes definir nodos personalizados de audio escritos en JavaScript o WebAssembly. Los worklets de audios implementan la interfaz Worklet
(en-US), una versión ligera de la interfaz Worker
. A partir del enero de 2018, los worklets de audio están disponibles en Chrome 64 detrás de un identificador.AudioWorklet
(en-US) Experimental
La interfaz AudioWorklet
está disponible a través de BaseAudioContext.audioWorklet
(en-US) y te permite agregar nuevos móduloss al worklet de audio.AudioWorkletNode
(en-US) Experimental
La intefaz AudioWorkletNode
representa un AudioNode
que está insertada en un gráfico de audio y puede pasar mensajes a la AudioWorkletProcessor
.AudioWorkletProcessor
(en-US) Experimental
La interfaz AudioWorkletProcessor
representa código de procesamiento de audio que se ejecuta en un AudioWorkletGlobalScope
que genera, procesa, o analiza audio directamente, y puede pasar mensajes al AudioWorkletNode
.AudioWorkletGlobalScope
(en-US) Experimental
La interfaz AudioWorkletGlobalScope
es un objeto derivado de WorkletGlobalScope
que representa un contexto del worker en el que se ejecuta un script de procesamiento de audio; está diseñado para permitir la generación, procesamiento, y análisis de datos de audio directamente usando JavaScript en un hilo worklet.
Antes de que se definieran los worklets de audio, la API de Web Audio usó ScriptProcessorNode
Obsoleto para procesamiento de audio basado en JavaScript. Como el código se ejecuta en el hilo principal, tuvo un mal rendimiento. ScriptProcessorNode
se mantiene por razones históricas pero está marcada como obsoleta y será removida en una versión futura de la especificación.ScriptProcessorNode
(en-US) Obsoleto
La interfaz ScriptProcessorNode
permite la generación, procesamiento, o análisis de audio usando JavaScript. Es un módulo de procesamiento de audio AudioNode
que está enlazado a dos buffers, uno conteniendo la actual entrada, uno conteniendo la salida. Un evento, implementando la interfaz AudioProcessingEvent
(en-US), es enviado al objeto cada vez que el buffer de entrada contiene nuevos datos, y el manejador del evento termina cuando ha llenado el buffer de salida con datos.audioprocess
(en-US) (event) Obsoleto
El evento audioprocess
es lanzado cuando un buffer de entrada de un ScriptProcessorNode
(en-US) del API del Audio Web está listo para ser procesado.AudioProcessingEvent
(en-US) Obsoleto
El evento AudioProcessingEvent
del API de Audio Web representa los eventos que ocurren cuando un buffer de entrada ScriptProcessorNode
(en-US) está listo para ser procesado.
Procesamiento de audio offline/en segundo plano
Es posible procesar/renderizar un gráfico de muy rápidamente en segundo plano — renderizándolo en un AudioBuffer
en lugar de hacerlo a los altavoces del equipo — con lo siguiente.OfflineAudioContext
(en-US)
La interfaz OfflineAudioContext
es una interfaz AudioContext
(en-US) representando un gráfico de procesamiento de audio construido a partir de varios AudioNode
enlazados juntos. En contraste con un AudioContext
estándar, un OfflineAudioContext
realmente no procesa el audio sino que lo genera, lo más rápido que puede, en un buffer.complete
(en-US) (event)
El evento complete
es lanzado cuando el renderizado de un OfflineAudioContext
(en-US) está terminado.OfflineAudioCompletionEvent
(en-US)
La interfaz OfflineAudioCompletionEvent
representa los eventos que ocurren cuando procesamiento de un OfflineAudioContext
(en-US) is terminado. El evento complete
(en-US) implementa esta interfaz.