Parte: 6 — Audio y música interactiva · Fuente: Documentación de audio de Godot 4 + Karen Collins, "Game Sound" (MIT Press) ⏱️ Duración estimada: 45 min · Nivel: Intermedio
Refrescar los conceptos de audio digital que de verdad afectan a un juego —muestreo, profundidad de bits, formatos, canales, decibelios y latencia— pero de forma aplicada, tocando cada idea desde Godot 4. Al terminar sabrás por qué un SFX corto va en WAV y la música en OGG, cómo activar el bucle correcto en el importador, qué reproductor usar en cada caso y cómo pensar el volumen en dB en lugar de en porcentajes. Es la base sobre la que se apoya toda la parte 6.
Al finalizar, el alumno podrá:
AudioStreamPlayer y controlar su volumen en decibelios.linear_to_db() y db_to_linear().| # | Tema | Por qué importa |
|---|---|---|
| 1 | Sample rate y bit depth | Definen la fidelidad y el peso del archivo en memoria |
| 2 | WAV vs OGG (Vorbis) | Uno se descomprime en RAM, el otro hace streaming |
| 3 | Mono vs estéreo | El SFX posicional debe ser mono para que Godot lo espacialice |
| 4 | Decibelios y percepción | El oído es logarítmico; el volumen se piensa en dB |
| 5 | Latencia y buffer de audio | El sonido debe sonar "a tiempo" con la acción |
| 6 | Reproductores de Godot 4 | Elegir global, 2D o 3D según el contexto |
| 7 | Importación y loop | El bucle se define al importar, no al reproducir |
0 dB es sin cambio, valores negativos bajan; -6 dB ≈ mitad de amplitud percibida.Necesitas Godot 4.x (idealmente 4.3 o superior) y dos archivos de audio de dominio libre: un efecto corto en formato WAV (por ejemplo, un "click", un salto o una moneda) y una pieza de música en OGG pensada para repetirse en bucle. Puedes obtenerlos en freesound.org o en la biblioteca de Kenney. Crea un proyecto nuevo, arrastra ambos archivos a una carpeta audio/ dentro del proyecto y ten a la vista el panel Import (pestaña junto a Scene). Repasa la documentación de audio de Godot 4 y la referencia de AudioStreamPlayer.
Vamos a importar un SFX y una música, reproducirlos y controlar su volumen en dB. El resultado será audible: oirás el efecto al pulsar una tecla y la música en bucle de fondo.
Paso 1 — Importa el SFX en bucle correcto. Selecciona tu archivo WAV en el panel FileSystem y abre la pestaña Import. Un SFX de "click" no debe repetirse, así que deja Loop Mode en Disabled. Si fuese un sonido continuo (motor, viento), elegirías Forward. Pulsa Reimport.
Paso 2 — Importa la música en loop. Selecciona el archivo OGG. En su pestaña Import, activa Loop para que la música se repita sin cortes. Los OGG guardan un punto de bucle propio; deja Loop Offset en 0 salvo que tengas una intro. Pulsa Reimport.
Paso 3 — Arma la escena. Crea una escena con un Node raíz llamado AudioDemo. Añade dos hijos AudioStreamPlayer: renómbralos SfxPlayer y MusicPlayer. Arrastra el WAV a la propiedad Stream de SfxPlayer y el OGG a la de MusicPlayer.
Paso 4 — Escribe el script. Adjunta este script al nodo raíz:
extends Node
@onready var sfx_player: AudioStreamPlayer = $SfxPlayer
@onready var music_player: AudioStreamPlayer = $MusicPlayer
func _ready() -> void:
# La música arranca al iniciar y se repite (loop activado al importar).
music_player.volume_db = -12.0 # música de fondo, algo por debajo
music_player.play()
# Demostramos la conversión lineal <-> dB en consola.
var lineal := 0.5 # 50 % de amplitud
var en_db := linear_to_db(lineal) # ~ -6.02 dB
print("0.5 lineal equivale a %.2f dB" % en_db)
print("-6 dB equivale a %.3f lineal" % db_to_linear(-6.0))
func _unhandled_input(event: InputEvent) -> void:
# Al pulsar Espacio disparamos el efecto corto.
if event.is_action_pressed("ui_accept"):
sfx_player.pitch_scale = 1.0 # tono normal
sfx_player.volume_db = 0.0 # a plena señal
sfx_player.play()
Paso 5 — Ejecuta y escucha. Corre la escena. Deberías oír la música en bucle de fondo y, cada vez que pulses Espacio, el efecto corto. En la consola verás cómo 0.5 lineal son unos -6 dB, la prueba de que la escala no es proporcional sino logarítmica.
Paso 6 — Experimenta con el volumen. Cambia music_player.volume_db a -24.0 y luego a 0.0. Nota que la diferencia percibida entre -24 y -12 es enorme, mientras que entre -3 y 0 apenas se aprecia: así funciona el oído.
Resultado visible: música en bucle sonando, un SFX disparado por teclado y dos líneas en consola que demuestran la relación lineal/dB.
Disabled y otro Forward, y compara el resultado al reproducirlos.AudioStreamPlayer y reproduce dos SFX a la vez para comprobar que Godot los mezcla.linear_to_db().-40 dB y sube el SFX a +6 dB: describe qué ocurre y por qué +6 puede saturar.pitch_scale del SFX a 0.5 y 2.0, y explica cómo afecta al tono y a la duración.Crea una escena de "banco de pruebas de audio" con un AudioStreamPlayer para música (OGG en loop) y otro para SFX (WAV sin loop). La música debe iniciarse automáticamente a -15 dB, y tres teclas distintas deben disparar el mismo SFX a tres volúmenes diferentes (-12, -6 y 0 dB) calculados y aplicados desde código.
Criterio de aceptación: al ejecutar, la música suena en bucle sin cortes, cada tecla reproduce el efecto a un volumen claramente distinto, y el proyecto usa el formato correcto para cada tipo (OGG para música, WAV para SFX).
| Síntoma | Causa y arreglo |
|---|---|
| La música no se repite | No activaste Loop en el panel Import; reimporta con el bucle habilitado |
| El SFX suena "arrastrado" o con eco al repetir | Dejaste Loop Forward en un sonido de un solo golpe; ponlo en Disabled |
| El juego consume mucha RAM | Cargas música larga como WAV; usa OGG para streaming |
Subo volume_db a 100 y satura o no cambia |
dB no es porcentaje; el rango útil suele ir de -80 a +6, no a 100 |
| El audio suena con retraso perceptible | Latencia alta; reduce el tamaño de buffer en Project Settings → Audio |
| No se oye nada | El Stream está vacío o el volume_db está en -80; asigna el stream y sube el volumen |
¿44 100 o 48 000 Hz para mi juego? Cualquiera va bien. 48 kHz es el estándar de vídeo y audio profesional; 44,1 kHz es el de CD. Lo importante es ser consistente para evitar remuestreos.
¿Por qué mi SFX 3D no se oye desplazado a un lado? Probablemente es estéreo. El audio posicional debe ser mono; convierte el archivo a mono o reimpórtalo como tal.
¿0 dB es el máximo?
0 dB significa "sin cambio respecto a la señal original", no un tope. Puedes subir con valores positivos, pero por encima de 0 en el bus Master arriesgas clipping (saturación).
¿Debo usar MP3 en Godot 4? Godot 4 soporta MP3, pero OGG Vorbis suele dar mejor relación calidad/peso y bucles más limpios. Reserva MP3 para cuando ya tengas assets en ese formato.
Clase 125 - Capstone Parte 5: enemigo con behavior tree y percepción
Clase 127 - Diseño de sonido: capas, variación y aleatoriedad