An Ableton Live Extension that generates transitional drum fills — humanized, accelerating toward the downbeat — as MIDI, from a right-click. Built on the official Ableton Extensions SDK 1.0.0-beta.0.
Install: grab the latest
.ablxfrom the Releases page and drop it on Live's Settings → Extensions (Live 12 Suite Beta 12.4.5+).
Right-click a MIDI clip, a MIDI track, a Drum Rack, or an Arrangement time selection → Breakdowns… opens a modal: pick a genre (16, Electronic or Acoustic), a technique, a length, and whether you want just the fill figure or a full groove bar that breaks into it (Context). A live velocity step-grid
- build-up lane shows the result; Audition it through a built-in percussion synth, then Insert. Nothing touches the Set until you do.
Fills are assembled from genre-authentic patterns, not stamped from one gesture. Each genre owns a bank of groove cells (the beat) and fill figures (the licks), authored as data on a step grid. The engine arranges them:
- Context — Groove + fill lays a bar of the genre's groove that breaks into the fill; Fill only makes the whole length the figure(s).
- Technique is the structural archetype — a genre figure fill, an accelerating roll, a tom cascade, a stutter, a build, a half-time drop, or a hat run.
- Expressive render — ornaments (flam / drag / ruff) expand into grace notes, velocities escalate toward the downbeat, a resolving cymbal lands on the last hit, then swing + humanize finish it.
The engine speaks in abstract drum voices and only maps to MIDI pitches at the very end, so the musical logic is independent of any kit's pad layout. Everything is deterministic per seed — Reshuffle / Variations re-roll the figure selection, groove cell, and ornaments for a genuinely different fill.
Because the SDK (1.0.0-beta) can't read the timeline's position or tempo from a clip, you are the placement oracle: you pick the length and where the fill goes. The exception — and the headline entry point — is an Arrangement time selection, where the position and length are both known, so Breakdowns drops a fill clip straight into the range you highlighted.
| Right-click on… | Targets offered |
|---|---|
| MIDI clip | New clip · Replace clip · Append to end · New track |
| MIDI track | New clip · New track |
| Drum Rack | New track (the beta device surface doesn't expose the owning track) |
| Arrangement selection (MIDI track) | Fill selection · New track |
"Append to end" places the fill at the tail of the clicked clip, keeping its notes. "Fill selection" creates a clip spanning your selection and lands the fill at the end of it — a pickup into the downbeat that follows.
Seven structural archetypes. Each pulls from the active genre's bank, scales to the chosen ½ / 1 / 2-bar length, and is deterministic per seed.
| Technique | What it does |
|---|---|
| Groove Fill (default) | A complete, multi-voice fill figure from the genre bank — the "real drummer" fill. |
| Snare Roll | An accelerating run of snares building toward the downbeat, with seeded ghost taps. |
| Tom Cascade | Toms descending Hi→Mid→Low across the fill, accelerating, with a flam on the last tom. |
| Glitch / Stutter | 2–4 retrigger bursts of one voice at a fast fixed subdivision, decaying within each burst. |
| Build-Up | A genre fill over a kick pulse that rises on every beat, resolving on a crash. |
| Half-Time Drop-In | Kick on 1, a big (flammed) snare on the half-bar, then an accelerating pickup into the downbeat. |
| Hat Run | A busy closed-hat accelerando, every 4th accented, resolving on an open hat. |
Sixteen genres, each with its own bank of authentic groove cells + fill figures — so switching genre changes the actual rhythmic vocabulary, not just a coat of paint. A header dropdown groups them:
- Electronic — Melodic House, Dark Techno, Drum & Bass, Trap, Breakbeat, Ambient
- Acoustic — Rock, Funk, Jazz, Metal, Latin, Hip-Hop, R&B / Soul, Reggae, Disco, Pop
(Four-on-floor, amen breaks, boom-bap swing, jazz triplet ride spang-a-lang, reggae one-drop, metal double-kick, songo clave, disco offbeat open-hat, …)
Five built-in palettes, switched live from the palette button in the header. Ignite — warm gold→orange on a cool charcoal base — is the default (the hero shot above). The others re-skin everything: the accent gradient, the technique tiles, the velocity heat-ramp on the grid + build-up lane, and the playhead glow. Your pick persists between sessions.
Plasma (cyan→violet) · Acid (lime→teal)
![]() |
![]() |
Ember (coral→magenta) · Mono (white→grey)
![]() |
![]() |
The musical logic lives in pure, SDK-free, unit-tested modules:
src/patterns.ts (the step-grid DSL + the genre banks of
groove cells and fill figures), src/fillengine.ts
(FillSpec → Note[] — assembles groove → fill → resolve, ornaments, the
accel/build-up math), and src/drumvoices.ts (the abstract
voice vocabulary + GM pad map). src/rhythm.ts provides the
swing/humanize final pass. The host↔webview contract is
src/protocol.ts (also SDK-free, so the webview typechecks
without the SDK). 243 tests pass (*.test.ts).
- Times are in beats; everything scales to the chosen fill length.
- Meter: Live's API (1.0.0-beta) doesn't expose a clip's time signature — only per-scene. The dialog seeds beats/bar from the first scene's signature.
- Placement: the SDK can't read timeline position/tempo from a clip, so you choose the length + target. The Arrangement-selection scope is the one place position + length are both known.
- Voices map to the General MIDI percussion layout (kick 36, snare 38, …), which lands correctly on Live's stock kits and any GM-keyed Drum Rack.
- The Audition plays through a built-in Web Audio percussion synth — preview only; it writes nothing. Every insert is a single undo step.
The pure engine is written and unit-tested (243/243 passing) and the full dialog builds + verifies in a browser. An in-Live pass in Live 12 Suite Beta (the WKWebView under AbletonSans, audition by ear, and the host write paths — append + fill-selection) is the remaining step before tagging the first release.
This repo does not include the Ableton Extensions SDK or CLI — they're a
proprietary beta. The tarballs in vendor/ are gitignored, and the SDK + CLI are
declared as optionalDependencies, so the SDK is needed only to build, not
to install or test:
- Without the SDK —
npm installon a fresh clone succeeds (the SDK is skipped) andnpm testruns the pure engine. The modules under test import nothing from the SDK. You can't build, run in Live, or package the.ablx. - With the SDK — drop the two beta tarballs into
vendor/(versions must matchpackage.json) and reinstall:ableton-extensions-sdk-1.0.0-beta.0.tgzableton-extensions-cli-1.0.0-beta.0.tgz
The SDK comes from Ableton's Extensions SDK beta — the same program that gives you Live 12 Suite Beta with Developer Mode.
npm install # works with OR without vendor/*.tgz (the SDK is optional)
npm test # vitest — pure fill engine, no SDK needed
npm run typecheck # full typecheck (needs the SDK); `typecheck:ci` skips the host file
npm start # build:dev + extensions-cli run (Extension Host) — needs the SDK
npm run package # -> Breakdowns-<version>.ablx — needs the SDKExtension Host logs (for console.* + stack traces):
~/Library/Preferences/Ableton/Live <ver>/ExtensionHost.txt.
Release notes are kept in CHANGELOG.md in
Keep a Changelog format — add entries under
## [Unreleased] as you work. To cut a release: move the Unreleased entries under
a new ## [x.y.z] heading, bump version in package.json + manifest.json,
npm run package, then attach the Breakdowns-x.y.z.ablx to a GitHub release
tagged vx.y.z.
MIT © E. T. Carter




