Creating music for video games often requires a distinctly different approach compared to composing for linear media. Depending on the level of agency a player has within a game, it can become increasingly difficult to know what that player will be doing at any given moment. Due to this fact, we often need to create some sort of adaptive system to effectively match what is happening on the screen while maintaining musicality.
There are many ways that we can create dynamic music systems for our game, and most of these decisions will be informed by our game’s specific mechanics. In this blog series, we won’t be able to cover all potential scenarios, but we will explore some possible approaches and how to implement them using ADX2.
This first part will look at a vertical layering approach, where we will set up modular stems between which we will create fades.
This project was created using CRI Atom Craft Ver.3.43.05
Vertical Layering involves creating several stem layers and gradually fading them in based on some gameplay behaviour, which is a technique best used for implying intensity. We might start with an ambience layer, slowly fade in some strings as gameplay becomes more intense, and finally, fade in percussion to a crescendo during climactic moments.
With this in mind, we can go ahead and similarly compose our music to how we usually would. We just need to ensure that our stems are mixed to sound good at various states of intensity, and ensure that our stems loop seamlessly (especially if they have reverb baked in).
Atom Craft Implementation
First, we need to import our stems into Atom Craft. For this demonstration, I have created stems for bass, percussion, melody, and drums. Of course, use whatever configuration makes sense for the genre and overall feel/mechanics of your game.
We then need to create our music Cue and some AISAC logic to fade our stems in, to layer up the intensity. Again, the layering order is subjective, but since the drums have the most impact and presence, I have chosen to play this stem last.
If our gameplay logic is more of a state-machine, then simple linear AISAC curves will suffice. We can set our AISAC up so that at each multiple of 0.2, a new stem is introduced. We may also decide to introduce even more dynamic logic, such as adding a low-pass filter to our bass so that it becomes more present at higher intensity levels (pictured above). We could extend this even further by sending signal from our stems to an effects bus with Distortion and Compression to really add some intensity!
Since the stems in this example are simple loops and do not play an introductory passage, it is a good idea to add some attack and release times. We can quickly apply batch changes by using the List Editor. Simply shift-select the relevant stems and enter in a value. The value will be applied to all selected items.
Finally, we can audition the result of our system by opening the Session View and dragging our Cue in from the WorkUnits Tree. We can then open the AISAC-Control and ensure Already Attached and Selected Cue are highlighted to show AISAC which are attached to our Music Cue.