TT-LuckyMidiChance — User Manual

JSFX MIDI plug-in for REAPER // Version 1.2.0 // TimTechlor

A MIDI processor that injects controlled chance: notes pass or drop by probability, get gated by bar position and Euclidean patterns, burst into strums and ratchets, drift in velocity and timing — all driven by a seedable, deterministic random engine that reproduces exactly when you lock the seed, and all operated from a fully drawn front panel.

01The concept

TT-LuckyMidiChance sits between your MIDI source and the instrument and decides — note by note — what happens to each event. It is not a random filter that gives different results every run: every stochastic decision comes from an internal XorShift32 PRNG, and the stream is fully determined by SEED. A locked seed produces an identical performance on every play, bounce and project reload; seed 0 runs free.

The unit is operated entirely from its drawn front panel (680×440, Tim Techlor design) — all 45 JSFX sliders are hidden by release policy but stay alive as the parameter/automation channel. The verdict chain per incoming note-on:

note on
  → COND      bar-position gate   (host transport timeline)
  → EUCLID    step-pattern gate   (16th-note grid)
  → CHANCE    probability gate    (seeded draw)
  → MUTATE    per-note hit        (flip / velocity / division)
  → DEVIATE   velocity ±VEL DEV, delay +0…TIME DEV
  → STRUM     chord-window spread (rank × TIME)
  → RATCHET   replaces the note by a K-hit burst in one 16th
  → QUEUE     time-sorted output, note-off tracking

Events stay on their input channel — no MPE remapping, so drum racks and monosynths keep working — and the plug-in adds zero latency: every delay it creates is a scheduled event offset inside the MIDI stream.

02Quick start

  1. Insert TT-LuckyMidiChance before the instrument in the track's FX chain (it is a MIDI-only FX — no audio passes through).
  2. Make sure the header button reads ENABLED (click toggles to BYPASS).
  3. Leave SEED at 0000 (LED green = FREE) for fresh variation every pass, or dial in any number 1–9999 to lock a performance (LED amber = LOCKED).
  4. Start with CHANCE ≈ 70 and VEL DEV ≈ 12 — instant organic feel without touching your part.
  5. Add RATCHET DIV 1/8 or 1/16 for trap-style rolls, or set EUCLID PULSES/STEPS to gate notes onto a rhythmic pattern.
  6. Short on time? Pick one of the five factory presets in the preset bar (Subtle Human is a good start) and save your own settings with SAVE.

03The front panel

Everything you touch is drawn by the plug-in — there is no slider page. Layout top to bottom:

TT-LuckyMidiChance front panel — preset bar, OPTIONS and ENABLED in the header, PROBABILITY, BURST & SPREAD, HUMAN DEVIATE and EUCLID & MUTATE quadrants, seed box, footer counters
FRONTThe LUCKY MIDI CHANCE front. Preset bar and OPTIONS in the header, four module quadrants, the seed box (LOCKED shown, from the factory preset Locked Groove) and the event counters along the bottom.
HEADER
Wordmark LUCKY MIDI CHANCE; to its right the preset bar and the OPTIONS button, at the far right the ENABLED/BYPASS button. The second header row holds the seed LED (green FREE / amber LOCKED) and the SEED readout box with − + and FREE buttons. Mouse wheel over the readout steps ±1 (Shift = ±10), right-click resets to 0.
PROBABILITY
Top left: CHANCE knob, the COND cycler (< name >, click or wheel to step through 11 states), the COND CYCLE buttons 2/4/8/16 and the PASS (green) / DROP (amber) verdict LEDs.
BURST & SPREAD
Top right: STRUM TIME knob, UP/DOWN/ALT/RAND buttons; RATCHET division buttons OFF…1/16 and the DECAY % knob.
HUMAN DEVIATE
Bottom left: VEL DEV and TIME DEV knobs plus two live range bars that pulse with every passed note.
EUCLID & MUTATE
Bottom right: status readout (E(k,n) Rr or BYPASS), the PULSES/STEPS/ROTATE knobs, up to 32 step LEDs, the MUTATE AMT knob with value and the CHNC/VEL/RATCH/ALL target buttons.
READOUTS
Bottom strip: EV IN, EV OUT, EV DROP counters, Q LOAD number and bar (turns amber above 384 of 512 queue slots), and the legend line MIDI IN > CHANCE > COND > EUCLID > STRUM > RATCHET > OUT.
WidgetGestureBehaviour
Knobdrag verticallyset value; Shift = fine
mouse wheel±2 % of range per detent
right-click / double-clickreset to default
Button / cyclerclickset / step (cyclers wrap around)
CHANCE 100 · SEED 0 · STRUM TIME 0 · RATCHET DEC 0 · VEL/TIME DEV 0 · PULSES 0 · STEPS 16 · ROTATE 0 · MUTATE AMT 0.

