Tutorial Wwise en Español - Parte III: Game Syncs

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.

En esta parte 3 vamos a profundizar en cómo podemos recibir información desde el juego y usarla para alterar nuestros sonidos. Esta es una parte muy importante del trabajo de diseño en un juego puesto que queremos que el mundo sonoro reaccione antes las acciones que la persona que juegue realice.

Vuelta a Cube

Para esta parte del tutorial, vamos a volver a usar el primer juego que usamos, Cube. Puedes abrir el mismo proyecto que usamos en la primera parte o bien empezar de cero. También puedes abrir el proyecto original desde el launcher por si quieres echar un ojo, este es un proyecto mucho más sencillo que el de Limbo y puede ser didáctico ver cómo está organizado.

Game Syncs

En el Layout Designer, hasta ahora hemos ido trabajando con las tres primeras pestañas: Audio, Eventos y SoundBanks que nos han permitido hasta ahora administrar prácticamente todo lo necesario para introducir nuestros propios sonidos. Esto siempre y cuando el equipo de programación y nosotros nos pongamos de acuerdo en la nomenclatura. Recuerda que el nombre de los eventos y los soundBanks debe ser preciso puesto que en el código del propio juego estos serán llamados específicamente.

Ahora vamos a introducir la siguiente pestaña, Game Syncs, que, como comentaba en la introducción, nos permitirán recibir información del juego y cambiar cómo nuestros sonidos se comportan en tiempo real. Imagina por ejemplo que la cantidad de munición afecte al sonido del arma, la hora del día cambie el ambiente sonoro o pausar la partida cambie la música. Este es el tipo de cosas que podemos hacer con Game Syncs y, como eventos y SoundBanks, también necesitan de precisión en su nomenclatura. Veamos poco a poco los cuatro tipos que Wwise nos ofrece:

  • Game Parameters.

  • Switches.

  • States.

  • Triggers.

Game Parameters (RTPCs)

Este tipo es quizás el más intuitivo. Nos permite enviar a Wwise una variable que toma un valor numérico en un determinado rango. Ejemplos de Game parameters, también llamados RTPC (Real Time Parameter Control) serían la salud del personaje, la velocidad de un vehículo o los segundos restantes de partida. Cualquier cosa que se pueda describir con un valor numérico.

Fíjate también que en el nombre se incluye “Real Time” por que estos valores se están enviando a Wwise constantemente, de forma que los sonidos afectados reaccionan en tiempo real.

Vamos a crear uno de estos parámetros en Cube. Desde el Designer Layout ve a la pestaña de Game Syncs. Verás que hay una carpeta física por cada tipo de Game Sync. Dentro de Game Parameters, selecciona la Default Work Unit y crea un nuevo Game Parameter. Lo llamaremos “PlayerHealth”. Recuerda que este nombre ya viene definido en el código del juego por lo que debe ser exacto.

Verás entonces que en el Property Editor (parte central superior) puedes elegir el rango que tendrá nuestro parámetro. En este caso, la salud irá de 0 a 100. Recuerda si creáramos otro parámetro relacionado con distancia o tiempo, podremos elegir cualquier rango que tenga sentido y se haya consensuado con el equipo de programación. La distancia podría medirse en metros en juego de carreras o en años luz en uno de naves espaciales. También se podrían usar unidades arbitrarias que tengan sentido con el editor que se use para el mapeado. En cualquier caso es importante ponerse de acuerdo en este aspecto y tener una idea de la escala que estás usando en cada momento.

En nuestro caso, hemos determinado que la salud va de 0 (muerto) a 100 (vida máxima). Repito que esto no lo decidimos nosotros si no que se define en la programación del juego. También se nos requiere elegir un valor por defecto (Default). Como aparecemos en el juego con la vida al máxima, usaremos 100.

Aplicando RTPCs

Ya tenemos nuestro parámetro pero por ahora no está haciendo gran cosa. Vamos a crear un nuevo sonido de latido de corazón que sonará cuando nuestra salud es baja. Crea un nuevo SFX Object a partir de este sonido u otro que te guste similar. Esto me sirve para recordar que idealmente Wwise acepta audio sin comprimir por lo que en el caso de querer usar el audio que he enlazado habría que convertirlo en wav. Esto es aceptable para nuestras prácticas pero idealmente siempre debemos usar grabaciones originales y sin comprimir. Recuerda que al crear nuestro banco podremos determinar cuánto y cómo comprimimos el audio, pero esto lo veremos en más detalle en el futuro.

Nombra al SFX Object como quieras (recuerda que sólo necesitamos respetar los nombres de eventos, SoundBanks y Game Syncs). En el Property Editor ajusta su volumen y haz que se reproduzca siempre en bucle.

Una vez listo, necesitamos también crear el evento que va a disparar nuestro sonido. En principio, puedes pensar que sólo queremos lanzar este evento cuando nuestra salud baje de un cierto valor. Esta manera sería totalmente válida pero vamos a hacer algo más interesante. Nos convendría que el evento estuviera siempre reproduciéndose para poder ir introduciéndolo gradualmente. Crearemos entonces un evento llamado “Map_Loaded” ya que este evento se inicia cuando cargamos cualquier mapa y no se para nunca durante toda la partida. Una vez creado, no olvides asociar una acción de Play al objeto con el sonido de corazón que creamos previamente.

Puedes probar ahora a añadir este nuevo evento al soundBank y compilar un nuevo banco de sonidos. Si ahora juegas a Cube, notarás que el corazón suena todo el tiempo. Buena señal de que nuestro evento funciona pero desde luego necesitamos ajustarlo para que sólo se oiga cuando la salud sea baja.

Ajustando las curvas RTPC

Para ello ve al Layout Designer y selecciona nuestro SFX Object con el sonido de corazón. Si te fijas en el Property Editor verás varias pestañas. Normalmente hemos usado la llamada “General Settings” pero ahora es nuestro oportunidad de usar otra. ¿Ves alguna que te llame la atención? Bingo, hay una llamada RTPC.

Cuando la seleccionas, en un principio todo estará vacío. Lo primero que necesitamos especificar es a qué parámetro queremos afectar. En la parte inferior izquierda, selecciona el botón con flechas y elige “Voice Volume”. Ese será el valor que usaremos en el eje de Y. Para el eje de X, pulsa en el siguiente botón que ahora aparece y selecciona el parámetro que creamos al principio para la salud del personaje que estará en la ruta: Game Parameters > Default Work Unit > PlayerHealth.

Una vez listo nos aparecerá una gráfica que representa la relación entre la salud del personaje y el volumen del sonido del corazón. Fíjate que puedes cambiar el valor del parámetro (Player_Health) arrastrando la “bandera” que ves en el centro del gráfico. También puedes usar la barra espaciadora para reproducir el sonido a medida que cambias el parámetro.

Pronto te darás cuenta que las cosas están al revés de lo que pretendemos. Ahora mismo el sonido solo suena en su máximo volumen cuando la saludo es 100. Lógicamente queremos que ocurra lo contrario. Puedes usar los puntos en los extremos de la gráfica para cambiar los valores. También puedes crear nuevos puntos haciendo doble click y haciendo click derecho en la curva, puedes elegir una forma diferente como logarítmica o exponencial.

Una vez retocado, deberías tener algo parecido a lo que ves arriba. No oiremos prácticamente nada entre 100 y 50. A partir de ahí el nivel subirá hasta ser máximo con 0 salud.

Algo interesante que nos ofrece esta forma de editar parámetros es que podemos ajustar distintas cosas a la vez. La salud del personaje ya está afectando el nivel del sonido pero también podría afectar a un filtro de paso bajo. Para ello, debemos crear una nueva pareja de valores asociados tal y como hicimos antes usando los botones con flechas. Elige esta vez “Voice Low-Pass Filter” y el mismo parámetro “PlayerHealth”. Verás que aparece una nueva curva en otro color que podemos ver a la vez que al anterior siempre que tengamos ambas seleccionadas.

Ajusta esta segunda curva para obtener un resultado similar al anterior. Puedes escuchar el resultado a medida que cambias el valor de salud. En mi caso, he intentado que cuando empezamos a oír el corazón este suene más amortiguado, como si viniera desde detrás de una puerta y a medida que la salud baja el sonido de vuelve más claro y prominente.

También he añadido una tercera curva relacionado con el pitch (tono) para que el ritmo del corazón aumente cuando la salud baja de 20 a 0. Cuando termines, mueve la bandera mientras reproduces el objeto para probar el resultado.

Una vez listo, podremos crear un nuevo soundBank y probarlo en Cube aunque te darás cuenta de que no hay enemigos que te puedan “ayudar” a que tu salud baje. Podrías cargar otro nivel que tenga enemigos pero esto nos sirve para descubrir otra funcionalidad que tiene el transporte en Wwise.

