Skip to content

[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

Closed

Description

@ktkt40208

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)

  1. 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.

  2. 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.

  3. Track delay — get_track_delay / set_track_delay use Track.delay, which doesn't exist.

  4. 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.

  5. 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).

  6. 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).

  7. 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.)

  8. 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.

  9. 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).

  10. Take lanes — delete_take_lane calls Track.delete_take_lane(), which doesn't exist (create_take_lane does).

  11. 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.

Activity

  1. Ziforge commented on Sep 9, 2026

    @Ziforge
    Owner

    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-op ok:true or misleading "not available"):

    • Track groups (create_group_track/group_tracks/ungroup_track) — GUI-only
    • freeze_track/unfreeze_track/flatten_track — only read-only is_frozen/can_be_frozen exist
    • get/set_track_delay, get/set_track_annotation, get/set_clip_annotation
    • get/set_clip_follow_action, set_follow_action_time (the false ok:true is gone)
    • get/set_groove_amount (error notes groove is per-clip Clip.groove)
    • delete_take_lane, get/set_metronome_volume

    Made real:

    • send_midi_cc/send_program_change now send via c_instance.send_midi(...) (control-surface layer, not Song.send_midi)
    • Clip fades read/write clip.sample.sample_env_fade_in/out (audio clips only)
    • set_track_input/output_sub_routing were also made functional (they assign the real *_routing_channel objects)

    Really appreciate the write-up — it made the fixes straightforward. Docs/README cleanup for the dropped/limited tools + the 404 links is next.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions