Stochastic Track — manual

A probabilistic note engine. Two independent domains — rhythm and melody — each roll fresh (Live) or replay a shaped snapshot (Loop), with bursts, articulation, and per-cycle evolution.

1. Overview
2. Modes — Live & Loop
3. The Rhythm Roll
4. The Melody Roll
5. Burst Clusters
6. Per-Cycle Evolution
7. Playback & Timing
8. The Edit Page
9. Setup & Routing

Introduction

The Stochastic track rolls notes from weighted distributions instead of storing fixed steps. Two independent domains run side by side — rhythm (timing, gate, articulation) and melody (pitch). Each runs in one of two modes: Live (re-rolled fresh every trigger) or Loop (a captured snapshot that gets thinned, masked, and slowly mutated). Over the roll sit per-cycle evolution knobs — patience, mutate, jump, sleep — that let the pattern drift.

Everything here is grounded in the firmware as built — defaults, ranges, enum members, key bindings, and step-grid maps come from the model, engine, and UI code.

Prerequisites

Part 1 · Overview

A Stochastic track has no hand-drawn step data. Instead it:

  1. Rolls an event each trigger — a duration, a pitch, and articulation flags — from the distributions you set.
  2. Runs two domains independently: rhythm (duration / gate / rest / slide / legato / burst) and melody (scale degree + octave).
  3. Evolves the pattern at each cycle boundary — patience regeneration, one-step mutation, octave jumps, stochastic sleep.

Each domain runs in one of two modes:

The two domains' modes are set separately, so you can run Live rhythm under Loop melody, or any other split.

Where state lives. Track-wide params (lock, octave, transpose, slide time, CV update, play mode, fill mode) live on the track. Per-pattern params (every distribution knob, the tickets, the window, the evolution knobs, divisor/clock) live on the sequence. The scale group (scale / root / scale-rotate) is on the sequence, not the track.

Part 2 · Modes — Live & Loop

Per-domain mode

Rhythm and melody each carry their own source mode (Live or Loop). Setting both equal reads back as "Live" or "Loop"; setting them differently reads as "Split".

DomainLiveLoop
Rhythmre-rolls duration/rest/slide/legato/burst every triggerone seeded snapshot, replayed and shaped
Melodyre-rolls scale degree + octave every triggerone seeded snapshot, replayed and shaped

In Live mode the slide and legato flags on stored events are dead — the engine's playback cache owns those picks per trigger. The Loop-only shaping params (mask/tilt for both domains) are inert in Live.

When Loop content regenerates

A Loop domain holds its snapshot until one of these fires:

Capture: freezing a Live roll into a Loop

NewR / NewM is mode-aware:

Part 3 · The Rhythm Roll

Each rhythm event is a duration plus articulation. The roll draws from duration tickets, then applies rest/slide/legato probabilities and an optional burst cluster.

Duration and tickets

The duration LUT (kStochasticDurationLut) has 8 slots, each a fraction of the clock divisor. Labels shown at divisor = 1/16:

SlotMultiplierLabel @ 1/16
0×81/2
1×41/4
2×33/16
3×21/8
4×4/31/8T
5×11/16 (= divisor)
6×2/31/16T
7×1/21/32

Labels are redrawn from the live divisor, so they track clock changes instead of lying.

Rest, slide, legato, gate length

Patience (rhythm)

Patience R (patienceRhythm, 0-100%, routable) is a boredom timer. Knob 0-99 maps to a Poisson rate; the engine rolls a Poisson CDF against how many cycles the loop has survived, and when it fires the rhythm domain regenerates with a fresh seed. Knob 100 = off. Loop-mode only.

Mask and Tilt (rhythm, Loop-only)

These thin a Loop snapshot by duration rank — they don't change the roll, they sieve it at playback.

Both are inert in Live rhythm.

Part 4 · The Melody Roll

Melody rolls a scale degree and octave through a five-step pitch law: pick a degree class with a recency penalty, build an octave field, then place the pitch through a Marbles-style bell and a contour nudge.

Degree tickets and rotation

