Welcome to crocus. Hold a chord type with one hand, tap a root with the other — a chord plays. Add extensions like ♭9 or M7, pick a voicing, lay in bass and drums, drive an arpeggiator or strum, sync MIDI clock to your gear, and play a whole song from a monome 128 grid and the three encoders + three keys on the norns.
The shortest path from "loaded the script" to "playing chords."
crocus runs on monome norns. You drive most playing from the 16×8 grid; you change settings and watch state on the norns OLED with its three encoders (E1–E3) and three keys (K1–K3).
| Control | Default | Notes |
|---|---|---|
| E1 | cycle screen view | Home → Geek Out → Hint → Perform → Bass → Key → BPM & Beats → Options → wrap. |
| E2 | per-screen primary | e.g. Perform = mode select; Key = quality; Bass = bass mode; Options = scroll cursor. |
| E3 | per-screen secondary | e.g. Perform = mode value; Bass = bass dial; Options = edit selected entry. |
| K1 | norns shift (system) | Hold and turn E1 to change brightness, E2 levels, etc. |
| K2 | per-screen toggle | e.g. Bass = bass on/off; Key = key mode on/off; BPM = beats run on/off; Options = confirm action. |
| K3 | per-screen secondary | e.g. Hint = play preview chord; BPM = cycle time signature (long); Options = K3-long toggles perf-lock on most screens. |
16 columns × 8 rows. The map below matches the physical grid as it sits in front of you with the USB cable pointing away: row 1 on top (drums + spicy chord qualities), row 8 on the bottom (root pads). Columns are 1 → 16, left to right.
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| R1 | aug | m7♭5 | m♯5 | sus2 | beat div− | beat div+ | beats vol− | beats vol+ | beat patt− | beat patt+ | beats run | |||||
| R2 | dim | min | maj | sus4 | arp rate− | arp rate+ | arp mode− | arp mode+ | arp on | |||||||
| R3 | bass dial− | bass dial+ | bass voice− | bass voice+ | bass on | |||||||||||
| R4 | m7 | M7 | 9 | 13 | ||||||||||||
| R5 | ♭9 | ♯9 | ♯11 | ♭13 | voicing− | voicing+ | octave− | octave+ | voicing mode | |||||||
| R6 | play style− | play style+ | perf mode− | perf mode+ | key mode | |||||||||||
| R7 | hold mode | |||||||||||||||
| R8 | A−3 ↓oct | A♯−2 ↓oct | B−1 ↓oct | C±0 | C♯+1 | D+2 | D♯+3 | E+4 | F+5 | F♯+6 | G+7 | G♯+8 | A+9 | A♯+10 | B+11 | C+12 |
offset = col − 4 semitones added to the current key root. C4 is the anchor (offset 0). C1–C3 are left-anchor cells — they sound A, A♯, B in the octave below the C anchor (so the relative minor sits within reach). C16 (offset +12) is one octave above the anchor. Brightness shows scale membership when Key Mode is on.
Every cell marked with the orange underline is a ± pair: holding
both cells of the pair simultaneously for ~1 second resets that one parameter to
its param_spec default. Two pairs have additional special behavior:
voicing_mode = Split enters SET_SPLIT_MODE; the next R8 root-pad press writes that pad's column to voicing_split_index. In Octave mode the same gesture simply resets voicing_dial.The bass-voice ± pair (R3 C13 + R3 C14) is also pair-hold-aware, but its pair-hold short-cuts to the "share with chord voice" nb-voice picker entry instead of a numeric reset.
This is the single most important behavioral toggle.
Toggle with row 6, column 16 (the rightmost cell on the master row), or via PARAMS.
Hold two roots at once. The most recently pressed one is the active root — that's what sounds. Release it; the previous root is promoted and its chord resumes. Lets you "stack" chord changes in time without ever having a silent gap.
| Style | Behavior |
|---|---|
| Simple (default) | Chord type must be held when the root is pressed. Cleanest live-play feel. |
| Advanced | Either order works. Root-first arms the trigger; the next chord-type press fires it. |
| Free | Root pads play single notes — no chord, no bass. Useful for melody. |
Two rows of four pads on the upper-left of the grid:
| Row | Pads (left → right) | Notes |
|---|---|---|
| R1 — spicy | aug · m7♭5 · m♯5 · sus2 | Less common qualities — spread out for color choices. |
| R2 — normal | dim · min · maj · sus4 | Bread and butter. |
| Row | Bits 0..3 (left → right) |
|---|---|
| R4 — normal | m7 · M7 · 9 · 13 |
| R5 — spicy | ♭9 · ♯9 · ♯11 · ♭13 |
Hold any combination — they stack. Examples: maj + m7 + 9 = C9, maj + m7 + ♯9 = C7♯9 (the Hendrix chord), min + m7 + 9 + ♭13 = Cm9♭13.
How the script reacts when you add an extension while a chord is already sounding:
Set in PARAMS > Trigger > extension_addition or in the Options screen.
[0,3,6,9], "stacked minor thirds"), not a half-diminished
chord — that one's available via the dedicated m7♭5 pad.
Lets ragtime and classic-tritone-sub voicings actually exist.
Two dials live next to each other on the Minilab faders 1 & 2 — Bass Voicing (Fader 1) sets bass octave; Chord Voicing (Fader 2) sets where the chord notes sit. Both are also reachable from the Bass and Home screens on the norns.
Two algorithms ship; pick in Options > voicing_source.
20 = mid-register Root position. Verified note-for-note against Orchid's published Visualizer table.| Orchid dial | C Major notes | Inversion |
|---|---|---|
| 8 | C2 E2 G2 | Root |
| 13 | E2 G2 C3 | 1st |
| 17 | G2 C3 E3 | 2nd |
| 20 | C3 E3 G3 | Root (default) |
The Bass Voicing dial is bass_dial in PARAMS — an
octave offset for the bass voice (±2 octaves).
0 places bass one octave below the chord root in the
default Chords Only bass mode; +1 lifts it to chord-root
octave; -1 drops it another octave. In Unison bass mode it
follows the played pad's pitch class instead, with the same ±2 octave
range.
Four bass modes, each with the bass voicing dial as a sub-modifier.
| Mode | What plays |
|---|---|
| Chords Only (default) | Bass plays the chord root, one octave below the chord. Standard accompaniment. |
| Unison | Bass plays the literal pressed pad, not the snapped chord root. Lets bass disagree with chord when Key Mode nudges roots into scale. |
| Single Notes | Bass and chord both play normally. Press a root WITHOUT a chord-type held → bass-only note. |
| Solo | Chord voice muted; bass plays the chord notes solo. |
Pick a separate nb voice for bass at PARAMS > bass voice. Set "share with chord" if you want both through the same engine. Toggle bass on/off with K2 on the Bass screen.
Choose how the chord articulates. Eight modes, all reachable from the Perform screen (E2 cycles).
| Mode | What you hear | Param |
|---|---|---|
| off | Solid block chord. | — |
| Strum | Notes cascade low → high. | strum_speed (5..200 ms) |
| Strum 2 Oct | Same cascade, doubled across two octaves. | strum_speed |
| Slop | Notes spread out with timing jitter — feels human. | slop_amount (0..1) |
| Arp | Walks the chord tones at a tempo-locked rate. | arp_rate, arp_mode (Up / Down / Up-Down / Random) |
| Arp 2 Oct | Same, walking across two octaves. | arp_rate, arp_mode |
| Harp | One-shot four-octave low-to-high sweep on every press. | strum_speed |
| Pattern | Runs a chord-tone pattern at tempo (11 patterns). | pattern_id_perf |
Options > quantization snaps Strum / Slop / Harp per-note timing to a grid: none, 1/32, 1/16, 1/8, 1/4, 1/16t, 1/8t. Pattern and Arp are already step-locked, so quantization doesn't apply to them.
K3-long on most screens toggles perf_lock. With it on, changing the perf mode stages for the next press instead of interrupting the current performance.
crocus understands three orthogonal pieces: a scale root (any of 12 pitch classes), a quality (Major or Minor), and a scale type within that quality. With Key Mode on, off-scale root presses snap to the nearest in-scale pitch.
| Quality | Scale type | Intervals |
|---|---|---|
| Major | Natural | 0 2 4 5 7 9 11 |
| Lydian | 0 2 4 6 7 9 11 | |
| Mixolydian | 0 2 4 5 7 9 10 | |
| Harmonic Major | 0 2 4 5 7 8 11 | |
| Pentatonic | 0 2 4 7 9 | |
| Minor | Natural | 0 2 3 5 7 8 10 |
| Dorian | 0 2 3 5 7 9 10 | |
| Phrygian | 0 1 3 5 7 8 10 | |
| Locrian | 0 1 3 5 6 8 10 | |
| Harmonic Minor | 0 2 3 5 7 8 11 | |
| Melodic Minor | 0 2 3 5 7 9 11 | |
| Pentatonic | 0 3 5 7 10 | |
| Blues | 0 3 5 6 7 10 |
Three places, all equivalent:
Eight drum patterns ship: 4-on-floor, rock, half-time, breakbeat, samba, jazz brushes, dembow, kick + crash. Toggle on/off with the rightmost cell on grid row 1, or K2 on the BPM & Beats screen.
Set BPM (40–240) on the BPM screen with E2. Tap tempo: K3 on the BPM screen — each tap derives BPM from the rolling-window average interval (4 most recent taps; 0.2..3.0 sec valid). Time signature: K3-long cycles 4/4 → 3/4 → 6/8.
Three send-style effects on the engine output, all in PARAMS > crocus > Audio:
| FX | Range | Notes |
|---|---|---|
| Reverb send | 0..1 | Norns built-in plate. Engine→reverb level; > 0 turns plate on. |
| Reverb decay | 0.5..10 s | Mid-band rt60. |
| Delay time | 0.001..2 s | Softcut tape-style delay length. |
| Delay feedback | 0..0.95 | Echo tail. > 0 engages the engine→softcut send. |
| Comp Mix | 0..1 | Norns built-in compressor wet mix; > 0 turns it on. |
E1 cycles eight views. Each shows what's relevant to the current task and re-purposes E2/E3/K2/K3 accordingly.
Top-left key indicator, top-right transpose, big chord name, piano showing the chord pitch classes (chord notes bright; bass-note pc half-bright). E2 = chord voicing, E3 = octave, K2-long = Quick-Key.
Chord name + note list + voicing index + scale-degree analysis. Add 3+ extensions to see the JAZZ tag fire.
Four pages of suggestions: diatonic triads, 7ths, substitutions, modal interchange. E2 scrolls; K2 cycles pages; K3 plays the highlighted chord at root position.
E2 cycles modes (off → strum → strum_2oct → slop → arp → arp_2oct → harp → pattern); E3 sets the mode's primary value. K2 toggles a per-mode secondary (arp_mode, pattern direction).
E2 picks bass mode; E3 sets octave dial. K2 mutes the bass voice.
E2 cycles scale type within the current quality; E3 transposes ±12. K2 short toggles Key Mode; K2 long enters Quick-Key.
E2 sets BPM; E3 cycles drum patterns. K2 toggles beats running; K3 taps tempo; K3-long cycles 4/4 → 3/4 → 6/8.
Scroll list of every behavioral setting. E2 moves cursor; E3 edits the selected value; K2 confirms (only Reset asks).
Plug any MIDI controller into the norns. crocus listens for keyboard notes (root + octave + velocity) and CCs. Configure the device + channel in PARAMS > MIDI Input. With a velocity-sensitive keyboard you get full dynamic range; the grid sends a constant velocity.
crocus sends MIDI Clock (24 PPQN) plus Start/Stop (0xFA / 0xFC) when enabled. PARAMS > MIDI Output > Clock Out defaults to OFF so external gear isn't surprised on first boot. Set the device + flip the toggle to drive an external sequencer in lock-step with crocus's BPM.
crocus has a built-in mapping for the Arturia Minilab 3 — the most common compact controller. Below is an approximate top-down of the physical hardware with each control's target. Faded cells are unmapped — they're free for you to bind via norns Settings > MIDI.
Reading the schematic: labels show physical control name → MIDI CC# (or note range) → crocus target. "Unmapped" = the CC arrives but crocus drops it; you can bind those CCs externally via norns Settings > MIDI without conflict. Two faders changed from the original ChordLab defaults: F3 was octave (now driven by face-value MIDI keyboard) and F4 was slop (moved to E2). F3 + F4 now drive the extension banks with curated 8-stop sweeps — see "Extension faders" below.
omni by default. Set to 1..16 to filter.External keyboard notes drive the chord-engine root row exactly like a grid R8 press. The MIDI note's pitch class selects the root (pc = note % 12); the MIDI note's octave drives the crocus octave param so a 25-key controller (C2..C4) spans crocus octaves 2..4 instead of folding to one octave. Velocity carries through to the chord engine.
Pressing C4 (MIDI 60) plays Cmaj at octave 4. Pressing C2 (MIDI 36) plays Cmaj at octave 2. The on-screen octave param visibly updates to the played octave; this is intentional — the keyboard's Oct+/Oct- buttons therefore "just work" via the implicit MIDI-octave shift.
For chord triggering: same gating as grid R8 presses. In Simple play_style (default), chord plays only while a chord-type pad (grid OR Minilab pad — see below) is held.
The 8 pads in bank A send notes 36..43 on channel 10 (Arturia factory). Each pad maps to one of crocus's 8 chord types — single GRID_KEY_DOWN action, no extension side effects. Hold to gate chord (same semantics as grid chord-type pads).
| Pad | MIDI note | Chord type | Crocus grid cell |
|---|---|---|---|
| 21 | 36 | maj (0, 4, 7) | R2 col 2 (chord_type 2) |
| 22 | 37 | min (0, 3, 7) | R2 col 1 (chord_type 1) |
| 23 | 38 | dim (0, 3, 6) | R2 col 0 (chord_type 0) |
| 24 | 39 | aug (0, 4, 8) | R1 col 1 (chord_type 5) |
| 25 | 40 | sus4 (0, 5, 7) | R2 col 3 (chord_type 3) |
| 26 | 41 | sus2 (0, 2, 7) | R1 col 0 (chord_type 4) |
| 27 | 42 | m7b5 | R1 col 2 (chord_type 6) |
| 28 | 43 | m#5 | R1 col 3 (chord_type 7) |
For 7ths, 9ths, etc.: add extensions via the grid R4/R5 extension rows OR via PARAMS > Chord > extensions_normal / extensions_spicy. The Minilab pads stay focused on chord-type selection only — keeping the live-jam workflow simple.
Pads do exactly one thing — chord-type select. Toggle behaviors (arp on/off, beats run, hold mode, etc.) live on the grid and PARAMS menu, not on the Minilab pads.
From the ChordLab brief at reference/orchid-clones/chordlab/PROJECT_BRIEF.md:
| Control | CC # | Mode | Crocus target |
|---|---|---|---|
| Mod strip | 1 | — | unmapped — was strum_speed (broken on hardware); strum_speed moved to Encoder 4. Free for user binding. |
| Fader 1 (Bass Voicing) | 14 | absolute | bass_dial (±2 octave bass offset — matches Orchid's bass voicing dial position) |
| Fader 2 (Chord Voicing) | 15 | absolute | voicing_dial (chord voicing — matches Orchid's chord voicing dial position) |
| Shift | 27 | — | unmapped — Shift+pad system removed 2026-05-13. Free for user binding. |
| Main encoder rotate | 28 | relative-binary | view_mode ± (cycles screens) |
| Fader 3 | 30 | curated | extensions_normal — sweep through 8 stops (none → m7 → M7 → 6 → 9 → m7+9 → M7+9 → 6+9) |
| Fader 4 | 31 | curated | extensions_spicy — sweep through 8 stops (none → b9 → #9 → #11 → b13 → #9+#11 → b9+b13 → all) |
| Hold button / Sustain pedal | 64 | press | cycles play_style (Simple → Advanced → Free → wrap). Press edge only; release is ignored. |
| Encoder 1 | 86 | absolute | arp_rate (moved from Fader 1 — bass_dial took its place per Orchid layout) |
| Encoder 2 | 87 | absolute | slop_amount |
| Encoder 3 | 89 | absolute | perf_mode |
| Encoder 4 | 90 | absolute | strum_speed (moved from broken Mod strip; bass_mode is comfortable on norns + grid R5 cycle) |
| Encoder 5 | 110 | — | unmapped — free for your norns/voice param assignments |
| Encoder 6 | 111 | — | unmapped |
| Encoder 7 | 116 | — | unmapped |
| Encoder 8 | 117 | — | unmapped |
| Main encoder press | 118 | press | CYCLE_VIEW_MODE (cycles screens) |
CC modes explained:
SET_PARAM_DELTA.The mapping deliberately covers the controls you'd touch during a performance — voicing, perf mode, strum, slop, bass, arp, hold, screen navigation, and live extension sweeps. Key/scale/transpose live in PARAMS or on dedicated screens (E2 on the Key screen for example) because those decisions are made before the jam, not during. Octave isn't on the encoder map either — face-value MIDI octave (the keyboard's own Oct± buttons or just playing different octaves) drives it for free.
Encoders 5..8 are explicitly left unmapped so you can bind them via norns' Settings > MIDI menu to whatever nb voice / audio params your current setup needs (filter cutoff, reverb send, sub osc level, etc.) — without those bindings fighting crocus.
The two extension faders give live, between-press control over the chord's color tones. Fully down on a fader = no extensions in that bank; sliding up walks through 8 curated stops covering single extensions and common combos. Each stop is exactly 16 CC units wide.
Fader 3 → normal extensions (m7, M7, 9, 13 — per lib/kernel/harmony.lua):
| CC value | Slot | Extensions | Bitmask |
|---|---|---|---|
| 0–15 | 1 | none | 0 |
| 16–31 | 2 | m7 | 1 |
| 32–47 | 3 | M7 | 2 |
| 48–63 | 4 | 9 | 4 |
| 64–79 | 5 | 13 | 8 |
| 80–95 | 6 | m7+9 (dom9) | 5 |
| 96–111 | 7 | M7+9 (Maj9) | 6 |
| 112–127 | 8 | m7+13 (dom13) | 9 |
Fader 4 → spicy extensions (b9, #9, #11, b13):
| CC value | Slot | Extensions | Bitmask |
|---|---|---|---|
| 0–15 | 1 | none | 0 |
| 16–31 | 2 | b9 | 1 |
| 32–47 | 3 | #9 | 2 |
| 48–63 | 4 | #11 | 4 |
| 64–79 | 5 | b13 | 8 |
| 80–95 | 6 | #9+#11 (Hendrix-ish) | 6 |
| 96–111 | 7 | b9+b13 (altered dom) | 9 |
| 112–127 | 8 | all (full altered) | 15 |
Both faders work together — sliding both to a non-zero stop combines normal + spicy bits on the next chord trigger. Combos beyond the curated stops (e.g. m7+M7) require setting bits manually via the grid R4/R5 extension pads or PARAMS > Chord.
On-screen preview: as you move either fader, the chord-name display on the Home screen updates live to show the chord name with the new extensions (e.g. "C" → "C9" → "C9♭13"). The currently-sounding chord doesn't retrigger — you're previewing the next press. Trigger a chord (chord-type pad held + root key) to hear the new color.
Minilab 3 buttons whose CC depends on your Arturia MCC config (default may vary):
octave param follows automatically. If your MCC config sends Oct buttons as CCs instead, enable Diagnostic Log to capture them and wire explicitly.play_style (Simple → Advanced → Free).beats_running, RESET, Reset-to-defaults.Grid optional from here.
key_root_pc, key_quality, and key_mode = ON are written. The current scale type is preserved across the change.If no pad is tapped within modal_auto_dismiss_sec (default 3 s), Quick-Key exits without changes.
Two ways to start over:
Resets every crocus param to its default. PSET files on disk are not touched.
One-screen comparison of where crocus follows the Orchid spec and where it walks its own road.
| Area | Status | Notes |
|---|---|---|
| Chord engine (build, name, resolution) | ✅ mirrors | Same intervals, same naming, same Add Note vs Play Chord behavior. |
| Eight chord types | ↺ partial mirror | 4 normals (dim/min/maj/sus4) match. 4 spicy (aug/m7♭5/m♯5/sus2) replace Orchid's two-button "Secret Chords" gesture. |
| Eight extensions | ↺ partial mirror | Normal bank matches. Spicy swaps natural-11 for ♯9 so the Hendrix chord is reachable. |
| Voicing engine | ✅ mirrors | Verified note-for-note against Orchid Visualizer table (with one octave fix in Root inversion). Crocus algorithm available as alternative. |
| Bass engine + 4 modes | ✅ mirrors | Chords Only, Unison, Single Notes, Solo all match. |
| 7 perf modes (Strum, Strum 2 Oct, Slop, Arp, Arp 2 Oct, Harp, Pattern) | ✅ mirrors | All present. Quantization for Strum/Slop/Harp added per spec §17. |
| Modal scales (Lydian, Dorian, Phrygian, etc.) | ✅ mirrors | 10 modal flavors in the standard families. |
| Pentatonic Major, Pentatonic Minor, Blues | + diverges | Crocus addition — common pop/rock/jazz scales not in Orchid spec. |
| Quick-Key gesture | ✅ mirrors | Behavior matches; reachable via K2-long. |
| Three play styles (Simple, Advanced, Free) | ✅ mirrors | Same semantics. |
| BPM, time signature, drum patterns | ↺ partial mirror | BPM 40–240, 4/4 + 3/4 + 6/8 supported. 8 generic patterns ship vs Orchid's 12 branded. |
| Tap tempo | ✅ mirrors | Rolling 4-tap window. |
| FX (Reverb, Delay, Compressor) | ↺ partial mirror | Three sends present. Bitcrush / Chorus / Filter / Drum-FX submenu not implemented. |
| MIDI clock + transport out | ✅ mirrors | 24 PPQN + Start/Stop. Toggle-off by default. |
| Per-channel MIDI note out (chord / bass / perf) | ✅ mirrors | Routed through nb voice picks — set each voice to a different "midi N" entry. |
| Sound presets / "User Sounds" | − diverges | Replaced by norns PSETs, which save the entire param state, not just the synth patch. No browse-by-name dial. |
| Secret Chords matrix | − diverges | Not implemented. 4 of 6 sounds reachable as first-class spicy pads. Min+Sus → Cm-add4 and Maj+Dim+6 → C♭6 are unreachable. |
| Loop Mode | − diverges | Not implemented. Use a tape recorder or external sequencer. |
| Onboard speakers / battery / Auto Power Off | n/a | norns hardware concerns; manage via norns own UI. |
| Metronome click | − diverges | Not implemented separately from the drum pattern. |