livepilot 1.8.0 → 1.8.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 +7 -0
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/tools/_theory_engine.py +17 -2
- package/package.json +1 -1
- package/plugin/plugin.json +1 -1
- package/remote_script/LivePilot/__init__.py +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.8.1 — Patch (March 2026)
|
|
4
|
+
|
|
5
|
+
- Fix: `parse_key()` now accepts shorthand key notation ("Am", "C#m", "Bbm") in addition to "A minor" / "C# major"
|
|
6
|
+
- Fix: re-freeze LivePilot_Analyzer.amxd with v1.8.0 bridge + patch openinpresentation
|
|
7
|
+
- Fix: address audit findings from fresh v1.8 code review
|
|
8
|
+
- Fix: update bridge version string
|
|
9
|
+
|
|
3
10
|
## 1.8.0 — Perception Layer (March 2026)
|
|
4
11
|
|
|
5
12
|
**13 new tools (155 → 168), 1 new domain (perception), FluCoMa real-time DSP, offline audio analysis, audio capture.**
|
|
Binary file
|
package/mcp_server/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
|
|
2
|
-
__version__ = "1.8.
|
|
2
|
+
__version__ = "1.8.1"
|
|
@@ -82,8 +82,23 @@ def pitch_name(midi: int) -> str:
|
|
|
82
82
|
|
|
83
83
|
|
|
84
84
|
def parse_key(key_str: str) -> dict:
|
|
85
|
-
"""Parse key string -> {tonic: 0-11, tonic_name: str, mode: str}.
|
|
86
|
-
|
|
85
|
+
"""Parse key string -> {tonic: 0-11, tonic_name: str, mode: str}.
|
|
86
|
+
|
|
87
|
+
Accepts: "D minor", "Dm", "C# major", "C#m", "Bb", "Bbm", "F#m".
|
|
88
|
+
"""
|
|
89
|
+
s = key_str.strip()
|
|
90
|
+
|
|
91
|
+
# Shorthand: trailing 'm' after a note name means minor (e.g. "Am", "C#m", "Bbm")
|
|
92
|
+
# But not "Dm" vs "D" — check if removing 'm' leaves a valid tonic
|
|
93
|
+
if len(s) >= 2 and s[-1] == 'm' and ' ' not in s:
|
|
94
|
+
candidate = s[:-1]
|
|
95
|
+
norm = candidate[0].upper() + candidate[1:]
|
|
96
|
+
if norm in ENHARMONIC:
|
|
97
|
+
norm = ENHARMONIC[norm]
|
|
98
|
+
if norm in NOTE_NAMES:
|
|
99
|
+
return {"tonic": NOTE_NAMES.index(norm), "tonic_name": norm, "mode": "minor"}
|
|
100
|
+
|
|
101
|
+
parts = s.split()
|
|
87
102
|
raw_tonic = parts[0]
|
|
88
103
|
mode = parts[1].lower() if len(parts) > 1 else 'major'
|
|
89
104
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"mcpName": "io.github.dreamrec/livepilot",
|
|
5
5
|
"description": "Agentic production system for Ableton Live 12 — 168 tools, 17 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
6
6
|
"author": "Pilot Studio",
|
package/plugin/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "Agentic production system for Ableton Live 12 — 168 tools, 17 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
5
5
|
"author": "Pilot Studio",
|
|
6
6
|
"skills": [
|
|
@@ -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.8.
|
|
8
|
+
__version__ = "1.8.1"
|
|
9
9
|
|
|
10
10
|
from _Framework.ControlSurface import ControlSurface
|
|
11
11
|
from .server import LivePilotServer
|
|
@@ -34,7 +34,7 @@ class LivePilot(ControlSurface):
|
|
|
34
34
|
ControlSurface.__init__(self, c_instance)
|
|
35
35
|
self._server = LivePilotServer(self)
|
|
36
36
|
self._server.start()
|
|
37
|
-
self.log_message("LivePilot v1.8.
|
|
37
|
+
self.log_message("LivePilot v1.8.1 initialized")
|
|
38
38
|
self.show_message("LivePilot: Listening on port 9878")
|
|
39
39
|
|
|
40
40
|
def disconnect(self):
|