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_tracks call Song.create_group_track(), which does not exist. Song only exposes create_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_track currently returns {"ok": true, "message": "Ungroup operation requested (may require manual implementation)"} without doing anything.
-
Freeze / Flatten — freeze_track / unfreeze_track read/write Track.freeze_available and Track.freeze_state; the real members are Track.can_be_frozen (read-only) and Track.is_frozen (read-only), and there is no method to trigger freeze. flatten_track calls Track.flatten(), which doesn't exist.
-
Track delay — get_track_delay / set_track_delay use Track.delay, which doesn't exist.
-
Annotations — get_track_annotation / set_track_annotation use Track.annotation; get_clip_annotation / set_clip_annotation use Clip.annotation. Neither Track nor Clip has an annotation member.
-
Clip follow actions — get_clip_follow_action / set_clip_follow_action / set_follow_action_time use Clip.follow_action_A/B, follow_action_time, follow_action_chance_A/B. None of these exist on Clip. set_clip_follow_action returns {"ok": true, ...} even though the hasattr guards skip every assignment (false success).
-
Clip fades — get_clip_fade_in / set_clip_fade_in / get_clip_fade_out / set_clip_fade_out use Clip.fade_in_time / Clip.fade_out_time, which don't exist on Clip (envelope fades live on Sample as sample_env_fade_in/out).
-
MIDI send — send_midi_cc / send_program_change call Song.send_midi(), which doesn't exist. (A Remote Script sends MIDI through the control-surface layer, not via Song.)
-
Groove amount — get_groove_amount / set_groove_amount use Track.groove_amount; groove is exposed as Clip.groove (a groove object), not a track property.
-
Sub-routing — set_track_input_sub_routing / set_track_output_sub_routing are self-described "simplified implementation" and return {"ok": true, "message": "... limited in LiveAPI"} without changing routing (false success).
-
Take lanes — delete_take_lane calls Track.delete_take_lane(), which doesn't exist (create_take_lane does).
-
Metronome volume — get_metronome_volume / set_metronome_volume read/write Song.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.md and docs/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.
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_downexists) andset_clip_signature_numerator(Clip.signature_numeratorexists) 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)
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.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.Clip.groove; RAM mode (Clip.ram_mode) and clip time signature (Clip.signature_numerator) do work and could be surfaced correctly.docs/API_REFERENCE.mdanddocs/TROUBLESHOOTING.md, which are 404 in the repo.Environment