04Preset bar & user bank

Header of TT-LuckyMidiChance with the preset bar (previous, name with drop-down, next, SAVE, menu) left of OPTIONS and the open preset list with the FACTORY and USER sections
PRESETSThe preset bar sits in the header, directly left of OPTIONS: < name > SAVE .... The name opens the list with the FACTORY and USER sections; the preset in use is marked.

The bar loads and saves the whole musical setting of the instance in one step: SEED, CHANCE, the condition mode and cycle, strum time and direction, ratchet division and decay, velocity and time deviation, the three Euclid values and the mutate amount and target (parameters 2–16). Not part of a preset: the ENABLED/BYPASS switch (a preset must never silence the track), the colour scheme (OPTIONS) and the hidden diagnostic and test parameters.

ControlFunction
< / >Previous / next preset: first the five factory presets, then the used user slots; wraps around and loads immediately.
Name fieldOpens the list: FACTORY (5 presets) and USER (32 slots, empty ones show - empty -). Mouse wheel scrolls, click loads. A * behind the name means the settings differ from the loaded preset.
SAVESaves the current settings into the selected user slot; with a factory preset (or none) selected, into the first free slot. A name box opens (up to 24 characters, default User 07): type, Enter or OK saves, CANCEL or a click outside cancels.
...RENAME, COPY (into the next free slot) and DELETE (a second click confirms) for the selected user preset, and INIT (all preset parameters back to their defaults).
Factory presetSettingsUse
Subtle HumanVEL DEV 12, TIME DEV 6 ms; everything else defaultOrganic feel without dropping a note; free seed.
Locked GrooveSEED 42, CHANCE 80, VEL DEV 10, TIME DEV 5 msA sparse but reproducible variation: the same notes drop on every play.
Euclid 5 of 8EUCLID 5 pulses / 8 stepsFive of eight 16th steps pass (x.xx.xx.) — a classic rhythm gate.
Ratchet RollRATCHET 1/4, DECAY −40 %Every note becomes a four-hit roll that fades out.
Strum Up 25msSTRUM TIME 25 ms, UPChords roll upward, 25 ms per note.

A factory preset starts from the defaults (INIT) and changes only the listed parameters, so it never inherits settings from what you had before. ENABLED and the colour stay as they are.

Where the user bank lives. Plug-ins cannot write files, so the 32 user slots are part of the plug-in state: they are saved with the project, with FX-chain and track-template copies, and in every REAPER preset of this plug-in (the + button in the FX window toolbar). To take your bank to another project or computer, save a REAPER preset once (+ → Save preset) and load it there: the whole bank comes with it. Projects saved with earlier versions load unchanged with an empty bank.

Typing names. REAPER keeps Space for the transport, so type Shift+Space for a blank. Depending on your REAPER settings Esc closes the whole FX window; use CANCEL instead. (The + menu of the FX window also has Send all keyboard input to plug-in.)

The preset bar is narrower than in the larger plug-ins (194 instead of 250 units) to fit the 680×440 header; long names are shortened with .. in the bar and shown in full in the list.

05SEED: FREE & LOCKED