The Marbles-style pitch bell

Field, contour, complexity, range

Mask and Tilt (melody, Loop-only)

These sieve a Loop snapshot by pitch centrality (how tonal the degree is — root, fifth, thirds rank high).

Both inert in Live melody.

Repeat

Repeat (repeatProb, 0-100%) — per-trigger chance to freeze and replay the previous event verbatim (note, octave, duration, articulation). 100% holds on the last event; mid values cluster durations like a human player. Works in both modes. No routing target.

Patience (melody)

Patience M (patienceMelody, 0-100%) — the melody domain's own boredom timer, same Poisson-CDF behavior, independent of Patience R. Knob 100 = off. No routing target. When it fires it also resets the octave-jump register.

Part 5 · Burst Clusters

A burst replaces one event with a short cluster of notes packed into that event's duration. The cluster is rolled per event.

Burst HoldPitch axisTiming axis
Hold/Fitcells share the anchor's pitchpack into one duration on the BurstRate curve
Hold/Over (default)cells share the anchor's pitchuniform spacing, may overflow the duration
Roll/Fiteach cell rolls its own pitchpack into one duration
Roll/Overeach cell rolls its own pitchuniform spacing, may overflow
Bursts need room. Below kMinBurstParentTicks (96 ticks) the parent event is too short to host a cluster and burst count auto-clips to 0. The Burst readout appends * when the current Note Duration + divisor combo can't produce an audible burst, so you can see why the knob is inert.

Part 6 · Per-Cycle Evolution

At each cycle boundary — a natural pattern wrap or a preempted reset-measure — four hooks fire in lockstep.

Part 7 · Playback & Timing

The sequence window

Clock

The effective tick spacing is the divisor scaled by the PPQN ratio (CONFIG_PPQN / CONFIG_SEQUENCE_PPQN = 4) and divided by the clock multiplier.

Feel

Feel (feel, 0-100%, centre 50, default 50, routable) bends the cycle toward a different beat count. The detent 45..55 is off (no scaling). Below 50 lerps the cycle toward 3 beats; above 50 toward 5 beats. Computed per trigger so routed Feel takes effect immediately; scaling clamps to ¼×..4×.

Output: octave, transpose, slide, CV update

Part 8 · The Edit Page

Page+S0 opens the Stochastic edit page. F5 (NEXT) cycles four layers: LIVE → LOOP → PITCH → DURATION → LIVE. The first two are the hands-on knob-grid pages (each step holds one shaping param); the last two edit the degree and duration tickets.

On every layer, hold a step (or several) and turn the encoder to edit. Shift multiplies the encoder delta by 10. A single held step shows its full name + value at the top; more than one held shows "MANY SELECTED". The context menu (long-press) offers INIT / EVEN / RAND / BPITCH — behavior is per-page.

LIVE page

The performance knob grid. Footer F-keys: rhythm-mode toggle, melody-mode toggle, NewR, NewM, NEXT.

LIVE page — constellation of recent events
LIVE page. The constellation plots recent events; brighter rings are newer, the marbles haze tracks Bias/Spread. Two tiny rows above show all 16 knob values; a held step swaps them for its full name and value. Fresh-track footer reads LiveR / LiveM / NewR / NewM / NEXT.
StepParamStepParam
S1Note DurationS9Complexity
S2VariationS10Contour
S3RestS11Bias
S4FeelS12Spread
S5Gate LengthS13Range
S6LegatoS14Slide
S7BurstS15Repeat
S8Burst CountS16Burst Rate

LEDs: rhythm + articulation + repeat (S1-S6, S15) red; pitch shape (S9-S14) green; burst (S7-S8, S16) orange; a held step adds the opposite colour (amber).

Context menu: INIT resets all 16 knobs to defaults; RAND randomizes them (or the held selection); BPITCH cycles Burst Hold (Hold/Over → Roll/Over → Hold/Fit → Roll/Fit). EVEN is not used on LIVE. Quick-edit: Page + S16 fires RAND directly.

LOOP page

