livepilot 1.9.3 → 1.9.5
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/.claude-plugin/marketplace.json +1 -1
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +9 -1
- package/README.md +23 -8
- package/livepilot/.claude-plugin/plugin.json +1 -1
- package/livepilot/skills/livepilot-core/references/overview.md +2 -2
- package/m4l_device/livepilot_bridge.js +1 -1
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/connection.py +2 -1
- package/package.json +1 -1
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/arrangement.py +42 -3
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{
|
|
11
11
|
"name": "livepilot",
|
|
12
12
|
"description": "Agentic production system for Ableton Live 12 — 178 tools, 17 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
13
|
-
"version": "1.9.
|
|
13
|
+
"version": "1.9.5",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Pilot Studio"
|
|
16
16
|
},
|
package/AGENTS.md
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 1.9.
|
|
3
|
+
## 1.9.5 — TCP Retry Fix + Arrangement Automation Fix (March 2026)
|
|
4
|
+
|
|
5
|
+
- Fix(P1): disconnect() now clears _recv_buf — prevents partial JSON corruption on TCP retry
|
|
6
|
+
- Fix(P1): set_arrangement_automation fallback copies notes + deletes original clip to avoid silent duplication
|
|
7
|
+
- Fix(P2): get_arrangement_clips reports effective length based on loop_end, not raw timeline length
|
|
8
|
+
- 2 new connection tests for recv_buf corruption
|
|
9
|
+
- 257 tests passing
|
|
10
|
+
|
|
11
|
+
## 1.9.4 — Doc Sync + M4L Analyzer Fix + Full Validation (March 2026)
|
|
4
12
|
|
|
5
13
|
**178 tools, all validated live in Ableton. M4L analyzer fully working.**
|
|
6
14
|
|
package/README.md
CHANGED
|
@@ -80,11 +80,11 @@ Every tool maps directly to an LOM call — no abstraction, no guessing.
|
|
|
80
80
|
| Domain | # | Scope |
|
|
81
81
|
|--------|:-:|-------|
|
|
82
82
|
| Transport | 12 | playback, tempo, time sig, loop, metronome, undo/redo, cue points, diagnostics |
|
|
83
|
-
| Tracks |
|
|
83
|
+
| Tracks | 17 | create MIDI/audio/return, delete, duplicate, arm, mute, solo, color, monitoring, freeze, flatten |
|
|
84
84
|
| Clips | 11 | create, delete, duplicate, fire, stop, loop, launch mode, warp mode, quantize |
|
|
85
85
|
| Notes | 8 | add/get/remove/modify MIDI notes, transpose, duplicate, per-note probability |
|
|
86
|
-
| Devices |
|
|
87
|
-
| Scenes |
|
|
86
|
+
| Devices | 15 | load by name or URI, get/set parameters, batch edit, racks, chains, presets, plugin params |
|
|
87
|
+
| Scenes | 12 | create, delete, duplicate, fire, name, color, tempo, scene matrix, selective launch |
|
|
88
88
|
| Browser | 4 | search library, browse tree, load items, filter by category |
|
|
89
89
|
| Mixing | 11 | volume, pan, sends, routing, meters, return tracks, master, full mix snapshot |
|
|
90
90
|
|
|
@@ -95,7 +95,7 @@ Every tool maps directly to an LOM call — no abstraction, no guessing.
|
|
|
95
95
|
The M4L Analyzer sits on the master track. UDP 9880 carries spectral data
|
|
96
96
|
from Max to the server. OSC 9881 sends commands back.
|
|
97
97
|
|
|
98
|
-
All
|
|
98
|
+
All 146 core tools work without it — the analyzer adds 32 more
|
|
99
99
|
and closes the feedback loop.
|
|
100
100
|
|
|
101
101
|
<br>
|
|
@@ -425,8 +425,8 @@ Windsurf — `~/.codeium/windsurf/mcp_config.json`:
|
|
|
425
425
|
|
|
426
426
|
Drag `LivePilot_Analyzer.amxd` onto the master track.
|
|
427
427
|
|
|
428
|
-
Unlocks
|
|
429
|
-
sample manipulation, deep device introspection.
|
|
428
|
+
Unlocks 32 additional tools: spectral analysis, key detection,
|
|
429
|
+
sample manipulation, deep device introspection, plugin parameter mapping.
|
|
430
430
|
|
|
431
431
|
All core tools work without it.
|
|
432
432
|
|
|
@@ -499,7 +499,7 @@ Check memory before creative decisions. Verify every mutation.
|
|
|
499
499
|
|
|
500
500
|
<br>
|
|
501
501
|
|
|
502
|
-
### Tracks (
|
|
502
|
+
### Tracks (17)
|
|
503
503
|
|
|
504
504
|
| Tool | Description |
|
|
505
505
|
|------|-------------|
|
|
@@ -517,6 +517,9 @@ Check memory before creative decisions. Verify every mutation.
|
|
|
517
517
|
| `stop_track_clips` | Stop all clips on track |
|
|
518
518
|
| `set_group_fold` | Fold/unfold group track |
|
|
519
519
|
| `set_track_input_monitoring` | Set monitoring mode |
|
|
520
|
+
| `freeze_track` | Freeze track (render devices to audio) |
|
|
521
|
+
| `flatten_track` | Flatten frozen track (commit audio permanently) |
|
|
522
|
+
| `get_freeze_status` | Check if track is frozen |
|
|
520
523
|
|
|
521
524
|
<br>
|
|
522
525
|
|
|
@@ -572,7 +575,7 @@ Check memory before creative decisions. Verify every mutation.
|
|
|
572
575
|
|
|
573
576
|
<br>
|
|
574
577
|
|
|
575
|
-
### Scenes (
|
|
578
|
+
### Scenes (12)
|
|
576
579
|
|
|
577
580
|
| Tool | Description |
|
|
578
581
|
|------|-------------|
|
|
@@ -584,6 +587,10 @@ Check memory before creative decisions. Verify every mutation.
|
|
|
584
587
|
| `set_scene_name` | Rename |
|
|
585
588
|
| `set_scene_color` | Set color |
|
|
586
589
|
| `set_scene_tempo` | Per-scene tempo |
|
|
590
|
+
| `get_scene_matrix` | Full clip grid: every track × every scene with states |
|
|
591
|
+
| `fire_scene_clips` | Fire scene with optional track filter |
|
|
592
|
+
| `stop_all_clips` | Stop all playing clips (panic) |
|
|
593
|
+
| `get_playing_clips` | All currently playing/triggered clips |
|
|
587
594
|
|
|
588
595
|
<br>
|
|
589
596
|
|
|
@@ -706,6 +713,14 @@ Check memory before creative decisions. Verify every mutation.
|
|
|
706
713
|
| `capture_audio` | Record master output to WAV |
|
|
707
714
|
| `capture_stop` | Cancel in-progress capture |
|
|
708
715
|
|
|
716
|
+
### Devices — Plugin Deep Control (3) `[M4L]`
|
|
717
|
+
|
|
718
|
+
| Tool | Description |
|
|
719
|
+
|------|-------------|
|
|
720
|
+
| `get_plugin_parameters` | All VST/AU params including unconfigured |
|
|
721
|
+
| `map_plugin_parameter` | Add param to Ableton's Configure list |
|
|
722
|
+
| `get_plugin_presets` | List plugin's internal presets/banks |
|
|
723
|
+
|
|
709
724
|
<br>
|
|
710
725
|
|
|
711
726
|
### Perception (4)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.5",
|
|
4
4
|
"description": "Agentic production system for Ableton Live 12 — 178 tools, 17 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pilot Studio"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# LivePilot v1.9.
|
|
1
|
+
# LivePilot v1.9.5 — Architecture & Tool Reference
|
|
2
2
|
|
|
3
3
|
Agentic production system for Ableton Live 12. 178 tools across 17 domains. Device atlas (280+ devices), spectral perception (M4L analyzer), technique memory, automation intelligence (16 curve types, 15 recipes), music theory (Krumhansl-Schmuckler, species counterpoint), generative algorithms (Euclidean rhythm, tintinnabuli, phase shift, additive process), neo-Riemannian harmony (PRL transforms, Tonnetz), MIDI file I/O.
|
|
4
4
|
|
|
@@ -32,7 +32,7 @@ A flat tool list lets the AI press buttons. LivePilot's three layers give it con
|
|
|
32
32
|
|
|
33
33
|
This turns "set EQ band 3 to -4 dB" into "cut 400 Hz by 4 dB, then read the spectrum to confirm the mud is actually reduced."
|
|
34
34
|
|
|
35
|
-
## The
|
|
35
|
+
## The 178 Tools — What Each One Does
|
|
36
36
|
|
|
37
37
|
### Transport (12) — Playback, tempo, global state, diagnostics
|
|
38
38
|
|
package/mcp_server/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
|
|
2
|
-
__version__ = "1.9.
|
|
2
|
+
__version__ = "1.9.5"
|
package/mcp_server/connection.py
CHANGED
|
@@ -84,13 +84,14 @@ class AbletonConnection:
|
|
|
84
84
|
) from exc
|
|
85
85
|
|
|
86
86
|
def disconnect(self) -> None:
|
|
87
|
-
"""Close the TCP connection."""
|
|
87
|
+
"""Close the TCP connection and discard any partial receive buffer."""
|
|
88
88
|
if self._socket is not None:
|
|
89
89
|
try:
|
|
90
90
|
self._socket.close()
|
|
91
91
|
except OSError:
|
|
92
92
|
pass
|
|
93
93
|
self._socket = None
|
|
94
|
+
self._recv_buf = b""
|
|
94
95
|
|
|
95
96
|
def is_connected(self) -> bool:
|
|
96
97
|
"""Return True if a socket is currently held."""
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.5",
|
|
4
4
|
"mcpName": "io.github.dreamrec/livepilot",
|
|
5
5
|
"description": "Agentic production system for Ableton Live 12 — 178 tools, 17 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
6
6
|
"author": "Pilot Studio",
|
|
@@ -5,7 +5,7 @@ Entry point for the ControlSurface. Ableton calls create_instance(c_instance)
|
|
|
5
5
|
when this script is selected in Preferences > Link, Tempo & MIDI.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "1.9.
|
|
8
|
+
__version__ = "1.9.5"
|
|
9
9
|
|
|
10
10
|
from _Framework.ControlSurface import ControlSurface
|
|
11
11
|
from .server import LivePilotServer
|
|
@@ -13,12 +13,22 @@ def get_arrangement_clips(song, params):
|
|
|
13
13
|
track = get_track(song, track_index)
|
|
14
14
|
clips = []
|
|
15
15
|
for i, clip in enumerate(track.arrangement_clips):
|
|
16
|
+
timeline_length = clip.length
|
|
17
|
+
# Report effective length based on loop_end if looping is active
|
|
18
|
+
# (arrangement clips may have been trimmed by create_arrangement_clip)
|
|
19
|
+
effective_length = timeline_length
|
|
20
|
+
try:
|
|
21
|
+
if clip.looping and clip.loop_end < timeline_length:
|
|
22
|
+
effective_length = clip.loop_end
|
|
23
|
+
except (AttributeError, RuntimeError):
|
|
24
|
+
pass
|
|
16
25
|
clips.append({
|
|
17
26
|
"index": i,
|
|
18
27
|
"name": clip.name,
|
|
19
28
|
"start_time": clip.start_time,
|
|
20
|
-
"end_time": clip.start_time +
|
|
21
|
-
"length":
|
|
29
|
+
"end_time": clip.start_time + effective_length,
|
|
30
|
+
"length": effective_length,
|
|
31
|
+
"timeline_length": timeline_length,
|
|
22
32
|
"color_index": clip.color_index,
|
|
23
33
|
"is_audio_clip": clip.is_audio_clip,
|
|
24
34
|
})
|
|
@@ -557,7 +567,36 @@ def set_arrangement_automation(song, params):
|
|
|
557
567
|
temp_envelope.insert_step(time, duration, value)
|
|
558
568
|
points_written += 1
|
|
559
569
|
|
|
560
|
-
#
|
|
570
|
+
# Copy notes from original arrangement clip to the temp session clip
|
|
571
|
+
# so the replacement clip has the same musical content.
|
|
572
|
+
try:
|
|
573
|
+
orig_notes = clip.get_notes_extended(0, 128, 0.0, arr_length + 1.0)
|
|
574
|
+
import Live
|
|
575
|
+
note_specs = []
|
|
576
|
+
for note in orig_notes:
|
|
577
|
+
spec = Live.Clip.MidiNoteSpecification(
|
|
578
|
+
pitch=note.pitch,
|
|
579
|
+
start_time=note.start_time,
|
|
580
|
+
duration=note.duration,
|
|
581
|
+
velocity=note.velocity,
|
|
582
|
+
mute=note.mute,
|
|
583
|
+
)
|
|
584
|
+
note_specs.append(spec)
|
|
585
|
+
if note_specs:
|
|
586
|
+
temp_clip.add_new_notes(tuple(note_specs))
|
|
587
|
+
except Exception:
|
|
588
|
+
pass # Non-MIDI clips or errors — automation-only is still valid
|
|
589
|
+
|
|
590
|
+
# Delete the original arrangement clip BEFORE placing the replacement
|
|
591
|
+
# to avoid creating a second overlapping clip at the same position.
|
|
592
|
+
try:
|
|
593
|
+
clip.delete_clip()
|
|
594
|
+
except (AttributeError, RuntimeError):
|
|
595
|
+
# delete_clip may not exist on arrangement clips in all versions;
|
|
596
|
+
# in that case we accept the overlap as a known limitation.
|
|
597
|
+
pass
|
|
598
|
+
|
|
599
|
+
# Place the session clip (with automation + notes) into arrangement
|
|
561
600
|
track.duplicate_clip_to_arrangement(temp_clip, arr_start)
|
|
562
601
|
|
|
563
602
|
# Clean up the temporary session clip
|