Ve a al pestaña de Eventos y selecciona “Map_Loaded” que es el evento que estaba reproduciendo el sonido de corazón. Si reproduces el evento posiblemente no oirás el corazón puesto que 100 era el valor por defecto para la salud. si te fijas en la parte inferior central (dentro del Layout Designer) verás el transporte con el que podemos controlar la reproducción de objetos o eventos en Wwise. En el centro, puedes ver cuatro botones cada uno con el nombre de un Game Sync diferente.

Podemos usarlos para manipular los distintos valores que vendrían del juego en tiempo real si estuviéramos jugando pero con la comodidad de poder cambiarlos a nuestro antojo y con el juego cerrado. Puedes ver esto como una especie de “simulación” de lo que pasaría con un objeto o un evento cuando los valores se cambian de una determinada manera.

Si eliges entonces RTPCs verás que aparece “Player_Health” como opción. Esto es por que Wwise puede ver qué los objetos llamados por el evento “Map_Loaded” están asociados con ese parámetro. Puedes entonces reproducir el evento y cambiar el valor de la salud para ver si funciona como deseas sin necesidad de abrir las curvas RTPC.

Blend Containers

Ahora que tienes una buena idea de lo que es un RTPC, hemos sentado una buena base para comentar otro de los contenedores que Wwise utiliza. Recuerda que ya vimos los random containers que lanzan sonidos al azar partiendo de un conjunto y los sequence container que los lanzan en listas de reproducción.

El siguiente es el Blend Container. Como su nombre indica (blend se podría traducir como mezclar o combinar) este tipo de contenedor nos permite combinar diferentes objetos de una forma dinámica según como un parámetro o RTPC cambie.

Vamos a aplicar de nuevo esta idea a nuestro sonido de salud baja. El sonido de corazón quizás no es demasiado claro y fácil de oír en medio de una intensa batalla. Vamos entonces a añadir un segundo sonido que solo oiremos si la salud cae a niveles críticos. Importa este sonido u alguno otro similar que prefieras en Wwise. Una vez listo, selecciona este y el latido de corazón, haz click derecho y elige New Parent > Blend Container. Puedes nombrarlo “Salud” o como prefieras. Te debería quedar algo similar a la imagen inferior, con el Blend Container conteniendo a ambos sonidos.

Ajustando un Blend Container

Si ahora seleccionas este nuevo contenedor y echas un vistazo a la view “Property Editor” (parte central superior), verás que nos aparece una nueva opción llamada “Blend Tracks” y un botón para editar. Haz click en él y verás que todo aparece bastante vacío. Lo primero que necesitamos crear es una nueva “Blend Track”. Estas pistas son dónde vamos a poder alojar nuestras curvas que nos permitirán personalizar cómo se comportarán nuestros sonidos según cambien determinados parámetros.

Creamos una nueva que podemos llamar “Salud”. Una vez hecho esto, si vuelves a la ventana principal de Wwise y te fijas en la parte central inferior verás que se listan los “children” (hijos) que están dentro de nuestro blend container y a la derecha nos aparece la pista que hemos creado. Por ahora está vacía pero para solucionarlo sólo tenemos que arrastrar nuestros objetos a ella. Debería quedarte algo similar a lo que ves en la imagen siguiente.

Una vez listo, volvemos a nuestra ventana de edición del Blend Container (“Blend Tracks”). Verás en la parte superior izquierda una caja que podemos confirmar donde dice “Crossfade”. En nuestro caso este es el comportamiento que deseamos puesto que queremos que ambos sonidos se entremezclen paulatinamente. Una vez confirmado esto, verás que justo a la derecha un botón de vuelve clickable y ahora podemos elegir nuestro parámetro “Player _Health”.

Como puedes ver, por defecto el primer sonido (corazón) sonaría de 0 a 50 y el segundo de 50 a 100. Lógicamente, este no es el comportamiento que queremos. Lo primero que necesitamos hacer para hacer nuestra vida más sencilla es cambiar el orden puesto que solo queremos el Beep cuando queda muy poca salud. Puedes hacer esto en la lista de Blend Tracks que usamos antes. Una vez hecho esto, es sencillo ajustar los sonidos para que se solapen de una forma que nos guste. Recuerda que siempre puedes escuchar el container para ver como queda y también que todo el trabajo que antes aplicamos al sonido de corazón sigue funcionando. Debería quedarte algo similar a esto:

Una vez terminado sólo nos quedaría probarlo en el juego o usar el propio transporte de Wwise que como recuerdas nos ofrece la posibilidad de manipular cualquier RTPC mientras reproduces un objeto.

Espero que esto te de una buena idea del poder que pueden tener estos Blend Containers. Un uso muy común para ellos es para motores de vehículos de forma que podemos ir de un sonido menos revolucionado a otro más intenso según las RPM del motor. También quizás te diste cuenta que se usan en los pasos de Limbo para pasar de una superficie a otra (como tierra-barro-agua) y así poder controlar cómo de rápido es la fusión entre este tipo de sonido según te acercas a un lago, por ejemplo.

Switches & Switch Container

Y ya sólo nos queda por ver un último tipo de container, el Switch Container que viene asociado con otro tipo de Game Sync: Switches. De nuevo el nombre nos da pistas ya que switch significa intercambiar. Este tipo de contenedor nos permite cambiar de unos sonidos a otros según cambie este nuevo tipo de Game Sync. Veamos cómo funciona.

Si recuerdas, el anterior Game Sync que vimos es el Game Parameter o RTPC que suele recoger valores numéricos dentro de un rango y que describe diferentes variables en el mundo del juego. En cambio, los Switches nos ofrecen otro tipo de funcionalidad. En vez de usar un rango de valores numéricos, usan unos determinados estados pre definidos. En otras palabras, mientras que los RTPC miden cantidad los Switches miden calidad o tipo.

Para el juego de Cube necesitamos añadir pasos a nuestro personaje. Por suerte la programación del juego ya contempla esto y siempre que movamos al personaje, el juego va a estar pidiendo a Wwise que lance un evento de pasos. Hasta ahí esto funciona bien pero tenemos el problema de que podemos andar por distintas superficies como tierra, arena, metal, etc. Necesitamos entonces diferenciar entre todas estas superficies. Una manera de hacer esto sería que el programador pida un evento diferente en cada tipo de superficie.

Otra manera, quizás más flexible, podría ser definir el material de cada superficie del juego para que un único evento general de pasos se adapte y lance los sonidos apropiados en cada momento. La ventaja de este sistema es que podemos usar la información de estos materiales para otras cosas también como por ejemplo un sonido de salto o de cuerpo cayendo al suelo.

Para esto, creamos un Switch por cada superficie y los agrupamos en un Switch Group. Fíjate que los Game Parameters que vimos antes no se agrupaban de ninguna forma puesto que lo que los definía era su propio valor numérico pero en el caso de los Switches necesitamos siempre englobarlos en un Switch Group.

Otros ejemplo de uso de los Switches podría darse en un juego en el que podemos cambiar el motor de nuestro vehículo. Cada tipo de motor tendría sus sonidos asociados en un switch diferente y todos ellos se asociarían en un switch group que iría ligado al vehículo. Como puedes ver, en general, los switches son útiles cuando tenemos un número de opciones que el juego va a necesitar intercambiar según progrese la partida.

Definiendo los materiales en Cube

Lo primero que necesitamos hacer es crear un nuevo Switch Group. Si dentro del Layout Designer vas a la pestaña de Game Syncs verás una carpeta llamada Switches. Dentro de la Default Work Unit, crea un nuevo Switch Group y nómbralo “Material”. Una vez creado, podrás crear diferentes switches dentro de este grupo. Puedes pensar en un Switch Group como un interruptor y los Switches contenidos dentro como cada una de las posiciones en las que se puede poner dicho interruptor.

Crea pues un nuevo switch por cada material que usa Cube. Fíjate que los nombres están en inglés ya que el juego ya tiene pre establecido llamar así a cada uno de los posibles materiales. Cambiar estos nombres requeriría ponerse de acuerdo con el equipo de programación por lo que por ahora usaremos los que ya nos vienen definidos:

  • Concrete

  • Grass

  • Gravel

  • Metal

  • Sand

  • Stone

  • Tile

  • Water

  • Wood

Importando múltiples sonidos

Una vez definidos los materiales, lo siguiente que necesitamos es crear los pasos para cada superficie. Puedes usar aquí tus propias librerías si quieres pero para facilitar las cosas, lo más sencillo sería recurrir a los sonidos que venían con el tutorial oficial del curso básico de Wwise. Lo deberías tener de la parte primera pero descárgalo si no lo encuentras. Dentro de ese zip encontrarás los pasos en la siguiente ruta:

  • Wwise-101_v2017.2/Lesson 3/Audio files for Lesson 3/Footsteps