SEEDLEDBehaviour
0000green · FREEFree-running: a fresh seed is drawn from time at every transport start — every pass differs
0001–9999amber · LOCKEDLocked: identical decisions on every play from the same material — reproducible across plays, bounces, reloads and even between two instances

The PRNG is re-seeded on every transport start and immediately when you change SEED in the panel, so A/B-ing two seeds is instant. With a locked seed, the same input after play start always yields bit-identical decisions — the same notes drop, the same strums roll, the same mutations hit. Change one digit and the performance changes completely.

Note: MUTATE hits, DEVIATE jitter and RAND strums all draw from this one stream — a locked seed locks everything, not just CHANCE.

06CHANCE: probability gate

ControlValuesFunction
CHANCE0–100 %, def. 100Per-note pass probability: each note-on draws against the seeded stream; 100 = all pass, 0 = all dropped

At 100 the gate is open and costs no random draw. Below 100, dropped notes are removed completely — their note-off is swallowed too, so nothing hangs. The PASS (green) and DROP (amber) LEDs in the PROBABILITY panel flash with every verdict.

07COND: bar conditions

COND gates notes by where in the song they land — it reads the host transport, not the clip. The cycler steps (and wraps) through 11 states:

ModeMeaning
OFFNo condition (default)
1:2 · 2:2Pass only in bar 1 / bar 2 of every 2-bar cycle
1:4 · 2:4 · 3:4 · 4:4Pass only in bar n of every 4-bar cycle
FILLPass only in the last 2 beats of the last bar of the COND CYCLE
!FILLInverse of FILL — everything except those 2 beats
FIRSTPass only inside the bar where playback started
LASTPass only in the last bar of the COND CYCLE

The COND CYCLE buttons (2 / 4 / 8 / 16 bars) set the cycle length used by FILL, !FILL and LAST — the 1:2…4:4 modes have their own fixed 2- or 4-bar grid. Two honest details: bars are counted on the project timeline (bar position in the song, time-signature aware), and with the transport stopped COND passes everything, exactly like OFF.

TT-LuckyMidiChance PROBABILITY panel — CHANCE knob at 75 %, COND MODE cycler on OFF, COND CYCLE buttons 2/4/8/16, PASS and DROP LEDs
PROBABILITYGate and bar conditions. The CHANCE knob, the COND MODE cycler and the COND CYCLE buttons — the PASS/DROP verdict LEDs flash per note.

08STRUM & RATCHET

ControlValuesFunction
STRUM TIME0–100 ms, 0.1 stepsSpacing per note: within a 15 ms chord window, passing notes get sorted ranks and the k-th note is delayed k × TIME — a 4-note chord at 20 ms lands 0/20/40/60 ms
STRUM DIRUP · DOWN · ALT · RANDRank order: low→high, high→low, alternating per chord (first UP), or a seeded shuffle
RATCHET DIVOFF · 1/2 · 1/3 · 1/4 · 1/6 · 1/8 · 1/12 · 1/16Replaces each note by a burst of N hits inside one 16th note at the note's position — the original note-off is swallowed, so the burst length follows tempo, not your finger
RATCHET DEC %−100…+100Linear velocity ramp across the burst hits: negative fades out (−50 % at vel 100 → 100/83/66/50), positive builds, clamped 1–127

Strum note-offs are delayed by the same amount as their ons — chords stay intact, just rolled. A chord arriving across an audio-block boundary still joins the open window. Ratchet bursts consist of note-on/note-off pairs (off halfway to the next hit) and every hit counts in EV OUT.

TT-LuckyMidiChance BURST & SPREAD panel — STRUM knob, TIME ms, direction buttons UP/DOWN/ALT/RAND, RATCHET division buttons and DECAY knob
BURSTStrum and ratchet. STRUM TIME with its direction buttons on the left, the RATCHET division grid and DECAY ramp on the right.

09DEVIATE: human jitter

