Repository navigation
[BUG] Several advertised tools call Live API members that don't exist (verified on Live 12.4) — group/freeze/annotation/fade/follow-action/MIDI-send are non-functional #3
Description
Thanks for open-sourcing this — the flat 1:1 LOM-over-TCP surface is handy, and the thread-safe queue design is nice.
While evaluating the tool surface I found that a group of advertised actions reference Live Object Model (LOM) members that don't exist in current Live, so they can never succeed. Because most are guarded with hasattr(...), they don't crash — they quietly return {"ok": false, "error": "... not available"} (and a few return {"ok": true} while doing nothing), so they're easy to miss in a smoke test.
How I verified
Introspected the live LOM on a running Ableton Live 12.4 (Song, Track, MixerDevice, Clip, DeviceParameter) and cross-checked against the official Cycling '74 LOM reference (docs.cycling74.com/apiref/lom/) and the Live 11 API doc archive.
Affected tools (grouped by root cause)
-
Track Groups —
create_group_track,group_trackscallSong.create_group_track(), which does not exist.Songonly exposescreate_audio_track/create_midi_track/create_return_track/create_scene. Creating/ungrouping group tracks is not in the Live API at all (it's a UI-only command, Edit ▸ Group Tracks / Cmd-G) — so this can't be implemented, only documented.ungroup_trackcurrently returns{"ok": true, "message": "Ungroup operation requested (may require manual implementation)"}without doing anything. -
Freeze / Flatten —
freeze_track/unfreeze_trackread/writeTrack.freeze_availableandTrack.freeze_state; the real members areTrack.can_be_frozen(read-only) andTrack.is_frozen(read-only), and there is no method to trigger freeze.flatten_trackcallsTrack.flatten(), which doesn't exist. -
Track delay —
get_track_delay/set_track_delayuseTrack.delay, which doesn't exist. -
Annotations —
get_track_annotation/set_track_annotationuseTrack.annotation;get_clip_annotation/set_clip_annotationuseClip.annotation. NeitherTracknorCliphas anannotationmember. -
Clip follow actions —
get_clip_follow_action/set_clip_follow_action/set_follow_action_timeuseClip.follow_action_A/B,follow_action_time,follow_action_chance_A/B. None of these exist onClip.set_clip_follow_actionreturns{"ok": true, ...}even though thehasattrguards skip every assignment (false success). -
Clip fades —
get_clip_fade_in/set_clip_fade_in/get_clip_fade_out/set_clip_fade_outuseClip.fade_in_time/Clip.fade_out_time, which don't exist onClip(envelope fades live onSampleassample_env_fade_in/out). -
MIDI send —
send_midi_cc/send_program_changecallSong.send_midi(), which doesn't exist. (A Remote Script sends MIDI through the control-surface layer, not viaSong.) -
Groove amount —
get_groove_amount/set_groove_amountuseTrack.groove_amount; groove is exposed asClip.groove(a groove object), not a track property. -
Sub-routing —
set_track_input_sub_routing/set_track_output_sub_routingare self-described "simplified implementation" and return{"ok": true, "message": "... limited in LiveAPI"}without changing routing (false success). -
Take lanes —
delete_take_lanecallsTrack.delete_take_lane(), which doesn't exist (create_take_lanedoes). -
Metronome volume —
get_metronome_volume/set_metronome_volumeread/writeSong.metronome, which is the metronome on/off toggle (bool), not a volume. There is no metronome-volume member in the LOM.
Not a bug (for reference): nudge_down (Song.nudge_down exists) and set_clip_signature_numerator (Clip.signature_numerator exists) do work.
Expected behavior
Advertised tools either work, or clearly report that the operation is unsupported by the Live API — rather than returning {"ok": true} on a no-op, or a generic "not available".
Suggestions (happy to send a PR)
- Document that group create/ungroup, track freeze/flatten, track delay, annotations, clip follow actions, clip fades,
Song-level MIDI send, and metronome volume are not exposed by the Live API (so they can't be supported), and drop the corresponding entries from the tool count / README table. - For the "false success" cases (
ungroup_track,set_clip_follow_action, sub-routing setters), return{"ok": false, "error": "unsupported by Live API"}so callers/LLMs don't believe the op succeeded. - Fixable adjacencies if desired: groove is
Clip.groove; RAM mode (Clip.ram_mode) and clip time signature (Clip.signature_numerator) do work and could be surfaced correctly. - Minor: the README links to
docs/API_REFERENCE.mdanddocs/TROUBLESHOOTING.md, which are 404 in the repo.
Environment
- Ableton Live version: 12.4
- OS: macOS
- Verified against the running LOM + Cycling '74 official LOM reference.
Activity
Ziforge commentedon Sep 9, 2026
Thank you — this is an outstanding report. Introspecting the live LOM and cross-checking Cycling '74 was exactly the right method, and every item checked out. Fixed across a few PRs (#4, #5, #6):
Now return honest
{"ok": false, "error": "... not exposed by the Live Object Model"}(no more no-opok:trueor misleading "not available"):create_group_track/group_tracks/ungroup_track) — GUI-onlyfreeze_track/unfreeze_track/flatten_track— only read-onlyis_frozen/can_be_frozenexistget/set_track_delay,get/set_track_annotation,get/set_clip_annotationget/set_clip_follow_action,set_follow_action_time(the falseok:trueis gone)get/set_groove_amount(error notes groove is per-clipClip.groove)delete_take_lane,get/set_metronome_volumeMade real:
send_midi_cc/send_program_changenow send viac_instance.send_midi(...)(control-surface layer, notSong.send_midi)clip.sample.sample_env_fade_in/out(audio clips only)set_track_input/output_sub_routingwere also made functional (they assign the real*_routing_channelobjects)Really appreciate the write-up — it made the fixes straightforward. Docs/README cleanup for the dropped/limited tools + the 404 links is next.
Docs: fix 404 README links, document LOM-unsupported tools; rename $H…