I’ve been working on the development of a new game (working title is 50 Things). In our latest development update for 50 Things, we’ve pivoted our audio architecture toward a more dynamic, generative approach. Instead of static, looping background tracks, we’ve implemented a Camelot-based Music System that creates a unique soundscape every time you play.
What is the Camelot System?
The Camelot Wheel is a tool used by DJs to mix tracks harmonically. Every musical key is assigned a number and a letter (e.g., 8A for A minor, 9A for E minor). By matching these numbers, you ensure that multiple audio stems will always sound harmonious when played together.
In our game, we use this to drive a “Generative” engine.

Why Generative Music?
Standard game music can become repetitive. By breaking a song down into four distinct “stems,” we can mix and match variations in real-time:
- SubDrone: The foundational low-end.
- MainPads: The harmonic atmosphere.
- Textures: Environmental noise and field recordings.
- Melodic: Leads, arpeggios, and high-frequency flair.
By having, for example, 3 different pad variations and 5 different lead variations for a single key, the game can generate 15 different versions of the same song!
Technical Implementation in Godot
We built this system using Godot Mono (C#) with a focus on performance and flexibility.
1. The Centralized JSON Catalog
We moved away from embedding metadata in WAV files. Instead, we use a single track_catalog.json. This file acts as the “brain” of the system, telling the game which files belong to which Camelot key and stem type.
{
"tracks": [
{
"FileName": "abyss_2A.ogg",
"TrackName": "Abyssal Pad",
"CamelotNumber": "2A",
"StemType": 0
}
]
}
2. The MusicManager (Singleton)
The MusicManager is a global autoload that handles the heavy lifting. It parses the JSON, caches the audio files to prevent frame-stutter, and—most importantly—triggers all four stems at the exact same micro-second to ensure perfect synchronization.
We also added support for multiple formats like OGG Vorbis, which drastically reduces our memory footprint (from 30MB WAVs down to 3MB OGGs!) while maintaining high quality and gapless loops.
3. The Trigger System
To bring the music into the world, we created a GenerativeMusicTrigger scene. It’s a simple collision area that developers can drop anywhere in a level. When the player walks into the trigger, it tells the MusicManager to “Play 2A,” and the engine instantly builds a harmonious mix from the available catalog.
Summary
This pivot to a JSON-driven Camelot system gives us:
- Infinite Variety: No two playthroughs sound exactly the same.
- Harmonic Consistency: The music always sounds “right” because it follows music theory rules.
- Efficiency: Smaller file sizes and smart caching mean better performance on all hardware.
Stay tuned for more updates as we continue to expand the soundscape of 50 Things!