ControlValuesFunction
VEL DEV0–64, def. 0Uniform ± velocity jitter around the played value, clamped 1–127
TIME DEV0–50 ms, 0.1 stepsRandom late per note: adds a seeded delay between 0 and TIME DEV. Never early — that is why the plug-in needs no lookahead and adds zero latency

The two range bars under the knobs show the live ± window and pulse brighter with every note that passes. Both jitter sources draw from the master seed — a locked seed gives you the same “human” player every time, dragging and pushing identically on each bounce.

TT-LuckyMidiChance HUMAN DEVIATE panel — VEL DEV and TIME DEV knobs with live range bars below
DEVIATEHuman jitter. VEL DEV and TIME DEV knobs; the range bars underneath pulse per passing note and show the live ± window.

10EUCLID pattern gate

EUCLID is a gate, not a generator: it distributes PULSES hits over a STEPS-long ring using the Bjorklund algorithm — the same maximally-even distribution as every classic Euclidean box — and lets a note pass only when its onset lands on a pulse step of the 16th-note grid. ROTATE shifts which step the pattern starts on.

ControlValuesFunction
PULSES0–32, def. 0Active hits in the ring. 0 = EUCLID bypassed (status shows BYPASS, no gating)
STEPS1–32, def. 16Ring length in 16th steps (16 = one 4/4 bar)
ROTATE0–31, def. 0Rotates the pattern (mod STEPS) — moves where the hits sit against the beat

While transport plays, the step is the project's 16th-note position — the pattern repeats every STEPS sixteenths across the timeline. With transport stopped, a step counter advances per played note group (notes closer than ~15 ms share a step), so live playing is gated too. Notes on the same step share the verdict — a chord passes or drops together.

The step LEDs show the rotated pattern (acid dot = pulse, white ring = current step). Classic references: E(3,8) = x..x..x., E(5,8) = x.xx.xx., E(7,16) = x..x.x.x..x.x.x.

TT-LuckyMidiChance EUCLID & MUTATE panel — PULSES/STEPS/ROTATE knobs, 16 step LEDs, MUTATE amount knob and target buttons
EUCLIDPattern gate and mutation. PULSES/STEPS/ROTATE knobs with the step-LED ring on the left; MUTATE AMT and its target buttons on the right.

11MUTATE

MUTATE is a per-note seeded dice roll, not a slow drift: every note-on draws once against MUTATE AMT; on a hit, the chosen target is perturbed for that note only.

MUTATE TGTWhat a hit does
CHNCFlips the pass/drop verdict — a dropped note plays, a passing note drops
VELOffsets velocity by a seeded ±48 (clamped 1–127)
RATCHReplaces the ratchet division for this note by a random one (1/2…1/16)
ALLAll three at once

MUTATE AMT (0–100 %) is the hit probability — low values give occasional “wrong” notes, high values reorganise whole passages. COND is never mutated: the bar condition is a hard rule. Like everything else, mutation is fully seeded — a locked SEED replays the same hits.

12In practice

Three recipes that show how the modules are meant to work together. Every control named here is documented in the sections above — what matters here is the order of moves and what to watch while it runs.

1 · A real-player lane — humanize only

Goal: make a quantized keys, pad or drum lane feel played without losing a single note.

  1. Leave CHANCE at 100, EUCLID PULSES at 0 (BYPASS), RATCHET OFF, MUTATE AMT 0 and STRUM TIME 0 — the whole verdict chain now passes every note; only DEVIATE touches the events.
  2. Play the loop and raise VEL DEV until the accents breathe — 8–14 is the sweet spot; much beyond ~20 reads as sloppy rather than human.
  3. Add TIME DEV 3–8 ms. It only ever adds lateness (that is what keeps the unit zero-latency), so if the part drags, nudge the clip a few milliseconds earlier instead of hoping for pushes.
  4. Keep SEED FREE while writing; before printing, lock any number so every bounce reuses exactly the same “player”.
