- Each track (stem) from a DAW or any online license sources of stems are the source of the setup
- They are setup in FMOD as separate events (reasoning for this will follow)
- In Unity, a MasterBusController script serves as the main interface between FMOD and Unity. It helps setup song level controls like Play/Pause/Stop/Un-mute all/Mute all etc.
- The fmod banks that contain all the information about the FMOD setup are then built into Unity under the streaming assets.
- There was no specific customization necessary for Quest and hence this single setup was used to build both for Oculus Quest and Oculus Rift PC build.
Audio Setup:
Some advantages of using FMOD Audio Middleware:
- The DAW like layout makes it easy to do edits within FMOD itself instead of having to jump back to a DAW (the obvious!)
- The extent of DSP plugins that come with FMOD was the deal breaker and the interface that FMOD provides through it’s API is easy to use (even though it’s not documented very well)
- More online content regarding FMOD and how to use it is available compared to extensively using Unity’s audio system.
On that note, some of the most useful resources that was used:
FMOD specific setup:
Since the sources are stems, and as the project demands individual control for each track through the FMOD API, the FMOD side setup is slightly different from a regular game audio like use case for FMOD.
Each song is placed in a folder and each of its stems are setup as a separate 2D event and assigned to a bank as shown in the screenshot. They are set up as 2D events since it’s going to be strictly rendered as stereo and need not use more than 2 channels at any point.
This set up allows for addition of any DSP module to any of these tracks independently through the API. The channel group that each event is routed to is the main source for addition of any sort of DSP chain, panning controls and volume controls.
Note: FMOD still allows to add separate plugins through the desktop interface for each audio track within an event but that isn’t straightforward to do from the API