Para importarlos vamos a usar un nuevo método. Como habitualmente, haz click derecho en la Default Work Unit donde se alojan tus sonidos (carpeta “Actor-Mixer Hierarchy”) y haz click en “Import Audio Files…” pero esta vez elige “Add Folders…” en la ventana emergente y selecciona la carpeta entera llamada “Footsteps”.

Si te fijas, con esta opción Wwise crea una estructura de carpetas que usará cuando importe los sonidos. Esto es de gran ayuda, especialmente por que podemos modificarla a nuestro gusto antes de importar los sonidos. Verás que cada tipo de material (Concrete, Dirt, etc…) está organizado en carpetas virtuales y todos ellos están contenidos a su vez en otra carpeta virtual llamada “Footsteps”. Vamos a cambiar algunas cosas para ajustarlas a nuestras necesidades.

Para empezar, las carpetas que contienen cada tipo de material nos vendría bien que fueran Random Containers, ya que queremos que cada paso sea uno elegido aleatoriamente. Puedes cambiar esto con el menú desplegable que cada elemento tiene en la columna central. Una vez hecho esto, necesitamos cambiar también la carpeta principal llamada “Footsteps” en un Switch Container ya que vamos a usar nuestros materiales antes creados para decidir qué grupo es el que sonará. Al final, debería quedarte algo similar a esto:

Una vez importado, verás que se nos crea una bonita estructura de carpetas para la que no hemos tenido necesariamente que mover y colocar todo a mano. Quizás incluso te recuerde un poco a las jerarquías de carpeta que Limbo tenía y es que este tipo de organización es la mejor forma de mantener en orden de una forma lógica y funcional tus sonidos.

Asignando sonidos a materiales

Si ahora eliges nuestro nuevo y flamante Switch Group verás que en el Property Editor nos aparece una función nueva llamada “Switch”.

En ella, debemos primero seleccionar nuestro Switch Group, “Material” y también que Switch queremos que se use por defecto, que en nuestro caso será “Concrete”. Con esto, estamos diciendo a Wwise que utilice los Switches contenidos en este grupo como referencia y que en caso de no encontrar ninguno asociado use “Concrete”.

Ya sólo nos queda asignar los sonidos que queremos que cada material use. Te habrás dado cuenta de que tenemos muchos materiales y sólo 4 tipos de sonidos. Esto puede ser algo habitual durante el desarrollo de un juego, se utilizan primero sonidos provisionales que luego iremos sustituyendo.

Seleccionando aún nuestro Switch Container, verás en la parte inferior que de la misma manera que previamente podíamos asociar objetos a las distintas blend tracks de los Blend Containers, podemos también asociar los distintos objetos contenidos en nuestro Switch Container a los distintos materiales.

Screen Shot 2019-12-19 at 11.42.58.png

Por ahora no hay nada asociado pero podemos ir arrastrando el tipo de sonido que creamos mejor encaja con cada material. Recuerda que si dejas un material sin asociación, se utilizará el material por defecto que nuestro caso es “Concrete”. También ten en cuenta que puedes asociar el mismo sonido a varios materiales. Ve asociando sonidos según veas más lógico hasta obtener algo similar a esto:

Probando los pasos

Antes de probar en el juego, recuerda que puedes también usar el transporte de Wwise. Seleccionando el Switch Group que contiene todo los pasos, reprodúcelo y prueba cada una de los materiales.

Para poder implementar estos pasos en Cube, como siempre necesitamos un evento. Crea un nuevo evento y llámalo “Foot_Player”. Añade a este evento una acción que reproduzca nuestro Switch Container “Footsteps”. Si necesitas repasar cómo se hacía cualquiera de estas cosas, puedes consultar la primera parte de esta serie.

Ahora sólo queda crear un nuevo SoundBank (no olvides añadir el nuevo evento al banco) y abrir el juego para probar el resultado de nuestro trabajo. No hay demasiados materiales diferentes en el mapa por defecto pero podrás oír la diferencia de sonido en los pasos entre el interior y el exterior.

States

Ya hemos visto dos de los cuatro Game Syncs que Wwise ofrece. Por un lado, los Game Parameters nos permiten recibir información numérica desde el juego como el nivel de salud, velocidad de un coche o hora del día. Los Switches, en cambio, nos permiten comunicar a Wwise cambio cualitativos como por ejemplo qué material está pisando nuestro personaje o qué tipo de cañón se está usando en un arma.

Veamos ahora los States que pueden resultar conceptualmente un poco confusos al principio. Funcionan de forma similar a los Switches en el sentido de que no usan valores numéricos sino valores cualitativos determinados. Como los Switches, también se agrupan en grupos, en este caso en State Groups.

¿Cual es la diferencia entonces? Mientras que un Switch Group afecta de forma local a unos determinados sonidos (como los pasos que acabamos de implementar) un State Group se utiliza para eventos globales que pueden afectar a muchos sonidos a la vez.

Piensa por ejemplo que el material usado en los pasos se considera algo local por que cada entidad que se encuentre en el mapa (otros jugadores, enemigos…) estará utilizando su propia instancia de este Switch Group. Los States Groups, en cambio, se aplican a eventos globales como por ejemplo que el jugador haya pulsado pausa, esté en un determinado menú o se encuentre bajo el agua.

Estos eventos van afectar a como percibiremos varios sonidos a la vez. Por ejemplo, si el jugador se sumerge quizás queramos aplicar un filtro pasa bajos a todos los sonidos del entorno e incluso podríamos hacer que la música del juego suene más lejana y amortiguada.

La ventaja de los States es que podemos aplicar los cambios que asociemos a ellos de forma gradual pudiendo controlar cómo de rápidos son estos cambios.

Creando States

En Cube, podemos crear un State Group que reciba información del juego sobre el estado del personaje y en caso de morir, podamos hacer que por ejemplo nuestro sonido de salud baja se apague gradualmente. Recuerda que ahora mismo, el sonido de alarma que tenemos programado para la salud baja va a seguir sonando incluso aunque la salud sea 0 por lo que parece una buena idea hacer que se desvanezca cuando morimos.

Vamos allá pues. Sigue el mismo proceso que con los Switches pero esta vez elige crear un nuevo State Group bajo la Default Work Unit correspondiente, dentro de la pestaña de Game Syncs. Crea un nuevo grupo y llámalo “PlayerLife“. Dentro del grupo, crea dos estados, “Dead” y “Alive”. Recuerda que, como el juego ya está preparado para enviar las Game Calls con estos nombres exactos, es importantes mantener los nombres tal cual.

Una vez hecho esto, vamos a personalizar el comportamiento global que queremos que estos estados tengan. Selecciona el State Group “PlayerLife” dentro del Layout Designer y verás que en el Property Editor podemos crear transiciones personalizadas aunque por ahora aparece todo vacío.

Hacemos click en “Insert” para crear una nueva transición. En el campo “From” elegimos “Alive” mientras que en “To” seleccionamos “Dead”. Verás que podemos definir cuánto tiempo queremos que dure la transición entre ambos estados. En este caso, desde vivo a muerto queremos que dure unos 5 segundos para que los sonidos se vayan desvaneciendo lentamente. Creamos otra transición pero esta vez de muerto a vivo y hacemos que dure 1 segundo ya que cuando hagamos re-spawn queremos que los sonidos vuelvan a la normalidad más rápidamente.

Aplicando States a nuestros sonidos

Un vez los estados están definidos, debemos decidir cómo van a afectar a los distintos objetos que tenemos. Selecciona nuestro Blend Container “Salud” y fíjate que en el Property Editor tenemos una ventana que indica “States”. Selecciónala y añade el State Group que hemos creado. Como puedes ver, nos aparece varias maneras de manipular el sonido para ambos estados. En nuestro caso, lo que queremos es que el nivel del sonido caiga al morir por lo que en “Voice Volume” indicaremos -96dB en el estado “Dead” ya que este es el nivel mínimo que Wwise maneja. También podrías cambiar el valor “Voice Pitch” para que el tono del sonido caiga si el personaje muere. En el State “Alive” en principio no necesitamos cambiar nada.

Si quieres ver cómo queda y posiblemente ajustar los valores a tu gusto, recuerda que puedes reproducir el Blend Container y luego cambiar los valores RTCP y los States con las cajas que puedes encontrar a la derecha del transporte.

Como los States son de ámbito global, podemos afectar a muchos otros sonidos. Por ejemplo, podríamos hacer que cuando el personaje muere, siga oyendo los pasos y disparos de sus enemigos alrededor, pero muy amortiguados, como si estuviera perdiendo la conciencia. Puedes aplicar un cambio de estado similar al que ves en la imagen inferior a los objetos de pasos y disparo de escopeta. Esto haría que cuando muramos un filtro pasa bajos entre en acción gradualmente.

