Story Matrix

← Back to Index Β· ← Story


Definition

The Story Matrix is how the model determines the name of the current Story. It maps the intersection of Foundation state and Variance direction to a human-readable label.

The matrix is a starting point β€” not a rigid, final mapping. Implementations are expected to customize story names, add Sustain modifiers, and define only the combinations that matter for their context.


The Base Matrix

The simplest form: Foundation Weight (three bands) Γ— Variance Direction (three states) = 9 cells.

                        VARIANCE DIRECTION
                      Rising      Stable      Falling
                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            Heavy  β”‚ Escalationβ”‚  Groove   β”‚ Wind_down β”‚
                   β”‚           β”‚           β”‚           β”‚
  FOUNDATION       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
  WEIGHT           β”‚           β”‚           β”‚           β”‚
            Medium β”‚  Build    β”‚  Drive    β”‚  Cool     β”‚
                   β”‚           β”‚           β”‚           β”‚
                   β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
            Light  β”‚  Rise     β”‚  Minimal  β”‚  Fade     β”‚
                   β”‚           β”‚           β”‚           β”‚
                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Each cell is a potential Story name. The name is just a human-readable label for the combination of Weight and Direction at this moment.

What Each Cell Means

Heavy + Rising = Escalation. The kick is at full power and the energy around it is climbing. This is the peak build β€” the moment before a breakdown or a gear shift. Everything is maxed. Visually, this is maximum intensity trending upward.

Heavy + Stable = Groove. The kick is at full power and the energy is locked. This is peak-time techno in its natural state β€” driving, relentless, unwavering. The floor is moving. Visually, this is sustained high-energy expression.

Heavy + Falling = Wind_down. The kick is still heavy but layers are stripping away. The peak is passing. Energy is resolving without the kick disappearing. Visually, intensity is receding while the foundation stays strong.

Medium + Rising = Build. The kick has moderate weight and energy is climbing. This is the standard build β€” not at peak intensity yet, but clearly heading there. Visually, things are getting bigger, brighter, faster.

Medium + Stable = Drive. The kick has moderate weight and energy is steady. A solid, workmanlike groove β€” not the peak, not building, just driving. Visually, this is confident and steady.

Medium + Falling = Cool. The kick has moderate weight and energy is dropping. Cooling off after a peak, or transitioning toward something quieter. Visually, things are calming, simplifying.

Light + Rising = Rise. The kick is light (maybe filtered, maybe a thinner track) and energy is building. An early-set build or a post-breakdown ramp. Visually, something is emerging from nothing.

Light + Stable = Minimal. A light kick with stable energy. Minimal techno territory β€” sparse, precise, deliberate. Visually, restrained and detailed.

Light + Falling = Fade. A light kick losing energy. The set might be ending, or a long wind-down is in progress. Visually, things are dissolving.


Naming Scheme

Story IDs are now deterministic technical identifiers, not vibe names. The format is:

<base_story>_<weight_band>_<sustain_band>

Where:

  • base_story is one of: escalation, groove, wind_down, build, drive, cool, rise, minimal, fade
  • weight_band is one of: heavy, medium, light
  • sustain_band is one of: dry, mid, wet

Examples:

groove_heavy_dry
groove_heavy_mid
groove_heavy_wet
cool_medium_mid
fade_light_wet

All matrix states are explicit. There is no compact/default naming for mid.

Adding Sustain as a Modifier

The base matrix captures Weight Γ— Direction, but it misses the character of the kick. Two β€œGroove” stories can feel completely different depending on how the kick decays.

Sustain acts as a modifier on any matrix cell, adding flavor without changing the structural position:

  Heavy + Stable + DRY   =  "groove_heavy_dry"
  Heavy + Stable + MID   =  "groove_heavy_mid"
  Heavy + Stable + WET   =  "groove_heavy_wet"

This extends the matrix from 9 cells to 27 combinations (3 Γ— 3 Γ— 3). All combinations have explicit labels, even if some are rare in a given context.