The Loop-shaping and evolution grid. Footer F-keys mirror LIVE (rhythm/melody toggles, NewR, NewM, NEXT).

LOOP page — loop tape with window brackets
LOOP page. The tape shows every step; bracket marks the first..last play window, the bright slot is currently audible, bar height encodes pitch. Two patience meters fill below; side bars are Mask/Tilt per domain. Footer reads LoopR / LoopM / NewR / NewM / NEXT in Loop mode.
StepParamStepParam
S1Patience RS9First
S2Patience MS10Size
S3MutateS11Rotate
S4JumpS15Mask R
S5SleepS16Tilt R
S7Mask M
S8Tilt M

(S6, S12-S14 unbound.) First and Size trigger an engine window-sync; Rotate does not.

LEDs: patience + walk (S1-S5) red; Mask/Tilt Melody (S7-S8), window (S9-S11), Mask/Tilt Rhythm (S15-S16) green; held step adds amber. Context menu: INIT resets patience/mutate/jump/sleep/window/masks/tilts (selection-aware). EVEN and RAND are not used on LOOP.

PITCH page

Scale-degree tickets. Header SCALE TICKETS. Each step S1-S16 selects a degree (degree index = bank × 16 + step); the encoder edits that degree's ticket (or all held degrees). A single held degree reads DEG n: <weight or EXCL>.

PITCH page — per-degree ticket bars
SCALE TICKETS. One bar per scale degree; taller = more weight, the box marks the selected degree, the bright bar is the degree playing now, an X marks an excluded degree. Left readout is the selected degree's weight, right shows DROT / MROT.

LEDs: in-scale degrees green; the currently-playing degree red; a selected degree amber. Quick-edit: Page + S14 = INIT (all degrees uniform), Page + S15 = EVEN (all to selected degree's value), Page + S16 = RAND.

DURATION page

Duration-slot tickets. Header DURATION TICKETS. Steps S1-S8 select a duration slot; the encoder edits that slot's ticket weight. The label shows the divisor-relative duration name and the weight.

DURATION page — per-slot ticket bars
DURATION TICKETS. Eight bars, one per LUT slot, labelled with the divisor-relative duration. The box marks the selected slot, the bright bar is the duration playing now, flat baselines are zero-weight slots. Left shows the selected slot's weight; REST % sits top-right.

LEDs: the 8 slots green; the playing slot red; a selected slot amber. Quick-edit: Page + S14 = INIT (all slots 50, rest 0), Page + S15 = EVEN, Page + S16 = RAND.

Part 9 · Setup & Routing

Track-scope list (Page+S2)

The Stochastic config list, in display order:

(Divisor, Clock Mult, Reset Measure, Scale, Root Note, Scale Rotate are per-sequence values shown here; the rest are track-wide.)

Sequence-scope list (Page+S1)

The performance list, in display order (grouped Playback / Pitch / Rhythm / Burst / Sieve / Window / Evolution): Rhythm (mode), Melody (mode), Refresh, Complexity, Contour, Repeat, Bias, Spread, MaskM, TiltM, Range, Note Duration, Variation, Rest, Gate Length, Slide Prob, Legato, Burst, Burst Count, Burst Rate, Burst Hold, MaskR, TiltR, Size, First, Rotate, Sleep, Patience R, Patience M, Mutate, Jump.

Refresh ("Exec") invalidates both Loop domains so they regenerate on the next trigger.

What is routable

The Stochastic routing targets — all per-sequence:

Track-scope params route through the shared targets: Octave, Transpose, Slide Time, Clock Mult, Scale, Root Note, Rotate.

Not routable: Patience M, Repeat, Legato, Mask/Tilt Melody, Degree/Mask Rotation, the tickets, Size, First, the mode toggles.

Four hands-on performance controls

  1. Live capture — NewR/NewM freezes the live phrase into a loop.
  2. Renew — NewR/NewM in Loop mode rolls a fresh seed; Shift undoes.
  3. Page + S16 RAND — randomize the whole LIVE knob grid in one press.
  4. BPITCH — cycle the burst Hold/Roll × Fit/Over mode from the context menu.