Por supuesto, ya que nuestro juego apenas tiene unos pocos sonidos, no podemos hacer mucho más con el estado de muerte, pero imagina las posibilidades. Quizás la música sonaría más lejana y con reverb, el ambiente exterior se apaga y suena distante y a los sonidos más cercanos les aplicamos un delay con feedback para obtener un efecto de aturdimiento.

En definitiva, los States nos permiten afectar globalmente a los sonidos y su mezcla para conseguir transmitir ciertos estados especiales.

Triggers

Si recuerdas nuestra lista inicial de Game Syncs, sólo nos quedan por mencionar los Triggers. No los vamos a ver en uso en este tutorial puesto que se utilizan para implementar elementos musicales. Los Triggers pueden básicamente disparar distintas frases musicales respetando el tempo y ritmo de una música de fondo. Se utilizan para crear una banda sonoara dinámica que reacciona a cómo el jugador interactúa con el entorno.

Sumario

En esta tercera parte, hemos visto los cuatro tipos de Game Syncs y algunos de los containers que llevan asociados. Si tienes dudas o cualquier problema, puedes escribirme a contactme [ arroba ] javierzumer.com. Mientras tanto, dejo por aquí un glosario con todos los conceptos que he ido introduciendo en esta tercera parte. !Hasta la próxima!

  • Game Syncs: Objeto que nos permite recibir información del juego y cambiar cómo nuestros sonidos se comportan en tiempo real.

  • Game Parameter o RTPC: Tipo de Game Sync con la que el juego nos puede comunicar una variable que toma un valor numérico en un rango determinado. Por ejemplo la salud del personaje, la velocidad de un vehículo o los segundos restantes de partido.

  • Blend Container: Tipo de objeto que nos permite combinar distintas proporciones de varios sonidos según cambie el valor de un RTPC.

  • Blend Track: Pistas especiales que podemos crear en cada Blend Container y nos permitirán personalizar cómo se comportarán nuestros sonidos según cambien determinados parámetros.

  • Switches: Tipo de Game Sync que en vez de usar un rango de valores numéricos, usan unos determinados estados pre definidos como si se tratara de distintos posibles valores en un interruptor. Se ajustan a determinados sonidos de manera local.

  • Switch Group: Conjunto de Switches.

  • Switch Container: Tipo de objeto que lee los valores que el juego manda para así determinar qué grupo de sonidos lanzar.

  • States: Tipo de Game Sync que usa valores cualitativos como los Switches pero se utiliza para eventos globales que pueden afectar a varios sonidos a la vez.

  • State Group: Conjunto de States.

  • Triggers: Tipo de Game Sync que se utiliza para implementar elementos musicales que se pueden disparar respetando el tempo musical.

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.

Screen Shot 2019-11-27 at 13.55.29.png

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.

Tutorial Wwise en Español - Parte I: Introducció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.

Dada la falta de recursos en castellano para aprender sonido para videojuegos de una forma práctica, me he decidido a escribir este tutorial como forma de iniciación en este, algo misterioso, mundo.

Voy a tratar de explicar algunos de los conceptos básicos que son necesarios para entender como funciona esta disciplina. He decidido mencionar y nombrar los conceptos clave en inglés por que así creo que te será mas fácil familiarizarte con la jerga del sector además de permitirte poder buscar ayuda online utilizando los términos en su idioma original.

Utilizaré Wwise, posiblemente el motor de audio más utilizado en la industria, pero ten en cuenta que estas ideas y prácticas se pueden aplicar, con ciertas modificaciones conceptuales, a otros software también.

Preámbulo sobre Diseño Interactivo

Antes de entra en harina, quería comentar que si hasta ahora solo has trabajado en disciplinas sonoras lineales como producción, mezcla musical o sonido para cine, hay ciertas consideraciones que debes tener en cuenta a la hora de trasladar tu trabajo a un medio interactivo como son los videojuegos.

Es imposible predecir como cada jugador va a comportarse por lo que el diseño de sonido y la mezcla debe considerar todas las posibles relaciones entre los elementos sonoros del proyecto. En comparación, un mezcla para un medio como cine es lineal y estática, luego una vez mezclada la película, esta siempre va a sonar igual, asumiendo que el medio de reproducción es medianamente fiel.

En contrapartida, los juegos son mas impredecibles y ningún jugador va a interactuar con el entorno de la misma manera por lo que el diseñador de sonido deberá implementar sistemas que ayuden a que la mezcla final provea la información mas relevante posible, manteniendo a la vez la estética y estilo que queremos transmitir.

Un ejemplo de esos sistema es el manejo de prioridades. Veremos ver cómo es posible dar prioridad a ciertos sonidos por encima de otros para asegurarnos de que los elementos más importantes, como diálogos, música o las acciones del protagonista nunca queden ahogados en la mezcla por sonidos del entorno que quizás no son tan relevantes.

Otra consideración a tener en cuenta es el manejo de la repetición. Si una acción es muy común en un juego, como por ejemplo saltar, y tiene un sonido asociado, el jugador va a escuchar este sonido cientos de veces. Veremos que métodos y estrategias podemos implementar para añadir mas variación y diversidad a sonidos frecuentes incluso aunque contemos con pocos sonidos a nuestra disposición.

Por último, un diseñador de sonido para juegos también debe tener siempre presente que cuenta con un número finito de recursos para realizar su trabajo. Debemos asegurarnos que tanto a nivel de memoria como de CPU no nos excedemos del “presupuesto” que se nos concede ya que la mayor parte de los recursos suelen ser destinados para el apartado gráfico.

Middleware

Este es el nombre que recibe el tipo de software que va a hacer de puente entre nuestros sonidos y el propio motor del juego. Wwise es el que voy a usar en este tutorial pero hay muchos otros que también son utilizados en la industria como por ejemplo Fmod o Fabric. Conocer uno de ellos te va a ayudar mucho a familiarizarte con los demás, puesto que trabajan con conceptos similares, aunque ten en cuenta que a veces resuelven el mismo problema de formas muy diferentes.

Estos middleware se pueden integrar en motores conocidos como Unity, Unreal o Source e incluso pueden funcionar junto a cualquier otro software o incluso hardware (¡como en coches!), siempre y cuando se utilice la sintaxis de programación adecuada. Por otro lado, los motores de juego mas grandes (Unity, Unreal, etc) tienen sus propias herramientas de audio que actúan en realidad como un middleware integrado por lo que a veces no utilizan Wwise o Fmod. Todo depende de las necesidades del proyecto y las preferencias del equipo.

En lo que a nosotros respecta, vamos a ver como usar Wwise en general, sin concretar como interactúa con ningún motor en particular. Una gran ventaja de usar Wwise, en vez de las herramientas de audio propias de un motor, es que como diseñador tendrás mas independencia a la hora de diseñar e integrar sonidos sin necesidad de que la persona encargada de la programación tenga que ayudarte con cada cambio que hagas.

Aprender las funciones y conceptos básicos de Wwise te va ayudar a comprender un poco mejor cómo funciona el audio para videojuegos y de paso te dará los conocimientos necesarios para en el futuro saltar a otro middleware con más facilidad, de la misma forma que, por ejemplo, aprender Pro Tools te ayudaría a usar Nuendo.

Descarga, Instalación y Materiales

Vamos al turrón, pues.

Veo imprescindible que pongas las manos en la masa y a medida que explique distintos conceptos puedas ir poniéndolos en practica en tu propio proyecto de Wwise. Para ello, vas a necesitar descargar todo el software necesario.

Ve a la pagina oficial de Wwise y debes descargar el launcher con el que podrás administrar todas las distintas versiones y materiales.

Una vez en el launcher, debes instalar la última version de Wwise (latest) e incluir también los elementos que ves en la imagen inferior. Dentro de Samples, veras LIMBO y Cube, estos son dos juegos que podrás usar para poner tus propios sonidos y aprender como Wwise interactúa con un juego real. Por otro lado, a la derecha verás que puedes elegir distintas plataformas que Wwise tendrá en cuenta cuando prepare los archivos de audio para el juego. En principio, elige tu propia plataforma (Windows o Mac) o ambas incluso si quieres.

Para que te sirva de referencia, este tutorial ha sido realizado en la version 2019.1.4.7065. Si estás leyendo esto en algún punto en el futuro, posiblemente tu versión será más avanzada pero la mayoría de cosas deberían ser razonablemente iguales.

