livepilot 1.0.0

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.
Files changed (64) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +21 -0
  3. package/README.md +409 -0
  4. package/bin/livepilot.js +390 -0
  5. package/installer/install.js +95 -0
  6. package/installer/paths.js +79 -0
  7. package/mcp_server/__init__.py +2 -0
  8. package/mcp_server/__main__.py +5 -0
  9. package/mcp_server/connection.py +210 -0
  10. package/mcp_server/memory/__init__.py +5 -0
  11. package/mcp_server/memory/technique_store.py +296 -0
  12. package/mcp_server/server.py +87 -0
  13. package/mcp_server/tools/__init__.py +1 -0
  14. package/mcp_server/tools/arrangement.py +407 -0
  15. package/mcp_server/tools/browser.py +86 -0
  16. package/mcp_server/tools/clips.py +218 -0
  17. package/mcp_server/tools/devices.py +256 -0
  18. package/mcp_server/tools/memory.py +198 -0
  19. package/mcp_server/tools/mixing.py +121 -0
  20. package/mcp_server/tools/notes.py +269 -0
  21. package/mcp_server/tools/scenes.py +89 -0
  22. package/mcp_server/tools/tracks.py +175 -0
  23. package/mcp_server/tools/transport.py +117 -0
  24. package/package.json +37 -0
  25. package/plugin/agents/livepilot-producer/AGENT.md +62 -0
  26. package/plugin/commands/beat.md +18 -0
  27. package/plugin/commands/memory.md +22 -0
  28. package/plugin/commands/mix.md +15 -0
  29. package/plugin/commands/session.md +13 -0
  30. package/plugin/commands/sounddesign.md +16 -0
  31. package/plugin/plugin.json +19 -0
  32. package/plugin/skills/livepilot-core/SKILL.md +208 -0
  33. package/plugin/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
  34. package/plugin/skills/livepilot-core/references/device-atlas/00-index.md +110 -0
  35. package/plugin/skills/livepilot-core/references/device-atlas/distortion-and-character.md +687 -0
  36. package/plugin/skills/livepilot-core/references/device-atlas/drums-and-percussion.md +753 -0
  37. package/plugin/skills/livepilot-core/references/device-atlas/dynamics-and-punch.md +525 -0
  38. package/plugin/skills/livepilot-core/references/device-atlas/eq-and-filtering.md +402 -0
  39. package/plugin/skills/livepilot-core/references/device-atlas/midi-tools.md +963 -0
  40. package/plugin/skills/livepilot-core/references/device-atlas/movement-and-modulation.md +874 -0
  41. package/plugin/skills/livepilot-core/references/device-atlas/space-and-depth.md +571 -0
  42. package/plugin/skills/livepilot-core/references/device-atlas/spectral-and-weird.md +714 -0
  43. package/plugin/skills/livepilot-core/references/device-atlas/synths-native.md +953 -0
  44. package/plugin/skills/livepilot-core/references/m4l-devices.md +352 -0
  45. package/plugin/skills/livepilot-core/references/memory-guide.md +107 -0
  46. package/plugin/skills/livepilot-core/references/midi-recipes.md +402 -0
  47. package/plugin/skills/livepilot-core/references/mixing-patterns.md +578 -0
  48. package/plugin/skills/livepilot-core/references/overview.md +209 -0
  49. package/plugin/skills/livepilot-core/references/sound-design.md +392 -0
  50. package/remote_script/LivePilot/__init__.py +42 -0
  51. package/remote_script/LivePilot/arrangement.py +693 -0
  52. package/remote_script/LivePilot/browser.py +424 -0
  53. package/remote_script/LivePilot/clips.py +211 -0
  54. package/remote_script/LivePilot/devices.py +596 -0
  55. package/remote_script/LivePilot/diagnostics.py +198 -0
  56. package/remote_script/LivePilot/mixing.py +194 -0
  57. package/remote_script/LivePilot/notes.py +339 -0
  58. package/remote_script/LivePilot/router.py +74 -0
  59. package/remote_script/LivePilot/scenes.py +99 -0
  60. package/remote_script/LivePilot/server.py +293 -0
  61. package/remote_script/LivePilot/tracks.py +268 -0
  62. package/remote_script/LivePilot/transport.py +151 -0
  63. package/remote_script/LivePilot/utils.py +123 -0
  64. package/requirements.txt +2 -0
