Slumbering Vale

This 8 month, sophomore project was my first experience with game development! It is a top-down, tile-based stealth run set in an eerie dark-forest.

As Audio Lead, I used:

  • Reaper

  • Wwise

  • and a custom C++ engine

with the help of 15 coders, artists, and designers to craft this creepy, crow-y experience.

Watch the Trailer

Fun Sounds

Level transition screen

Listen to the OST

Check out the Audio Style Guide

An Interesting Technical Problem

In game music, looping is incredibly important. As creators, it’s impossible to predict how long a player will stay in any one area: they could dash through five minutes of content in 10 seconds or leave the pause menu idling for. . . ever! Who knows? So, we have to compose music which can loop smoothly and indefinitely (and not become tiring to the ear).

For the gameplay music of Slumbering Vale, I wanted to utilize two techniques:

  1. Vertical layering

  2. Generative chords

Meaning, 1. layers of separate instruments which can be brought in or out depending on the game state and 2. shorter segments of swelling string chords & piano to accompany underneath a longer precomposed melody played on a duduk flute—with chords chosen at random by Wwise as the music track plays. All of this leading to an ambient, lonely atmosphere which could play for a long, long while.

Here is the problem:

Wwise’s Interactive Music Hierarchy does not have the functionality for asynchronous looping. If you want to have multiple layers playing and looping at the same time, there can only be one loop point. They all have to be the same length.

One option was to ditch the Music Hierarchy for the Actor-Mixer, which is used for implementing sound effects. While it can play music just fine, it lacks some of the functionality and UI built into the other. Also, by the time I realized this might have been a method, I was coming up on the submission deadline, so I had to find a way to make the Music Hierarchy work.

My solution:

Some basic math! All I had to do was make sure the longer flute melody was a multiple in length of the string swell segments.

Then, cut the melody into swell-sized chunks and use a combination of random and sequence-step containers to play the instrument layers at the same time. This allowed Wwise to loop the music seamlessly: stepping through the melody, choosing a new chord swell each loop, and still having the benefit of the game state machine with custom track fades.

Music Segment Editor from Wwise (click to enlarge)

Implementation:

To keep every layer locked to the same time grid, all of the musical elements needed to be crammed into one music segment (see above picture).

Phew! It’s crowded in there. Typically, to switch music based on the game state, we tell Wwise to switch to a different music segment. In this case, as I wanted to use some the layers for multiple states while keeping everything in time, I had to use one segment.

A workaround:

Use custom track filters and volume ducking to achieve the same effect while using certain music layers for multiple game states. Below is a gif cycling through each music track with separate parameters.

This turned out to be a great way to handle the situation. I used the filters to adjust the music based on the intensity of gameplay and was also able to handle the pause state. All while keeping the same musical elements lined up on the same grid.

This was a fun technical problem and one that greatly deepened my knowledge of the quirks and workings of Wwise. Ultimately, what it came down to was fitting a square peg in a round hole. The idea I had for my music system was slightly outside the normal window of how Wwise was designed to function, but with perseverance and a lot of thought, I was able to make my auditory vision come to light!

Each segment has its own volume and EQ parameters