Repository navigation
Releases: CanArslanDev/ableton-live-mcp
Release list
v2.3.0
The Remote Script is unchanged (2.1.0): no reinstall or Live restart needed.
The new build_tracks options were checked in Live 12.4.6 (2026-10-19);
audio_to_midi's placement through a clip's warp only against the fake Live.
Added
audio_to_miditakes apreset:melodic(the default: onset 0.6,
frame 0.3, 35 ms, melodia only below MIDI 52),chords(melodia at every
pitch) orlegacy(what it did before: 0.5, 0.3, 127.7 ms, melodia on),
andmelodia_trick, which it never passed (it was always on); given, it
holds at every pitch. On 63 synthetic renders (plucks, 32nd runs, leads,
pads; with reverb, an 808 and a bleed loop), onset F1 went from 0.583
(legacy) to 0.687 with melodia off at every pitch, 0.706 withlowest
just above the 808 (measured by an earlier spike, not again with melodia
below MIDI 52). legacy keeps only notes of 139 ms or more: on 32nd-note
runs at 140 BPM its F1 was 0.36, melodic's 0.90 (4 clean renders through
this server's worker). Without melodia a note needs an attack Basic Pitch
sees: it found 3 of 16 pure sines with a 10 ms fade-in (chords 15), 13 of
124 notes on synthetic 808 lines and 2 notes for the 336 of six 808 stems
(MIDI 22-32; "No notes found" on five of them). So melodic decodes the
model's output twice, melodia off from MIDI 52 (165 Hz) up and on below,
and drops the low notes melodia reads an octave over a sounding one (a
bass's second harmonic: 83 of the 106 extra notes on 3 saw bass lines).
Onset F1, melodia off everywhere → melodic (3 renders each, 4 above MIDI
52): 808 lines 0.18 → 0.86, with repeated notes 0.18 → 0.49, sine bass
0.00 → 0.45, saw bass 0.84 → 0.82, sine bass at MIDI 40-55 0.34 → 0.82;
plucks, runs, a lead and pads above MIDI 52 0.915 → 0.916, plucks and
pads at MIDI 40-60 0.900 → 0.873. On the 808 stems F1 went from 0.006 to
0.17: the notes have their pitch, but Basic Pitch starts them a median
109 ms late (IQR 48–187 ms) at 29–52 Hz. When it finds no notes, the
error suggestspreset="chords".audio_to_midi(bends=true)lists the pitch bend of each bent note in
cents, one value per model frame (11.6 ms). Basic Pitch 0.4.0 reads
in-tune notes a third of a semitone sharp (+1 in 99.4–100 % of the frames
of sines at 110, 220, 440 and 880 Hz); the values are corrected by that
bin, after which in-tune and ±33-cent sines read 0 and ±33 cents. Live's
API has no per-note pitch bend, so bends are returned, not written.audio_to_midivelocities follow each note's level
(audio_analysis.note_levels): a band at the note's pitch, one semitone
wide but at most 100 ms long, the loudest of its readings from 20 ms
before the note's start to 60 ms after it, none past its end; the
loudest note gets 127 and the others 127 × 10^(dB below it / 40). Rank
correlation with the true level (Spearman, Basic Pitch on 4 clean
synthetic renders each), against 127 × Basic Pitch's amplitude before:
plucks 0.62 → 0.98, a legato lead 0.71 → 0.99, triad pads 0.27 → 0.95.
On 3 driven 808 lines (MIDI 28-43, -24 to 0 dB, 82 notes) it is 0.98,
and equal-level 808 lines get velocities 125–127. Centred on the note's
start, a one-semitone window (0.51 s at MIDI 24) read the silence or the
note before it: 0.95 and velocities 102–127, and equal-level 808 lines
(MIDI 24-45) spread 3.6, 4.1 and 10.0 dB in quarters, 8ths and 16ths at
140 BPM, against 0.08, 0.12 and 0.18 dB now. Below MIDI 53 the band is
wider than a semitone, so a kick on an 808 note adds 0.9 dB on average.
With reverb and detuned pad voices a similar measure ranked plucks at
0.81–0.83, a lead at 0.57 and pads at 0.20.legacykeeps the old
velocity.audio_to_midiplaces notes where the source clip plays them: a warped
clip through Live's own warp (Clip.sample_to_beat_time, in batches), an
unwarped one from its start marker; notes the clip never plays are left
out.offset_beatsmoves every note, andtimingin the result says
what applied (or that Live could not map a warped clip). Checked against
the fake Live, not yet in Live.lowestandhighestalso take Hz
("82.4 Hz").build_tracksloads a Simpler's or a drum pad's sample from a file
(sample_path, absolute) withSimplerDevice.replace_sample(Live
12.4+), builds those pads without the browser (insert_chain,in_note,
a Simpler per chain) and reads each file back from its Simpler. By name,
the browser's first hit could be another file with the same name. On
older Live, or when Live refuses a file, the file's name goes to the
browser (loaded_by_namesays why), and the call fails if neither
works. Simplers and pads takeplayback_mode(classic, one_shot,
slicing) andstart_marker(sample frames), padschoke_group(0–16),
andsignaturesets the time signature first. Settings such as
"Detune": "-12 ct"resolve by name as before. If Live refuses a call
that builds pads by path (insert_chain,in_note,
Chain.insert_device), the rack is deleted and every pad comes from the
browser on a new one, asloaded_by_namesays.samplemay come with
sample_path: it is the name the browser looks up when the path cannot
be used, and what 2.2.0, which ignoressample_pathand the new options
without an error, loads. Everything goes through the Remote Script's
generic LOM bridge: script 2.1.0 works unchanged. Measured in Live 12.4.6
on 2026-10-19 with script 2.1.0, every option passed: files by path on a
Simpler and on Drum Rack pads (each read back as the exact path),
playback_modeclassic and one_shot,start_marker(frames),
choke_group,warping: false,"Detune": "-12 ct",signature"7/8",
the browser fallback for a file Live refuses (on a Simpler and on one pad
of a rack) and the refusals before anything is built; a 5-track build (an
808 Simpler and drum pads, by path) took 7.7 s. Not verified in Live: the
rack rebuilt by name (Live 12.4.6 refused none of those calls; the fake
Live was made to refuse each), loading on Live before 12.4, and the
slicing mode.
Changed
audio_to_mididefaults to themelodicpreset and to velocities from
each note's level;preset="legacy"gives what it gave before.- The tempo estimate of the audio analysis tools is found between frames: a
parabola through the autocorrelation peak at one beat, then at 2 to 32
beats, and it is reported to 0.01 BPM (0.1 before). Whole-frame lags are
3.9 BPM apart at 140 BPM (44.1 kHz), and a 137 BPM click track read
136.0; it reads 137.0 now. Click tracks from 70 to 175 BPM at 44.1 and
48 kHz came within 0.01 BPM wherever the tempo octave was right; the
octave choice is unchanged (150 BPM still reads 75).
Documentation
capture_stemssays its recordings are at the audio device's sample rate
(often 48 kHz). Read as 44.1 kHz, a capture drifts by 9 %.- CLAUDE.md: recordings' sample rate; Live keeps playing a sample it loaded
after the file is overwritten on disk, until it restarts. - CLAUDE.md: what Live 12.4.6 does with the Simplers and pads
build_tracksmakes, measured on 2026-10-19.replace_samplereads an
overwritten file again, where a browser load keeps the old content.
Transpose keeps whole semitones and Detune whole cents from −50 to +50,
truncating numbers (display text such as "11.5 ct" rounds). A Simpler's
level follows dB = 0.4 × A × (velocity − 70) − 0.096 over its Volume, A
being "Vol < Vel" as a fraction (35 % on a Simpler made with
insert_device, 45 % on a pad loaded through the browser). A choke
group cuts with a 1 ms fade; "Snap", on by default, ends a sample
10–30 ms early; Glide slides linearly in semitones over the Glide Time
(one voice, overlapping notes); notes start within 0.04 ms of their
time, and recordings add no offset. - The compose-in-live skill says when
preset="chords"fits and that Basic
Pitch starts the lowest notes (under ~50 Hz) about 0.1 s late. - CLAUDE.md: what Live 12.4.6 did in reference-dissector's live checks of
2026-10-29, which built 8 plans and a song with 2.2.0'sbuild_tracks
and recorded every pad. One-Shot pads hit again start the new hit 1.000
ms late (391 hits) and fade the old one out over 1 ms; the Classic 808
Simpler releases at −1.683 dB/ms, restarts a note of its own pitch ~1 ms
late, and its filter delays notes 0.13–0.46 ms; Simpler loses top end
(more for 44.1 kHz files); a Volume sent as display text is held a step
low; loading by file name took another file of the same name, and a
name the browser never listed made the build stop half-made; cues land
on the Arrangement's zoom-dependent grid. - README and the ableton-setup skill: "Connection reset by peer" means the
Remote Script already serves its 8 clients (one per MCP server).
Tests
- The fake Live, and so the simulator, reports Live 12.4.6 and has Drum
Rack chains that a pad lists by theirin_note(asDrumPad.chains
does),SimplerDevice.replace_sample, Simpler's Detune and
Clip.sample_to_beat_time. 28 new tests, 370 in all; 2 of them run the
real Basic Pitch model, only withABLETON_MCP_ML_TESTS=1. - The companion tools' test gives them a connection that raises. It used the
server's own, which tried localhost:9877, where a running Live listens,
3 times per run (2.5 s; 0.45 s now). No test tries that port now (checked
over the whole suite with Live open).
v2.2.0
Remote Script 2.1.0: reinstall it (ableton-mcp-install-script) and restart
Live. Checked in Live 12.4.3: the script loads without errors, recordings
start at start_beat, build_tracks, browser ids, clipping reports and
watch_live events work as before.
Removed
- The telemetry and dataset recorder inherited from upstream
(MCP_Server/telemetry*.py,MCP_Server/dataset/, ~3,200 lines, the
datasetextra withsupabase). It was inactive in this fork (it needed an
unshippedMCP_Server/config.py), but it read a Supabase service key from
the environment and its six tools (set_dataset_consent,submit_intent,
rate_last_action,prefer_candidate,reject_last_action,
record_audition) were in the source. The server now reads no credentials. - The Remote Script's passive listeners (on tempo, signature, playback and
every track, clip slot and mixer) anddrain_passive_events: only the
dataset recorder read them, and they ran in Live all the time.
Fixed
rack_control(info) crashed on a device that does not report
visible_macro_count(an error dict was added to a number).
Tests
- Every tool is now called by at least one test (18 were not): the original
full-profile tools run through the real Remote Script on the fake Live.
v2.1.2
Added
build_tracksbuilds Drum Racks (a sample per pad, with settings), audio
tracks with clips that start at the file's start (Live's warp analysis
otherwise moves them to the first transient), mute, and Simplers with
warping off. A sample named with its extension is found by exact name,
waiting up tosample_wait_sfor Live to list a file just written. Checked
in Live 12.4.2: reference-dissector's PIRAMIT plan (an 808, six drum pads,
675 notes, five stems) builds in 4.9 s, every setting as planned.
Fixed
- Recordings now really start at
start_beatin Live 12.4.2. 2.1.1 moved the
playhead beforecontinue_playing, butcontinue_playingresumes where
Live last stopped whatever the playhead says; recording now sets
Song.start_timeand callsstart_playing(checked in Live: a section at
beat 32 gives a 4.07 s file with its first hit at 0.9 ms).
v2.1.1
Remote Script 2.0.1: reinstall it (ableton-mcp-install-script) and restart
Live for the browser fix; everything else works with 2.0.0.
Added
build_tracksbuilds MIDI tracks from a spec in one call: instrument (a
device by name or a sample from the browser), settings, effects with
Compressor sidechains (routed once every track exists), fader and pan, and
Arrangement clips with their notes. Problems (a sidechain source Live does
not offer, a setting that failed) are reported per track.capture_stemslists stems that reached full scale (clipped, and
clipped_samplesper stem);mix_doctorsays so in its findings.
Fixed
render_and_analyze,capture_stemsandmix_doctorrecorded from
wherever the playhead was, not fromstart_beat: Live applies a playhead
move only after the command that made it, and the move and
continue_playingwent in one batch. The playhead is now moved first and
read back.audio_to_midiand the other ML jobs failed on results over 64 KB
("Separator is found, but chunk is longer than limit"), such as a dense
3-minute stem's notes.audio_to_midireturned no notes whenlowestwas under A0 (27.5 Hz,
Basic Pitch's lowest note); the floor is raised to it.- Browser ids went stale during long searches ("Unknown id"): results shared
the 4096-entry object registry and a walk of ~12,000 samples evicted them.
They now have a registry of their own (Remote Script 2.0.1). edit_clip_notessays note times count from the clip's start (also for an
Arrangement clip placed later);apply_device_chainsays Gate's sidechain
cannot be set from a script.
Changed
manage_tracklists its actions (create_midi,create_audio,
create_return,delete, …) as an enum in its input schema, so a client
or a registry sees what it can do without reading the description. An
unknown action is refused with the list of valid ones; actions are now
matched exactly (lowercase).
Fixed
- The .mcpb manifest summed up
lom_call_methodas "Call any LOM method,
e.g.": a tool's summary no longer ends at "e.g." or "i.e.".
v2.1.0
The Remote Script is unchanged (2.0.0): no reinstall or Live restart needed.
Added
-
Safety net.
agent_changeslists what the assistant changed in this
session and, withundo=N, takes back exactly the undo steps those changes
made, counted the way Live 12.4 records them (parameter and other changes
are separate steps; unchanged values, transport, selection, arm and solo
make none). Parameter changes leave an automatic snapshot (the last 10),
which still works after the user edited the set. The seven generators,
transform_clip_notesandapply_midi_tooltakepreview=true. Deleting a
track, scene, clip or device asks the user first in clients with MCP
elicitation, in both protocol versions. -
Simulator.
ableton-mcp-simulatorruns the real Remote Script over an
in-memory Live set (with an undo history that follows Live's rules), so the
server and its tools work without Ableton;--state-filekeeps the set as
JSON. -
Eval suite (
evals/): 32claude plugin evalcases, each against a
fresh simulated set, graded by deterministic checks of the resulting set
(plus the reply where wording matters). A scripted correct solution of
every case runs in the tests. -
Arrangement automation and transitions.
write_arrangement_automation
puts automation over a stretch of the Arrangement on MIDI tracks at once
(the notes there go into a Session clip with the envelope, laid back over
the stretch: Live 12.4 draws envelopes only on Session clips, and a copy
keeps them).record_automationrecords track automation on any track,
the main one included, by moving the parameter while the Arrangement
records.design_transitionbuilds risers, reversed crashes, drum fills,
gaps before a drop and high-pass sweeps. All verified on Live 12.4,
including undoing each withagent_changes. -
Audio generation on this computer.
generate_audiomakes a sound or
a loop from a text prompt with MusicGen small (in its own environment,
like the other models) and puts it in the set: a clip on an audio track,
a Drum Rack pad, or a Simpler. The set's tempo and key go into the prompt;
the files land in the User Library. MusicGen's weights are CC-BY-NC 4.0,
which the tool says (non-commercial use). -
Project memory.
memorykeeps notes about a song inside the Live set
(Song.set_data, saved with the set, no undo step) and the user's
preferences in~/.ableton-mcp/memory.json; a keyed note replaces the
earlier one.get_session_overviewshows them, so a later session (or
another client) starts from what was decided. -
MIDI Tools in Live's clip view.
install_midi_toolsadds three Max for
Live MIDI Tools that run inside Live, without the server: Usul and Makam
Melody (Generate) and Makam Snap (Transform). Their JavaScript is a port
of the server's generators (the usuls match note for note) and lives in
the device. Verified in Live 12.4 with Max 9.1.4.
Changed
- Less context per session and per call. The core profile's tool
descriptions and schemas take about 15k tokens instead of 22k: schemas lose
pydantic's titles and null defaults, long descriptions are tighter, and six
original tools that newer ones replace (load_instrument_or_effect,
get_browser_tree,get_browser_items_at_path,load_drum_kit,
get_remote_script_info,get_arrangement_clips) moved to thefull
profile. Results are compact JSON (a quarter to a half smaller), and notes
come as rows undernote_columns(an 8-bar melody: 885 characters instead
of about 4,100). - The server takes Live's port from the session file the Remote Script
writes (ABLETON_PORTstill wins). - Makam melodies arrive on the karar through the makam's first tetrachord
(G F# Eb D in Hicaz on D), so its characteristic intervals are always
heard; before, one 4-bar Hicaz melody in five never played its F#.
Fixed
- While a client watched a resource (Claude Code does), the background
watcher's 2-second long polls held the connection the tools use, so a tool
call could wait up to 2 s per command. The watcher now has a connection of
its own. Found by the eval suite (a recorded fade lost whole seconds). - A server started before Live refused
create_locatorand the other tools
that check the Remote Script's capabilities until it was restarted: the
capabilities are now taken from every connection's hello.
v2.0.0
Breaking
- Remote Script 2.0. Commands run on Live's main thread (about 10 ms
each instead of ~410 ms), one JSON object per line with request ids, and a
per-launch session token. Reinstall the script (ask the assistant to run
install_remote_script, orableton-mcp-install-script) and restart Live;
servers older than 2.0 cannot talk to it. - MCP Python SDK 2.x (
mcp>=2.3), Python 3.10 or newer. - Tool profiles. The default
coreprofile has one tool per job; the
original tools that newer ones replace needABLETON_MCP_PROFILE=full.
Added
- Working with Live: one undo step per tool call;
doctorand
install_remote_script; Live's changes pushed to subscribed clients
(ableton://events,ableton://session/overview, both MCP protocol
versions); progress notifications for long tools. - Writing music: generators that follow the set's meter and Key & Scale
(chords, drums, bass, arpeggios, melodies, Euclidean rhythms); harmony
analysis; Live 12 MIDI Tools equivalents; Turkish makams with.ascl
tunings and usuls;build_arrangement; MIDI file import and export; drum
kits from one-shots; browser search, loading and preview. - Mixing and listening:
measure_levels,render_and_analyze,
capture_stems,mix_doctor(masking between parts),compare_to_reference
with EQ Eight settings, snapshots with A/B, ready-made device chains. - Panels (MCP Apps) for 22 tools: mixer and Session grid, meters, masking
heat map, reference curve, snapshots, piano roll, drum pads, makam keyboard. - Live Set files:
read_live_set(and comparing with a backup),
find_live_sets,import_from_live_set, without opening Live. - Machine learning, each in its own environment set up by uv on first
use:separate_stems(Demucs),audio_to_midi(Basic Pitch),
find_similar_sounds(CLAP). - Max for Live analyzer:
install_analyzerputs a generated device on a
track;read_analyzerreports octave bands, loudness, correlation and width
while the set plays. - Extensions SDK add-on (
extension/, Live 12.4.5+ Suite beta; not yet
run inside Live):get_live_selection,confirm_in_live,
render_track_audio. - Distribution: a Claude Desktop extension (
.mcpb), a Claude Code plugin
with five skills, CI, and GitHub releases from version tags.