A Max for Live MIDI effect that splits incoming notes across MIDI channels by order of arrival — not by pitch — and lets you sculpt where each note lands by dragging a per-channel bar graph.
Why? So you can fan a melody, arpeggio, or chord out to several instruments without zone-splitting by pitch — and shape the split by hand, deterministically.
- Every new note piles onto the working channel — the rightmost channel that already holds notes (the very first note goes to Ch 1). Pitch and velocity pass through untouched; only the channel is chosen.
- Each distinct pitch is sticky: it always returns to the channel it's on until you move it. Held notes go off on the channel they sounded on, so reshaping mid-phrase never hangs a note.
- Drag a bar down to peel its newest notes onto the next channel to the right — building a left-to-right spread (Ch 1 → 2 → 3 …).
- Drag a bar up to reclaim notes back from the channels to its right.
- The whole sculpt is saved with the Live Set and restored on load.
- bar graph — live per-channel note counts. Drag a bar to sculpt: down peels its newest notes one channel right, up reclaims notes from the right.
- notes — the count sitting on each channel.
- ch 1–8 — the eight channels.
- channels — pool size: how many channels are in play (default 4).
- re-learn — forget every learned assignment; the next notes start over from Ch 1. Use it when you switch to a genuinely different pattern.
- readout — the last note's name and the channel it landed on.
arpsplit assigns each note a MIDI channel and broadcasts it to a global bus, so pick the path that matches your setup. (Live flattens MIDI to one channel per track on output and offers no per-channel track routing, so you can't split to separate tracks by channel directly — use one of these.)
If a single multitimbral instrument (Kontakt, Omnisphere, an External Instrument to a hardware/IAC port, …) sits after arpsplit on the same track, it receives every channel directly — Live only collapses channels between tracks. Set the instrument to respond per-channel; channel = the bar the note landed on. Nothing else to wire.
arpsplit also broadcasts each channel to a global send bus arpsplit_ch1..16.
The companion arpsplit-recv device receives one bus and outputs it locally,
sidestepping Live's channel limit entirely:
- Put arpsplit on a MIDI track (no instrument needed; it's the master).
- On each instrument track, add arpsplit-recv before the instrument and set its Group to the channel you want.
- That track now plays only its channel — no MIDI-From routing, no IAC.
The bus names are global, so run one arpsplit master per Live set. Only notes travel the buses; CC / pitch-bend / etc. stay on the master track (path A still carries them per-channel).
Requires Ableton Live with Max for Live.
- Download
arpsplit.amxd(andarpsplit-recv.amxdif you want to fan out to separate tracks — path B). Grab them from the latest release or download the raw files from this repo. - Drop
arpsplit.amxdonto a MIDI track in Live. - Route it to your instrument(s) using one of the paths above.
The .amxd files are frozen (self-contained) — no other files needed to run
them. A ready-made example is in Sample Live Project/ — open
Arpsplit Sample Project.als to see the devices wired up.
Logic lives in the v8 script + the abstraction; the .amxd is a thin shell with
the front-panel UI.
arpsplit.js— the engine: stable pitch→rank map, sticky per-pitch channel assignments, drag-to-peel / drag-to-reclaim, and state save/restore. Av8object.arpsplit.maxpat— MIDI plumbing:midiparse → v8 → midiformat, plusv8 → route → send arpsplit_ch1..16to broadcast each channel. Inlets:0MIDI,1bars (multislider),2channels,3re-learn,4state (pattr),5seed (debug — injects fake notes so you can sculpt with no MIDI in).arpsplit-recv.maxpat— receiver: 16receive arpsplit_chN→switch(Group selects the open bus) →midiformat→ MIDI out.validate_maxpat.mjs— structural check:node validate_maxpat.mjs <file>.maxpat
To rebuild a device, edit the loose source files (keep them beside the .amxd),
then in Live's Max editor Freeze (snowflake) → Save to re-embed them.
- Only note messages are split. CC, pitch-bend, aftertouch, etc. pass straight through; their channel follows the last note's.
- The pool is 8 channels; the rightmost channel always catches — there is no separate overflow lane.
arpsplit.jsuses thev8object (Max 8.5+) but sticks to ES5-safe constructs.