Hay algo más que vas a necesitar. Wwise ofrece un curso de introduccion oficial que es gratuito y en el que se incluyen varios ejercicios. Desgraciadamente, este curso no existe en castellano, pero vamos a utilizar algunos de los recursos que el proyecto ofrece para poder poner en practica este tutorial y de hecho estoy basando esta primera parte en gran medida en la primera lección de ese curso. Puedes descargar los materiales aquí. Una vez descargado estos archivos, debes moverlos al mismo directorio donde reside Cube, el primer juego que vamos a utilizar como ejemplo. La ruta sería:

  • Windows: Program Files (x86)/Audiokinetic/Wwise 20xx.x.x.xxxx/Cube

  • Mac: Applications/Audiokinetic/Wwise 20xx.x.x.xxxx /Cube

Por cierto, si te ves con el inglés necesario para hacer el curso oficial, creo que es la mejor introducción que puedes darle a Wwise y lo considero mas completo y exhaustivo que el mío. Si en cambio prefieres una introducción en castellano, sigue leyendo y quizás después te animes a saltar a la version oficial.

Si ya tienes todo descargado e instalado, estás listo para abrir Wwise por primera vez.

Primera toma de contacto con Wwise

Ejecuta tu versión de Wwise desde el propio launcher.

Nada mas abrirse, veras el Project Launcher que suele contener los proyectos que has abierto recientemente y en tu caso estará seguramente en blanco. Empieza por crear un nuevo proyecto en blanco (New…) y guárdalo en el mismo directorio donde guardaste los archivos de Cube, pero en este caso en la carpeta de la lección 1.

Puedes llamar al proyecto como quieras pero es importante que lo guardes en este lugar para poder luego conectar nuestro trabajo con el juego más fácilmente. Verás también que hay una sección llamada “Platforms“, asegúrate de añadir tu plataforma (Windows o Mac) si esta no aparece ya.

Una vez listo, y tras un aviso sobre licencias que por ahora no nos interesa, nos encontraremos con un proyecto de Wwise vacío.

No dejes que tanto panel te intimide, vamos a ir viendo cómo funciona cada cosa poco a poco. Por ahora, fíjate que si vas a la carpeta donde has creado el proyecto, verás que contiene un archivo con extension .wproj ademas de un montón de carpetas. Este sistema de carpetas es cómo Wwise organiza todos los elementos necesarios para hacer funcionar al sonido de un juego y son imprescindibles para que el archivo de proyecto .wproj funcione. Es algo parecido a las sesiones de Pro Tools o Cubase, necesitas tanto el propio archivo de proyecto como todas las carpetas asociada a él.

Project Explorer

Wwise divide su interfaz en “views“ que son cada uno de los paneles que puedes ver y que tienen un botón de cerrar, otro de ayuda más algunos extra para otras funciones dependiendo de que view se trate. Vamos a fijarnos un momento en la view “Project Explorer” que es la que puedes ver en la parte superior izquierda de tú proyecto..

Wwise tiene una forma curiosa de organizar la información, bastante diferente a otros programas de audio que quizás has usado hasta ahora. Cada una de las pestañas que ves en esta view contiene diferentes tipos de objetos, que se van usar más tarde para determinar el comportamiento del sonido en el juego. Puedes ver a estos objetos como la unidad funcional mínima en Wwise. Vamos a ver brevemente qué tipo de objetos se alojan en cada pestaña, aunque más tarde los veremos en más profundidad:

  • Audio: Esta pestaña es la única que va realmente a conectarse con los archivos de audio de nuestro proyecto. También podemos crear aquí buses de una forma similar a cómo se hace en un DAW.

  • Events: Aquí estarán alojados los objetos que recibirán información desde el juego de forma que podamos lanzar los sonidos que sean necesarios en los momentos idóneos.

  • SoundBanks: Estos son los archivos finales que van recopilar toda la información que permitirá al juego tener sonido. Contendrán tanto los sonidos en sí mismos como todas las instrucciones y programación para que se comporten de la forma que nosotros hayamos diseñado.

  • Game Syncs: Aquí se van a alojar todos los objetos que recogerán las instrucciones que vienen del juego pero no son necesariamente eventos que disparan sonidos, sino variables y estados que nos darán información como la salud del personaje, si está en un mapa u otro o en qué tipo de material está caminando el personaje.

  • ShareSets: Esta sección alberga los diferentes efectos, curvas de atenuación y otros elementos software que el juego va a utilizar. Como el nombre indica, “Share”, estos elementos son compartidos entre los distintos eventos que diseñemos.

  • Sessions: Podemos encontrar aquí distintas sesiones que nos facilitaran mezclar los distintos elementos sonoros del juego de una manera cómoda sin necesidad de jugar.

  • Queries: Por último, esta sección te permite crear búsquedas dinámicas y personalizadas para encontrar distintos elementos en tu proyecto, lo cual es muy útil cuando este empiece a crecer de tamaño.

Cómo puedes ver, todas las pestañas comparten una estructura similar. Hay distintas carpetas conteniendo categorías de elementos y luego cada elemento en particular esta siempre contenido dentro de una “Work Unit”. Estos archivos son los que van contener toda la información que luego el juego leerá para entender cómo debe manejar el sonido. Se trata de archivos tipo XML y fíjate que si vueles a tú explorador de archivos y miras la estructura de carpetas de tu proyecto, veras algo similar a lo que aparece en el Project Explorer.

No te preocupes si no entiendes todos los objetos que aparecen en el Project Explorer, iremos viendo cuando se usan y por qué poco a poco. Aunque ya mismo podríamos empezar a importar sonidos a Wwise, esto no tiene mucho sentido sin un juego al que poder conectarlos. Vamos a ver cómo podemos hacer esto primero.

Usando Cube

Este juego tipo Quake nos va a servir para poner en práctica todos los conceptos que vamos a ir aprendiendo. Para abrirlo, ve al launcher y en la sección de Samples, elige Wwise. Debajo, verás listado Cube y sólo tienes que hacer click en “Run Cube“ para iniciarlo.

Juega un poco para familiarizarte con el entorno y los sonidos, si te aparece un aviso de tu cortafuegos, déjale acceso por que necesitaremos que se pueda comunicar libremente con Wwise. Date una vuelta por el mapa y dispara la escopeta unas cuantas veces. Cierra el juego usando escape y quit game.

Conectando Cube con Wwise

En estos momentos, Cube tiene todos los sonidos funcionando pero en nuestro caso, queremos quitar estos sonidos para poner los nuestros y así poder practicar. Para hacer esto, debemos eliminar todos los archivos contenidos en la siguiente carpeta:

  • Windows: Program Files (x86)/Audiokinetic/Wwise 20xx.x.x.xxxx/Cube/cube/soundbanks

  • Mac: Applications/Audiokinetic/Wwise 20xx.x.x.xxxx/Cube/cube/soundbanks

Dentro de esta carpeta verás una carpeta por cada plataforma que puedes usar (Windows y Mac posiblemente). Elige tu plataforma y elimina todo el contenido que hay dentro. Alternativamente, también puedes copiar este contenido a otro lugar como el escritorio en caso de que quieras volver al sonido original del juego.

Una vez esta carpeta este en blanco, vuelve a ejecutar Cube y verás que todo el juego esta en silencio ya que no tiene los archivos necesarios para reproducir ningún sonido. En este momento, el juego está en un estado similar al que nos encontraríamos al empezar nuestro trabajo de sonido, vamos a ver como podemos conectar todo lo que ocurre en el juego con Wwise y así poder crear el paisaje sonoro que queramos.

Vuelve a tu proyecto vacío en Wwise. En el menu superior, tienes diferentes secciones como Project, Edit, Views, etc... Busca una llamada “Layouts“. Esta nos permite cambiar lo que nos muestra Wwise para que podamos trabajar en distintas secciones de nuestro proyecto. El layout por defecto es “Designer” que nos permite trabajar con sonidos y eventos. Vamos a cambiar al siguiente layout, “Profiler” que usaremos para conectarnos con cube. Fíjate que también puedes usar F6 para hacer esto rápidamente.

Una vez en Profiler verás que todo esta mas bien vacío. Si tienes Cube cerrado, ábrelo de nuevo y una vez esté el juego funcionando vuelve a Wwise y busca el botón indicado en la caja roja de la captura inferior y que indica “Connect to Remote Platform“.

En la ventana que aparece verás que Wwise ve que una instancia de Cube está abierta. Haz click en “Connect“ y verás como la sección Capture Log se empieza a llenar de información. No te preocupes si dice que hay plug-ins que no encuentra, no los necesitamos por ahora. Ve a Cube y dispara una vez la escopeta. Vuelve a Wwise y verás que ha aparecido un nuevo mensaje indicando que el juego ha pedido a Wwise el evento de disparo de la escopeta y no lo ha encontrado, ya que nuestro proyecto está vacío. No hay problema, de esto nos encargaremos ahora. Puedes parar ya la captura (botón verde en la imagen superior).

Game Calls, Events, Actions & SFX Objects