TT-LuckyMidiChance live during playback in a humanizer-only setup — FREE seed, CHANCE 100, VEL DEV 12, TIME DEV 6.5, EV IN equals EV OUT
HUMANIZEThe humanizer lane, running. FREE seed (green LED), CHANCE wide open, only DEVIATE engaged — EV IN equals EV OUT and the PASS LED flashes; nothing is dropped.

Watch: EV IN must equal EV OUT and EV DROP stays at 0 — if DROP moves, a gate you forgot is still on. The VEL/TIME range bars pulse with every note.

Pitfalls: a locked seed makes every replay identical — when you double-track, give the second take a different seed (or FREE), otherwise both “players” deviate in perfect unison and the double sounds like one. Jitter applies per note-on, so held chords smear slightly — halve TIME DEV for chord material.

2 · Find it, lock it, print it — reproducible variation

Goal: thin a busy loop into a controlled variation that survives bounce and reload bit-identically.

  1. Set CHANCE 60–75 and, if you want phrase-level structure, a COND — 2:4 passes only the second bar of every four, FILL/!FILL gate the last two beats of the COND CYCLE.
  2. Add MUTATE AMT ~15 on VEL or ALL for occasional flipped verdicts and accents.
  3. Lock the seed first: dial any number ≥ 1 (amber LOCKED LED), then step the SEED box +1 per looped pass — every number is a different but perfectly repeatable arrangement.
  4. When a pass lands, stop touching SEED: from that moment every replay, freeze and bounce is bit-identical — same drops, same strum shuffles, same mutation hits, same deviate jitter (one shared stream).
  5. Print via freeze/render-in-place; the committed take is exactly what you auditioned.
TT-LuckyMidiChance header and top panels during a locked-seed run — amber LOCKED LED, SEED 0420, CHANCE 65, COND 2:4, STRUM ALT, DROP LED lit
LOCKEDThe locked workflow. Amber LOCKED LED with seed 0420, COND 2:4 and STRUM ALT engaged, the amber DROP LED mid-flash — the verdict history of a reproducible take.

Watch: the PASS/DROP LEDs and the counters — expect EV OUT + EV DROP ≈ EV IN (ratchet bursts inflate EV OUT, see below). If the verdicts do not match your mental picture, the counters tell you which stage is eating notes.

Pitfalls: in FREE mode the drawn seed is never shown — a magic pass you hear while FREE cannot be recovered, so audition locked from the start (or freeze the moment you like it). Editing the clip changes the note stream, so the same seed then yields different decisions. Changing SEED mid-play reseeds instantly — ideal for A/B, but decisions before the edit do not repeat.

3 · Rolls and gates — ratchet meets euclid

Goal: trap-style hi-hat rolls and grid-locked rhythmic gating.

  1. Feed a steady 16th-note lane. Set RATCHET DIV to 1/8 or 1/16 — each note is replaced by a burst inside one 16th at the note’s position, so rolls stay tempo-locked at any BPM.
  2. Turn RATCHET DEC % negative (−30…−60) for fade-out rolls; positive values build toward the next hit.
  3. Layer the gate: EUCLID PULSES 3 / STEPS 8 passes only onsets on the x..x..x. pattern — an instant maximally-even rhythm. ROTATE shifts the hits on or off the beat.
  4. Rolls only where they belong: add COND FILL (the last two beats of the cycle’s last bar) and the rest of the loop stays straight.
TT-LuckyMidiChance right column live — STRUM 12 ms UP, RATCHET 1/8 with DECAY −40, EUCLID E(3,8) R0 with three pulse LEDs and the white step marker
RHYTHMRolls and gates live. RATCHET 1/8 with −40 decay, STRUM UP at 12 ms, and E(3,8) running — three pulse LEDs lit, the white ring on the current 16th step.

Watch: the step-LED ring (white marker = current 16th) and Q LOAD — dense bursts fill the 512-slot queue quickly and the bar turns amber past 384. EV OUT counts every burst hit individually, so it legitimately runs far ahead of EV IN.

