Wiki · Devlog · Audio Procedural

Audio Procedural

CONTRABAND: Edge of the Fold se envía con cero archivos de audio. Cada sonido — música ambiental, efectos de combate, chimes de UI, drones de motor — se genera en tiempo de ejecución por la Web Audio API. Este post explica cómo y por qué.

¿Por qué sin archivos de audio?

Tres razones. Primero, presupuesto. Licenciar música profesional para un juego indie cuesta miles de dólares como mínimo. No tenía miles de dólares. Segundo, tamaño de descarga. Un soundtrack decente es 20-40MB de MP3s. El juego CONTRABAND entero sin los modelos de Three.js es más pequeño que eso. Enviar el juego con soundtrack habría cuadruplicado la descarga. Tercero, riesgo legal. Incluso la música "libre de regalías" gratuita ocasionalmente tiene licencias ambiguas que se vuelven problema cuando un juego se monetiza.

El audio procedural esquiva las tres. Cero bandwidth, cero dólares, cero riesgo de licencia. La música ambiental se sintetiza desde primeros principios en tiempo de ejecución. Suena distinto en cada sesión — no radicalmente, pero lo suficiente para que los oyentes repetidos noten variedad sin identificar conscientemente por qué.

El soundtrack ambiental

La música de fondo del juego está compuesta por seis osciladores de onda sinusoidal superpuestos con modulación LFO (oscilador de baja frecuencia) en sus amplitudes. Cada oscilador corre a una frecuencia fundamental distinta correspondiendo a una estructura de tríada en acorde menor. Los LFOs corren a tempos entre 0.05 Hz y 0.3 Hz, produciendo hinchazones lentas de amplitud que se sienten orgánicas.

El resultado es música drone ambiental al estilo de las grabaciones de aeropuerto de Brian Eno — mínima, espaciosa, no melódica en ningún sentido convencional. Esto coincide con el tono del juego. Los jugadores la han descrito como "como escuchar el sistema de soporte vital de una nave espacial". Eso es exactamente lo que buscaba.

Código total para el sistema ambiental: aproximadamente 80 líneas de JavaScript. Sin samples, sin loops, sin archivos de audio disparados. Los osciladores corren continuamente y nunca se repiten exactamente.

Audio de combate

El combate necesita audio más agudo y rítmico que el drone ambiental. El enfoque: cada sonido de combate es uno o dos osciladores con un envelope específico (curva ataque-decay-sustain-release) y opcionalmente un filtro. Un disparo de láser es un oscilador de diente de sierra a 440Hz con ataque rápido, decay inmediato, sustain corto y un filtro paso-bajo que se cierra conforme suena el sonido. Duración total: 120ms. Código total: 15 líneas.

Los sonidos de explosión usan ruido blanco pasado a través de un filtro paso-bajo resonante cuya frecuencia de corte baja rápidamente de 8kHz a 60Hz en 500ms. Esto crea el característico "whump" de una explosión sintetizada sin ningún sample. No es indistinguible de una explosión real grabada, pero es convincentemente juegoso.

Audio de UI

Los clics de menú, avances de diálogo y aperturas modales usan pitidos sintetizados cortos. Las elecciones tonales específicas coinciden con la paleta de color del juego: las acciones doradas reproducen sonidos ligeramente más agudos, las acciones rojas reproducen más graves. Esto es subliminal — los jugadores no registran conscientemente el patrón pero sienten la consistencia.

La Web Audio API

Todo esto corre sobre la Web Audio API, que es un grafo nativo del navegador para procesamiento de audio. Creas nodos (osciladores, filtros, envelopes de ganancia) y los conectas en un grafo que enruta a los altavoces. Para audio procedural es ideal — todo el sistema es declarativo y de bajo overhead.

La única limitación mayor es que Web Audio no arranca automáticamente en navegadores modernos. El usuario debe interactuar con la página una vez antes de que el audio pueda comenzar. Manejo esto iniciando todos los nodos de audio silenciosamente y dessileando en el primer clic. Este es un workaround de una línea para lo que de otra forma sería un bug confuso de "audio no funciona".

Variabilidad y ambiente

El sistema de audio del juego cambia sutilmente el ambiente según el estado del juego. Cuando el jugador está en combate, los LFOs de música ambiental se aceleran. Cuando el jugador está en el Pliegue Silencioso, se añade una ligera vibración de frecuencia a todos los osciladores. Cuando el jugador está cerca del Keystone en el Capítulo 4, se superpone un oscilador de sub-bajo adicional a 40Hz. Los jugadores no notan conscientemente estos cambios pero sienten que diferentes regiones "suenan distinto".

Este es el tipo de soundtrack dinámico que sería muy caro con audio grabado (necesitarías múltiples stems, crossfades y mucho mixing). Con audio procedural es un cambio de parámetro — la misma red de osciladores, solo sintonizada de forma distinta.

Lo que aprendí

El audio procedural funciona excelentemente para juegos ambientales y atmosféricos. Funciona menos bien para juegos que necesitan melodías memorables o pistas emocionales específicas. CONTRABAND no tiene melodías memorables — eso está bien para este juego. No estaría bien para un juego que quiere un tema reconocible. Si escribiera ese tipo de juego, licenciaría música.

La Web Audio API está subutilizada por la mayoría de los desarrolladores web. Es genuinamente una de las APIs más poderosas del navegador y puede producir sonidos rivalizando con output de DAW de escritorio. Más juegos de navegador deberían experimentar con ella.