livepilot 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -5
- package/README.md +11 -11
- package/mcp_server/tools/scenes.py +4 -6
- package/mcp_server/tools/tracks.py +2 -40
- package/package.json +2 -2
- package/plugin/plugin.json +2 -2
- package/plugin/skills/livepilot-core/SKILL.md +11 -11
- package/plugin/skills/livepilot-core/references/overview.md +4 -7
- package/remote_script/LivePilot/scenes.py +4 -4
- package/remote_script/LivePilot/tracks.py +1 -56
package/CHANGELOG.md
CHANGED
|
@@ -1,21 +1,34 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.2.1 — 2026-03-17
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
- Remove 3 tools that don't work in Live 12's ControlSurface API: `create_group_track`, `freeze_track`, `flatten_track`
|
|
7
|
+
- Fix `set_scene_name` — now allows empty string to clear scene name
|
|
8
|
+
- Fix `set_scene_tempo` — removed invalid "0 to clear" (Live 12 range is 20-999 BPM)
|
|
9
|
+
- All 96 tools live-tested against Ableton Live 12
|
|
10
|
+
|
|
3
11
|
## 1.2.0 — 2026-03-17
|
|
4
12
|
|
|
5
|
-
### New Tools (+
|
|
6
|
-
- **`create_group_track`** — group a range of tracks into a foldable group track
|
|
13
|
+
### New Tools (+5, total 96)
|
|
7
14
|
- **`set_group_fold`** — fold/unfold a group track to show/hide children
|
|
8
|
-
- **`freeze_track`** — freeze a track to reduce CPU load
|
|
9
|
-
- **`flatten_track`** — flatten a frozen track to audio permanently
|
|
10
15
|
- **`set_track_input_monitoring`** — set input monitoring state (In/Auto/Off)
|
|
11
16
|
- **`set_clip_warp_mode`** — set warp mode for audio clips (Beats/Tones/Texture/Re-Pitch/Complex/Complex Pro)
|
|
12
17
|
- **`set_scene_color`** — set scene color (0-69)
|
|
13
|
-
- **`set_scene_tempo`** — set per-scene tempo that triggers on launch
|
|
18
|
+
- **`set_scene_tempo`** — set per-scene tempo that triggers on launch (20-999 BPM)
|
|
19
|
+
|
|
20
|
+
### Removed Tools (-3)
|
|
21
|
+
- **`create_group_track`** — removed due to Live 12 API limitations
|
|
22
|
+
- **`freeze_track`** — removed due to Live 12 API limitations
|
|
23
|
+
- **`flatten_track`** — removed due to Live 12 API limitations
|
|
14
24
|
|
|
15
25
|
### Enhancements
|
|
16
26
|
- `get_clip_info` now returns `is_midi_clip`, `is_audio_clip`, and audio warp fields (`warping`, `warp_mode`)
|
|
17
27
|
- `get_track_info` now returns `is_foldable`, `is_grouped`, `fold_state`, and `current_monitoring_state`
|
|
18
28
|
|
|
29
|
+
### Fixes
|
|
30
|
+
- `set_scene_name` now allows empty string to clear scene name
|
|
31
|
+
|
|
19
32
|
## 1.1.2 — 2026-03-17
|
|
20
33
|
|
|
21
34
|
### Fixes
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/dreamrec/LivePilot/actions/workflows/ci.yml)
|
|
12
12
|
[](https://github.com/dreamrec/LivePilot/stargazers)
|
|
13
13
|
|
|
14
|
-
**AI copilot for Ableton Live 12** —
|
|
14
|
+
**AI copilot for Ableton Live 12** — 96 MCP tools for music production, sound design, and mixing.
|
|
15
15
|
|
|
16
16
|
Control your entire Ableton session through natural language. Create tracks, program MIDI, load instruments, tweak parameters, arrange songs, and mix — all without leaving the keyboard.
|
|
17
17
|
|
|
@@ -156,16 +156,16 @@ npx -y github:dreamrec/LivePilot --status
|
|
|
156
156
|
|
|
157
157
|
---
|
|
158
158
|
|
|
159
|
-
##
|
|
159
|
+
## 96 Tools Across 9 Domains
|
|
160
160
|
|
|
161
161
|
| Domain | Tools | What you can do |
|
|
162
162
|
|--------|:-----:|-----------------|
|
|
163
163
|
| **Transport** | 12 | Play/stop, tempo, time signature, loop, undo/redo, metronome, diagnostics |
|
|
164
|
-
| **Tracks** |
|
|
165
|
-
| **Clips** |
|
|
164
|
+
| **Tracks** | 14 | Create MIDI/audio/return tracks, name, color, mute, solo, arm, group fold, input monitoring |
|
|
165
|
+
| **Clips** | 11 | Create, delete, duplicate, fire, stop, loop settings, launch mode, warp mode |
|
|
166
166
|
| **Notes** | 8 | Add/get/remove/modify MIDI notes, transpose, quantize, duplicate |
|
|
167
167
|
| **Devices** | 12 | Load instruments & effects, tweak parameters, rack chains, presets |
|
|
168
|
-
| **Scenes** |
|
|
168
|
+
| **Scenes** | 8 | Create, delete, duplicate, fire, rename, color, per-scene tempo |
|
|
169
169
|
| **Mixing** | 8 | Volume, pan, sends, routing, return tracks, master |
|
|
170
170
|
| **Browser** | 4 | Search Ableton's library, browse categories, load presets |
|
|
171
171
|
| **Arrangement** | 19 | Create clips, full MIDI note CRUD, cue points, recording, automation |
|
|
@@ -176,11 +176,11 @@ npx -y github:dreamrec/LivePilot --status
|
|
|
176
176
|
### Transport (12)
|
|
177
177
|
`get_session_info` · `set_tempo` · `set_time_signature` · `start_playback` · `stop_playback` · `continue_playback` · `toggle_metronome` · `set_session_loop` · `undo` · `redo` · `get_recent_actions` · `get_session_diagnostics`
|
|
178
178
|
|
|
179
|
-
### Tracks (
|
|
180
|
-
`get_track_info` · `create_midi_track` · `create_audio_track` · `create_return_track` · `delete_track` · `duplicate_track` · `set_track_name` · `set_track_color` · `set_track_mute` · `set_track_solo` · `set_track_arm` · `stop_track_clips`
|
|
179
|
+
### Tracks (14)
|
|
180
|
+
`get_track_info` · `create_midi_track` · `create_audio_track` · `create_return_track` · `delete_track` · `duplicate_track` · `set_track_name` · `set_track_color` · `set_track_mute` · `set_track_solo` · `set_track_arm` · `stop_track_clips` · `set_group_fold` · `set_track_input_monitoring`
|
|
181
181
|
|
|
182
|
-
### Clips (
|
|
183
|
-
`get_clip_info` · `create_clip` · `delete_clip` · `duplicate_clip` · `fire_clip` · `stop_clip` · `set_clip_name` · `set_clip_color` · `set_clip_loop` · `set_clip_launch`
|
|
182
|
+
### Clips (11)
|
|
183
|
+
`get_clip_info` · `create_clip` · `delete_clip` · `duplicate_clip` · `fire_clip` · `stop_clip` · `set_clip_name` · `set_clip_color` · `set_clip_loop` · `set_clip_launch` · `set_clip_warp_mode`
|
|
184
184
|
|
|
185
185
|
### Notes (8)
|
|
186
186
|
`add_notes` · `get_notes` · `remove_notes` · `remove_notes_by_id` · `modify_notes` · `duplicate_notes` · `transpose_notes` · `quantize_clip`
|
|
@@ -188,8 +188,8 @@ npx -y github:dreamrec/LivePilot --status
|
|
|
188
188
|
### Devices (12)
|
|
189
189
|
`get_device_info` · `get_device_parameters` · `set_device_parameter` · `batch_set_parameters` · `toggle_device` · `delete_device` · `load_device_by_uri` · `find_and_load_device` · `get_rack_chains` · `set_simpler_playback_mode` · `set_chain_volume` · `get_device_presets`
|
|
190
190
|
|
|
191
|
-
### Scenes (
|
|
192
|
-
`get_scenes_info` · `create_scene` · `delete_scene` · `duplicate_scene` · `fire_scene` · `set_scene_name`
|
|
191
|
+
### Scenes (8)
|
|
192
|
+
`get_scenes_info` · `create_scene` · `delete_scene` · `duplicate_scene` · `fire_scene` · `set_scene_name` · `set_scene_color` · `set_scene_tempo`
|
|
193
193
|
|
|
194
194
|
### Mixing (8)
|
|
195
195
|
`set_track_volume` · `set_track_pan` · `set_track_send` · `get_return_tracks` · `get_master_track` · `set_master_volume` · `get_track_routing` · `set_track_routing`
|
|
@@ -53,10 +53,8 @@ def fire_scene(ctx: Context, scene_index: int) -> dict:
|
|
|
53
53
|
|
|
54
54
|
@mcp.tool()
|
|
55
55
|
def set_scene_name(ctx: Context, scene_index: int, name: str) -> dict:
|
|
56
|
-
"""Rename a scene."""
|
|
56
|
+
"""Rename a scene. Pass empty string to clear the name."""
|
|
57
57
|
_validate_scene_index(scene_index)
|
|
58
|
-
if not name.strip():
|
|
59
|
-
raise ValueError("Scene name cannot be empty")
|
|
60
58
|
return _get_ableton(ctx).send_command("set_scene_name", {
|
|
61
59
|
"scene_index": scene_index,
|
|
62
60
|
"name": name,
|
|
@@ -81,10 +79,10 @@ def set_scene_color(ctx: Context, scene_index: int, color_index: int) -> dict:
|
|
|
81
79
|
|
|
82
80
|
@mcp.tool()
|
|
83
81
|
def set_scene_tempo(ctx: Context, scene_index: int, tempo: float) -> dict:
|
|
84
|
-
"""Set scene tempo in BPM. Fires when the scene launches.
|
|
82
|
+
"""Set scene tempo in BPM (20-999). Fires when the scene launches."""
|
|
85
83
|
_validate_scene_index(scene_index)
|
|
86
|
-
if tempo
|
|
87
|
-
raise ValueError("Tempo must be
|
|
84
|
+
if tempo < 20 or tempo > 999:
|
|
85
|
+
raise ValueError("Tempo must be between 20.0 and 999.0 BPM")
|
|
88
86
|
return _get_ableton(ctx).send_command("set_scene_tempo", {
|
|
89
87
|
"scene_index": scene_index,
|
|
90
88
|
"tempo": tempo,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Track MCP tools — create, delete, rename, mute, solo, arm, group
|
|
1
|
+
"""Track MCP tools — create, delete, rename, mute, solo, arm, group fold, monitor.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
14 tools matching the Remote Script tracks domain.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
from fastmcp import Context
|
|
@@ -148,30 +148,6 @@ def stop_track_clips(ctx: Context, track_index: int) -> dict:
|
|
|
148
148
|
return _get_ableton(ctx).send_command("stop_track_clips", {"track_index": track_index})
|
|
149
149
|
|
|
150
150
|
|
|
151
|
-
@mcp.tool()
|
|
152
|
-
def create_group_track(
|
|
153
|
-
ctx: Context,
|
|
154
|
-
start_index: int,
|
|
155
|
-
end_index: int,
|
|
156
|
-
name: str | None = None,
|
|
157
|
-
color: int | None = None,
|
|
158
|
-
) -> dict:
|
|
159
|
-
"""Create a group track containing tracks from start_index to end_index (inclusive)."""
|
|
160
|
-
_validate_track_index(start_index)
|
|
161
|
-
_validate_track_index(end_index)
|
|
162
|
-
if end_index < start_index:
|
|
163
|
-
raise ValueError("end_index must be >= start_index")
|
|
164
|
-
params = {"start_index": start_index, "end_index": end_index}
|
|
165
|
-
if name is not None:
|
|
166
|
-
if not name.strip():
|
|
167
|
-
raise ValueError("Track name cannot be empty")
|
|
168
|
-
params["name"] = name
|
|
169
|
-
if color is not None:
|
|
170
|
-
_validate_color_index(color)
|
|
171
|
-
params["color_index"] = color
|
|
172
|
-
return _get_ableton(ctx).send_command("create_group_track", params)
|
|
173
|
-
|
|
174
|
-
|
|
175
151
|
@mcp.tool()
|
|
176
152
|
def set_group_fold(ctx: Context, track_index: int, folded: bool) -> dict:
|
|
177
153
|
"""Fold or unfold a group track to show/hide its children."""
|
|
@@ -182,20 +158,6 @@ def set_group_fold(ctx: Context, track_index: int, folded: bool) -> dict:
|
|
|
182
158
|
})
|
|
183
159
|
|
|
184
160
|
|
|
185
|
-
@mcp.tool()
|
|
186
|
-
def freeze_track(ctx: Context, track_index: int) -> dict:
|
|
187
|
-
"""Freeze a track to reduce CPU load. Frozen tracks render to audio cache."""
|
|
188
|
-
_validate_track_index(track_index)
|
|
189
|
-
return _get_ableton(ctx).send_command("freeze_track", {"track_index": track_index})
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
@mcp.tool()
|
|
193
|
-
def flatten_track(ctx: Context, track_index: int) -> dict:
|
|
194
|
-
"""Flatten a frozen track to audio permanently. Use undo to revert."""
|
|
195
|
-
_validate_track_index(track_index)
|
|
196
|
-
return _get_ableton(ctx).send_command("flatten_track", {"track_index": track_index})
|
|
197
|
-
|
|
198
|
-
|
|
199
161
|
@mcp.tool()
|
|
200
162
|
def set_track_input_monitoring(ctx: Context, track_index: int, state: int) -> dict:
|
|
201
163
|
"""Set input monitoring (0=In, 1=Auto, 2=Off). Only for regular tracks, not return tracks."""
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"mcpName": "io.github.dreamrec/livepilot",
|
|
5
|
-
"description": "AI copilot for Ableton Live 12 —
|
|
5
|
+
"description": "AI copilot for Ableton Live 12 — 96 MCP tools for music production, sound design, and mixing",
|
|
6
6
|
"author": "Pilot Studio",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"type": "commonjs",
|
package/plugin/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.2.
|
|
4
|
-
"description": "AI copilot for Ableton Live 12 —
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "AI copilot for Ableton Live 12 — 96 MCP tools for music production, sound design, and mixing",
|
|
5
5
|
"author": "Pilot Studio",
|
|
6
6
|
"skills": [
|
|
7
7
|
"skills/livepilot-core"
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: livepilot-core
|
|
3
|
-
description: Core discipline for controlling Ableton Live 12 through LivePilot's
|
|
3
|
+
description: Core discipline for controlling Ableton Live 12 through LivePilot's 96 MCP tools. Use whenever working with Ableton Live through MCP tools.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# LivePilot Core — Ableton Live 12 AI Copilot
|
|
7
7
|
|
|
8
|
-
LivePilot gives you
|
|
8
|
+
LivePilot gives you 96 MCP tools to control Ableton Live 12 in real-time: transport, tracks, clips, MIDI notes, devices, scenes, mixing, browser, and arrangement.
|
|
9
9
|
|
|
10
10
|
## Golden Rules
|
|
11
11
|
|
|
@@ -16,7 +16,7 @@ LivePilot gives you 99 MCP tools to control Ableton Live 12 in real-time: transp
|
|
|
16
16
|
5. **Track indices are 0-based** — track 0 is the first track, scene 0 is the first scene
|
|
17
17
|
6. **Color indices 0-69** — Ableton's fixed palette. Don't guess — use the index
|
|
18
18
|
7. **Volume is 0.0-1.0, pan is -1.0 to 1.0** — these are normalized, not dB
|
|
19
|
-
8. **Tempo range 20-
|
|
19
|
+
8. **Tempo range 20-969 BPM** — validated before sending to Ableton
|
|
20
20
|
9. **Always name your tracks and clips** — organization is part of the creative process
|
|
21
21
|
|
|
22
22
|
## Track Health Checks — MANDATORY
|
|
@@ -57,16 +57,16 @@ LivePilot gives you 99 MCP tools to control Ableton Live 12 in real-time: transp
|
|
|
57
57
|
- MIDI track with no instrument loaded
|
|
58
58
|
- Notes programmed but clip not fired
|
|
59
59
|
|
|
60
|
-
## Tool Domains (
|
|
60
|
+
## Tool Domains (96 total)
|
|
61
61
|
|
|
62
62
|
### Transport (12)
|
|
63
63
|
`get_session_info` · `set_tempo` · `set_time_signature` · `start_playback` · `stop_playback` · `continue_playback` · `toggle_metronome` · `set_session_loop` · `undo` · `redo` · `get_recent_actions` · `get_session_diagnostics`
|
|
64
64
|
|
|
65
|
-
### Tracks (
|
|
66
|
-
`get_track_info` · `create_midi_track` · `create_audio_track` · `create_return_track` · `delete_track` · `duplicate_track` · `set_track_name` · `set_track_color` · `set_track_mute` · `set_track_solo` · `set_track_arm` · `stop_track_clips`
|
|
65
|
+
### Tracks (14)
|
|
66
|
+
`get_track_info` · `create_midi_track` · `create_audio_track` · `create_return_track` · `delete_track` · `duplicate_track` · `set_track_name` · `set_track_color` · `set_track_mute` · `set_track_solo` · `set_track_arm` · `stop_track_clips` · `set_group_fold` · `set_track_input_monitoring`
|
|
67
67
|
|
|
68
|
-
### Clips (
|
|
69
|
-
`get_clip_info` · `create_clip` · `delete_clip` · `duplicate_clip` · `fire_clip` · `stop_clip` · `set_clip_name` · `set_clip_color` · `set_clip_loop` · `set_clip_launch`
|
|
68
|
+
### Clips (11)
|
|
69
|
+
`get_clip_info` · `create_clip` · `delete_clip` · `duplicate_clip` · `fire_clip` · `stop_clip` · `set_clip_name` · `set_clip_color` · `set_clip_loop` · `set_clip_launch` · `set_clip_warp_mode`
|
|
70
70
|
|
|
71
71
|
### Notes (8)
|
|
72
72
|
`add_notes` · `get_notes` · `remove_notes` · `remove_notes_by_id` · `modify_notes` · `duplicate_notes` · `transpose_notes` · `quantize_clip`
|
|
@@ -74,8 +74,8 @@ LivePilot gives you 99 MCP tools to control Ableton Live 12 in real-time: transp
|
|
|
74
74
|
### Devices (12)
|
|
75
75
|
`get_device_info` · `get_device_parameters` · `set_device_parameter` · `batch_set_parameters` · `toggle_device` · `delete_device` · `load_device_by_uri` · `find_and_load_device` · `set_simpler_playback_mode` · `get_rack_chains` · `set_chain_volume` · `get_device_presets`
|
|
76
76
|
|
|
77
|
-
### Scenes (
|
|
78
|
-
`get_scenes_info` · `create_scene` · `delete_scene` · `duplicate_scene` · `fire_scene` · `set_scene_name`
|
|
77
|
+
### Scenes (8)
|
|
78
|
+
`get_scenes_info` · `create_scene` · `delete_scene` · `duplicate_scene` · `fire_scene` · `set_scene_name` · `set_scene_color` · `set_scene_tempo`
|
|
79
79
|
|
|
80
80
|
### Mixing (8)
|
|
81
81
|
`set_track_volume` · `set_track_pan` · `set_track_send` · `get_return_tracks` · `get_master_track` · `set_master_volume` · `get_track_routing` · `set_track_routing`
|
|
@@ -152,7 +152,7 @@ Deep production knowledge lives in `references/`. Consult these when making crea
|
|
|
152
152
|
|
|
153
153
|
| File | What's inside | When to consult |
|
|
154
154
|
|------|--------------|-----------------|
|
|
155
|
-
| `references/overview.md` | All
|
|
155
|
+
| `references/overview.md` | All 96 tools mapped with params, units, ranges | Quick lookup for any tool |
|
|
156
156
|
| `references/midi-recipes.md` | Drum patterns by genre, chord voicings, scales, hi-hat techniques, humanization, polymetrics | Programming MIDI notes, building beats |
|
|
157
157
|
| `references/sound-design.md` | Stock instruments/effects, parameter recipes for bass/pad/lead/pluck, device chain patterns | Loading and configuring devices |
|
|
158
158
|
| `references/mixing-patterns.md` | Gain staging, parallel compression, sidechain, EQ by instrument, bus processing, stereo width | Setting volumes, panning, adding effects |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# LivePilot Architecture & Tool Reference
|
|
2
2
|
|
|
3
|
-
LivePilot is an MCP server that controls Ableton Live 12 in real-time through
|
|
3
|
+
LivePilot is an MCP server that controls Ableton Live 12 in real-time through 96 tools across 9 domains. This document maps every tool to what it actually does in Ableton, so you know exactly which tool to reach for.
|
|
4
4
|
|
|
5
5
|
## Architecture
|
|
6
6
|
|
|
@@ -14,7 +14,7 @@ Claude Code ──MCP──► FastMCP Server ──TCP/9878──► Remote
|
|
|
14
14
|
- **Protocol**: JSON over TCP, newline-delimited. Every command gets a response.
|
|
15
15
|
- **Thread safety**: All Live Object Model (LOM) access happens on Ableton's main thread
|
|
16
16
|
|
|
17
|
-
## The
|
|
17
|
+
## The 96 Tools — What Each One Does
|
|
18
18
|
|
|
19
19
|
### Transport (12) — Playback, tempo, global state, diagnostics
|
|
20
20
|
|
|
@@ -33,7 +33,7 @@ Claude Code ──MCP──► FastMCP Server ──TCP/9878──► Remote
|
|
|
33
33
|
| `get_recent_actions` | Returns log of recent commands sent to Ableton (newest first) | `limit` (1-50, default 20) |
|
|
34
34
|
| `get_session_diagnostics` | Analyzes session for issues: armed tracks, solo leftovers, unnamed tracks, empty clips | — |
|
|
35
35
|
|
|
36
|
-
### Tracks (
|
|
36
|
+
### Tracks (14) — Create, delete, configure, group tracks
|
|
37
37
|
|
|
38
38
|
| Tool | What it does | Key params |
|
|
39
39
|
|------|-------------|------------|
|
|
@@ -41,7 +41,6 @@ Claude Code ──MCP──► FastMCP Server ──TCP/9878──► Remote
|
|
|
41
41
|
| `create_midi_track` | Creates a new MIDI track | `index` (-1=end), `name`, `color` (0-69) |
|
|
42
42
|
| `create_audio_track` | Creates a new audio track | `index` (-1=end), `name`, `color` (0-69) |
|
|
43
43
|
| `create_return_track` | Creates a new return track | — |
|
|
44
|
-
| `create_group_track` | Groups a range of tracks into a group track | `start_index`, `end_index`, `name`, `color` |
|
|
45
44
|
| `delete_track` | Deletes a track | `track_index` |
|
|
46
45
|
| `duplicate_track` | Duplicates track with all contents | `track_index` |
|
|
47
46
|
| `set_track_name` | Renames a track | `track_index`, `name` |
|
|
@@ -51,8 +50,6 @@ Claude Code ──MCP──► FastMCP Server ──TCP/9878──► Remote
|
|
|
51
50
|
| `set_track_arm` | Arms/disarms for recording | `track_index`, `armed` (bool) |
|
|
52
51
|
| `stop_track_clips` | Stops all playing clips on track | `track_index` |
|
|
53
52
|
| `set_group_fold` | Folds/unfolds a group track | `track_index`, `folded` (bool) |
|
|
54
|
-
| `freeze_track` | Freezes a track to reduce CPU | `track_index` |
|
|
55
|
-
| `flatten_track` | Flattens a frozen track to audio (use undo to revert) | `track_index` |
|
|
56
53
|
| `set_track_input_monitoring` | Sets input monitoring state | `track_index`, `state` (0=In, 1=Auto, 2=Off) |
|
|
57
54
|
|
|
58
55
|
### Clips (11) — Clip lifecycle, properties, warp
|
|
@@ -123,7 +120,7 @@ Claude Code ──MCP──► FastMCP Server ──TCP/9878──► Remote
|
|
|
123
120
|
| `fire_scene` | Launches all clips in a scene | `scene_index` |
|
|
124
121
|
| `set_scene_name` | Renames a scene | `scene_index`, `name` |
|
|
125
122
|
| `set_scene_color` | Sets scene color | `scene_index`, `color_index` (0-69) |
|
|
126
|
-
| `set_scene_tempo` | Sets tempo that triggers when scene fires
|
|
123
|
+
| `set_scene_tempo` | Sets tempo that triggers when scene fires | `scene_index`, `tempo` (20-999 BPM) |
|
|
127
124
|
|
|
128
125
|
### Mixing (8) — Levels, panning, routing
|
|
129
126
|
|
|
@@ -86,14 +86,14 @@ def set_scene_color(song, params):
|
|
|
86
86
|
|
|
87
87
|
@register("set_scene_tempo")
|
|
88
88
|
def set_scene_tempo(song, params):
|
|
89
|
-
"""Set a scene's tempo (BPM).
|
|
89
|
+
"""Set a scene's tempo (BPM, 20-999)."""
|
|
90
90
|
scene_index = int(params["scene_index"])
|
|
91
91
|
scene = get_scene(song, scene_index)
|
|
92
92
|
tempo = float(params["tempo"])
|
|
93
|
-
if tempo
|
|
94
|
-
raise ValueError("Tempo must be
|
|
93
|
+
if tempo < 20 or tempo > 999:
|
|
94
|
+
raise ValueError("Tempo must be between 20 and 999 BPM")
|
|
95
95
|
scene.tempo = tempo
|
|
96
96
|
return {
|
|
97
97
|
"index": scene_index,
|
|
98
|
-
"tempo": scene.tempo
|
|
98
|
+
"tempo": scene.tempo,
|
|
99
99
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
LivePilot - Track domain handlers (
|
|
2
|
+
LivePilot - Track domain handlers (14 commands).
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from .router import register
|
|
@@ -235,39 +235,6 @@ def stop_track_clips(song, params):
|
|
|
235
235
|
return {"index": track_index, "stopped": True}
|
|
236
236
|
|
|
237
237
|
|
|
238
|
-
@register("create_group_track")
|
|
239
|
-
def create_group_track(song, params):
|
|
240
|
-
"""Create a group track containing the specified track range."""
|
|
241
|
-
start = int(params["start_index"])
|
|
242
|
-
end = int(params["end_index"])
|
|
243
|
-
tracks = list(song.tracks)
|
|
244
|
-
if start < 0 or start >= len(tracks):
|
|
245
|
-
raise IndexError(
|
|
246
|
-
"start_index %d out of range (0..%d)" % (start, len(tracks) - 1)
|
|
247
|
-
)
|
|
248
|
-
if end < start or end >= len(tracks):
|
|
249
|
-
raise IndexError(
|
|
250
|
-
"end_index %d out of range (%d..%d)" % (end, start, len(tracks) - 1)
|
|
251
|
-
)
|
|
252
|
-
# Select the range of tracks, then use the API
|
|
253
|
-
song.view.selected_track = tracks[start]
|
|
254
|
-
for i in range(start, end + 1):
|
|
255
|
-
tracks[i].is_part_of_selection = True
|
|
256
|
-
song.create_group_track()
|
|
257
|
-
# The new group track is inserted at start_index
|
|
258
|
-
new_tracks = list(song.tracks)
|
|
259
|
-
group_track = new_tracks[start]
|
|
260
|
-
if "name" in params:
|
|
261
|
-
group_track.name = str(params["name"])
|
|
262
|
-
if "color_index" in params:
|
|
263
|
-
group_track.color_index = int(params["color_index"])
|
|
264
|
-
return {
|
|
265
|
-
"index": start,
|
|
266
|
-
"name": group_track.name,
|
|
267
|
-
"is_foldable": group_track.is_foldable,
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
|
|
271
238
|
@register("set_group_fold")
|
|
272
239
|
def set_group_fold(song, params):
|
|
273
240
|
"""Fold or unfold a group track."""
|
|
@@ -282,28 +249,6 @@ def set_group_fold(song, params):
|
|
|
282
249
|
}
|
|
283
250
|
|
|
284
251
|
|
|
285
|
-
@register("freeze_track")
|
|
286
|
-
def freeze_track(song, params):
|
|
287
|
-
"""Freeze a track to reduce CPU load."""
|
|
288
|
-
track_index = int(params["track_index"])
|
|
289
|
-
track = get_track(song, track_index)
|
|
290
|
-
if track_index < 0:
|
|
291
|
-
raise ValueError("Cannot freeze a return track")
|
|
292
|
-
track.freeze()
|
|
293
|
-
return {"index": track_index, "frozen": True}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
@register("flatten_track")
|
|
297
|
-
def flatten_track(song, params):
|
|
298
|
-
"""Flatten a frozen track to audio (irreversible — use undo to revert)."""
|
|
299
|
-
track_index = int(params["track_index"])
|
|
300
|
-
track = get_track(song, track_index)
|
|
301
|
-
if track_index < 0:
|
|
302
|
-
raise ValueError("Cannot flatten a return track")
|
|
303
|
-
track.flatten()
|
|
304
|
-
return {"index": track_index, "flattened": True}
|
|
305
|
-
|
|
306
|
-
|
|
307
252
|
@register("set_track_input_monitoring")
|
|
308
253
|
def set_track_input_monitoring(song, params):
|
|
309
254
|
"""Set input monitoring state for a track (0=In, 1=Auto, 2=Off)."""
|