Antes de poder integrar nuestro primer sonido, es crucial que comprendamos la diferencia entre estos cuatro conceptos. Veámoslos uno a uno con el ejemplo del disparo de la escopeta.

Las “Game Calls” son las ordenes que Wwise va a recibir desde el propio juego indicando cualquier información útil que pueda afectar al sonido. En nuestro caso, el juego ha visto que la escopeta ha sido disparada, por lo que envía esta información a Wwise para que este pueda reproducir el sonido que corresponda. Ten en cuenta que nosotros como diseñadores muchas veces no tenemos control de estas Game Calls, si no que es el equipo de programación el que se encarga de prepararlas. Por ello, es muy importante que nos pongamos de acuerdo en la nomenclatura que se va a usar ya que necesitamos que el nombre que el juego envía y el nombre que Wwise espera, coincidan exactamente.

Los “Events” son una de las formas que tiene Wwise de recibir Game calls. Puedes entenderlos como “receptores” de información que viene del juego y que Wwise entonces traduce en una determinada respuesta que puedes diseñar. En el ejemplo de la escopeta, fíjate que cuando vimos el Profiler, aparecía que el juego estaba intentando activar un evento llamado “Fire_Shotgun_Player“. Ya sabemos entonces que este es el nombre que debemos dar a nuestro evento y que debe ser exactamente ese para que funcione. Cabe señalar también que, pese a que los nombres deban ser exactos, Wwise va a convertir todos los nombres de objetos (y un evento es un tipo de objeto) a minúsculas por lo que podemos usar mayúsculas en los nombres si queremos.

Una vez el evento se ha activado es obvio que queremos disparar el sonido que preparemos para la escopeta. Esta sería una Action contenida dentro de nuestro evento, en este caso una action “Play“, que simplemente va a reproducir un sonido. Por ahora con esto nos basta, pero es bueno que te hagas a la idea de que los eventos pueden contener otras “Actions“ diferentes como por ejemplo detener un sonido o alterarlo de diferentes maneras.

Por último, el “SFX Object” es por fín el objeto en Wwise que va a contener el sonido que vamos a escuchar en el juego. Ten en cuenta que estos objetos no son los sonidos en si mismos, si no más bien actúan como canales mediante los cuales se reproducen archivos de sonido. Algo así como pistas en un DAW. Como veremos mas adelante, varios SFX Objects pueden apuntar hacia un mismo archivo de sonido, sin necesidad de que tengamos que importar ese sonido varias veces. De nuevo, conceptualmente esto es similar a importar un sonido a un DAW y hacer una copia en otra pista para hacerle un tratamiento diferente.

Creando un Evento

Pongamos en practica los conceptos que hemos aprendido. Vuelve al layout “Designer“ y dentro de la view Project Explorer abre la pestaña de eventos. Como hemos visto, aquí podremos crear los objetos que recogerán game calls, de forma que sepamos cuando lanzar sonidos.

Fíjate que dentro de la pestaña de eventos, hay una jerarquía con dos tipos de objetos, “Events“ y “Dynamic Dialogue“. Por ahora a nosotros sólo nos interesa la sección de events. Verás que hay una “Default Work Unit“ y aquí es donde alojaremos nuestro evento.

Hay varias maneras de crear un evento pero por ahora, como en la imagen superior, puedes hacer click derecho en al Default Work Unit, elegir “New Child” y luego Event. Llama al evento “Fire_Shotgun_Player”. Recuerda que el juego está esperando que tu evento tenga ese nombre exacto. También podrás ver que este nuevo evento se ha creado como “child“ o hijo de la Default Work Unit. Esto es algo común en Wwise, los distintos objetos suelen tener una relación jerárquica entre ellos.

Importando Audio

Una vez creado nuestro evento, necesitamos importar el efecto de sonido en sí. Para tratar con archivos de sonido, vamos a ir a la pestaña Audio, dentro del Project Explorer. Una vez aquí, verás que hay varios elementos pero nosotros simplemente necesitamos localizar la Default Work Unit dentro de la carpeta “Actor-Mixer Hierarchy“. Esta carpeta es básicamente donde vamos a alojar a todos nuestros sonidos. Fíjate que la parte superior de esta view hay un montón de iconos que representan los distintos tipos de objetos que esta Work Unit podría contener. Todos estos tienen su utilidad, que veremos en el futuro, pero por ahora crea un nuevo objeto tipo “Sound SFX“ (icono con un altavoz) y nómbralo “escopeta_disparo“. Fíjate que el nombre del objeto Sound SFX puede ser cualquiera, incluso uno en castellano ya que el juego nunca verá este nombre sino el del evento.

Notarás que el nuevo objeto creado aparece con texto rojo. Esto nos indica que aun no hay ningún archivo sonoro asociado a él. Solucionemos esto. Puedes hacer click derecho en el objeto y elegir “Import Audio Files…“. En la ventana emergente, elige “Add Files“ y puedes usar este sonido de freesound por ahora o bien el sonido que venia con este tutorial en la siguiente ruta:

  • C:\Program Files (x86)\Audiokinetic\Wwise 2019.1.4.7065\Cube\Wwise-101_v2017.2\Lesson 1\Audio files for Lesson 1.

O también puedes elegir un sonido de tu propia librería. Sea como sea, es importante que uses una version de audio en la mejor calidad posible (normalmente en wav). Esto puede parecer en un principio poco eficiente ya que estos archivos ocuparan mucho espacio pero a la hora de compilar el audio para nuestro juego, podremos comprimir y optimizar el espacio utilizado de diferentes maneras.

Una vez importado el sonido, puedes seleccionarlo y reproducirlo usando la barra espaciadora. Verás que Wwise tiene una pequeña sección de transporte en la zona inferior que te permitirá reproducir objetos que emitan sonido lo cual también hará que los medidores de sonido de la derecha nos indiquen los niveles de nuestro audio. Además, verás que en parte central ahora aparecen un montón de opciones con las que configurar y programar nuestro sonido. Algunas de las funciones que ves, te sonarán de cualquier otro software de audio, mientras que otras serán nuevas para ti. Poco a poco iremos viendo lo que todas estas opciones nos ofrecen.

Uniendo SFX Objects y Events mediante Actions

Ahora que tenemos nuestro sonido en Wwise, necesitamos asociarlo con el evento de disparo que creamos antes. Fíjate que ahora en la esquina inferior izquierda podremos ver en la view “Event Viewer“, el evento que creamos antes, “Fire_Shotgun_Player“ y nos esta indicando “Missing“ ya que este evento no tiene ninguna acción asociada.

Si lo seleccionamos, la vista central cambiara para mostrarnos las acciones que el evento posee, que por ahora es ninguna. Elegiremos “Add“ en la parte inferior izquierda de esta view para solucionar esto.

Veremos que nos dan muchas posibles acciones a añadir pero en nuestro caso solo necesitamos una acción “Play”. Una vez la acción está creada, debemos especificar qué objeto será el que se reproduzca. En nuestro caso, arrastraremos al área señalada (Target) nuestro SFX Object, “escopeta disparo“.

Una vez hecho esto, verás que si vas a la pestaña de Events y seleccionas el evento “Fire_Shotgun_Player“, este ya hará sonar nuestro sonido de disparo.

Creando SoundBanks

Ya estamos casi listos para probar nuestro sonido dentro del juego pero antes necesitamos compilar todo el trabajo realizado en un SoundBank. Cuando hacemos esto, estamos “empaquetando“ tanto los sonidos de nuestro proyecto como las instrucciones que gobiernan su utilización en una serie de archivos que podrán ser leídos por el juego en tiempo real.

Vamos entonces a cambiar la layout a “SoundBank“. Lo primero que necesitamos es crear un nuevo SoundBank dentro de, como viene siendo habitual, la Default Work Unit. En el centro de este layout verás un botón que dice “New…“, haz click y nómbralo “Main“.

Este será el SoundBank principal que usaremos para transmitir sonidos al juego. Ten en cuenta que el juego conoce este nombre por lo que, al igual que en el caso de los eventos, la nomenclatura debe ser exacta.

Una vez creado nuestro SoundBank, deberemos añadirle eventos, los cuales serán los elementos fundamentales que usará. En la esquina inferior izquierda, verás, en la sección “Event Viewer” nuestro evento, que deberás arrastrar hasta tu SoundBank “Main“. Ahora nuestro SoundBank ya tiene al menos un evento asociado.

Como puedes ver en la parte superior derecha, cada SoundBank va asociado a un tipo de plataforma (sistema operativo, consola, etc) y a un idioma. Este es el caso ya que para diferentes sistemas es posible que necesitemos ajustar las características de nuestro proyecto de forma diferente. Una versión en móviles, por ejemplo, podría necesitar que reduzcamos los recursos que el audio utiliza. Por otro lado, los distintos idiomas nos permitirán mantener diferentes versiones de los diálogos y voces de una forma más cómoda.

