Welcome back to this series, where we look at configuring and designing a simple loop-based car engine in Wwise. If you haven't yet read Part 1, where we studied engine parameters needed to control our design and general guidelines on how to edit assets, then please check it out here first!
This part in the series is heavily based on the official engine audio modding bundle for Wreckfest, a banger / folk racing video game developed by Bugbear Entertainment and published by THQ Nordic. This modding bundle consists of a tutorial and Wwise example project, both of which you can download by visiting this thread over at the Bugbear Community forum.
If you’re new to Wwise, you'll definitely want to first study this modding tutorial to learn the related basics of Wwise GUI. Beyond that, I assume you know your way around Wwise Authoring. Now let’s dive right in!
About the Example Project
Once you have the example project open in Wwise 2019.2, take a quick look around to see what Actor-Mixer objects and RTPC game syncs are included. You will see that notes are included with almost every object, to document a specific function or a related feature.
In the Project, the key engine parameters which we looked at over Part 1 are as follows:
1. RTPC_Player_Example, RTPC for Rpm for player vehicle, with a range of actual Rpm.
2. RTPC_Player_Load, RTPC for engine Load, with a range of 0 to 1.
3. RTPC_Player_Throttle, RTPC for amount of throttle set by player, with a range of 0 to 1.
Specifically with Load RTPC, the parameter range used in Wreckfest means that neutral (idle) load sits at the middle of range at value 0.5. There are also NPC vehicle variations of these RTPCs; they substitute “Player_” with “AI_”.
The Project also comes with example assets. These have been recorded, edited and kindly donated for this specific use by Pole Position Production, and are provided for the sole purpose of learning vehicle audio design and creating audio mods for Wreckfest.
Everything included with the project is offered for personal use under Creative Commons license By-NC-SA, Attribution-NonCommercial-ShareAlike.
Note that to try out your designs in Wreckfest, you will need to grab a copy of the game on Steam.
Object Setup Overview
In Wwise, loop-based engine designs are constructed using a Blend Container object, by adding sound objects onto any Blend Tracks belonging to that Container. Together, these define the order and length of when each of the child sound objects will play, based on Rpm data.
All-in-all, the following needs to be done to complete our engine design:
1. Create assets and import them to create sound objects.
2. Configure sound objects to loop and track pitch.
3. Set up a Blend Container object with Blend Tracks and sound objects.
4. Configure playback range and crossfades of adjacent sounds.
5. Define RTPC automation of Blend Tracks.
6. Check pitch tuning consistency over full Rpm range and over Blend Tracks & adjust where necessary.
Next, we will go through each of these tasks step-by-step. All pictures shown reference the objects located under the ‘Tutorial Engine’ Work Unit of Example Project. This Work Unit serves as the hands-on portion of this tutorial.
Sound Object Configuration
Starting at the ‘Imported Assets’ folder, it replicates a situation where we would’ve already created and imported our on- and off-load loop assets to Wwise Authoring. Go ahead and enable looping for objects in this folder. The Multi Editor view comes in handy with this.
To have the pitch of these sound objects react to in-game Rpm simulation, we need to establish the automation behaviour between the two. To automate configuration of consistent pitch tracking across a set of sound objects, like our engine loops, Wwise comes with a tool to do this automatically based on a given RTPC parameter range and pitch (natural Rpm) of the sound object.
Select the ‘Demo_Idle_1170’ object and, under the RTPC tab of Property Editor, add Voice Pitch on the Y Axis, then RTPC_Player_Example on the X Axis. Right-click anywhere over the automation curve (line) and select ‘Build Smart Pitch Curve’ from the context menu. In the settings box for this tool, input the numeric value of the sound object (1170) and click ‘Ok’. You should end up with this:
Just to verify that you have the curve all correct, move the ‘RTPC_Player_Example’ flag over the zero crossing on the Y Axis, and it should line up with the numeric value of the sound object. If not, run the ‘Build Smart Pitch Curve’ tool again and check for typos.
With this sorted, the same process needs to be repeated for all the sounds. But you can slightly cut corners by first copy-pasting the X-Y mapping we just made, then running the ‘Build Smart Pitch Curve’ tool again, using the correct value for each sound object.
Blend Container Configuration
For brevity of this tutorial, the ‘Tutorial Blend Container’ object comes predefined with two Blend Tracks: One for on-load and another for off-load, and both with some RTPC automation mappings. If you were to create an entirely new Container, you would first need to add the amount of Blend Tracks your design calls for, and then assign and calibrate relevant RTPC mappings.
First, the Container needs to be populated with child objects. Shift + click to select all the sound objects under ‘Imported Assets’ and Ctrl + click-drag them over the Container. This will create copies of the sound objects. Now look at the Contents Editor for the Container. Here we assign the objects we just added into the appropriate Blend Tracks.
Drag the files over to the appropriate Blend Track (“On” and “Off” in object name) playlists, sorting them in ascending order based on the natural Rpm (idle to highest). The list order defines the order of objects in the Blend Track Editor, and you can drag/drop to reorder.
Note that when creating a new Blend Container, one important thing to consider is whether to set its Play Mode to ‘Step’ or ‘Continuous’. Since our sounds are set to loop indefinitely, running the engine Container in ‘Step’ mode can quickly blow up the virtual voice count of your project, especially if the design has a lot of child objects and if multiple copies of the Container are instanced at runtime.
Blend Track Configuration
Next we move over to the Blend Track Editor view, where you should see the off- and on-load Blend Tracks, with predefined automation and boxes representing objects we placed on each Blend Track playlist. Note that the option ‘Crossfade’ is (and needs to be) enabled for this specific use, and that it’s been assigned to track RTPC_Player_Example.
If the Blend Container is configured for ‘Continuous’ Play Mode, these box boundaries tell Wwise where to start and stop playback of each sound object, as the simulation parameter passes over a given boundary.
Where there is a gap between object boxes, no sound will play while the RTPC value stays within the gap. This can be of use for some applications - say f.ex. when you might want a sound object to only play over the middle Rpm range, but not top or bottom.
Starting with the top Rpm object, move and resize each box on both Blend Tracks so that they’re somewhat centered about their natural Rpm range, slightly overlapping adjacent objects. Next, right-click on both left and right edges of each box and, from the context menu, select ‘Sine (Constant Power Fade In)’ or ‘Sine (Constant Power Fade Out)’ for left and right box edges respectively.
This type of edge crossfade is appropriate for the use specifically because it will hold a constant volume level near the midpoint of the crossfade. One other similar crossfade to replace the Sine pair is a combination of ‘Base 3’ and ‘S-Curve’. It can come across sounding smoother than Sine in some cases.
With objects placed about their natural Rpm and edge fades configured, we now need to fine-tune the width of each crossfade. Set Blend Container to play, move ‘RTPC_Player_Load’ to value 1 and work your way down from max Rpm to idle through the on-load Blend Track, adjusting widths to your liking.
You want to end up with as narrow crossfades as you can get away with, but where the transition and re-pitching still sounds smooth. Avoid pushing any sound object too far beyond its natural Rpm, while keeping tonal change between adjacent objects smooth.
Once done, set ‘RTPC_Player_Load’ to 0 and again work your way down from max Rpm, but this time over the off-load Blend Track. Finally, compare the Blend Container you just set up against that of ‘Engine Example Plr’. It uses the same loops and can serve as a reference for where to place child objects.
One optimization tip here is to see if the source recordings allow you to design loop assets so that crossfades at the on- and off-load Blend Tracks never occur simultaneously. This can save you some active voices at run-time, especially if many instances of the object are spawned.
Whenever multiple Blend Tracks have crossfades occurring over the same Rpm range, it means you’ll be running two active voices per Blend Track per instance, and four in the case of our Tutorial Container. The same applies for any plugins you may add to the Blend Container; they too will get instanced per child object at runtime.
RTPC Automation of Blend Tracks
This part of the engine setup ultimately depends on how you want your engine to sound. If you're working on a freshly-set up engine design, what would remain for you to do, in order to meet simulation behavior, is mostly to configure Load automation, to control transition between on- and off-load layers.
In the tutorial document of the Wreckfest modding bundle, look up the chapter “How Engine Load Works” and compare the behavior presented in it, against how the predefined RTPC automation is configured for ‘Tutorial Blend Container’ between the three Load states. Since we lack the option to connect Wwise Authoring directly with the Steam build of Wreckfest, the said chapter will help you figure out the pre-configured automation.
The overall shape of Voice Volume automation (based on Load) depends on the simulation you’re working with, but in general they are set up in such a way that off- and on-load Blend Tracks crossfade around the neutral load value range.
Even if the overall shape is pretty much set for on- and off-load behaviour, you can still tweak specific automation keypoints for volume levels and filtering. Let’s try a simple automation design tweak with our example engine.
With RTPC simulation values configured to neutral Load and idle Rpm, look up the extra Voice Volume automation at the on-load Blend Track between 1000 and 2500 Rpm (like in picture above). Here’s how it sounds as-is:
In conjunction with Rpm-based High-Pass filter automation of the Blend Track, this mixes in a little bit of valve-like clattering texture from the on-load loop, with the off-load at idle Rpm, and without muddying up the bass frequencies. Try increasing the volume of on-load automation at the 1000 Rpm (idle) keypoint - it will make the clatter more present in the mix, in turn making our car idle feel perhaps more ‘worn out’, or maybe even somewhat like a diesel engine. Here’s an audio example of this:
Now try out what happens if you copy the on-load High-Pass filter automation over to off-load Blend Track, and remove it from on-load, or switch automation to control Low-Pass filtering instead. Then try adjusting the balance between on- and off-load volume at 1000 Rpm and neutral Load (0.5). Here’s how the idle can sound like with on-load bass frequencies included, the overall volume raised and some highpassed off-load mixed on top:
We notice that the sound has now become pretty hollow, even something you might not expect a car idle to sound like at all. There’s a strong tube-like tone because the on-load loop is now the dominant element in the mix, and the tone is emphasized further since we’re playing a down-pitched version of the loop; Idle Rpm simulation value is at 1000 whereas natural Rpm of the loop is 1670.
This tube-like tone likely stems from the exhaust pipe being near-mic’d during the recording session, and then a lot of this layer (mic) getting mixed into the final asset. So a baked mix that is designed to match in-game chase camera view. Since we now have the on-load layer configured to dominate the mix, the excess of near-mic exhaust tones and down-pitching makes for quite a strange and unnatural sounding idle.
These are the kind of design choices that you can make with just the basic loops. Keypoint tweaks can give your car a personality to match its look and feel, or destroy it if done in excess. But tweaking automation doesn’t need to be just for making the car sound unique: In the case of our clatter, you could also increase its volume based on the amount of damage the car may have taken. Then you’d be conveying something meaningful to (or adding to the immersion of) the player with the change in tonality.
The important thing to focus on is that we were able to make the car idle sound quite different with just a few simple tweaks, and without adding any further assets to our design.
Small reminder: If you want to have the RTPC automation affect only a single child object instead of every object on a Blend Track, you then need to configure this automation directly to the object. That is, something similar to the pitch tracking based on natural Rpm that we added before.
Pitching for Perfection
As you monitor and configure assets you’ve imported, you may sometimes find that adjacent objects in a Blend Track are slightly out of tune against one another with just the plain root pitch tracking configured.
Pitch issues commonly stem from pitch flattening and Hertz-to-Rpm conversions, both of which we looked at in Part 1. If the playback of Blend Track can hover over a problematic crossfade for a long time, you can hear these issues as anything between a wildly different tuning change, to a slow sweeping tone caused by comb-filtering. Such issues should be addressed by tweaking Voice Pitch in the Contents Editor of a Blend Container.
The process to fine-tune pitch is similar to how we previously went about adjusting the crossfade widths: Audition and scrub through both on- and off-load layers one at a time, and work your way down from max to idle Rpm. It is always recommended to start from max Rpm because the engine sounds are most tonal towards the top range, and thus is easiest to correct for.
Throughout the fine-tuning process, it’s a good practise to flip RTPC simulation value between full off- and on-load every now and then, to check that pitch tracking between the two Blend Tracks stays consistent. The loudness balance between harmonic frequencies can change over specific Rpm range depending on the recording, and sometimes these changes can make you fine-tune to a wrong frequency.
For an example of this balance change, play the example engine from max Rpm to around 3600, flipping between full on- and off-load in the process. Going downwards from max Rpm, the off-load side has quite a different tone than on-load at around 3600, yet pitch is tracked correctly over the crossfade between the top two off-load assets and, at max Rpm, the tonal balance between the two layers is a close match.
That's a Wrap
With all of the above, we are done! Be it a spaceship, car or a sample-based musical instrument, I hope that this tutorial inspires you to try and whip up some kind of tuned, pitch-tracking Blend Container design in Wwise.
If you’re looking for hands-on opportunities to give engine sound design a go, then why not ask around at the Modding channel of the official Wreckfest Discord server. You could help out car modders to complete their design by offering to create engine sounds for them. Or maybe have a go at customizing one of the many Wreckfest car mods (256 at the time of writing!) available over at Steam Community Workshop.
Any questions or comments you might have about this tutorial, please leave them in the comments below, or give me a holler over at the Wwise_Discord server. Catch you there!