Pitfalls: a burst always fits inside one 16th regardless of note length — the original note-off is swallowed, so for sustained rolls retrigger the note. EUCLID sits before CHANCE, STRUM and RATCHET in the verdict chain: a note on a dead step never reaches the burst. A strummed chord under ratchet becomes a staircase of mini-rolls (rank × TIME shifts each burst). With transport stopped the pattern advances per note group (~15 ms) rather than along the timeline — judge the real alignment while the loop plays. If a burst ever hangs, a transport jump or CC 123 flushes everything instantly.

13MIDI thru & panic

System-exclusive data passes through untouched in both modes — REAPER forwards SysEx events automatically while the input queue is drained (verified on REAPER 7.79: F0…F7 intact, sample offset preserved). With ENABLE off the unit is a bit-exact MIDI thru.

14Automation & parameters

All panel controls are ordinary JSFX parameters — hidden from the generic slider page by design, but fully exposed to REAPER: they appear in the parameter list for envelopes, MIDI/OSC learn, track controls and parameter modulation. Every panel gesture also reports itself as a real parameter change, so touch/latch/write automation recorded from the front panel works exactly like automating the slider.

Param #ParameterPanel control
1ENABLEHeader button ENABLED/BYPASS
2SEED (0=free)Header readout, −/+/FREE, wheel, right-click
3CHANCE %PROBABILITY knob
4COND MODECOND cycler
5COND BARSCOND CYCLE buttons 2/4/8/16
6STRUM TIME msSTRUM TIME knob
7STRUM DIRUP/DOWN/ALT/RAND buttons
8RATCHET DIVdivision buttons OFF…1/16
9RATCHET DEC %DECAY % knob
10VEL DEVVEL DEV knob
11TIME DEV msTIME DEV knob
12–14EUCLID PULSES / STEPS / ROTEUCLID knobs
15MUTATE AMT %MUTATE knob
16MUTATE TGTCHNC/VEL/RATCH/ALL buttons
40UI ColorOPTIONS box, COLOR (colour scheme 0–9)

Parameters 41–45 (PB CMD/ARG/A/B/C) are the test interface of the preset bank (save, load and check slots without the mouse); leave them alone. Parameters 17–39 (and only these besides 41–45; 40 is the colour scheme above) are a diagnostic/test bus used by the automated test harness: the SNT sanity tag, the live counters (EV IN/OUT/DROP, Q LOAD, ACT), a per-note query bus (Q NOTE → Q STATUS/DELAY/VEL), an event log ring buffer (LOG EN/IDX/KIND/M1–M3/T/N) and environment echoes (SRATE, TEMPO, BEATSAMP). Most are read-only outputs the DSP overwrites every block — automating them is pointless, and users can safely ignore them; the interesting ones are mirrored on the front panel anyway.

TT-LuckyMidiChance footer strip — EV IN/OUT/DROP counters, Q LOAD, ACT, rate and tempo readouts
STATUSThe footer counters. Live EV IN/OUT/DROP statistics plus Q LOAD, ACT, sample-rate and tempo — the same values the diagnostic bus exposes.

15Options / Color

TT-LuckyMidiChance front with the OPTIONS box open: ten colour schemes, the factory scheme ACID is marked
OPTIONSTen colour schemes. The OPTIONS button sits in the header directly right of the preset bar and left of the ENABLED button. The white frame marks the active scheme; the name of the scheme under the mouse is shown at the bottom left of the box.

Click OPTIONS in the header to open the box. Under COLOR pick one of ten schemes: ACID, CYAN, ORANGE, MAGENTA, YELLOW, RED, BLUE, VIOLET, MINT or ICE. A click on a swatch changes the whole front at once (accent, dimmed accent, panel and ground tint, knob discs); a click outside the box closes it. The choice applies per plug-in instance and is saved with the project and with FX chains (hidden parameter UI Color, parameter 40). The factory colour of TT-LuckyMidiChance is ACID. The LOCKED seed LED and the overloaded Q LOAD bar use the warning colour of the scheme (orange under ACID). Colour has no effect on the MIDI processing.

16Troubleshooting