Example: Meaningful Sustain Modifiers in Techno

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Base Story         β”‚  Sustain  β”‚  Modified Name                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Groove (heavy)     β”‚  DRY      β”‚  groove_heavy_dry             β”‚
β”‚  Groove (heavy)     β”‚  MID      β”‚  groove_heavy_mid             β”‚
β”‚  Groove (heavy)     β”‚  WET      β”‚  groove_heavy_wet             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Escalation (heavy) β”‚  DRY      β”‚  escalation_heavy_dry         β”‚
β”‚  Escalation (heavy) β”‚  WET      β”‚  escalation_heavy_wet         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Minimal (light)    β”‚  DRY      β”‚  minimal_light_dry            β”‚
β”‚  Minimal (light)    β”‚  WET      β”‚  minimal_light_wet            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Build (medium)     β”‚  DRY      β”‚  build_medium_dry             β”‚
β”‚  Build (medium)     β”‚  WET      β”‚  build_medium_wet             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Every (BaseStory, SustainBand) combination has a unique explicit label. Implementations can still map these IDs to UX-friendly names, but the matrix itself is fully explicit.


Special Story: Absence

When Presence gate is open (the kick is confirmed absent), the matrix does not apply. The story enters a special state outside the matrix:

  Foundation.presence.gate = OPEN β†’ story.name = null (or "absence")
  
  The matrix requires a kick to evaluate Weight.
  No kick = no Weight = no matrix lookup.
  
  "Absence" is the story that exists between stories β€”
  the breakdown, the silence, the gap between tracks.

When the gate closes (kick returns), the matrix immediately evaluates the returning kick’s Weight and the current Variance direction, and a new Story enters.


How the Matrix Is Evaluated

The matrix lookup is simple β€” it’s an if/else tree or a table lookup. The complexity is in the inputs, not the lookup itself.

  When is the matrix evaluated?
  
  Only when a CONFIRMED value changes:
    - Variance direction changes (after temporal threshold)
    - Sustain shifts (after temporal threshold)
    - Presence gate opens or closes (after temporal threshold)
  
  Weight is continuous and changes constantly, but the matrix
  does not re-evaluate on every weight change. Instead, Weight
  is sampled at the moment a confirmed value changes. This
  prevents the Story from flickering between "Heavy + Stable"
  and "Medium + Stable" as Weight oscillates near the boundary.
  
  Exception: if Weight crosses a band boundary AND stays in the
  new band for M bars (suggested default: 2 bars), the matrix
  re-evaluates. This handles gradual transitions between weight
  bands (e.g., a DJ slowly mixing into a heavier track).

Weight Band Boundaries

The Weight spectrum (0.0–1.0) is divided into three bands for matrix purposes. The exact boundaries are configurable, but defaults are:

  Light:   0.0 – 0.33
  Medium:  0.33 – 0.66
  Heavy:   0.66 – 1.0

These bands have hysteresis β€” the boundary for entering a band is different from the boundary for leaving it. This prevents flickering when Weight sits near a boundary:

  To enter Heavy from Medium:  Weight must exceed 0.70
  To leave Heavy into Medium:  Weight must drop below 0.62
  
  The dead zone between 0.62 and 0.70 prevents oscillation.

Defining Custom Stories

The base 9-cell matrix (or 27-cell with Sustain) is a starting framework. Implementations should:

  1. Start with the base matrix and test it against real techno sets.
  2. Identify which cells actually occur in the target context. Some may never appear in practice.
  3. Merge cells that feel identical. If β€œBuild” and β€œRise” always feel the same in context, merge them.
  4. Split cells that feel too broad. If β€œGroove” covers too many different vibes, split it using Sustain modifiers.
  5. Name only what matters. If you end up with 8 meaningful stories, that’s fine. If you need 15, that’s also fine. The matrix is a tool for discovery, not a constraint.

  • Story β€” the parent concept, including lifecycle and phases
  • Foundation β€” the kick that drives the Weight axis
  • Weight β€” the continuous value that maps to matrix rows
  • Variance β€” the direction value that maps to matrix columns
  • Sustain β€” the modifier that adds character to matrix cells
  • Transition Map β€” how stories connect to each other

← Back to Index