Tutorial Wwise en Español - Parte II: Objetos y Randomización
/Note for my english readers: Sorry this article is not in your language but I wanted to write something for the spanish speaking community since there aren’t many resources on game audio in my native tongue. If I see that there is demand, I would be happy to translate this into english although most of the content can be found in Audiokinetic’s official resources.
Bienvenidos a la segunda parte. Ahora que tienes un idea básica de cómo funciona Wwise y cómo incorporar sonidos, vamos a ir viendo todas las distintas herramientas con las que contamos para introducir y administrar nuestros diseños.
Usando Limbo
Para esta segunda parte vamos a utilizar el otro juego que descargamos en la primera parte. Abre el launcher y en la seccion de Samples, haz click en Wwise. Deberías ver que debajo de Cube, también tienes Limbo.
Si no ves limbo, haz click en el botón azul que dice “Modify Wwwise…” y verás de nuevo la ventana donde puedes elegir qué elementos deseas instalar. Bajo la sección Samples, selecciona LIMBO.
Una vez listo, haz click en “Run Limbo” y prueba un poco el juego para familiarizarte con él. Limbo es un clásico Indie cuyo sonido fue diseñado e implementado en Wwise en 2009. Pese a todo el tiempo que ha pasado, nos va a servir para poder aprender muchas funciones ya que los creadores han colgado gratuitamente una demo que incluye el proyecto de Wwise.
Trabajando con el proyecto de Wwise para Limbo
Una vez te hayas dado una vuelta por el juego, lo siguiente es que abras el proyecto de Wwise con el que vamos a trabajar. Verás que al lado del botón para jugar hay otro que dice “Open in Wwise (64-Bit)”. Cuando hacemos click se abre un proyecto de Wwise bastante enorme que contiene todo lo necesario para manejar el sonido del juego.
Antes de tocar nada, vamos a hacer una copia de seguridad de este proyecto por si en el futuro queremos volver al original. En la siguiente ruta podrás encontrar el proyecto de Wwise. Copia todo el contenido en algún otro sitio.
C:\Program Files (x86)\Audiokinetic\Wwise 2019.1.4.7065\Limbo\Resources\audio\Limbo
Una vez hecho esto, vuelve al proyecto de Wwise y al Layout “Desginer”. En la pestaña de Audio, podrás encontrar todos los distintos tipos de SFX Objects que usa el juego. No te preocupes si no entiendes para qué sirve cada uno, los vamos a ir viendo poco a poco.
Bien, ve abriendo carpetas (icono +) hasta llegar al siguiente objeto:
Actor Mixer Hierarchy\Default Work Unit\boy\boy\boy_foley\boy_foley_materials\run\run\boy_step_drywet\ boy_step_speed\run_step
Nos ha costado pero hemos llegado a uno de los SFX Object que controla los pasos del protagonista. Como puedes ver todo está muy organizado. Si seleccionas el objeto “run_step_grass” verás que no puedes reproducirlo directamente. Esto es por que, al ser este un juego comercial, los sonidos en su calidad original no están incluidos y sólo están disponibles las versiones ya convertidas en una calidad de sonido menor.
Quizás recuerdes esto de la parte uno, en principio nos conviene siempre importar en Wwise sonidos con la máxima calidad posible y una vez creamos un nuevo banco de sonido, podremos elegir cuánto y cómo comprimir los archivos. En el caso de Limbo, sólo se incluyen en esta demo los sonidos ya convertidos por lo que si quieres reproducir cualquier SFX Object o Evento, debes reproducir la versión convertida y no la original.
Para ello, fíjate que en la sección de transporte (parte inferior y central del layout “Designer”) puedes de-seleccionar “Original”. Una vez de-seleccionado podrás reproducir el objeto normalmente con la barra espaciadora. Recuerda que lo que estás escuchando es la versión ya convertida del sonido.
Una vez hecho esto, date una vuelta si quieres por el proyecto, verás que hay muchísimos SFX Objects y eventos diferentes. Puede ser incluso un poco apabullante, pero te da una idea de la magnitud que un juego real puede alcanzar. Y este es un juego relativamente sencillo.
Añadiendo nuestro propio diseño de sonido
Para poder ir viendo cada uno de los tipos de SFX Objects que Wwise usa, vamos a crear nuestros propios objetos y usarlos en vez de los originales. También, como hicimos en el caso de Cube, necesitamos silenciar todos los sonidos originales para que así podamos concentrarnos en lo que estamos haciendo.
Para ello, en la misma pestaña de audio, de-selecciona todas las carpetas que ves excepto por la de boy. De esta manera, cuando abramos de nuevo el juego, sólo oiremos los sonidos del protagonista.
Date cuenta que esta es una manera muy útil de organizar un proyecto. Estas carpetas (ambience, boy, etc) son llamadas virtuales por que simplemente nos sirven para organizar el contenido pero no reflejan una carpeta real en la estructura de carpetas del proyecto. Es también posible crear una carpeta real y a está opción se le llama “Physical Folder”, aunque por ahora no nos interesa.
Una vez hecho esto y cómo quizás recuerdes, necesitamos generar el SoundBank del proyecto de nuevo para poder ver los cambios reflejados en el juego. Vamos al layout “SoundBank” y seleccionamos la Default Work Unit, que contiene 3 SoundBanks diferentes. Nos aseguramos que los tres estén seleccionados además de la Plataforma (“Windows”) e idioma (“English(US)“).
Una vez listo, generamos el nuevo SoundBank. Es posible que nos de algunos errores, mostrando que hay sonidos que no encuentra pero esto no es problema. Una vez hecho esto, ejecuta de nuevo Limbo. Ahora sólo oímos los sonidos del protagonista. Si no funcionara y sigues oyendo lo mismo, asegúrate de que la ruta a la que apunta Wiwse al construir el SoundBank es donde está alojado el sonido de Limbo. Una vez listo, estamos listos para empezar a añadir nuestros propios sonidos.
“Primeros Pasos”
Vamos a empezar por crear un SFX Object para los pasos del protagonista. Para simplificar aún más las cosas, vamos a desactivar también los sonidos del protagonista que venían de serie, de forma que únicamente oiremos nuestro nuevo contenido. Para ello, desactiva la carpeta virtual “boy” y crea una nueva carpeta virtual. Aquí vamos a guardar nuestros propios objetos por lo que la puedes llamar “Custom” o algo similar. Dentro de esta carpeta crea un nuevo SFX Object y llámalo cómo quieras. Yo lo he llamado “pasos_inicio”.
Una vez hecho esto, verás que el SFX Object aparece en rojo lo cual nos indica que no está asociado con ningún archivo de sonido. Para el tutorial, vamos a utilizar este sonido de freesound: https://freesound.org/people/worthahep88/sounds/319224/. O si lo deseas puedes usar algo de tu propia librería. Descárgalo (necesitas una cuenta) y lo vamos a importar a nuestro proyecto. Puedes hacer click derecho en nuestro SFX Object y luego en “Import Audio Files…” y así asociamos este audio con el objeto.
Si intentas reproducirlo, verás que no oyes nada, ya que aún teníamos el transporte configurado para reproducir los sonidos en su versión convertida y no original. Para solucionar esto, puedes volver a hacer click en "'Original” en el transporte. Ahora al hacer click, oímos el sonido.
Source Editor
Lógicamente, te habrás dado cuenta de que nuestro audio incluye varios pasos y lo que necesitamos es tener un sólo paso por objeto ya que el evento de pasos se dispara una vez cada vez que la animación del personaje pisa el suelo.
Para ello, vamos a usar el Source Editor, que es el editor de audio que Wwise incluye de serie. Para abrirlo, simplemente haz doble click en el archivo de sonido contenido dentro del SFX Object, tal y como ves en la imagen inferior.
Vemos que se abre el Source Editor. Si reproduces aquí el sonido, verás que básicamente hay una serie de sonidos de impacto con el pie y más una serie de arrastres. Vamos a intentar seleccionar un sólo paso que incluya primero un impacto y luego un arrastre. Para ello, verás que hay dos cuadrados blancos en la zona inferior de la ventana. Estos nos sirven para indicar dónde queremos que el sonido empiece y acabe. Valiéndote del zoom (iconos de + y - en la esquina inferior derecha), intenta aislar un sólo paso.
Como el archivo de audio no tiene mucho nivel, puedes darle un poco de ganancia con el control “Make-Up Gain” que está en la parte superior derecha. Dale +12dB. Yo he encontrado un paso que puede funcionar en 7.7 segundos. Utiliza ese o busca otro que te guste pero por ahora nos interesa que no haya mucho espacio entre la pisada y el arrastre.
Fíjate también que en la parte superior del editor hay un triángulo a cada lado. Estos nos sirven para hacer un fade in y out y así hacer un corte más suave. Debería quedarte y resultado más o menos como el de la imagen inferior.
Algo interesante a la hora de crear tu flujo de trabajo es que pese a que quizás sea más cómodo editar el audio en tu DAW, es bueno tener en cuenta que es posible traer a Wwise audio más en bruto y editarlo in-situ.
Integrando el paso
Una vez está nuestro SFX Object listo, deberemos integrarlo en el juego. Para ello, podemos ayudarnos del layout “Profiler” que si recuerdas de la parte 1, nos servía para ver entre otras cosas toda la información que el juego está enviando a Wwise. Conéctate con el juego de la misma manera que hicimos con Cube en la parte uno. Una vez conectado, anda un poco por el juego y ciérralo.
Si ahora echas un ojo al “Capture Log” verás que ahora aparece un montón de información. Puede ser difícil encontrar lo que quieres por lo que vamos a usar el filtro para ver mejor. Si haces click en la esquina superior izquierda en “Filter…” podrás elegir qué ver. Selecciona de forma que sólo veamos “Events”. Una vez hecho esto, verás que el evento que está disparando los pasos, al menos los principales se llama “boy_run_step”. Este es el evento que debemos usar.
Vuelve ahora al layout “Designer” y a la pestaña de Eventos. Podrás encontrar el evento deseado en la siguiente ruta:
Events\Default Work Unit\boy\foley_animation\run\run
Si seleccionas este evento, verás que está asociado con 3 acciones diferentes pero las tres aparecen sombreadas por que conectan con objetos que hemos desactivado antes. Te recuerdo que cada evento puede tener asociadas distintas acciones que se activarán cada vex que el juego llame a dicho evento. Vamos arrastrar nuestro objeto a la lista de acciones del evento deseado. Ve a la pestaña Audio y simplemente arrástralo como ves en la imagen.
¡Y ya está listo! Re-compila el SoundBank, ejecuta el juego y podrás oír nuestro nuevo paso en toda su gloria. Suena repetitivo y fuera de ritmo pero de eso nos vamos a encargar a continuación. Por ahora, espero que hayas podido ver lo relativamente sencillo que es introducir nuestros sonidos incluso partiendo de un archivo en bruto.
Randomizar Parámetros
La primera estrategia que podemos usar para evitar que el paso sea tan repetitivo es introducir variedad en forma de randomización de parámetros. Esta es una de las técnicas más básicas y esenciales en diseño de sonido para videojuegos que nos permite añadir algo de variedad a cualquier sonido sin necesidad de usar ningún audio adicional, con el consecuente ahorro de memoria.
Para ello, vamos a añadirle a nuestro paso algo de randomización a nivel de pitch (tono) y volumen. De esta manera, cada vez que Wwise dispare un nuevo paso elegirá al azar un nuevo valor de pitch y volumen dentro del rango que definamos.
En la Designer Layout, si hacemos click en nuestro SFX Object, verás que a la derecha aparece un panel con todos los parámetros que pertenecen al objeto. Esta view se llama “Editor de Propiedades” y es una de la más útiles y usadas ya que se puede consultar en relación a cualquier objeto, evento o game sync (hablaremos de este último tipo de objeto en la siguiente parte). Verás un montón de propiedades diferentes en este editor, que como puedes ver tiene varias pestañas. Algunas tienen una clara función sonora y son similares a las que podríamos ver en una pista de cualquier DAW. Aquí se incluyen cosas como volumen, pitch, buses, efectos, auxiliares, etc… Otras son algo más exóticas. Las iremos viendo poco a poco a medida que avancemos.
Si te fijas, a la izquierda de algunos de estos parámetros, hay un icono circular. Este icono nos indica que el parámetro se puede randomizar. Si hacemos doble click en él, se abrirá una ventana donde podremos activar la randomización (“Enabled“). Añade -6dB como el mínimo y +6dB como el máximo. Verás entonces que el icono se torna naranja lo que nos indica que la randomización está activada. ¿Que significa esto? Pues que cada vez que el objeto sea llamado, Wwise va a elegir un valor al azar entre -6 y +6, de forma que el volumen variará cada vez.
Repite el mismo proceso con el pitch. En este caso los valores se expresan en céntimos de semi-tono por lo que 200 representaría un tono entero y 1200 una octava. Busca unos valores que no sean muy extremos como -300 y 300. Fíjate que a medida que cambias los valores puedes reproducir el evento y ver el resultado.
Una vez terminado, verás que el paso es esencialmente el mismo pero suena diferente cada vez, con diferentes combinaciones de tono y volumen generadas al azar.
Puedes re-compilar el SoundBank y probar en Limbo que tal queda en el juego si lo deseas.
Reutilizar un sólo archivo de audio en varios Objetos
Imagino que te estás dando cuenta de que nuestros pasos no son precisamente los mejores del mundo. La sincronía con la animación deja que desear ya que cuando randomizamos el pitch, esto también afecta a la duración del sonido. Por otro lado, por mucho que cada paso sea algo diferente, sigue siendo el mismo archivo de audio fundamentalmente, lo cual rompe un poco la inmersión.
Una forma de paliar esto sería poder disponer de diferentes pasos grabados y utilizar uno diferente cada vez. Precisamente, nuestro archivo contiene varios pasos diferentes por lo que para dar más naturalidad a nuestro diseño sólo necesitamos usar uno diferente en cada instancia en vez del mismo constantemente. Vamos a ello.
Re-nombra (F2) nuestro objeto como “pasos_inicio_1” y duplícalo copiándolo y pegándolo de nuevo en la misma carpeta virtual. Repite el proceso hasta tener 4 objetos diferentes. Por ahora, los nuevos SFX Objects señalan exactamente al mismo paso que el original pero vamos a cambiar esto. Abre el source editor para cada una de nuestras copias (doble click en el nombre del archivo de sonido) y selecciona un paso diferente cada vez. Recuerda usar una pisada y luego un arrastre, tratando de tener variedad en los pasos que eliges.
Fíjate que podemos tener múltiples SFX Objects bebiendo de un único archivo de audio, sin necesidad de importar un nuevo archivo cada vez. Te estarás dando cuenta que todas estas estrategias nos permiten ofrecer un sonido más vivo y natural sin usar necesariamente más memoria.
Random Containers
Una vez tenemos todos nuestros sonidos diferenciados, vamos a reunirlos en un Random Container. Este es un tipo de objeto que nos permite agrupar varios objetos y lanzar cada vez uno diferente al azar, dándonos cierto control de cómo este azar funciona.
Selecciona nuestro 4 pasos, click derecho, New Parent y Random Container. Nómbralo “pasos_inicio”. Si ahora reproduces este nuevo objeto verás que un nuevo sonido diferente elegido al azar se dispara cada vez.
Como decía, puedes personalizar también cómo se elige el siguiente sonido a reproducir. Seleccionando el Random Container, en la parte central derecha, verás una sección llamada “Random” donde podemos controlar este comportamiento. “Standard” usará simplemente un sonido al azar del grupo que tengamos mientras que “Shuffle”, una vez reproduzca un sonido, no lo volverá a considerar hasta que todos los demás se hayan usado. También puedes usar la opción “Avoid repeating last…played“ para asegurarte de que nunca se oiga el mismo sonido dos veces seguidas.
Antes de probar este nuevo diseño, debes cambiar el evento “boy_run_step” de la misma manera que lo hicimos antes. Elimina la Acción que reproducía nuestro paso singular y añade una que reproduzca nuestro nuevo random container en su lugar. Una vez hecho debería verse como en la captura inferior. Ten en cuenta que el resto de acciones permanecen sombreadas ya que habíamos desactivado todos esos objetos para hacer nuestro diseño.
Granularidad
Ya tenemos unos pasos algo más decentes pero aun nos falla la sincronía. Originalmente, Limbo utiliza un sistema bastante más complejo que el nuestro. Por ejemplo, hay un evento especial cuando se empieza a correr y también cuando se salta que en nuestro caso no estamos cubriendo, luego estas acciones están es silencio. Además, el juego diferencia entre las distintas partes del paso disparando un random container para la pisada y otro para el arrastre. Si lo piensas, esto permite multiplicar exponencialmente la complejidad y posibilidades de nuestro diseño. Cada vez que Wwise reproduzca un paso, va a seleccionar al azar entre un grupo de pisadas y luego entre un grupo de arrastres por lo que rara vez oiremos la misma pareja en un espacio corto de tiempo.
A esta última forma de trabajar la llamamos Granularidad y nos permite crear diseños tan variados que imitan en cierto sentido a la naturaleza en su impredictibilidad. Si combinamos esto con las técnicas que ya hemos aprendido como randomización de parámetros y random containers obtenemos un resultado que convencerá más a la persona que juegue. Prueba si no a andar un poco o dar golpes suaves a una mesa y verás que los sonidos resultantes son siempre ligeramente diferentes aunque siempre cohesivos. Esto es precisamente los que estamos buscando conseguir.
Para aplicar esta idea a nuestros pasos vamos a convertir el random container que ahora tenemos en simplemente el sonido de pisada, sin arrastre. Duplicamos el container y re-nombramos uno de ellos como “pasos_inicio_pisada” y el otro como “pasos_inicio_arrastre”.
A continuación, editamos el contenido de cada uno de forma que sólo el ataque o el arrastre sean usados en cada grupo. Ayúdate de las herramientas de fade (triángulos en la parte superior de la ventana de edición) para evitar cortes abruptos.
Una vez terminado, deberías tener dos Random Containers, uno con sólo pisadas y uno con sólo arrastres.
Sequence Container
Para poner ambos elementos juntos, vamos a introducir un segundo tipo de objeto, el Sequence Container. Este nos permite disparar sonidos en una determinada secuencia, como si de una lista de reproducción se tratara. Seleccionamos ambos random container, click derecho, New Parent y Sequence Container.
Si ahora intentas reproducir el nuevo objeto, verás que no obtienes ningún sonido. Esto es por que aún tenemos que indicarle al objeto cómo queremos disparar los sonidos. Para ello, verás que en la parte inferior derecha aparece un área llamada “Playlist”. Aquí es dónde vamos a determinar qué sonidos disparamos y su orden. Arrastra aquí el objeto de pisada primero y a continuación el de arrastre.
Ya tenemos sonido pero ahora necesitamos personalizar el comportamiento del Sequence Container. En los settings del propio container (selecciona el container mientras estás en la Layout “Designer”) verás una sección llamada “Play Mode”. El valor por defecto es “Step”. Esto hace que se reproduzca un sólo elemento de la secuencia cada vez que disparemos el objeto. En nuestro caso, este no es el comportamiento que deseamos. “Continuous” es lo que buscamos, ya que usándolo nuestra playlist se reproducirá completa y en orden cada vez que se dispare el objeto.
También necesitamos marcar “Always Reset Playlist” para que cada vez que se dispare de nuevo el objeto, empiece por el principio de la Playlist. Debajo, verás dos opciones, “Loop” y “Transitions”. La primera opción nos permite poner la playlist en bucle de forma que los elementos se reproducirán un número determinado de veces. En nuestro caso, no necesitamos esto puesto que sólo queremos una instancia por disparo del objeto.
“Transitions” nos permite controlar qué pasa entre cada uno de los elementos de la lista. En nuestro caso, vamos a usar esta opción para asegurarnos que la sincronía de los pasos funciona con la animación. Elegiremos “Trigger rate”, que nos permite establecer el ritmo al que se disparan nuevos elementos dentro del Sequence Container. 0.04 nos permitirá aproximarnos a la animación, de forma que pisada y arrastre serán prácticamente simultáneos. Este es el mismo método que se ha usado en Limbo aunque ten en cuenta que hay muchas otras opciones para sincronizar animaciones y sonidos.
También he ajustado el arrastre para que sea algo más leve en nivel (-6dB) comparado con la pisada. Con esto, sólo queda repetir la operación anterior: cambiamos el objeto en el evento que estamos usando y re-construimos el soundBank. Verás que ahora los pasos se sincronizan bastante mejor.
Múltiples Acciones en un mismo evento
Una última cosa que quería comentar y que quizás ya sospeches es que puedes usar un mismo evento para disparar varios sonidos usando diferentes acciones.
Para poner esto en práctica, vamos a crear, por ejemplo, un nuevo Random Container que contenga sonidos de movimiento de ropa. Puedes usar este sonido: https://freesound.org/people/sunnyflower/sounds/435293/ o uno de tu propia cosecha. Repite un proceso similar al que hiciste con los pasos y aplica algo de randomización al conjunto. Fíjate que no tienes que aplicar la randomizacíon a cada uno de los SFX Objects, con que la apliques al propio container, basta. Esto es algo que se aplica a casi todo en Wwise, por defecto, los elementos “hijos” heredan las propiedades de sus “padres”.
Además, yo he reducido bastante el nivel de la ropa y le he añadido un delay (“Initial Delay”, en la view de propiedades) de 0.1 segundos para que el sonido de ropa se oiga justo después del paso.
Una vez terminado, sólo queda añadir este nuevo objeto al mismo evento que veníamos usando y así ambos se van a disparar a la vez.
Finalmente, puedes repasar la mezcla entre pasos y ropa, ajustar parámetros a tu gusto y crear un nuevo soundBank. Y esto es todo por ahora. Si quieres, puedes estudiar el proyecto para buscar más eventos que cubrir con tus propios sonidos y así seguir practicando. Nos vemos en la siguiente parte.
Glosario
Physical Folder: Son carpetas que, además de aparecer en Wwise, también se van a crear en la misma estructura de carpetas del proyecto, luego van a tener un lugar físico en tu disco duro. Se utilizan para organizar y separar Work Units.
Virtual Folder: Estas carpetas también aparecen en Wwise pero en este caso, no representan un lugar físico del disco duro. Son útiles para organizar elementos de tu proyecto, siempre dentro de tus Work Units.
Source Editor: Editor de audio que está incluído en Wwise y nos permite seleccionar qué porción de un archivo de audio estará asociada con un cierto SFX Object, además de poder cambiar otros parámetros del sonido.
Randomización de parámetros: Función que nos permite añadir variación al azar a ciertas funciones en Wwise dentro de un rango que establezcamos.
Random Container: Objeto que nos permite incluir varios objetos y cada vez que es disparado lanza, con un azar controlado, alguno de ellos.
Granularidad: Método de trabajo que nos permite dividir un cierto sonido en componentes individuales, aumentando así las posibles combinaciones entre sus elementos. Por ejemplo, un cañonazo se podría dividir en un elemento inicial de ataque o explosión más uno de eco que reverbera, pudiendo así combinar distintos ataques con distintos ecos.
Sequence Container: Objeto que nos permite disparar sonidos en cadena utilizando una lista de reproducción.