README from GitHub, MIT
🎸 Groove Bank
A library of standard rhythm templates for Schwung on the Ableton Move — played by the chord you hold.
You own the pitches, Groove Bank owns the timing. Hold a chord (or a single
note) and the selected rhythm template retriggers your held notes on the beat
— clock-locked, with a real re-attack on every hit. Change your chord mid-pattern
and the next hit follows your hands. It's a chainable midi_fx module: the module
makes the rhythm, your fingers make the harmony, and the chain plays the synth.
The sibling to Beat Bank: Beat Bank is drum patterns that generate their own notes; Groove Bank is pure rhythm applied to your notes. Layer them — a beat and a groove playing themselves — and just noodle a melody on top.
⚠️ Read this first: Schwung-mode only
Groove Bank plays the synth loaded in its own chain slot — NOT Move's native track instruments.
It is a Schw (post) mode module and cannot run in Schw+Move (Pre) mode — Pre is deliberately disabled (
pre_capableremoved in v0.1.15). If you somehow force it into Pre (e.g. an old set saved that way), it won't work: the groove fires once and dies, or the held chord won't sustain. That's an unavoidable MIDI feedback loop — Move echoes the injected groove back into the chain and drains the held notes — not something you can tune around. If a slot is stuck in Pre, switch it back to Schw.Want a sampler / drum-kit sound instead of a synth? Load a sampler as the slot's Sound Generator —
wav-playeror an SF2 synth — and Groove Bank grooves that, cleanly. There is no "drive my Move track" mode; loading the sound into the slot is the way.
🚀 Quick start
Groove Bank plays the Sound Generator loaded in its slot — a Schwung synth — the same way Super Arp and the other chain MIDI-FX tools do. (It does not play Move's native track instruments; see Feeding it a chord.)
- In a Schwung chain slot, set the Sound Generator to any synth (a pad, bass, keys, an SF2 — anything melodic).
- Set the slot's MIDI FX to Groove Bank.
- Feed it a chord (see below), press Play, and hold. You'll hear the chord chopped to the current groove through your chain synth. 🎉
- Turn the jog to audition grooves in the current genre; Knob 8 hops genres; Knob 1 morphs the variant; Knob 3 sets the gate (staccato ↔ legato); Knob 7 adds swing. (Full knob map below.)
- Move your hand to a new chord — the groove keeps running and strikes the new notes on the next hit.
Groove Bank follows Move's transport (it's silent when stopped), so it locks tight to a beat playing on the same clock.
🎹 Feeding it a chord
Groove Bank needs MIDI notes arriving at its slot. Two ways:
A. External MIDI keyboard (cleanest). Plug a USB keyboard into the Move, set the slot's Receive channel to match (or All), and hold a chord. Nothing of Move's is in the way — you hear only the patterned chain synth.
B. Move's own pads (as a silent controller). Move's pads normally play the selected track's instrument, which would sustain over the top. To use the pads purely as a chord input for Groove Bank:
- Set the slot's Receive channel to All.
- On the Move track you'll play, turn MIDI Out ON (this is what echoes your pad notes to the chain).
- Mute that track (or pull its volume to −inf). This silences Move's native instrument — but the notes still reach Groove Bank — so you hear only the patterned chain synth.
Either way, the sound you hear is the chain synth in the slot, not Move's track instrument. Pick the chain synth to get the sound you want (an SF2 kit, a pad, a bass…).
🎚 Chain-synth only (no Schw+Move / Pre mode)
Groove Bank is a Schw (post) mode module — it grooves the Sound Generator loaded in its own slot, and that's it. It does not drive Move's native track instruments.
Why not: in Pre mode the chain injects Groove Bank's output into Move, and
Move echoes that MIDI straight back into the chain. Because Groove Bank
re-attacks each held pitch every step (a kill note-off + a gate note-off per
hit), it emits ~2 note-offs per note-on — more than the host's Pre-mode echo
filter (which counts only note-ons) can absorb, so the surplus note-off echoes
leak back in and drain Groove Bank's held register. The result is a feedback
loop: the groove fires once and dies. While Groove Bank is grooving a pitch, its
own echoed note-off and your real key release are the identical MIDI event, so
no filter can separate them. Pre mode is therefore disabled for this module
(pre_capable removed in v0.1.15).
Want a sampler/kit sound? Load a sampler as the chain's Sound Generator
(e.g. wav-player or an SF2 synth) — Groove Bank grooves that, pads swallowed,
no Move-native routing, no echo.
🎛 The Pattern view
A fullscreen grid. Genre-first browsing on the jog, one rhythm lane (the pitches are your hands).
┌──────────────────────────────────────┐
│ Offbeat Stab 1/7 │
│ │
│ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ │
│ · · · │
│ hold 3 │
│ sw:0 gt:80 K8: HOUSE │
└──────────────────────────────────────┘
Row marks: x hit · A accent · g ghost (soft) · - tie/sustain · . rest.
hold N shows how many notes you're holding.
🎚 Controls
| Control | Action |
|---|---|
| Jog turn | Browse grooves within the current genre |
| Knob 1 | Gate — staccato ↔ legato (note length) |
| Knob 2 | Strum — tight chord (center) ↔ up-strum (right) / down-strum (left) |
| Knob 3 | Accent — velocity depth (flat ↔ punchy) |
| Knob 4 | Variant — morph the groove's flavors (regular / busy / sparse …) |
| Knob 7 | Swing (0–100) |
| Knob 8 | Switch genre (geared: ~8 genres per rotation) |
| Jog-click / Back | Exit the Pattern view |
These follow the Bank-family convention shared with Beat Bank: jog browses, K7 = swing, K8 = genre.
🎵 Genres
97 grooves across 14 genres — each a distinct root with a few authored flavors (base + variations on Knob 4). Curated, not padded: no two grooves in a genre share a rhythm.
Electronic — house · techno · garage · drum & bass Urban — hip-hop · trap Groove — funk · soul Band — jazz · rock (+ pop / folk strum) Roots — latin (clave family + bossa/samba) · reggae (skank/ska/dub/dembow/soca/calypso) World — afro (afrobeat/highlife/soukous) · world (maqsum/baladi/buleria/balkan)
Browse genre-first: the jog cycles grooves inside a genre; Knob 8 jumps between genres; Knob 4 morphs a groove's flavors. Odd-meter traditions use their natural step counts (12 for 6/8 & 3/4, 18 for 9/8), so the world/jazz-waltz grooves feel right.
✍️ Add your own grooves
Grooves load at startup from plain .groove text files, merged from two folders:
- Shipped defaults —
…/modules/midi_fx/groovebank/patterns/*.groove - Your grooves —
/data/UserData/schwung/groovebank/patterns/*.groove(persist across upgrades; a_HOWTO.txtis seeded here on first run)
A .groove file is a list of blocks separated by blank lines:
name: Son Clave 3-2
genre: LATIN
steps: 16
hit: x..x..x...x.x...
steps—16(one bar) or32(two bars)- Row chars —
.rest ·xhit ·Aaccent ·gghost ·-tie/sustain - A single
hit:row (the pitch is whatever you hold), exactlystepslong A---is one accented note held for four steps
Variants (a "font family" for the groove). Add alt: rows after hit: for
extra flavors of the same groove; Knob 4 morphs between them live:
name: Offbeat Stab
genre: HOUSE
steps: 16
hit: ..x...x...x...x. # regular
alt: ..x.x.x...x.x.x. # busy
alt: ..x.......x..... # sparse
Up to 6 variants (base + 5 alt:), all the same length as steps.
🔧 Build & install
./scripts/build.sh # cross-compile dsp.so (Docker or native)
./scripts/install.sh # deploy to move.local (incl. the patterns/ folder)
./scripts/package.sh # or build a release tarball
make test # run the engine unit checks (no hardware)
🙏 Acknowledgements
Built on the Schwung MIDI FX plugin API. Sibling to Beat Bank. Same driver philosophy as Super Arp — the module makes the timing, the chain plays the synth — but chord-first and queue-free: your pads change the held chord, they never enqueue a phrase.