Vehicle Audio Modding Guide For Wreckfest - Wwise2019-1-6
Vehicle Audio Modding Guide For Wreckfest - Wwise2019-1-6
This tutorial describes how to make custom engine audio assets to be used with the Windows version of
Wreckfest, a banger / folk racing game developed by Bugbear Entertainment and published by THQ
Nordic. Additional modding info can be found at the official Bugbear Community website.
Basic Setup
The audio of Wreckfest is implemented using Wwise API and Wwise Authoring Tool by Audiokinetic. To set
up a basic environment for modding:
If you are new to Wwise it is best to keep the official help documentation at hand, and in particular,
studying the basics of Wwise graphical user interface with the help of ’Getting to Know..’ chapters under
Working with Wwise. Additionally you might want to have a look at some of the official video tutorials.
Links to specific topics are provided throughout this tutorial. There’s also a section with some additional
tips & tricks at the end of this document.
IMPORTANT: Wwise Authoring Tool version needs to match the version with which Wreckfest runtime
binaries were generated with. Otherwise any newly made soundbanks will not load. When API version is
updated in Wreckfest, you will then need to install a matching version of Wwise Authoring Tool and
regenerate any old soundbanks to continue using them.
When carrying out edits, you will be primarily working in Designer screen layout. If this isn’t active, switch
to it by pressing F5. In this layout you will mainly use Project Explorer, Property Editor, Contents Editor and
Transport Control views (Picture 1). Additionally you will need to have Blend Track Editor view open,
further referred to as “BTE”, to this screen layout (press Control + Shift + B to show). A dual-head monitor
setup comes in handy here, just float the windowed BTE view over to second monitor.
Additional notes have been included to various objects within the audio object hierarchy, if not visible then
locate this under the ‘Audio’ tab of Project Explorer. You can view the notes by selecting an object, then
opening Property Editor view (if not visible, press Shift + Y) and clicking on box item in the upper right
corner of window (Picture 1).
Please refer to official documentation about The Project Hierarchy of a Wwise Authoring Project.
Picture 1: Wwise Authoring Tool with Designer layout (F5) active, and Blend Container selected in audio object hierarchy.
IMPORTANT: Do not modify objects or their placement under Master-Mixer Hierarchy, as this could lead to
broken in-game settings and/or silence engine audio in-game, or when previewing within the Wwise
Authoring Tool.
The way basic engine audio is set up in Wreckfest is, the imported engine assets become child objects of a
Blend Container (BC) and are assembled to Blend Tracks (BT). The latter define the order and length of
how each asset will play, as the vehicle is revved over its full RPM range. The engine BC needs to contain
BTs at least for on-load and off-load states of an engine, to simulate the amount of load being applied to
engine. More BTs can be added for extra textures. The engine BC for AI vehicles is best kept greatly
simplified from that of the Player to optimize the use of hardware resources. Remember: There can be up
to 23 AI in a given race, and very complex designs can ramp up the CPU load in no time.
For a basic engine setup, you will need to prepare a bunch of assets to populate On-load and Off-load BTs.
Each of the assets needs to..
You should have enough assets to cover the full RPM range that is set to the RTPC Game Parameter
Property (under Game Syncs tab of Project Explorer). For the example objects, max RPM is set to 6700.
Regardless of what files you have, it’s recommended to include the natural RPM with the filename for quick
reference later on.
With the basic assets prepared, drag & drop them (or the whole folder) over the AI or Player example BC
for import. Please refer to Wwise documentation about The Importing Process and Importing Media Files.
Once assets have been imported (and in the process, assigned to child objects) you then need to enable
looping for each. Go through objects one by one and check “Loop – Infinite” under General Settings tab of
Property Editor view (Picture 2). Once this is done, Press Shift + C to open Audio File Conversion dialog,
check that “Windows” platform is selected and click OK. After this, with any child object selected, clicking
Play (or pressing Spacebar) in Transport Control view (usually at bottom of Wwise main window) should
now produce audible sound. Stop the sound once you’ve had enough.
TIP: With the AI and Player example BCs, it is recommended to keep the example Onload & Offload BTs
intact for reference during editing; these can be used to copy/paste RTPC curves and deleted once you’ve
finished building custom Blend Tracks for the newly imported assets.
To start defining BTs for your imported assets, switch to BTE and (re-)select the BC in Project Explorer to
refresh BTE view. First, add new track(s) for groups of assets you imported by clicking ‘New Blend Track’,
then head back to Contents Editor (Picture 1) and drag the desired assets over to the appropriate BT list to
the right (Picture 3).
IMPORTANT: Make sure to organize child objects w ithin each BT list so, that they are in ascending order by
RPM (idle to highest). This list defines the order in which included objects will appear in BTE, and you can
drag/drop here to reorder. BTE itself does not allow changing the order of assets!
Picture 3: Adding assets by drag & drop to a Blend Track within a Blend Container
Before getting into detail configuration of child objects of a BT we still need to define basic pitch tracking
for each. Do you still remember that ‘natural’ pitch value from before? Good! If not, go back and re-read
from previous page, for now’s the time to dig up them numbers!
To calibrate pitch tracking, select any of the example BC child objects and, in Property Editor, navigate to
RTPC tab, right-click ‘Voice Pitch’ (Y Axis) and copy the parameter. Select one of the new BC child objects,
and paste the copied parameter. Then, right-click somewhere on this newly added curve, select “Build
Smart Pitch Curve” from the context dialog and in the following window, input the native pitch value of
object and click OK. Looking at the resulting graph, you should now see the native RPM value line up with
zero crossing of Voice Pitch / Y Axis.
NOTE: This calibration is needed only if you want the engine pitch to follow in-game RPM and/or to stay
consistent over a set of assets. If you have only one asset to cover the entire RPM range, don’t care about
pitch, or are designing a highly “experimental” engine, you can choose to skip setting up Smart Pitch Curves
entirely.
With the basic child object order and pitch tracking sorted, we can now do detail configuration of BT
objects, including overlaps (crossfades) between each, balancing of loudness etc. Open BTE, select BC to be
edited and you will see its BTs now filled with a bunch of colourful boxes. Each of these boxes represents an
object on BT lists we made previously. Nnice!
For each new BT, enable Crossfade (checkbox towards top-left in BTE) and assign the vehicle specific RPM
RTPC to control this. Doing so will add a matching RTPC marker / flag over the colored boxes (Picture 4).
Next, similar to copy/pasting the RTPC pitch curve, now instead do the same for RTPC Voice Volume curves
for any BTs you added.
Picture 4: The example Onload Blend Track, with Crossfade RTPC control added (green marker)
With both Y (target) and X (source) axis defined and the sound playing, dragging RTPC markers left/right
over the full BT range will simulate how the assigned parameter will affect the sound in-game. While this
isn’t an accurate representation of all the automation combined, it will still give you idea of how each
hen driven by the Wreckfest physics engine.
parameter behaves individually w
As load is applied (or engine allowed to decelerate) and the RPM changes accordingly, the appropriate BT
will play through child objects, and transitions between each need to sound smooth. This is achieved by
adding overlaps, aka crossfades, between child objects where one object fades in as the other fades out. To
make the objects overlap, move the objects or drag their left/right edges. Right-click these edges to select
the crossfade shape.
It’s recommended to first use shapes similar to those in example BTs - this is a specific type of equal
loudness crossfading that works most of the time. Even so, IF the overall loudness seems to dip over a
specific crossfade, then you need to try other shape combinations. Adjusted these by right-clicking
left/right edges of any object in BTE. With the BC playing, drag the example RTPC (green marker in Picture
4) over the problematic crossfade to monitor for volume changes. Adjust crossfade type and monitor for
changes to find your preference.
If loudness between objects doesn’t match or pitch doesn’t change smoothly (despite correct Smart Pitch
Curves have been set), these issues are best adjusted using object properties in Contents Editor (with BC
selected). Voice Volume RTPC curves should be only used to control the overall loudness of the engine, not
to kludge volume issues with any specific sound objects.
Picture 5: Adjusting child object pitch & volume using Contents Editor
For further reference please read chapters Managing Crossfades and Working with Blend Tracks of Wwise
documentation.
NOTE: The Wreckfest game engine communicates the amount of load placed on the engine to Wwise via a
Load parameter (eg. RTPC_Player_Load). This has a range of 0 to 1, and is used by Wwise to determine
whether to play objects from onload or offload BTs. With the car idling stationary, this load value sits at 0.5.
Any value above 0.5 indicates acceleration, whereas values below it indicate deceleration. Shifting gears,
applying brake or braking with the engine will temporarily drop the value below 0.5 and towards 0. From
here it will either jump back above 0.5 (if the gas pedal is pressed) or home in back to 0.5, as the vehicle
decelerates and pulls to a stop. Note that for the Player vehicle there’s a separate RTPC for throttle, to
communicate how far down the Player has pressed the gas pedal.
Calibrating Overall Volume
Final step in defining settings for your engine is to meter and adjust its volume for overall loudness. This will
set engine sound level on par with the other vehicles in the game.
Open Loudness Meter view by navigating to Views -> Loudness Meter -> Loudness Meter Sync Group 1
under main window pulldown menus. In this view you need to select the appropriate audio bus that will be
used to monitor for volume levels. Click the ‘…’ button to open Project Explorer Browser and in that
window select either ‘Car_Player’ to adjust Player vehicle, or ‘Car_AI’ to adjust AI vehicle. Click OK to
confirm & close Browser.
Select the BC to be adjusted and hit Play in Transport Control view. If you’re not hearing sound, check that
‘States display’ (Click ‘States’ button) under Transport Control view shows that the ‘Game’ state parameter
is set to ‘None’. Then:
1. In Transport Control, click button ‘RTPCs’, then find and adjust the
RPM RTPC which controls pitch of your engine. For the examples
provided, this is either RTPC_Player_Example or RTPC_AI_Example.
You should hear the pitch change. Set your RTPC to max value.
2. Also set the appropriate Load RTPC to max value.
3. If everything is now configured correctly, the Loudness Meter should
show at least two colored bars. We’re interested in the one that
reads “Integrated” underneath it. Unlike the other two other bars,
this will not register movement by default.
4. With the sound of your engine playing, press the ‘Capture’ button in
the Loudness Meter view. You will see a timer start to count. Let it
run for 10 seconds and then press the same button again to stop
metering.
5. For Player vehicles, and with RTPC set to max., the Integrated value
should read about -15 (dB).
6. For AI vehicles, and with RTPC set to max., the Integrated value
should read about -19 (dB).
7. If the captured volume reading isn’t a match, open General Settings
tab of Property Editor with the BC selected and adjust Voice Volume
slider up or down depending on which way the value needs to go.
8. In the Loudness Meter view, click ‘Reset’.
9. Repeat from step 3 until the Integrated loudness value of your
engine matches the above. In general you should try matching the
value within a 1dB bracket. That is, between -15.5 to -14.5 for Player
vehicle, and -19.5 to -18.5 for AI vehicle.
Picture 6: Loudness Meter
capturing Car_Player bus.
NOTE: Occasionally you may find that even with values matching the above, the engine sound may still
struggle cutting through the mix, or being reasonably audible, among all the other vehicles in a race. If this
is the case, then try adjusting the Voice Volume for that BC higher at 1dB increments, until you find a level
that works. If you add / render any EQ effects to your engine sound, remember to check for levels in a
similar fashion. Cutting or boosting a frequency can greatly swing the metering result. After each change
you will need to regenerate soundbank(s), copy them to the correct folder and restart the game for changes
to take effect.
Generating Soundbanks
Soundbank objects are the assets used by Wreckfest game engine and Wwise API to play audio. These
objects act as a container for all objects (event triggers, assets etc.) required to play a specific set of sounds,
such as your freshly made vehicle engine mod. In order to generate a soundbank, you need to first define
what will be included.
If you’re modifying only AI_Modding_Example and Player_Modding_Example provided with the project,
these are included in similarly titled soundbanks and you only need to generate & copy files over. Any new
items added under these example objects get automatically added to their soundbanks too, unless
explicitly unchecked under the ‘Edit’ tab of SoundBank Editor view.
For additional info about soundbanks, please read chapters Generating a Soundbank and Building
Soundbanks of Wwise documentation. There’s no need to copy over any other generated files other than
those named after the new engine sound, as none of the others will be used!
1. Under Wreckfest installation folder, open BagEdit subfolder and launch BagEditCommunity.exe
2. Open …mods/example/data/vehicle/mod_vehicle_1/audio/mod.engs. The file with its full folder
path will open to the left window pane, and data in that file to the right window pane.
3. Make sure that the soundbank name and all RTPCs match the file you generated.
4. In the left pane, select mod_ai.enga, repeat step 3, then jump to step 5.
5. In the left pane, navigate to …mods/example/data/vehicle/mod_vehicle_1/part/engine and edit
both mod.veen and stock.veen. For each, check that ‘Engine Sounds’ points to file in step 2 and
‘Engine Sounds AI’ points to file in step 3.
TIP: Soundbank and modded car names can be anything but the folder structure has to match. For example
…mods/ MYOWNMOD/data/vehicle/MYOWNCAR/…
Tips and Tricks
Here’s a collection of miscellaneous tips & suggestions for your engine designs.
● You can set up objects for multiple engines to a single Wwise project, and generate only ones you
need. This is great for trying out variations of a vehicle, and storing all within a single project. Keep
in mind that the free license of Wwise allows for a project to hold only up to 200 objects.
● Preparing steady RPM assets from vehicle recordings often requires ‘flattening’ pitch change over
the length of each asset. Spectral visualizers, like the ‘Spectrograph Spectrogram Meter’ JS plugin
included with Cockos Reaper (reaper.fm) allows you to visually see some of this pitch change.
● Feeling lost with where to source engine sound recordings? T ry looking up one of the free annual
GDC Soundpack bundles. These contain huge variety of free-to-use sounds by professional sound
recordists and audio designers, including vehicle recordings, all to demo their commercial sound
libraries. The packs are tens of gigabytes in size though.
● You could also record engine sounds off of other games. Don’t forget to hold steady RPMs!
● Using Youtube to source engine assets is highly not recommended. YT videos are commonly
recorded with integrated microphones of devices (eg. mobile phones) which are primarily designed
to capture the effective frequency range of human speech. The audio also has undergone at least
one pass (if not multiple passes) of lossy encoding. Garbage in, garbage out.
● Much of engine sound quality (besides decent quality source recordings) is attributed to re-pitching
of assets based on RPM. Having only a few assets to cover the full RPM range will add audible
imperfections to the sound, since assets are more likely played far beyond their natural pitch. Good
rule of thumb is to have natural RPMs spaced around 1000 RPM apart. Sometimes you might need
even more.
● If opting to synthesize sounds on a computer, sticking with real world conversion of 1 RPM = 1/60
Hertz (Hz), or 1000 RPM = ~16.67 Hz will add a sprinkle of realism to your engine mod. Well, if
that’s what you’re after anyway.. ;-). For conversion reference, look up one of the numerous
RPM-to-Hertz / Hertz-to-RPM tools online.
● Furthermore, if synthesizing sounds on a computer, it’s good to keep in mind that engine RPM is
calculated from crankshaft rotations and not engine cycles. If synthesizing sounds eg. for a single
cylinder 4-stroke engine, this would have ignition occurring every two rotations of the crankshaft
(and further, sending a blast of ignition gases through the exhaust at same rate).
● Commonly, the basic engine intake sound is hiss that changes in loudness according to RPM, but
not in pitch. If including this type of sonic element to your sound, you don’t need to use the Build
Smart Pitch Curve feature. If you still fee the intake sound pitch needs to change, rather experiment
with far more gentle automation curves.
● If looking to include a turbo or supercharger sound texture, you can set up new BCs or additional
BTs under the main engine BC to simulate these. For any new BC(s), you will also need to modify
the event (triggering the sound) to include a ‘Play’ event. Note that Player vehicles also need a
‘Stop’ event to stop sounds from playing, eg. when exiting a race.
● Under the ‘Effects’ tab of Actor-Mixer Property Editor, try adding effects plugins like EQ to address
problematic frequencies in your engine recordings. To have any of these effects baked to assets
rather than calculated in runtime, then check the ‘Render’ option.
● To dynamically alter your engine sounds, try controlling effects plugin parameters with RTPCs such
as Player_Load, Player_RPM or Player_Throttle.
● To modify gear stick sound, import assets under the ‘GearStick’ Actor-Mixer object. Remember to
modify the event responsible of triggering this sound (eg. ‘Play_Player_GearShift_Example’) to
include newly added objects. If you don’t hear any GearStick sound in Wwise, in Transport Control
view check that Game state is set to ‘None’ and that RTPC_camera_index is set to 2.