1. Future Vibe Check
  2. News
  3. ✨ Dev Log #3 - Chord Progressions in FVC

✨ Dev Log #3 - Chord Progressions in FVC

[p]Unwise, the developer of Future Vibe Check, is toiling through the code and has been making changes from the feedback and bug reports received from the public demo. He wrote some of the changes in the Alpha Demo Post-Mortem talking about the stats and some of the things he learned! It is a great read. [/p][p]
[/p][p]There is a demo available to check out on Steam and if you want to give feedback or see small updates from Unwise, then I would recommend joining the Future Vibe Check Discord![/p][p]
[/p][p]I talked with Unwise about Chord Progressions in Future Vibe Check.[/p][p][/p][p]Hey DJs,[/p][p]Last month we cracked open the Dynamic Measure System—the global metronome that keeps every automation mechanic and music you produce aligned. Today we’re answering the first step of, “Okay, the clock is ticking… but what does the procedural music system decide to play?”[/p][p]The first part of that answer is chord progressions. They’re what give the vibe we create a harmonic backbone. [/p][h2]1 Harmony 101 – Tonic, Sub-D, Dominant[/h2][p]Imagine a song that stays on one chord forever—you’d chill for ten seconds, then beg for change. Chord progressions are that change; they create tension (dominant), release (tonic), and the “in-between” lift (sub-dominant). Almost all modern music relies on chord progressions to drive a song forward. Music theory boils down into three functional “zones” of chords. [/p][p][/p]
[p]Zone[/p]
[p]Chords[/p]
[p]Feeling[/p]
[p]Tonic[/p]
[p]I,iii, vi[/p]
[p]Home base / resolution[/p]
[p]Sub-dominant[/p]
[p]ii, IV[/p]
[p]Tension builder[/p]
[p]Dominant[/p]
[p]V,vii°[/p]
[p]Pulls you back to tonic (home)[/p]
[p]A chord = a set of pitches stacked together (e.g., C-E-G). The specific set of pitches to be used are driven by the key/mode/scale of the music (we will go into what is a “pitch” and key/scale/mode in a later dev log). As a basic understanding, the Key sets the ‘home’ note, scale chooses the legal notes, and mode picks which scale degree feels like home (Ionian, Dorian, etc.)[/p][p][/p][p]What’s with the Roman numerals?
In music theory we name chords by their position inside the scale, not by absolute pitch.[/p][p]C-major scale = C D E F G A B[/p][p]We use numerals so the pattern I–V–vi–IV makes sense in any key (play it in C, G, F-sharp—doesn’t matter). FVC stores the degree (the number) and converts it to actual pitches only after it knows the current key/scale/mode. [/p][p]A classic pop loop C → G → Am → F is literally Tonic → Dominant → Tonic (relative) → Sub-dominant—motion that feels inevitable.[/p][p]Great songs juggle these zones to create motion in a piece of music. FVC’s generator uses the same underlying music theory but allows for more player control and modification in real-time. [/p][p][/p][h2]2 Under the Hood – The Progression Machine[/h2][p]Below is a slice of the actual generator (simplified for sanity):[/p][p][color]// For each slot in a 4-chord progression...[/color][/p][p][color]for (int i = 0; i < 4; i++)[/color][/p][p][color]{ // 1) Pick which zone we're drawing from switch (i) {[/color][/p][p][color]        case 0: currentPool = Roll(Data.TonicInfluence)        ? Tonic : SubD; break;[/color][/p][p][color]        case 1: currentPool = Roll(Data.SubdominantInfluence)  ? SubD  : Tonic; break;[/color][/p][p][color]        case 2: currentPool = Roll(Data.SubdominantInfluence)  ? SubD  : Dominant; break;[/color][/p][p]        [color]case 3: currentPool = Roll(Data.DominantInfluence)     ? Dominant :[/color][/p][p][color]                              Roll(Data.SubdominantInfluence)  ? SubD    : Tonic; break}[/color][/p][p][color]    // 2) Probability to apply a tritone substitution for jazzy colour[/color][/p][p][color]    int triTone = (currentPool == Dominant && Roll(Data.TritoneSubInfluence)) ? -1 : 1;[/color][/p][p][color]    // 3) Pick a step from the pool, honouring key-change safety checks[/color][/p][p][color]    progression(i) = triTone * PickSafeStep(currentPool, mode, scale, keyChange);}[/color][/p][p]
Design take-aways:[/p]
  • [p]Weighted randomness: All those [color]Data.*Influence[/color] numbers are tweakable in real-time. And, since we use scale degrees, the generator just rolls [1, 5, 6, 4]; looks at our key/scale to say, “We’re in A-minor Dorian,” where then we can easily map those numbers onto the A-minor Dorian scale and voilà—correct chords without rewriting any progression logic. Crank Dominant Influence and your loop gets spicier; lower it for chill lo-fi vibes. [/p]
  • [p]Key-change aware: [color]PickSafeStep[/color] avoids steps that clash when a key change is scheduled, so the musical turn feels intentional instead of broken.[/p]
  • [p]Tritone substitutions: Occasionally flipping  V chord ► bII chord injects that classic jazz surprise without derailing the groove.[/p]
[h2]From Code to Gameplay[/h2][p]Every Dynamic Measure boundary we call GenerateNewProgression() to generate a new array of chords to build around as a progression. This progression is then used to drive other musical behavior in the composition and has its own length (connected to the time signature), repeat cycle, and rate of progression (how long does it take to get the first chord to the 2nd chord of the progression). We allow the player to determine these values like the speed of how long a progression will last. Fun fact - this ties into the day/night cycle of the game when you rebuild the progression shrine. Night marks the end of a chord progression while daytime marks the beginning of one[/p]
  • [p]Nodes React, Players Hear

    [/p]
    • [p]Expressiveness: [/p]
      • [p]UI elements expose Tonic / Sub-D / Dominant influence, Key Change Odds, Progression Rate, Max Repeats, and probability to repeat when a progression ends. [/p]
      • [p]This allows Expert players to handpick progressions for predictable songwriting while newcomers can modify probabilities to see what progression types feel ‘right’ to them. Tweaking a few percentages nudges the soundtrack from EDM to jazz-fusion without rewriting a single note.[/p]
    • [p]Music Coherence: When a signal lands on a Node, it queries [color]CurrentChordProgression[ProgressionStep][/color] to decide pitch values to emit. We will go through this logic in an upcoming blog post. This allows everything you play to tie back to the harmonic core of the chord progression. [/p]
[p][/p][hr][/hr][h2]4 Next Up[/h2][p]Next dev log we dive into melody—how FVC’s generators riff over these progressions and how you can bend them to your will with in-game tooling.[/p][p]Until then, keep those vibes in check and—if you haven’t already—[/p][p][Wishlist Future Vibe Check on Steam] and hop into the Discord for behind-the-scenes chats![/p][p]Peace, love, and perfect cadences – Unwise 🎧[/p]