Re-Mezcla Vertical en Unreal Engine con Metasounds + Quartz (Parte 1/2)
If you prefer to read an English version, click on this button =>
Unreal Engine Version: 5.0.3
Este blog post muestra como implementar un segmento de música simple en blucle (loop) usando Metasounds en Unreal Engine. Este segmento musical tiene cuatro “capas” que se reproducen de manera interactiva y en sincronía, una sobre la otra. Finalmente, muestro cómo llamar los diferentes cambios o estados en este metasound usando un reloj Quartz.
Implementé el mismo sistema dos veces para este proyecto de prueba, uno usando scripting visual Blueprints, y otro usando código nativo C++. Aquí la lista de herramientas y términos esenciales usados en este proyecto:
Programé todas las funcionalidades dentro de la clase C++ MusicPlayerActor, la clase blueprint BP_MusicPlayerActor, y el blueprint del nivel ThirdPersonMap.
Importante:
Ten en consideración que esta guía no pretende enseñar diseño de sonido creativo. En cambio, se enfoca exclusivamente en aspectos de implementación y programación de game audio.
Descarga el Proyecto Aquí:
Parte 1 - Metasound:
El Segmento Musical:
Este proyecto usa una composición en cuatro partes (capas) con estas características:
Tempo: 76.0 bpm
Compás: 4/4
Duración: *8 bars
* La imagen de abajo muestra que las pistas “Pad” y “Bass” son más largas que 8 compáses. Estos archivos contienen una “cola” o la “caida” de volumen natural de estos instrumentos. La cola de estas pistas nos permiten crear transiciones fluidas entre cada loop, y es esencial exportarlas de esta manera.
Metasound Source:
Para crear Metasounds, ve al editor Unreal y habilita Metasound yendo a Edit > Plugins, y da click en “Metasound”.
Después de reiniciar el editor, Metasound Source va a estar disponible al dar click derecho en el content drawer dentro de la categoría “Sounds”.
Para este proyecto cree un MetaSound Source llamado “S_MusicCue_MS”
Estos son los Miembros de este Metasound Source:
Triggers (Naranja):
EndCue: Detiene el sistema de loop. El Metasound detendrá su timeline cuando la amplitud llegue a 0dB
PlayBass: Reproduce el track Bass sincronizadamente.
PlayGlitch: Reproduce el track Glitch sincronizadamente.
PlayPad: Reproduce el track Pad sincronizadamente.
OnNearlyFinishedDrums: Prepara el siguiente loop antes de que el loop actual termine.
Wave Assets (Azul):
Bass, Drums, Glitch, Pad: Estos son los archivos de audio o Wave Assets.
Audio Signal Flow (Rosa):
Bass, DrumsAudio(L, R), GlitchAudio(L, R), PadAudio(L, R): El flujo y conexiones de audio entre nodos.
Floats (Verde):
DrumsPlaybackLocation: Mantiene un registro de la posición relativa del Wave Asset “Drums”.
EnvelopeBass, Envelope Glitch, Envelope Pad: Crea una interpolación por medio de una curva de ataque a las ganancias de mezclador maestro.
Time (Celeste):
LoopPosition: Mantiene un registro de la posición relativa del Wave Asset “Drums” en segundos.
Capa 1: Drums
Esta sección reproduce la capa “Drums”. Es disparada por OnPlay, o OnNearlyFinishedDrums cada vez que el loop se termina. If EndCue es disparado, OnNearlyFinishedDrums no va a ser llamado, entonces el sistema no va a repetirse de nuevo. La posición de este Wave Asset es registrada para que las otras capas se reproduzcan en sincronía con esta.
Capa 2: Glitch
Esta sección reproduce la capa “Glitch”. Es disparada por PlayGlitch, o OnNearlyFinishedDrums solo sí PlayGlitch se llamó primero. El nodo Wave Player recive la posición actualizada de la secuencia musical entonces simpre están en sincronía.
Layer 3: Bass
Esta sección reproduce la capa “Bass”. Es disparada por PlayBass, o OnNearlyFinishedDrums solo sí PlayBass se llamó primero. El nodo Wave Player recive la posición actualizada de la secuencia musical entonces simpre están en sincronía. Este Wave Asset contiene una cola que se extiende por otros dos compáses extras después de que el loop se termina; entonces es importante tener dos nodos Wave Player para que el sonido anterior se sobreponga con el siguiente de manera fluida.
Layer 4: Pad
Esta sección reproduce la capa “Pad”. Es disparada por PlayPad, o OnNearlyFinishedDrums solo sí PlayPad se llamó primero. El nodo Wave Player recive la posición actualizada de la secuencia musical entonces simpre están en sincronía. Este Wave Asset contiene una cola que se extiende por otros dos compáses extras después de que el loop se termina; entonces es importante tener dos nodos Wave Player para que el sonido anterior se sobreponga con el siguiente de manera fluida.
El Mezclador Maestro
El Stereo Mixer combina todas las capas y los envia a las salidas izquierda y derecha. Una envolvente ADSR es usada para crear un fade-in de audio para las capas “Glitch”, “Pad”, y “Bass”. Finalmente, cuando EndCue es activado, OnFinished se dispara cuando la amplitud llega a 0db.
Sobre La Parte 2
En mi siguiente post, voy a compartir cómo implementar este Metasound en el juego usando Blueprints y C++ nativo. Mostraré cómo configurar un reloj Quartz Clock y cómo disparar cada capa sincronizada con el tempo musical.