@@ -0,0 +1,117 @@
1
+ """Transport MCP tools — playback, tempo, metronome, loop, undo/redo, action log, diagnostics.
2
+
3
+ 12 tools matching the Remote Script transport domain.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from typing import Optional
9
+
10
+ from fastmcp import Context
11
+
12
+ from ..server import mcp
13
+
14
+
15
+ def _get_ableton(ctx: Context):
16
+ """Extract AbletonConnection from lifespan context."""
17
+ return ctx.lifespan_context["ableton"]
18
+
19
+
20
+ @mcp.tool()
21
+ def get_session_info(ctx: Context) -> dict:
22
+ """Get comprehensive Ableton session state: tempo, tracks, scenes, transport."""
23
+ return _get_ableton(ctx).send_command("get_session_info")
24
+
25
+
26
+ @mcp.tool()
27
+ def set_tempo(ctx: Context, tempo: float) -> dict:
28
+ """Set the song tempo in BPM (20-999)."""
29
+ if not 20 <= tempo <= 999:
30
+ raise ValueError("Tempo must be between 20 and 999 BPM")
31
+ return _get_ableton(ctx).send_command("set_tempo", {"tempo": tempo})
32
+
33
+
34
+ @mcp.tool()
35
+ def set_time_signature(ctx: Context, numerator: int, denominator: int) -> dict:
36
+ """Set the time signature (e.g., 4/4, 3/4, 6/8)."""
37
+ if numerator < 1 or numerator > 99:
38
+ raise ValueError("Numerator must be between 1 and 99")
39
+ if denominator not in (1, 2, 4, 8, 16):
40
+ raise ValueError("Denominator must be 1, 2, 4, 8, or 16")
41
+ return _get_ableton(ctx).send_command("set_time_signature", {
42
+ "numerator": numerator,
43
+ "denominator": denominator,
44
+ })
45
+
46
+
47
+ @mcp.tool()
48
+ def start_playback(ctx: Context) -> dict:
49
+ """Start playback from the beginning."""
50
+ return _get_ableton(ctx).send_command("start_playback")
51
+
52
+
53
+ @mcp.tool()
54
+ def stop_playback(ctx: Context) -> dict:
55
+ """Stop playback."""
56
+ return _get_ableton(ctx).send_command("stop_playback")
57
+
58
+
59
+ @mcp.tool()
60
+ def continue_playback(ctx: Context) -> dict:
61
+ """Continue playback from the current position."""
62
+ return _get_ableton(ctx).send_command("continue_playback")
63
+
64
+
65
+ @mcp.tool()
66
+ def toggle_metronome(ctx: Context, enabled: bool) -> dict:
67
+ """Enable or disable the metronome click."""
68
+ return _get_ableton(ctx).send_command("toggle_metronome", {"enabled": enabled})
69
+
70
+
71
+ @mcp.tool()
72
+ def set_session_loop(
73
+ ctx: Context,
74
+ enabled: bool,
75
+ start: Optional[float] = None,
76
+ length: Optional[float] = None,
77
+ ) -> dict:
78
+ """Set loop on/off and optional loop region (start beat, length in beats)."""
79
+ params = {"enabled": enabled}
80
+ if start is not None:
81
+ if start < 0:
82
+ raise ValueError("Loop start must be >= 0")
83
+ params["loop_start"] = start
84
+ if length is not None:
85
+ if length <= 0:
86
+ raise ValueError("Loop length must be > 0")
87
+ params["loop_length"] = length
88
+ return _get_ableton(ctx).send_command("set_session_loop", params)
89
+
90
+
91
+ @mcp.tool()
92
+ def undo(ctx: Context) -> dict:
93
+ """Undo the last action in Ableton."""
94
+ return _get_ableton(ctx).send_command("undo")
95
+
96
+
97
+ @mcp.tool()
98
+ def redo(ctx: Context) -> dict:
99
+ """Redo the last undone action in Ableton."""
100
+ return _get_ableton(ctx).send_command("redo")
101
+
102
+
103
+ @mcp.tool()
104
+ def get_recent_actions(ctx: Context, limit: int = 20) -> dict:
105
+ """Get a log of recent commands sent to Ableton (newest first). Useful for reviewing what was changed."""
106
+ if limit < 1:
107
+ limit = 1
108
+ elif limit > 50:
109
+ limit = 50
110
+ entries = _get_ableton(ctx).get_recent_commands(limit)
111
+ return {"actions": entries, "count": len(entries)}
112
+
113
+
114
+ @mcp.tool()
115
+ def get_session_diagnostics(ctx: Context) -> dict:
116
+ """Analyze the session for potential issues: armed tracks, solo/mute leftovers, unnamed tracks, empty clips/scenes, MIDI tracks without instruments. Returns issues with severity (warning/info) and stats."""
117
+ return _get_ableton(ctx).send_command("get_session_diagnostics")
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "livepilot",
3
+ "version": "1.0.0",
4
+ "mcpName": "io.github.dreamrec/livepilot",
5
+ "description": "AI copilot for Ableton Live 12 — 104 MCP tools for music production, sound design, and mixing",
6
+ "author": "Pilot Studio",
7
+ "license": "MIT",
8
+ "type": "commonjs",
9
+ "bin": {
10
+ "livepilot": "./bin/livepilot.js"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/dreamrec/LivePilot"
15
+ },
16
+ "homepage": "https://github.com/dreamrec/LivePilot",
17
+ "bugs": {
18
+ "url": "https://github.com/dreamrec/LivePilot/issues"
19
+ },
20
+ "keywords": [
21
+ "mcp",
22
+ "mcp-server",
23
+ "model-context-protocol",
24
+ "ableton",
25
+ "ableton-live",
26
+ "music-production",
27
+ "midi",
28
+ "daw",
29
+ "ai",
30
+ "sound-design",
31
+ "mixing",
32
+ "arrangement"
33
+ ],
34
+ "engines": {
35
+ "node": ">=18.0.0"
36
+ }
37
+ }
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: livepilot-producer
3
+ description: Autonomous music production agent for Ableton Live 12. Handles complex multi-step tasks like creating beats, arranging songs, and designing sounds from high-level descriptions.
4
+ when_to_use: When the user gives a high-level production request like "make a lo-fi hip hop beat", "create a drum pattern", "arrange an intro section", or any multi-step Ableton task that requires planning and execution.
5
+ model: sonnet
6
+ tools:
7
+ - mcp
8
+ - Read
9
+ - Glob
10
+ - Grep
11
+ ---
12
+
13
+ You are LivePilot Producer — an autonomous music production agent for Ableton Live 12.
14
+
15
+ ## Your Process
16
+
17
+ Given a high-level description, you:
18
+
19
+ 1. **Plan** — decide tempo, key, track layout, instrument choices, arrangement structure
20
+ 2. **Consult memory** (unless user requests fresh exploration) — call `memory_recall` with a query matching the task (limit=5). Read the returned qualities and let them shape your plan: kit choices, tempo range, rhythmic approach, sound palette. Don't copy — be influenced. If the user says "fresh" / "ignore history" / "something new", skip this step entirely.
21
+ 3. **Build tracks** — create and name tracks with appropriate colors
22
+ 4. **Load instruments** — find and load the right synths, drum kits, and samplers
23
+ 5. **HEALTH CHECK** — verify every track actually produces sound (see below)
24
+ 6. **Program patterns** — write MIDI notes that fit the genre and style
25
+ 7. **Add effects** — load and configure effect chains for the desired sound
26
+ 8. **HEALTH CHECK** — verify effects aren't pass-throughs (Dry/Wet > 0, Drive set, etc.)
27
+ 9. **Mix** — balance volumes, set panning, configure sends
28
+ 10. **Final verify** — `get_session_info`, fire scenes, confirm audio output
29
+
30
+ ## Mandatory Track Health Checks
31
+
32
+ **A track with notes but no working instrument is silence. This is the #1 failure mode. CHECK EVERY TRACK.**
33
+
34
+ After loading any instrument, run this checklist:
35
+
36
+ | Check | Tool | What to look for |
37
+ |-------|------|-----------------|
38
+ | Device loaded? | `get_track_info` | `devices` array not empty, correct `class_name` |
39
+ | Drum Rack has samples? | `get_rack_chains` | Must have named chains ("Bass Drum", "Snare", etc.). Empty = silence. |
40
+ | Synth has volume? | `get_device_parameters` | `Volume`/`Gain` > 0, oscillators on |
41
+ | Effect is active? | `get_device_parameters` | `Dry/Wet` > 0, `Drive`/`Amount` > 0 |
42
+ | Track volume? | `get_track_info` | `mixer.volume` > 0.5 for primary tracks |
43
+ | Track not muted? | `get_track_info` | `mute: false` |
44
+ | Master audible? | `get_master_track` | `volume` > 0.5 |
45
+
46
+ ### Critical device loading rules:
47
+
48
+ - **NEVER load bare "Drum Rack"** — it's empty, zero samples. Load a **kit preset**: `search_browser` path="Drums" name_filter="Kit" → pick one → `load_browser_item`
49
+ - **For synths, use `search_browser` → `load_browser_item`** with exact URI. `find_and_load_device` can match sample files before the actual instrument (e.g., "Drift" matches a .wav sample first)
50
+ - **After loading any effect**, set its key parameters to non-default values. A Saturator with Drive=0, a Reverb with Dry/Wet=0, or a Compressor with Threshold at max are all pass-throughs.
51
+
52
+ ## Rules
53
+
54
+ - Always use the livepilot-core skill for guidance on tool usage
55
+ - Call `get_session_info` before making changes to understand current state
56
+ - **Verify every track produces sound** — this is non-negotiable
57
+ - Verify after every write operation — re-read to confirm
58
+ - Name everything clearly — tracks, clips, scenes
59
+ - Report progress to the user at each major step
60
+ - If something goes wrong, `undo` and try a different approach
61
+ - Confirm before destructive operations (delete_track, delete_clip, delete_device)
62
+ - Keep it musical — think about rhythm, harmony, and arrangement
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: beat
3
+ description: Guided beat creation — create a beat from scratch with genre, tempo, and instrumentation choices
4
+ ---
5
+
6
+ Guide the user through creating a beat from scratch. Follow these steps:
7
+
8
+ 1. **Ask about the vibe** — genre, tempo range, mood, reference tracks
9
+ 2. **Set up the session** — `set_tempo`, create tracks for drums/bass/harmony/melody with `create_midi_track`, name and color them
10
+ 3. **Load instruments** — use `find_and_load_device` for appropriate instruments per track
11
+ 4. **Program drums first** — create a clip, add kick/snare/hat patterns with `add_notes`
12
+ 5. **Add bass** — create clip, program a bassline that locks with the kick
13
+ 6. **Add harmony** — chords or pads that set the mood
14
+ 7. **Add melody** — top-line or lead element
15
+ 8. **Mix** — balance levels with `set_track_volume` and `set_track_pan`
16
+ 9. **Fire the scene** to listen, iterate based on feedback
17
+
18
+ Use the livepilot-core skill for all tool calls. Verify after each step. Keep the user informed of what you're doing and why.
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: memory
3
+ description: Browse, search, and manage your saved technique library
4
+ ---
5
+
6
+ Show the user's technique memory library. Follow these steps:
7
+
8
+ 1. Call `memory_list(limit=20)` to get an overview of saved techniques
9
+ 2. Format as an organized list grouped by type:
10
+ - **Beats** — beat_pattern techniques
11
+ - **Device Chains** — device_chain techniques
12
+ - **Mix Templates** — mix_template techniques
13
+ - **Browser Pins** — browser_pin techniques
14
+ - **Preferences** — preference techniques
15
+ 3. For each technique show: name, summary, rating (stars), favorite marker, tags
16
+ 4. Show total count and breakdown by type
17
+
18
+ After presenting, ask if the user wants to:
19
+ - **Search** — "search for [query]" → use memory_recall
20
+ - **View details** — "show me [name]" → use memory_get
21
+ - **Delete** — "delete [name]" → use memory_delete (confirm first)
22
+ - **Rate** — "rate [name] 5 stars" → use memory_favorite
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: mix
3
+ description: Mixing assistant — analyze and balance track levels, panning, and sends
4
+ ---
5
+
6
+ Help the user mix their session. Follow these steps:
7
+
8
+ 1. **Read the session** — `get_session_info` to see all tracks
9
+ 2. **Analyze each track** — `get_track_info` for clip and device details, check current volume/pan
10
+ 3. **Suggest a mix** — propose volume levels, panning positions, and send amounts based on the track types and instruments
11
+ 4. **Apply with confirmation** — only change levels after the user approves each suggestion
12
+ 5. **Check return tracks** — `get_return_tracks` to see shared effects
13
+ 6. **Master chain** — `get_master_track` to review the master
14
+
15
+ Present suggestions in a clear table format. Always explain the reasoning (e.g., "panning the hi-hats slightly right to create stereo width"). Use `undo` if the user doesn't like a change.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: session
3
+ description: Get a full overview of the current Ableton Live session
4
+ ---
5
+
6
+ Get a comprehensive overview of the current Ableton Live session by calling `get_session_info`. Format the results as an organized report showing:
7
+
8
+ 1. **Transport** — tempo, time signature, playing state, loop settings
9
+ 2. **Tracks** — list all tracks with type, name, color, arm/mute/solo state
10
+ 3. **Scenes** — scene names and clip occupancy
11
+ 4. **Master** — master volume and devices
12
+
13
+ After presenting the overview, ask if the user wants to dive deeper into any specific track, device, or area.
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: sounddesign
3
+ description: Sound design workflow — load instruments and effects, shape parameters for a target sound
4
+ ---
5
+
6
+ Guide the user through designing a sound. Follow these steps:
7
+
8
+ 1. **Ask about the target sound** — what character? (warm pad, aggressive bass, shimmering lead, atmospheric texture, etc.)
9
+ 2. **Choose an instrument** — pick the right synth for the job, load it with `find_and_load_device`
10
+ 3. **Get parameters** — `get_device_parameters` to see what's available
11
+ 4. **Shape the sound** — `set_device_parameter` or `batch_set_parameters` to dial in the character
12
+ 5. **Add effects** — load effects (reverb, delay, chorus, distortion, etc.) and tweak their parameters
13
+ 6. **Create a test pattern** — `create_clip` + `add_notes` with a simple pattern to audition
14
+ 7. **Fire the clip** to listen, iterate based on feedback
15
+
16
+ Explain what each parameter does as you adjust it. Use `undo` liberally if something sounds wrong.
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "livepilot",
3
+ "version": "1.0.0",
4
+ "description": "AI copilot for Ableton Live 12 — 104 MCP tools for music production, sound design, and mixing",
5
+ "author": "Pilot Studio",
6
+ "skills": [
7
+ "skills/livepilot-core"
8
+ ],
9
+ "commands": [
10
+ "commands/session.md",
11
+ "commands/beat.md",
12
+ "commands/mix.md",
13
+ "commands/sounddesign.md",
14
+ "commands/memory.md"
15
+ ],
16
+ "agents": [
17
+ "agents/livepilot-producer"
18
+ ]
19
+ }
@@ -0,0 +1,208 @@
1
+ ---
2
+ name: livepilot-core
3
+ description: Core discipline for controlling Ableton Live 12 through LivePilot's 104 MCP tools. Use whenever working with Ableton Live through MCP tools.
4
+ ---
5
+
6
+ # LivePilot Core — Ableton Live 12 AI Copilot
7
+
8
+ LivePilot gives you 104 MCP tools to control Ableton Live 12 in real-time: transport, tracks, clips, MIDI notes, devices, scenes, mixing, browser, arrangement, and technique memory.
9
+
10
+ ## Golden Rules
11
+
12
+ 1. **Always call `get_session_info` first** — know what you're working with before changing anything
13
+ 2. **Verify after every write** — re-read state to confirm your change took effect
14
+ 3. **Use `undo` liberally** — it's your safety net. Mention it to users when doing destructive ops
15
+ 4. **One operation at a time** — don't batch unrelated changes. Verify between steps
16
+ 5. **Track indices are 0-based** — track 0 is the first track. Use negative indices for return tracks (-1=A, -2=B). Use -1000 for master track.
17
+ 6. **NEVER invent device/preset names** — always `search_browser` first, then use the exact `uri` from results with `load_browser_item`. Hallucinated names like "echomorph-hpf" will crash. The only exception is `find_and_load_device` for simple built-in effects ("Reverb", "Delay", "Compressor", "EQ Eight", "Saturator", "Utility").
18
+ 7. **Color indices 0-69** — Ableton's fixed palette. Don't guess — use the index
19
+ 8. **Volume is 0.0-1.0, pan is -1.0 to 1.0** — these are normalized, not dB
20
+ 9. **Tempo range 20-999 BPM** — validated before sending to Ableton
21
+ 10. **Always name your tracks and clips** — organization is part of the creative process
22
+
23
+ ## Track Health Checks — MANDATORY
24
+
25
+ **Every track must be verified before you consider it "done".** A track with notes but no sound is a silent failure. Run these checks after building each track.
26
+
27
+ ### After loading any instrument:
28
+ 1. **`get_track_info`** — confirm the device loaded (`devices` array is not empty, `class_name` is correct)
29
+ 2. **For Drum Racks: `get_rack_chains`** — confirm chains exist (an empty Drum Rack = silence). You need named chains like "Bass Drum", "Snare", etc.
30
+ 3. **For synths: `get_device_parameters`** — confirm `Volume`/`Gain` parameter is not 0. Check oscillators are on.
31
+ 4. **For effects: check `Dry/Wet` and `Drive`/key params** — a Saturator with Drive=0 or a Reverb with Dry/Wet=0 does nothing.
32
+
33
+ ### After programming notes:
34
+ 1. **`fire_clip` or `fire_scene`** — always listen. If the track has notes but the instrument has no samples/chains, you're playing silence.
35
+ 2. **Check volume is audible** — `get_track_info` → `mixer.volume` should be > 0.5 for a primary track. Master volume should be > 0.5.
36
+
37
+ ### Device loading rules:
38
+ - **NEVER load a bare "Drum Rack"** — it's empty. Always load a **kit preset** like "909 Core Kit", "808 Core Kit", "Boom Bap Kit", etc. Use `search_browser` with path "Drums" and `name_filter` containing "Kit" to find real kits with samples.
39
+ - **For synths, prefer `search_browser` → `load_browser_item`** over `find_and_load_device` when the name could match samples (e.g., "Drift" matches "Synth Bass Drift Pad Wonk Bass.wav" before the actual Drift synth).
40
+ - **After loading any effect**, verify its key parameters aren't at defaults that make it a pass-through. Set `Drive`, `Dry/Wet`, `Amount` etc. to meaningful values.
41
+
42
+ ### Quick health check pattern:
43
+ ```
44
+ 1. get_track_info(track_index) → has devices? has clips?
45
+ 2. get_rack_chains (if Drum Rack) → has chains with samples?
46
+ 3. get_device_parameters → volume > 0? key params set?
47
+ 4. Check mixer.volume > 0 → track is audible?
48
+ 5. fire_clip / fire_scene → sound comes out?
49
+ ```
50
+
51
+ ### Red flags (things that produce silence):
52
+ - Empty Drum Rack (no chains)
53
+ - Synth with Volume/Gain at 0 or -inf dB
54
+ - Effect with Dry/Wet at 0%
55
+ - Track volume at 0
56
+ - Track muted
57
+ - Master volume at 0
58
+ - MIDI track with no instrument loaded
59
+ - Notes programmed but clip not fired
60
+
61
+ ## Tool Domains (104 total)
62
+
63
+ ### Transport (12)
64
+ `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`
65
+
66
+ ### Tracks (14)
67
+ `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`
68
+
69
+ ### Clips (11)
70
+ `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`
71
+
72
+ ### Notes (8)
73
+ `add_notes` · `get_notes` · `remove_notes` · `remove_notes_by_id` · `modify_notes` · `duplicate_notes` · `transpose_notes` · `quantize_clip`
74
+
75
+ ### Devices (12)
76
+ `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`
77
+
78
+ ### Scenes (8)
79
+ `get_scenes_info` · `create_scene` · `delete_scene` · `duplicate_scene` · `fire_scene` · `set_scene_name` · `set_scene_color` · `set_scene_tempo`
80
+
81
+ ### Mixing (8)
82
+ `set_track_volume` · `set_track_pan` · `set_track_send` · `get_return_tracks` · `get_master_track` · `set_master_volume` · `get_track_routing` · `set_track_routing`
83
+
84
+ ### Browser (4)
85
+ `get_browser_tree` · `get_browser_items` · `search_browser` · `load_browser_item`
86
+
87
+ ### Arrangement (19)
88
+ `get_arrangement_clips` · `create_arrangement_clip` · `add_arrangement_notes` · `get_arrangement_notes` · `remove_arrangement_notes` · `remove_arrangement_notes_by_id` · `modify_arrangement_notes` · `duplicate_arrangement_notes` · `transpose_arrangement_notes` · `set_arrangement_clip_name` · `set_arrangement_automation` · `back_to_arranger` · `jump_to_time` · `capture_midi` · `start_recording` · `stop_recording` · `get_cue_points` · `jump_to_cue` · `toggle_cue_point`
89
+
90
+ ### Memory (8)
91
+ `memory_learn` · `memory_recall` · `memory_get` · `memory_replay` · `memory_list` · `memory_favorite` · `memory_update` · `memory_delete`
92
+
93
+ ## Workflow: Building a Beat
94
+
95
+ 1. `get_session_info` — check current state
96
+ 2. `set_tempo` — set your target BPM
97
+ 3. `create_midi_track` — create tracks for drums, bass, chords, melody
98
+ 4. Name and color each track with `set_track_name` / `set_track_color`
99
+ 5. **Load instruments with PRESETS, not empty shells:**
100
+ - **Drums:** `search_browser` path="Drums" name_filter="Kit" → pick a kit → `load_browser_item`. NEVER load bare "Drum Rack".
101
+ - **Synths:** `search_browser` path="Instruments" name_filter="Drift" → `load_browser_item` with exact URI. Avoids sample name collisions.
102
+ - **VERIFY:** `get_rack_chains` for drums (must have chains), `get_device_parameters` for synths (Volume > 0)
103
+ 6. `create_clip` — create clips on each track (4 beats = 1 bar at 4/4)
104
+ 7. `add_notes` — program MIDI patterns. Each note needs `pitch`, `start_time`, `duration`
105
+ 8. **HEALTH CHECK per track:** `get_track_info` → confirm device loaded, mixer volume > 0, not muted
106
+ 9. `fire_scene` or `fire_clip` — listen to your work
107
+ 10. Iterate: `get_notes` → `modify_notes` / `transpose_notes` → listen again
108
+
109
+ ## Workflow: Sound Design
110
+
111
+ 1. Load a synth: `search_browser` path="Instruments" → `load_browser_item` with exact URI
112
+ 2. **VERIFY:** `get_device_parameters` — confirm Volume/Gain > 0, oscillators on, filter not fully closed
113
+ 3. `set_device_parameter` — tweak individual params by name or index
114
+ 4. `batch_set_parameters` — set multiple params at once for a preset
115
+ 5. Load effects: `find_and_load_device` with "Reverb", "Delay", "Compressor", etc.
116
+ 6. **VERIFY each effect:** `get_device_parameters` — confirm Dry/Wet > 0, Drive/Amount set to meaningful values. An effect at default may be a pass-through.
117
+ 7. Chain devices: they stack in order on the track's device chain
118
+ 8. Use `get_device_info` to inspect rack devices, `get_rack_chains` for racks
119
+
120
+ ## Workflow: Mixing
121
+
122
+ 1. `get_session_info` — see all tracks and current levels
123
+ 2. `set_track_volume` / `set_track_pan` — set levels and stereo position
124
+ 3. `set_track_send` — route to return tracks for shared effects
125
+ 4. `get_return_tracks` — check return track setup
126
+ 5. `set_master_volume` — final output level
127
+ 6. `set_track_routing` — configure input/output routing
128
+
129
+ ## Live 12 Note API
130
+
131
+ Notes use this format when calling `add_notes`:
132
+ ```json
133
+ {
134
+ "pitch": 60,
135
+ "start_time": 0.0,
136
+ "duration": 0.5,
137
+ "velocity": 100,
138
+ "mute": false
139
+ }
140
+ ```
141
+
142
+ When reading with `get_notes`, you also get:
143
+ - `note_id` — unique ID for modify/remove operations
144
+ - `probability` — 0.0-1.0, Live 12 per-note probability
145
+ - `velocity_deviation` — -127.0 to 127.0
146
+ - `release_velocity` — 0.0-127.0
147
+
148
+ Use `modify_notes` with `note_id` to update existing notes.
149
+ Use `remove_notes_by_id` for surgical deletion.
150
+ Use `transpose_notes` for pitch shifting a region.
151
+ Use `quantize_clip` to snap notes to a grid (grid is an enum: 1=1/4, 2=1/8, 5=1/16, 8=1/32).
152
+
153
+ ## Technique Memory
154
+
155
+ LivePilot has a persistent memory system for saving and recalling techniques — beats, device chains, mixing setups, browser pins, and preferences — with rich stylistic analysis.
156
+
157
+ ### Three Modes of Operation
158
+
159
+ **Informed (default):** Before creative decisions, consult memory:
160
+ ```
161
+ memory_recall(query relevant to the task, limit=5)
162
+ ```
163
+ Read the qualities of returned techniques. Let them INFLUENCE your choices — instrument selection, parameter ranges, rhythmic density, harmonic language — but always create something new. The memory shapes your understanding of this user's taste, not a template to copy.
164
+
165
+ **Fresh (user override):** When the user signals a clean slate:
166
+ - "ignore my history" / "something completely new" / "fresh"
167
+ - "don't look at my saved stuff" / "surprise me"
168
+ → Skip memory_recall entirely. Use only the shipped corpus and your own musical knowledge.
169
+
170
+ **Explicit Recall:** When the user references a saved technique:
171
+ - "use that boom bap beat" / "load my lo-fi chain" / "remember that thing I saved?"
172
+ → `memory_recall` to find it → `memory_get` for full payload → `memory_replay` (adapt=false for exact, adapt=true for variation)
173
+
174
+ ### Saving Techniques
175
+
176
+ When the user says "save this" / "remember this" / "I like this":
177
+
178
+ 1. Collect raw data using existing tools (get_notes, get_device_parameters, etc.)
179
+ 2. Write the qualities analysis — see `references/memory-guide.md` for the template
180
+ 3. Call `memory_learn` with type, qualities, payload, tags
181
+ 4. Confirm to the user what was saved and how it was characterized
182
+
183
+ ### Memory Tools (8)
184
+
185
+ | Tool | What it does |
186
+ |------|-------------|
187
+ | `memory_learn` | Save a technique with qualities + payload |
188
+ | `memory_recall` | Search by text query, type, tags — returns summaries |
189
+ | `memory_get` | Fetch full technique by ID (with payload) |
190
+ | `memory_replay` | Get replay plan for agent to execute |
191
+ | `memory_list` | Browse library with filtering and sorting |
192
+ | `memory_favorite` | Star and/or rate (0-5) a technique |
193
+ | `memory_update` | Update name, tags, or qualities |
194
+ | `memory_delete` | Remove (creates backup first) |
195
+
196
+ ## Reference Corpus
197
+
198
+ Deep production knowledge lives in `references/`. Consult these when making creative decisions — they contain specific parameter values, recipes, and patterns. Use them as starting points, not rigid rules.
199
+
200
+ | File | What's inside | When to consult |
201
+ |------|--------------|-----------------|
202
+ | `references/overview.md` | All 104 tools mapped with params, units, ranges | Quick lookup for any tool |
203
+ | `references/midi-recipes.md` | Drum patterns by genre, chord voicings, scales, hi-hat techniques, humanization, polymetrics | Programming MIDI notes, building beats |
204
+ | `references/sound-design.md` | Stock instruments/effects, parameter recipes for bass/pad/lead/pluck, device chain patterns | Loading and configuring devices |
205
+ | `references/mixing-patterns.md` | Gain staging, parallel compression, sidechain, EQ by instrument, bus processing, stereo width | Setting volumes, panning, adding effects |
206
+ | `references/ableton-workflow-patterns.md` | Session/Arrangement workflow, song structures by genre, follow actions, clip launch modes, export | Organizing sessions, structuring songs |
207
+ | `references/m4l-devices.md` | Browser organization, MIDI effects, rack systems, device loading patterns | Finding and loading devices, using racks |
208
+ | `references/memory-guide.md` | Qualities template, good/bad examples for each technique type | Saving techniques, writing qualities |