En nuestro caso, sólo estamos usando una plataforma (Windows o Mac) y un idioma (English(Us)) por lo que seleccionaremos estas dos. Antes de generar nuestro SoundBank debemos configurar la carpeta en la que este se va a crear. Para esto, hacemos click en “User Settings“.

En esta ventana podremos determinar la ruta y esto será crucial por que si no, Cube no podrá encontrar los sonidos que estamos generando. Haz click en “Override Project SoundBank Paths” y luego en el botón con los tres puntos. Debemos elegir la misma ruta donde Cube espera encontrar los archivos de audio. Usa la misma ruta que ves en el texto inferior dependiendo de la plataforma que estés usando:

  • Windows: C:\Program Files (x86)\Audiokinetic\Wwise 2019.1.4.7065\Cube\cube\soundbanks\Windows

  • Mac: Applications\Audiokinetic\Wwise 2019.1.4.7065\Cube\cube\soundbanks\Mac

Ya estamos listos al fin. Haz click en OK y luego en “Generate Selected“

Probando la Escopeta

Una vez hemos generado el SoundBank, Cube va a poder ver los archivos necesarios para poder reproducir el sonido del juego tal y como nosotros los hemos preparado aunque en este caso, sólo el sonido de la escopeta estará disponible. Lanza Cube de nuevo o reinícialo si ya estaba abierto y maravíllate al oír tu creación cada vez que disparas la escopeta.

Sumario

Aquí concluye la primera parte de este tutorial, espero que te haya podido servir de ayuda como introducción al sonido para videojuegos en general y Wwise en particular.

Si tienes dudas o cualquier problema, puedes escribirme a contactme [ arroba ] javierzumer.com. Mientras tanto, dejo por aquí un glosario con todos los conceptos que he ido introduciendo en este tutorial. !Hasta la próxima!

  • Middleware: Tipo de software que en nuestro caso hace de puente entre los recursos de sonido y el juego que los utiliza.

  • Proyecto de Wwise: Se compone tanto de un archivo con la extensión .wproj como de una estructura concreta de carpetas.

  • View: Nombre que recibe cada “mini-ventana“ dentro de la interfaz de Wwise.

  • Project Explorer View: Tipo de view que permite ver todos los tipos de objetos que el proyecto tiene y que se organiza en pestañas.

  • Objects: Unidad funcional mínima que usa Wwise para determinar el comportamiento del audio en un proyecto.

  • Work Unit: Archivo tipo XML donde se alojan distintos tipos de objetos en un proyecto de Wwise.

  • Layout: Conjunto de views que podemos cargar para poder trabajar más fácilmente en determinadas áreas de un proyecto.

  • Designer Layout: Disposición de views que nos permite trabajar con sonidos y eventos.

  • Profiler View: Disposición de views que nos permite acceder a información en tiempo real enviada desde el juego además de mostrar cuántos recursos está utilizando el motor de audio.

  • Game Call: Instrucción o información transmitida desde el juego hasta Wwise.

  • Events: Objeto de Wwise que recibe información sobre cuando cierto evento ha ocurrido en el juego.

  • Actions: Instrucción que un evento puede contener y que puede reproducir, pausar, parar o alterar sonidos en distintas maneras.

  • SFX Object: Tipo de objeto que contiene un archivo de audio.

  • SoundBank: Objeto donde empaquetamos todos los sonidos e información necesaria para dirigir su comportamiento y que el juego va a leer en tiempo real.

Exploring Sound Design Tools: Envy

I particularly enjoy sound design tools that allows you to stretch, torture and destroy the sounds you already have on your library, giving them a second life. Envy, by The Cargo Cult allows you to analyze your audio’s features, modify them and then re-apply them.

It’s like an audio sculpting tool which also works like a morphing plugin, which is interesting since I reviewed Morph 2 not too long ago.

The plugin only works in Pro Tools in AudioSuite mode since it is too process-heavy to create results in real time. The basic workflow uses the “Analyze” button to capture any desired audio features and then the “Render” button to apply them to any sound (even the same one!).

So what can we capture? Basically the plugins has 3 sections: amplitude, spectral and pitch. Each of them can distill each of these audio characteristics from a sound and modify them to create something completely new. Let’s see each of these sections:

Amplitude Envelope

It allows you to extract the amplitude envelope or “ADSR”. As you can see, you have similar controls to a compressor (attack & release) that you can use to tweak how tight the resulting envelope is. Smoothing is particularly useful if you want to get a bit looser, more natural result.

The filter sliders on the bottom of the plugin will affect to how the amplitude envelope is measured, so keep them in mind if, for example, you don’t want the low end to shape it too much.

Spectral Envelope

We can also steal the frequency distribution or “spectral weight” and apply it somewhere else.

This is quite useful to, for example, beef up the low end of a sound, add more shine to it or just apply a certain spectral timbre to a sound.

Pitch Envelope

This is probably the deepest section on the plugin. Firstly, as with the previous sections, we can copy the pitch envelope of our source sound. To do this, there are two different algorithms to choose from, a and b, as you can see in the “SCAN FRM SRC:” section. They work in different ways so is always worth trying both to see which one gives you better (or nastier, if that is what your are looking for) results.

Also, you can create your own pitch curves from scratch and apply them to any sound. To do this, you can just draw them with your mouse, which is pretty cool. You will be able to then modify the curve in different ways using:

  • Shift + Click: Moves the whole curve up or down in the pitch scale.

  • Double Click: Switches the pitch mode. More on this below.

  • Control + Click: Increases or decreases the pitch amount while keeping the same curve shape.

  • Option + Click: Resets the curve.

  • Right Click: Draws a vibrato curve. The higher your mouse is on the graphic the higher the frequency of the resulting curve.

Screen Shot 2019-09-25 at 14.57.46.png

Once you have your pitch envelope, you can apply it using several algorithms. Note that these are completely different to the algorithms you use to capture pitch. These are used to apply the envelope to a new file. So, this are:

  • Varispeed: It uses old-fashioned pitch processing, so length will be affected. It would be equivalent to speeding up tape or vinyl. The rest of the algorithms won’t affect the length of the sound.

  • Smooth: This is the “optimal” one for most stuff if you want to minimize artefacts.

  • Rhythmic: Same as the previous one but works better with fast transients.

  • Bad: Less clean but maybe in an interesting way. Embrace the artefacts.

  • Worse: This is the one you use when you are just going for crazy sounding sounds.

The best way to go would be to try some of the algorithms just to see what kind of result you get.

Additional features & Interface

Other than that, the plugin has a general gain slider (bottom right), a bigger window mode (plus sign, top, right corner) and a very handy undo/redo function.

Keep in mind that, being an audiosuite only plugin, any change you make to the parameters won’t be heard until a new cycle is reached. You can see this in the graphical interface which shows you both the progress of the original sound captured (vertical line) and the progress of the target sound (bottom grey bar).

Some Examples

Here are some examples of possible usage in very different applications, directly from the creators.

Conclusion

Envy is a very versatile plugin, maybe more so than Zynaptiq’s Morph 2. Being able to transfer envelopes to other sounds while keeping everything in perfect sync is a blessing for layer focused sound design. I also love how you can use the timing of a foley recording and change the materials easily. This application reminds me of Reformer Pro, which I’ve also reviewed, but without the performance and real-time aspect.

Pitch shaping is the other strong feature Envy offers. It just gives you all the tools you need for sound design and dialogue work. I love how easy pitch curves are to draw, specially since this is something that most DAWs don’t do out of the box. Having “clean” and “dirty” pitch algorithms is also great.

Is a bit of a drag that the plugin only works in AudioSuite and in Pro Tools and I imagine that is the biggest drawback Envy has for most people. I personally don’t mind it, since I do all my sound design in Pro Tools and I could accommodate it in my workflow easily. Envy costs $359 at the time of this writing, which, on one hand, feels a bit pricey to me. On the other hand, I can see how that price could be justified: they are offering you a complete sound design tool, foley replacer, morpher, plus advanced pitch capabilities, all in one box. The demo is complete and gives you plenty of time to play around, if you want to give it a go.

So, in summary, Envy feels to me like a Swiss Army knife plugin that you would want to bring to the jungle with you. My tests didn’t always yield the results I was expecting and the sound is sometimes a bit artefacty (in a bad way) but I believe this is how a plugin like this should behave: some experimentation is needed to get cool stuff that works and when you find it, you feel like you have created something completely unique and new.

Pro Tools Batch Rename & Regular Expressions

Batch renaming was introduced into Pro Tools at the end of 2017, with the 12.8.2 version. Since then, I haven’t had much of a chance to use this feature since most of my work has been mixing and sound design. Nevertheless, after some recent days of voice acting recording and all the editing associated, I have been looking a bit into this feature.

