Audio for games has come a long way from the iconic single sample sound effects of the 8-bit era. Modern AAA games have audio that rivals the biggest Hollywood blockbusters, and in many ways exceeds them. Field recording and music composition tend to be the focus of many audio articles – but when it comes to audio for games, it might not be glamorous, but the in-game implementation is what makes the difference between something that is static, and something that feels alive.
Most games have moved beyond the “play-a-wav-file-now” approach to sound, and have sophisticated audio implementations that create immersive, reactive, and dynamic worlds. The realtime audio implementation forms a critical cornerstone of the modern gaming experience, and over the next few posts, we’ll explore some of the fundamentals of those implementations and what the core techniques are to bring a soundscape to life.
There are sophisticated middleware products like FMOD or Wwise that facilitate this kind of sound design, along with a host of custom internal tools. We won’t focus on any particular toolset but, rather, focus on some of the fundamental principles that would be possible with any toolset. We’ll start with the absolute basics and look at how a number of very simple techniques can be combined to produce very sophisticated results.
Really great sound effects rarely come from a single source. Sweeteners, and other characteristic elements, are mixed together to create something truly unique. That works perfectly for linear media like film and television, but in games, you have to battle repetition, and adapt for an always-changing set of circumstances. Rather than creating a bank of samples 50 deep and then just shuffling through them during the game – a small amount of layering can produce a staggering number of combinations.
Harness the power of combinations
Creating deep banks of samples will quickly exhaust you and your memory budget. However, by dynamically recombining your component parts at runtime, you can massively increase the effective number of unique ‘samples’ that you hear in game.
Imagine you had a ‘punch’ sound effect. You could bake some truly awesome bone-crunching samples, but depending on the style of game, you might find the repetition tiring. Breaking it out into component parts, and beefing up each of those individual layers suddenly opens up an entire world of possibility.
Instead of just a bank of say, 15 static punch sounds, you have 3 layers with 5 ‘whiff’ samples, 5 ‘impact’ samples, and 5 ‘sweetener’ samples. We’ve created the same number of samples (15) – but by breaking them into layers, the game picks one sample from each of the pools and we end up with 125 unique punch sounds instead of 15. We’ve increased our effective sample pool by almost a factor of 10 without using any extra memory (and possibly even less!) – and if we’re careful, without impacting the quality of the experience.
Another major advantage that layered sounds offer is the ability to adapt to changing situations. For instance, with our punch sound above, you might leave out the sweetener element that really beefs up the entire punch except for big hits. Having it broken out into its own layer means that we don’t have to create an entire separate set of punches without sweeteners– we can simply turn off the layer based on whether or not the punch was targeted as a big hit or not.
Besides further increasing the total number of unique sample combinations once again, we are also altering the character of the sound to create a different feeling, and accentuating the impact, all using the sample pool of 15 samples. Having that ability to dynamically switch on and off parts of a sound is a huge part of what makes modern games sound and feel so realistic.
Layers are such a simple concept that is a staple of most offline workflows (ie. any multitrack editor, graphics program, etc.) – but one that when brought into the realtime environment opens up a whole new level of possibility.
Which brings us to the topic for next post – automation. Turning on or off layers based on a parameter is only the tip of the iceberg. Next time out, we’ll look at the types of parameters you can effectively automate, how you can link them with game values, and how you can use that to powerfully manipulate the layers, effects, and other elements of your sound’s playback.