Zone is a tiny Max for Live MIDI Effect that passes only the notes inside a key range and lets everything else through untouched. It simply lets you optimise how you use the keyboard from one song to the next — a split tailored to each track.
▶ Interactive demo · maxforlive.com — move a macro, watch one split point drive several zones.
- Two independent, toggleable bounds —
Lopasses notes≥its value,Hipasses notes<its value (the pivot note belongs to the upper zone). Turn one off for an open-ended range, both off to pass everything. - Full MIDI passthrough — control change (expression, sustain, breath…), pitch bend, aftertouch, program and poly pressure all pass unchanged, so breath/expression-driven instruments keep working.
- Macro-mappable — both bounds are Live parameters. Put one Zone at the head of each Instrument Rack chain and drive every split point from a single Rack macro. Instances stay independent yet synchronizable — the sync lives in Ableton, not the device.
- Learn — click a Learn button and play a note to set a bound, or click the on-screen piano.
- No stuck notes — a held note always gets its note-off, even if you move or disable a bound while it rings.
Stack as many instances as you like to build arbitrary multi-zone keyboard splits.
| File | Purpose |
|---|---|
zone.js |
The brain — note filtering + passthrough logic |
zone.maxpat |
The Max patch (UI + wiring) |
gen_zone_maxpat.py |
Regenerates zone.maxpat |
zone-demo.html |
Self-contained interactive demo |
The repo ships the source (zone.maxpat + zone.js); build the frozen device once:
- In Live, add an empty Max MIDI Effect to a track.
- Click Edit → Max opens.
- File → Open
zone.maxpat, select all (⌘A), copy (⌘C). - Back on the empty device window: ⌘A → delete → paste (⌘V).
- Save the device in this folder (so
js zone.jsresolves), then Freeze (embedszone.js) → save asZone.amxd.
midiin → midiparse ─ notes ──→ [js zone.js] ──→ midiout (filtered notes)
└ everything else → midiformat → midiout (untouched passthrough)
MIT — see LICENSE.