So this is a quick summary of what you can do with it with some tips and examples.

Operations

There are two batch rename windows in Pro Tools, one for clips and another for tracks. They are, for the most part, identical. You can open each of them with the following shortcuts:

  • Clips: CTRL + SHIFT + R

  • Tracks: OPTION + SHIFT + R

Both windows also have a preset manager which is great to have.

As you can see, there are four different operations you can do: Replace, Trim, Add and Numbering. As far as I can tell, the different operations are always executed from top to bottom, so keep that in mind when designing a preset. Let’s see each of them in more detail:

Replace (CMD + R) allows you to search for any combination of letters and/or numbers and replace with a different one. The “Clear Existing Name” checkbox allows you to completely remove any previous name the track or clip had. This option makes sense when you want to start from scratch and use any of the other operations (add and numbering) afterwards.

For example, let’s say you don’t like when Pro Tools adds that ugly “dup1” to your track name when duplicating them. You could use a formula like this:

Original names New names

FX 1.dup1 FX 1 Copy
FX 2.dup1 FX 2 Copy
FX 3.dup1 FX 3 Copy

You may realise that this would only work with the first copy of a track. Further copies of the same track will be named “…dup2, ...dup3” so the replace won’t work. There is a way to fix that with the last checkbox, “Regular Expressions”. This allows you to create complex and advanced functions and is where the true power of batch renaming resides. More about it later.

Trim (CMD + T) is useful when you want to shave off a known amount of characters from the beginning or end of the name. You can even use the range option to remove characters right in the middle. This of course makes the most sense when you have a consistent name length, since any difference in size will screw up the process.

So, for example, if you have the following structure and you want to remove the date, you can use the following operation:

Original names New names

Show_EP001_Line001_280819_v01 Show_EP001_Line001_v01
Show_EP001_Line002_280819_v03 Show_EP001_Line002_v03
Show_EP001_Line003_280819_v02 Show_EP001_Line003_v02

Add (CMD + D) lets you insert prefixes and suffixes, pretty much doing the opposite of Trim. You can also insert any text at a certain index in the middle of the name.

We can add to the previous example a suffix to mark the takes that are approved. It would look like this:


Original names New names

Show_EP001_Line001_v01 Show_EP001_Line001_v01_Approved
Show_EP001_Line002_v03 Show_EP001_Line002_v03_Approved
Show_EP001_Line003_v02 Show_EP001_Line003_v02_Approved

Finally, Numbering (CMD + N) is a very useful operation that allows you to add any sequence of numbers or even letters at any index. You can choose the starting number or letter and the increment value. As far as I can tell, this increment value can’t be negative. If you want to use a sequence of letters, you need to check the box “Use A..Z” and in that case the starting number 1 will correspond with the letter “A”.

If we are dealing with different layers for a sound, we could use this function to label them like so:

Original names New names

Plasma_Blaster Plasma_Blaster_A
Plasma_Blaster Plasma_Blaster_B
Plasma_Blaster Plasma_Blaster_C

As you can see, in this case, we are using letters instead of numbers and and underscore to separate them form the name. Also, you can see that in the case of clips, you can choose wether the order comes from the timeline itself of from the clip list.

Regular Expressions

Regular expressions (or regex) are kind of an unified language or syntax used in software to search, replace and validate data. As I was saying this is where the true power of batch renaming is. In fact, it may be a bit overkill for Pro Tools but let’s see some formulas and tips to use regular expressions in Pro Tools.

This stuff gets tricky fast, so you can follow along trying out the examples in Pro Tools or using https://regex101.com/.

Defining searches

First off, you need to decide what do you want to find in order to replace it or delete it (replace with nothing). For this, of course you can search for any term like “Take” or “001” but obviously, you don’t need regex for that. Regex shines when you need to find more general things like any 4 digit number or the word “Mic” followed by optional numbers. Let’s see how we can do all this with some commands and syntax:

[…] Anything between brackets is a character set. You can use “-” to describe a range. For example, “[gjk]” would search for either g, i or k, while [1-6] means any number from 1 to 6. We could use “Take[0-9]“ to search for the word “Take” followed by any 1 digit number.

Curly brackets are used to specify how many times we want to find a certain character set. For example ”[0-9]” would look for any combination of numbers that is 5 digits long. This could be useful to remove or replace a set of numbers like a date which is always constant. You can also use ”[0-9]” to search for any number which is between 5 and 8 digits. Additionally, ”[0-9]” would look for any number longer than 5 digits.

There are also certain special instructions to search for specific sets of charaqcters. “\d” looks for any digit (number) type character, while “\w” would match any letter, digit or underscore character. “\s” finds any whitespace character (normal spaces or tabs).

Modifiers

When defining searches, you can use some modifiers to add extra meaning. Here are some of the most useful:

. (dot or full stop) Matches any character. So, “Take_.” would match any character that comes after the underscore.
+ (plus sign) Any number of characters. We could use “Take_.+” to match any number of character coming after the underscore.
^ (caret) When used within a character set means “everything but whatever is after this character:. So “[^a-d]” would match any character that is not a, b, c or d.
? (question mark) Makes a search optional. So for example, “Mic\d?“ would match the word Mic by itself and also if it has any 1 digit number after it.
* (Asterisk) Also makes a search optional but allowing multiple instances of said search. In a way, is a combination of + and ?. So for example, ”Mic\d*” would match “Mic” by itself, “Mic6” but also “Mic456” and, in general, the word Mic with any number of digits after it.
| (vertical bar) Is used to expressed the boolean “or”. So for example, “Approved|Aproved” would search for either of these options and apply the same processing to both if they are found.

Managing multiple regex in the same preset

You sometimes want to process several sections of a name and replace them with different things, regardless of their position and the content around them. To achieve this, you could create a regex preset for each section but is also possible to have several regex formulas in just one. Let´s see how we can do this.

In the “Find:” section, we need to use (…) (parenthesis). Each section encompased between parenthesis is called a group. A group is just a set of instructions that is processed as a separated entity. So if we want to search for “Track” and also for a 3 digit number we could use a search like this one “(Track)(\d)“. Now, it is important to be careful with what we use between the two groups depending of our goals. With nothing in between, Pro Tools would strictly search for the word track, followed by a 3 digit number. We may want this but tipically what we want is to find those terms wherever in the name and in whichever order. For this, we could use a vertical bar (|) in between the two groups like so: “(Track)|(\d)“ which is telling Pro Tools: hey, search for this or for this and then replace any for whatever.

But what if you want to replace each group for an specific different thing? This is easily done by also using groups in the ¨Replace¨section. You need to indentify each of them with “?1”, “?2” and so on. So the example on the right would search for the word “Track” anywhere in the name and replace ti with “NewTrack” and then it would search for any 3 digit number and replace it with “NewNumbers”

Here is a more complex example, involving 4 different groups. If you have a look at the original names, you will see this structure: “Show_EpisodeNumber_Character_LineNumber”. We would want to change the character and show to the proper names. We are also using a “v” character after the line number to indicate that this is the approved take by the client, it could be nice if we could transform this into the string “Approved”. Finally, Pro Tools adds a dash (-) and some numbers after you edit any clip and we would want to get rid of all of this. If you have a look at our regex, you would see that we can solve all of this in one go. Also, notice how the group order is not important since we are using vertical bars to separate them. You will see that in the third group, I’m searching for anything that comes after a dash and replacing it with just nothing (ie, deleting it), which can be very handy sometimes. So the clip names will change like so:

Original names New names

Show_045_Character_023-01 Treasure_Island_045_Hero_023
Show_045_Character_026v-03 Treasure_Island_045_Hero_026_Approved
Show_045_Character_045v-034 Treasure_Island_045_Hero_045_Approved

Other regex functions that I want to learn in the future

I didn´t have time to learn or figure out everything that I have been thinking regular expressions could do, so here is a list of things I would like to reasearch in the future. Maybe some of them are impossible for now. If you are also interested in achieving some of these things, leave a comment or send me an email and I could have a look in the future.

  • Command that adds the current date with a certain format.

  • Commands that add meta information like type of file, timecode stamp and such.

  • Syntax that allows you to search for a string of characters, process them in some way, and them use it in the replace section.

  • Deal with case sensitivity.

  • Capitalize or uncapitalize characters.

  • Conditional syntax. (If you find some string do A, if you don´t, do B).

Regex Resources:

https://regex101.com/
https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
https://www.youtube.com/playlist?list=PL4cUxeGkcC9g6m_6Sld9Q4jzqdqHd2HiD

Conclusion

I hope you now have a better understanding of how powerful batch renaming can be. With regular expressions I just wanted to give you some basic principles to build upon and have some knowledge to start building more complex presets that can save you a lot of time.