livepilot 1.9.23 → 1.10.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 (191) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/AGENTS.md +3 -3
  3. package/CHANGELOG.md +119 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/README.md +144 -13
  6. package/bin/livepilot.js +87 -0
  7. package/installer/codex.js +147 -0
  8. package/livepilot/.Codex-plugin/plugin.json +2 -2
  9. package/livepilot/.claude-plugin/plugin.json +2 -2
  10. package/livepilot/skills/livepilot-core/SKILL.md +21 -4
  11. package/livepilot/skills/livepilot-core/references/device-knowledge/00-index.md +34 -0
  12. package/livepilot/skills/livepilot-core/references/device-knowledge/automation-as-music.md +204 -0
  13. package/livepilot/skills/livepilot-core/references/device-knowledge/chains-genre.md +173 -0
  14. package/livepilot/skills/livepilot-core/references/device-knowledge/creative-thinking.md +211 -0
  15. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-distortion.md +188 -0
  16. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-space.md +162 -0
  17. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-spectral.md +229 -0
  18. package/livepilot/skills/livepilot-core/references/device-knowledge/instruments-synths.md +243 -0
  19. package/livepilot/skills/livepilot-core/references/overview.md +13 -9
  20. package/livepilot/skills/livepilot-core/references/sample-manipulation.md +724 -0
  21. package/livepilot/skills/livepilot-core/references/sound-design-deep.md +140 -0
  22. package/livepilot/skills/livepilot-devices/SKILL.md +16 -2
  23. package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +1 -1
  24. package/livepilot/skills/livepilot-release/SKILL.md +19 -5
  25. package/livepilot/skills/livepilot-sample-engine/SKILL.md +104 -0
  26. package/livepilot/skills/livepilot-sample-engine/references/sample-critics.md +87 -0
  27. package/livepilot/skills/livepilot-sample-engine/references/sample-philosophy.md +51 -0
  28. package/livepilot/skills/livepilot-sample-engine/references/sample-techniques.md +131 -0
  29. package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +45 -0
  30. package/livepilot/skills/livepilot-wonder/SKILL.md +15 -0
  31. package/livepilot.mcpb +0 -0
  32. package/m4l_device/livepilot_bridge.js +1 -1
  33. package/manifest.json +2 -2
  34. package/mcp_server/__init__.py +1 -1
  35. package/mcp_server/atlas/__init__.py +357 -0
  36. package/mcp_server/atlas/device_atlas.json +44067 -0
  37. package/mcp_server/atlas/enrichments/__init__.py +111 -0
  38. package/mcp_server/atlas/enrichments/audio_effects/auto_filter.yaml +162 -0
  39. package/mcp_server/atlas/enrichments/audio_effects/beat_repeat.yaml +183 -0
  40. package/mcp_server/atlas/enrichments/audio_effects/channel_eq.yaml +126 -0
  41. package/mcp_server/atlas/enrichments/audio_effects/chorus_ensemble.yaml +149 -0
  42. package/mcp_server/atlas/enrichments/audio_effects/color_limiter.yaml +109 -0
  43. package/mcp_server/atlas/enrichments/audio_effects/compressor.yaml +159 -0
  44. package/mcp_server/atlas/enrichments/audio_effects/convolution_reverb.yaml +143 -0
  45. package/mcp_server/atlas/enrichments/audio_effects/convolution_reverb_pro.yaml +178 -0
  46. package/mcp_server/atlas/enrichments/audio_effects/delay.yaml +151 -0
  47. package/mcp_server/atlas/enrichments/audio_effects/drum_buss.yaml +142 -0
  48. package/mcp_server/atlas/enrichments/audio_effects/dynamic_tube.yaml +147 -0
  49. package/mcp_server/atlas/enrichments/audio_effects/echo.yaml +167 -0
  50. package/mcp_server/atlas/enrichments/audio_effects/eq_eight.yaml +148 -0
  51. package/mcp_server/atlas/enrichments/audio_effects/eq_three.yaml +121 -0
  52. package/mcp_server/atlas/enrichments/audio_effects/erosion.yaml +103 -0
  53. package/mcp_server/atlas/enrichments/audio_effects/filter_delay.yaml +173 -0
  54. package/mcp_server/atlas/enrichments/audio_effects/gate.yaml +130 -0
  55. package/mcp_server/atlas/enrichments/audio_effects/gated_delay.yaml +133 -0
  56. package/mcp_server/atlas/enrichments/audio_effects/glue_compressor.yaml +142 -0
  57. package/mcp_server/atlas/enrichments/audio_effects/grain_delay.yaml +141 -0
  58. package/mcp_server/atlas/enrichments/audio_effects/hybrid_reverb.yaml +160 -0
  59. package/mcp_server/atlas/enrichments/audio_effects/limiter.yaml +97 -0
  60. package/mcp_server/atlas/enrichments/audio_effects/multiband_dynamics.yaml +174 -0
  61. package/mcp_server/atlas/enrichments/audio_effects/overdrive.yaml +119 -0
  62. package/mcp_server/atlas/enrichments/audio_effects/pedal.yaml +145 -0
  63. package/mcp_server/atlas/enrichments/audio_effects/phaser_flanger.yaml +161 -0
  64. package/mcp_server/atlas/enrichments/audio_effects/redux.yaml +114 -0
  65. package/mcp_server/atlas/enrichments/audio_effects/reverb.yaml +190 -0
  66. package/mcp_server/atlas/enrichments/audio_effects/roar.yaml +159 -0
  67. package/mcp_server/atlas/enrichments/audio_effects/saturator.yaml +146 -0
  68. package/mcp_server/atlas/enrichments/audio_effects/shifter.yaml +154 -0
  69. package/mcp_server/atlas/enrichments/audio_effects/spectral_resonator.yaml +141 -0
  70. package/mcp_server/atlas/enrichments/audio_effects/spectral_time.yaml +164 -0
  71. package/mcp_server/atlas/enrichments/audio_effects/vector_delay.yaml +140 -0
  72. package/mcp_server/atlas/enrichments/audio_effects/vinyl_distortion.yaml +141 -0
  73. package/mcp_server/atlas/enrichments/instruments/analog.yaml +222 -0
  74. package/mcp_server/atlas/enrichments/instruments/bass.yaml +202 -0
  75. package/mcp_server/atlas/enrichments/instruments/collision.yaml +150 -0
  76. package/mcp_server/atlas/enrichments/instruments/drift.yaml +167 -0
  77. package/mcp_server/atlas/enrichments/instruments/electric.yaml +137 -0
  78. package/mcp_server/atlas/enrichments/instruments/emit.yaml +163 -0
  79. package/mcp_server/atlas/enrichments/instruments/meld.yaml +164 -0
  80. package/mcp_server/atlas/enrichments/instruments/operator.yaml +197 -0
  81. package/mcp_server/atlas/enrichments/instruments/poli.yaml +192 -0
  82. package/mcp_server/atlas/enrichments/instruments/sampler.yaml +218 -0
  83. package/mcp_server/atlas/enrichments/instruments/simpler.yaml +217 -0
  84. package/mcp_server/atlas/enrichments/instruments/tension.yaml +156 -0
  85. package/mcp_server/atlas/enrichments/instruments/tree_tone.yaml +162 -0
  86. package/mcp_server/atlas/enrichments/instruments/vector_fm.yaml +165 -0
  87. package/mcp_server/atlas/enrichments/instruments/vector_grain.yaml +166 -0
  88. package/mcp_server/atlas/enrichments/instruments/wavetable.yaml +162 -0
  89. package/mcp_server/atlas/enrichments/midi_effects/arpeggiator.yaml +156 -0
  90. package/mcp_server/atlas/enrichments/midi_effects/bouncy_notes.yaml +93 -0
  91. package/mcp_server/atlas/enrichments/midi_effects/chord.yaml +147 -0
  92. package/mcp_server/atlas/enrichments/midi_effects/melodic_steps.yaml +97 -0
  93. package/mcp_server/atlas/enrichments/midi_effects/note_echo.yaml +108 -0
  94. package/mcp_server/atlas/enrichments/midi_effects/note_length.yaml +97 -0
  95. package/mcp_server/atlas/enrichments/midi_effects/pitch.yaml +76 -0
  96. package/mcp_server/atlas/enrichments/midi_effects/random.yaml +117 -0
  97. package/mcp_server/atlas/enrichments/midi_effects/rhythmic_steps.yaml +103 -0
  98. package/mcp_server/atlas/enrichments/midi_effects/scale.yaml +83 -0
  99. package/mcp_server/atlas/enrichments/midi_effects/step_arp.yaml +112 -0
  100. package/mcp_server/atlas/enrichments/midi_effects/velocity.yaml +119 -0
  101. package/mcp_server/atlas/enrichments/utility/amp.yaml +159 -0
  102. package/mcp_server/atlas/enrichments/utility/cabinet.yaml +109 -0
  103. package/mcp_server/atlas/enrichments/utility/corpus.yaml +150 -0
  104. package/mcp_server/atlas/enrichments/utility/resonators.yaml +131 -0
  105. package/mcp_server/atlas/enrichments/utility/spectrum.yaml +63 -0
  106. package/mcp_server/atlas/enrichments/utility/tuner.yaml +51 -0
  107. package/mcp_server/atlas/enrichments/utility/utility.yaml +136 -0
  108. package/mcp_server/atlas/enrichments/utility/vocoder.yaml +160 -0
  109. package/mcp_server/atlas/scanner.py +236 -0
  110. package/mcp_server/atlas/tools.py +224 -0
  111. package/mcp_server/composer/__init__.py +1 -0
  112. package/mcp_server/composer/engine.py +452 -0
  113. package/mcp_server/composer/layer_planner.py +427 -0
  114. package/mcp_server/composer/prompt_parser.py +329 -0
  115. package/mcp_server/composer/tools.py +201 -0
  116. package/mcp_server/connection.py +53 -8
  117. package/mcp_server/corpus/__init__.py +377 -0
  118. package/mcp_server/device_forge/__init__.py +1 -0
  119. package/mcp_server/device_forge/builder.py +377 -0
  120. package/mcp_server/device_forge/models.py +142 -0
  121. package/mcp_server/device_forge/templates.py +483 -0
  122. package/mcp_server/device_forge/tools.py +162 -0
  123. package/mcp_server/hook_hunter/analyzer.py +23 -0
  124. package/mcp_server/hook_hunter/models.py +1 -0
  125. package/mcp_server/hook_hunter/tools.py +4 -2
  126. package/mcp_server/m4l_bridge.py +1 -0
  127. package/mcp_server/memory/taste_graph.py +68 -1
  128. package/mcp_server/memory/tools.py +15 -4
  129. package/mcp_server/musical_intelligence/detectors.py +14 -1
  130. package/mcp_server/musical_intelligence/tools.py +11 -8
  131. package/mcp_server/persistence/__init__.py +1 -0
  132. package/mcp_server/persistence/base_store.py +82 -0
  133. package/mcp_server/persistence/project_store.py +106 -0
  134. package/mcp_server/persistence/taste_store.py +122 -0
  135. package/mcp_server/preview_studio/models.py +1 -0
  136. package/mcp_server/preview_studio/tools.py +56 -13
  137. package/mcp_server/runtime/capability.py +66 -0
  138. package/mcp_server/runtime/capability_probe.py +137 -0
  139. package/mcp_server/runtime/execution_router.py +143 -0
  140. package/mcp_server/runtime/live_version.py +102 -0
  141. package/mcp_server/runtime/remote_commands.py +87 -0
  142. package/mcp_server/runtime/tools.py +18 -4
  143. package/mcp_server/sample_engine/__init__.py +1 -0
  144. package/mcp_server/sample_engine/analyzer.py +216 -0
  145. package/mcp_server/sample_engine/critics.py +390 -0
  146. package/mcp_server/sample_engine/models.py +193 -0
  147. package/mcp_server/sample_engine/moves.py +127 -0
  148. package/mcp_server/sample_engine/planner.py +186 -0
  149. package/mcp_server/sample_engine/sources.py +540 -0
  150. package/mcp_server/sample_engine/techniques.py +908 -0
  151. package/mcp_server/sample_engine/tools.py +442 -0
  152. package/mcp_server/semantic_moves/__init__.py +3 -0
  153. package/mcp_server/semantic_moves/device_creation_moves.py +237 -0
  154. package/mcp_server/semantic_moves/mix_moves.py +41 -41
  155. package/mcp_server/semantic_moves/performance_moves.py +13 -13
  156. package/mcp_server/semantic_moves/sample_compilers.py +372 -0
  157. package/mcp_server/semantic_moves/sound_design_moves.py +15 -15
  158. package/mcp_server/semantic_moves/tools.py +18 -17
  159. package/mcp_server/semantic_moves/transition_moves.py +16 -16
  160. package/mcp_server/server.py +51 -0
  161. package/mcp_server/services/__init__.py +1 -0
  162. package/mcp_server/services/motif_service.py +67 -0
  163. package/mcp_server/session_continuity/tracker.py +29 -1
  164. package/mcp_server/song_brain/builder.py +28 -1
  165. package/mcp_server/song_brain/models.py +4 -0
  166. package/mcp_server/song_brain/tools.py +20 -2
  167. package/mcp_server/sound_design/critics.py +89 -1
  168. package/mcp_server/splice_client/__init__.py +1 -0
  169. package/mcp_server/splice_client/client.py +347 -0
  170. package/mcp_server/splice_client/models.py +96 -0
  171. package/mcp_server/splice_client/protos/__init__.py +1 -0
  172. package/mcp_server/splice_client/protos/app_pb2.py +319 -0
  173. package/mcp_server/splice_client/protos/app_pb2.pyi +1153 -0
  174. package/mcp_server/splice_client/protos/app_pb2_grpc.py +1946 -0
  175. package/mcp_server/tools/arrangement.py +69 -0
  176. package/mcp_server/tools/automation.py +15 -2
  177. package/mcp_server/tools/devices.py +117 -6
  178. package/mcp_server/tools/notes.py +37 -4
  179. package/mcp_server/wonder_mode/diagnosis.py +5 -0
  180. package/mcp_server/wonder_mode/engine.py +85 -1
  181. package/mcp_server/wonder_mode/tools.py +6 -1
  182. package/package.json +12 -2
  183. package/remote_script/LivePilot/__init__.py +8 -1
  184. package/remote_script/LivePilot/arrangement.py +114 -0
  185. package/remote_script/LivePilot/browser.py +56 -1
  186. package/remote_script/LivePilot/devices.py +236 -6
  187. package/remote_script/LivePilot/mixing.py +8 -3
  188. package/remote_script/LivePilot/server.py +5 -1
  189. package/remote_script/LivePilot/transport.py +3 -0
  190. package/remote_script/LivePilot/version_detect.py +78 -0
  191. package/scripts/sync_metadata.py +132 -0
@@ -11,14 +11,14 @@ TIGHTEN_LOW_END = SemanticMove(
11
11
  protect={"warmth": 0.6},
12
12
  risk_level="low",
13
13
  compile_plan=[
14
- {"tool": "get_master_spectrum", "params": {}, "description": "Check current sub/low balance"},
15
- {"tool": "set_device_parameter", "params": {"description": "High-pass sub bass around 30-40 Hz"}, "description": "HP filter sub rumble"},
16
- {"tool": "set_track_volume", "params": {"description": "Reduce sub bass volume 5-10% if sub > 50%"}, "description": "Reduce sub volume"},
17
- {"tool": "set_device_parameter", "params": {"description": "Gentle saturation drive +2-4dB for harmonic definition"}, "description": "Add bass harmonics"},
14
+ {"tool": "get_master_spectrum", "params": {}, "description": "Check current sub/low balance", "backend": "mcp_tool"},
15
+ {"tool": "set_device_parameter", "params": {"description": "High-pass sub bass around 30-40 Hz"}, "description": "HP filter sub rumble", "backend": "remote_command"},
16
+ {"tool": "set_track_volume", "params": {"description": "Reduce sub bass volume 5-10% if sub > 50%"}, "description": "Reduce sub volume", "backend": "remote_command"},
17
+ {"tool": "set_device_parameter", "params": {"description": "Gentle saturation drive +2-4dB for harmonic definition"}, "description": "Add bass harmonics", "backend": "remote_command"},
18
18
  ],
19
19
  verification_plan=[
20
- {"tool": "get_master_spectrum", "check": "sub band should decrease, low-mid stable"},
21
- {"tool": "get_track_meters", "check": "bass track still producing audio"},
20
+ {"tool": "get_master_spectrum", "check": "sub band should decrease, low-mid stable", "backend": "mcp_tool"},
21
+ {"tool": "get_track_meters", "check": "bass track still producing audio", "backend": "remote_command"},
22
22
  ],
23
23
  )
24
24
 
@@ -30,14 +30,14 @@ WIDEN_STEREO = SemanticMove(
30
30
  protect={"cohesion": 0.7},
31
31
  risk_level="low",
32
32
  compile_plan=[
33
- {"tool": "analyze_mix", "params": {}, "description": "Check current stereo state"},
34
- {"tool": "set_track_pan", "params": {"description": "Pan harmonic elements wider: +/-25-40%"}, "description": "Pan harmonics wider"},
35
- {"tool": "set_track_pan", "params": {"description": "Pan percussion subtly: +/-10-20%"}, "description": "Pan perc subtly"},
36
- {"tool": "set_track_send", "params": {"description": "Increase reverb send on wide elements +10-15%"}, "description": "Add depth to wide elements"},
33
+ {"tool": "analyze_mix", "params": {}, "description": "Check current stereo state", "backend": "mcp_tool"},
34
+ {"tool": "set_track_pan", "params": {"description": "Pan harmonic elements wider: +/-25-40%"}, "description": "Pan harmonics wider", "backend": "remote_command"},
35
+ {"tool": "set_track_pan", "params": {"description": "Pan percussion subtly: +/-10-20%"}, "description": "Pan perc subtly", "backend": "remote_command"},
36
+ {"tool": "set_track_send", "params": {"description": "Increase reverb send on wide elements +10-15%"}, "description": "Add depth to wide elements", "backend": "remote_command"},
37
37
  ],
38
38
  verification_plan=[
39
- {"tool": "get_track_meters", "check": "all tracks producing stereo output"},
40
- {"tool": "analyze_mix", "check": "stereo.mono_risk is false, side_activity > 0.1"},
39
+ {"tool": "get_track_meters", "check": "all tracks producing stereo output", "backend": "remote_command"},
40
+ {"tool": "analyze_mix", "check": "stereo.mono_risk is false, side_activity > 0.1", "backend": "mcp_tool"},
41
41
  ],
42
42
  )
43
43
 
@@ -49,14 +49,14 @@ MAKE_PUNCHIER = SemanticMove(
49
49
  protect={"clarity": 0.7, "warmth": 0.5},
50
50
  risk_level="low",
51
51
  compile_plan=[
52
- {"tool": "get_track_meters", "params": {"include_stereo": True}, "description": "Read current levels"},
53
- {"tool": "set_track_volume", "params": {"description": "Push drum track +5-8%"}, "description": "Push drum level"},
54
- {"tool": "set_track_volume", "params": {"description": "Pull pad/texture -5-10%"}, "description": "Pull back pads"},
55
- {"tool": "set_device_parameter", "params": {"description": "Lower Glue Compressor threshold 2-3dB if on master"}, "description": "Tighten master bus"},
52
+ {"tool": "get_track_meters", "params": {"include_stereo": True}, "description": "Read current levels", "backend": "remote_command"},
53
+ {"tool": "set_track_volume", "params": {"description": "Push drum track +5-8%"}, "description": "Push drum level", "backend": "remote_command"},
54
+ {"tool": "set_track_volume", "params": {"description": "Pull pad/texture -5-10%"}, "description": "Pull back pads", "backend": "remote_command"},
55
+ {"tool": "set_device_parameter", "params": {"description": "Lower Glue Compressor threshold 2-3dB if on master"}, "description": "Tighten master bus", "backend": "remote_command"},
56
56
  ],
57
57
  verification_plan=[
58
- {"tool": "get_master_spectrum", "check": "mid and high-mid energy increased relative to before"},
59
- {"tool": "get_track_meters", "check": "all tracks still producing audio"},
58
+ {"tool": "get_master_spectrum", "check": "mid and high-mid energy increased relative to before", "backend": "mcp_tool"},
59
+ {"tool": "get_track_meters", "check": "all tracks still producing audio", "backend": "remote_command"},
60
60
  ],
61
61
  )
62
62
 
@@ -68,13 +68,13 @@ DARKEN_MIX = SemanticMove(
68
68
  protect={"width": 0.7, "clarity": 0.5},
69
69
  risk_level="low",
70
70
  compile_plan=[
71
- {"tool": "get_master_spectrum", "params": {}, "description": "Check current tonal balance"},
72
- {"tool": "set_device_parameter", "params": {"description": "Lower EQ/Auto Filter high shelf -2-4dB on bright tracks"}, "description": "Roll off highs"},
73
- {"tool": "set_track_send", "params": {"description": "Increase reverb send on darkened elements for depth compensation"}, "description": "Compensate depth"},
71
+ {"tool": "get_master_spectrum", "params": {}, "description": "Check current tonal balance", "backend": "mcp_tool"},
72
+ {"tool": "set_device_parameter", "params": {"description": "Lower EQ/Auto Filter high shelf -2-4dB on bright tracks"}, "description": "Roll off highs", "backend": "remote_command"},
73
+ {"tool": "set_track_send", "params": {"description": "Increase reverb send on darkened elements for depth compensation"}, "description": "Compensate depth", "backend": "remote_command"},
74
74
  ],
75
75
  verification_plan=[
76
- {"tool": "get_master_spectrum", "check": "high and air bands decreased, low-mid stable or increased"},
77
- {"tool": "get_track_meters", "check": "all tracks producing audio (filter didn't kill signal)"},
76
+ {"tool": "get_master_spectrum", "check": "high and air bands decreased, low-mid stable or increased", "backend": "mcp_tool"},
77
+ {"tool": "get_track_meters", "check": "all tracks producing audio (filter didn't kill signal)", "backend": "remote_command"},
78
78
  ],
79
79
  )
80
80
 
@@ -86,13 +86,13 @@ REDUCE_REPETITION = SemanticMove(
86
86
  protect={"cohesion": 0.6},
87
87
  risk_level="medium",
88
88
  compile_plan=[
89
- {"tool": "apply_automation_shape", "params": {"curve_type": "perlin", "description": "Perlin noise on filter cutoff"}, "description": "Add organic filter drift"},
90
- {"tool": "apply_automation_shape", "params": {"curve_type": "perlin", "description": "Perlin noise on send levels"}, "description": "Add depth movement"},
91
- {"tool": "set_device_parameter", "params": {"description": "Increase Beat Repeat variation or chance"}, "description": "Add rhythmic variation"},
89
+ {"tool": "apply_automation_shape", "params": {"curve_type": "perlin", "description": "Perlin noise on filter cutoff"}, "description": "Add organic filter drift", "backend": "mcp_tool"},
90
+ {"tool": "apply_automation_shape", "params": {"curve_type": "perlin", "description": "Perlin noise on send levels"}, "description": "Add depth movement", "backend": "mcp_tool"},
91
+ {"tool": "set_device_parameter", "params": {"description": "Increase Beat Repeat variation or chance"}, "description": "Add rhythmic variation", "backend": "remote_command"},
92
92
  ],
93
93
  verification_plan=[
94
- {"tool": "get_track_meters", "check": "all tracks still producing audio"},
95
- {"tool": "capture_audio", "check": "LRA > 2 LU (dynamic range should increase)"},
94
+ {"tool": "get_track_meters", "check": "all tracks still producing audio", "backend": "remote_command"},
95
+ {"tool": "capture_audio", "check": "LRA > 2 LU (dynamic range should increase)", "backend": "mcp_tool"},
96
96
  ],
97
97
  )
98
98
 
@@ -104,13 +104,13 @@ MAKE_KICK_BASS_LOCK = SemanticMove(
104
104
  protect={"warmth": 0.6, "cohesion": 0.7},
105
105
  risk_level="low",
106
106
  compile_plan=[
107
- {"tool": "get_device_parameters", "params": {"description": "Read bass EQ/filter state"}, "description": "Inspect bass chain"},
108
- {"tool": "set_device_parameter", "params": {"description": "High-pass bass at 40-60 Hz to clear space for kick sub"}, "description": "HP bass for kick clearance"},
109
- {"tool": "set_device_parameter", "params": {"description": "Sidechain compressor or volume duck on bass from kick"}, "description": "Duck bass on kick hits"},
107
+ {"tool": "get_device_parameters", "params": {"description": "Read bass EQ/filter state"}, "description": "Inspect bass chain", "backend": "remote_command"},
108
+ {"tool": "set_device_parameter", "params": {"description": "High-pass bass at 40-60 Hz to clear space for kick sub"}, "description": "HP bass for kick clearance", "backend": "remote_command"},
109
+ {"tool": "set_device_parameter", "params": {"description": "Sidechain compressor or volume duck on bass from kick"}, "description": "Duck bass on kick hits", "backend": "remote_command"},
110
110
  ],
111
111
  verification_plan=[
112
- {"tool": "get_master_spectrum", "check": "sub and low bands balanced, no masking"},
113
- {"tool": "get_track_meters", "check": "both kick and bass tracks producing audio"},
112
+ {"tool": "get_master_spectrum", "check": "sub and low bands balanced, no masking", "backend": "mcp_tool"},
113
+ {"tool": "get_track_meters", "check": "both kick and bass tracks producing audio", "backend": "remote_command"},
114
114
  ],
115
115
  )
116
116
 
@@ -122,13 +122,13 @@ CREATE_BUILDUP_TENSION = SemanticMove(
122
122
  protect={"clarity": 0.6},
123
123
  risk_level="medium",
124
124
  compile_plan=[
125
- {"tool": "apply_gesture_template", "params": {"template_name": "tension_ratchet"}, "description": "Apply staged tension ratchet"},
126
- {"tool": "apply_automation_shape", "params": {"curve_type": "exponential", "description": "Rising HP filter over 4-8 bars"}, "description": "HP filter rise"},
127
- {"tool": "set_track_send", "params": {"description": "Increase reverb send for wash effect"}, "description": "Add reverb wash"},
125
+ {"tool": "apply_gesture_template", "params": {"template_name": "tension_ratchet"}, "description": "Apply staged tension ratchet", "backend": "mcp_tool"},
126
+ {"tool": "apply_automation_shape", "params": {"curve_type": "exponential", "description": "Rising HP filter over 4-8 bars"}, "description": "HP filter rise", "backend": "mcp_tool"},
127
+ {"tool": "set_track_send", "params": {"description": "Increase reverb send for wash effect"}, "description": "Add reverb wash", "backend": "remote_command"},
128
128
  ],
129
129
  verification_plan=[
130
- {"tool": "get_emotional_arc", "check": "tension should increase before target section"},
131
- {"tool": "get_track_meters", "check": "all tracks still producing audio"},
130
+ {"tool": "get_emotional_arc", "check": "tension should increase before target section", "backend": "mcp_tool"},
131
+ {"tool": "get_track_meters", "check": "all tracks still producing audio", "backend": "remote_command"},
132
132
  ],
133
133
  )
134
134
 
@@ -140,11 +140,11 @@ SMOOTH_SCENE_HANDOFF = SemanticMove(
140
140
  protect={"clarity": 0.7},
141
141
  risk_level="low",
142
142
  compile_plan=[
143
- {"tool": "apply_gesture_template", "params": {"template_name": "pre_arrival_vacuum"}, "description": "Pull energy back before transition"},
144
- {"tool": "apply_gesture_template", "params": {"template_name": "re_entry_spotlight"}, "description": "Spotlight returning elements"},
143
+ {"tool": "apply_gesture_template", "params": {"template_name": "pre_arrival_vacuum"}, "description": "Pull energy back before transition", "backend": "mcp_tool"},
144
+ {"tool": "apply_gesture_template", "params": {"template_name": "re_entry_spotlight"}, "description": "Spotlight returning elements", "backend": "mcp_tool"},
145
145
  ],
146
146
  verification_plan=[
147
- {"tool": "get_emotional_arc", "check": "transition point should show energy dip then recovery"},
147
+ {"tool": "get_emotional_arc", "check": "transition point should show energy dip then recovery", "backend": "mcp_tool"},
148
148
  ],
149
149
  )
150
150
 
@@ -16,12 +16,12 @@ RECOVER_ENERGY = SemanticMove(
16
16
  risk_level="low",
17
17
  required_capabilities=["session"],
18
18
  compile_plan=[
19
- {"tool": "set_track_volume", "params": {"description": "Gradually restore drum volume"}, "description": "Bring drums back"},
20
- {"tool": "set_track_volume", "params": {"description": "Restore bass volume"}, "description": "Bring bass back"},
21
- {"tool": "set_track_send", "params": {"description": "Reduce reverb send to tighten mix"}, "description": "Tighten reverb"},
19
+ {"tool": "set_track_volume", "params": {"description": "Gradually restore drum volume"}, "description": "Bring drums back", "backend": "remote_command"},
20
+ {"tool": "set_track_volume", "params": {"description": "Restore bass volume"}, "description": "Bring bass back", "backend": "remote_command"},
21
+ {"tool": "set_track_send", "params": {"description": "Reduce reverb send to tighten mix"}, "description": "Tighten reverb", "backend": "remote_command"},
22
22
  ],
23
23
  verification_plan=[
24
- {"tool": "get_track_meters", "check": "drum and bass tracks producing audio"},
24
+ {"tool": "get_track_meters", "check": "drum and bass tracks producing audio", "backend": "remote_command"},
25
25
  ],
26
26
  )
27
27
 
@@ -34,11 +34,11 @@ DECOMPRESS_TENSION = SemanticMove(
34
34
  risk_level="low",
35
35
  required_capabilities=["session"],
36
36
  compile_plan=[
37
- {"tool": "set_track_volume", "params": {"description": "Pull back high-energy elements 15-20%"}, "description": "Pull energy down"},
38
- {"tool": "set_track_send", "params": {"description": "Increase reverb for spaciousness"}, "description": "Open space"},
37
+ {"tool": "set_track_volume", "params": {"description": "Pull back high-energy elements 15-20%"}, "description": "Pull energy down", "backend": "remote_command"},
38
+ {"tool": "set_track_send", "params": {"description": "Increase reverb for spaciousness"}, "description": "Open space", "backend": "remote_command"},
39
39
  ],
40
40
  verification_plan=[
41
- {"tool": "get_track_meters", "check": "all tracks still alive, overall energy decreased"},
41
+ {"tool": "get_track_meters", "check": "all tracks still alive, overall energy decreased", "backend": "remote_command"},
42
42
  ],
43
43
  )
44
44
 
@@ -51,11 +51,11 @@ SAFE_SPOTLIGHT = SemanticMove(
51
51
  risk_level="low",
52
52
  required_capabilities=["session"],
53
53
  compile_plan=[
54
- {"tool": "set_track_volume", "params": {"description": "Pull non-spotlight tracks to 30-40%"}, "description": "Pull background"},
55
- {"tool": "set_track_volume", "params": {"description": "Push spotlight track to 80-85%"}, "description": "Push spotlight"},
54
+ {"tool": "set_track_volume", "params": {"description": "Pull non-spotlight tracks to 30-40%"}, "description": "Pull background", "backend": "remote_command"},
55
+ {"tool": "set_track_volume", "params": {"description": "Push spotlight track to 80-85%"}, "description": "Push spotlight", "backend": "remote_command"},
56
56
  ],
57
57
  verification_plan=[
58
- {"tool": "get_track_meters", "check": "spotlight track clearly dominant, others still audible"},
58
+ {"tool": "get_track_meters", "check": "spotlight track clearly dominant, others still audible", "backend": "remote_command"},
59
59
  ],
60
60
  )
61
61
 
@@ -68,11 +68,11 @@ EMERGENCY_SIMPLIFY = SemanticMove(
68
68
  risk_level="low",
69
69
  required_capabilities=["session"],
70
70
  compile_plan=[
71
- {"tool": "set_track_volume", "params": {"description": "Pull all non-rhythm tracks to 10-15%"}, "description": "Strip to essentials"},
72
- {"tool": "set_track_volume", "params": {"description": "Keep drums at current level"}, "description": "Maintain rhythm"},
71
+ {"tool": "set_track_volume", "params": {"description": "Pull all non-rhythm tracks to 10-15%"}, "description": "Strip to essentials", "backend": "remote_command"},
72
+ {"tool": "set_track_volume", "params": {"description": "Keep drums at current level"}, "description": "Maintain rhythm", "backend": "remote_command"},
73
73
  ],
74
74
  verification_plan=[
75
- {"tool": "get_track_meters", "check": "drums producing audio, other tracks at low but nonzero level"},
75
+ {"tool": "get_track_meters", "check": "drums producing audio, other tracks at low but nonzero level", "backend": "remote_command"},
76
76
  ],
77
77
  )
78
78
 
@@ -0,0 +1,372 @@
1
+ """Compilers for sample-domain semantic moves.
2
+
3
+ These compile sample manipulation intents into concrete tool call sequences
4
+ using the session kernel to find appropriate tracks and devices.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from .compiler import CompiledPlan, CompiledStep, register_compiler
10
+ from .models import SemanticMove
11
+ from . import resolvers
12
+
13
+
14
+ def _compile_sample_chop_rhythm(move: SemanticMove, kernel: dict) -> CompiledPlan:
15
+ """Compile 'sample_chop_rhythm': load, slice, and chop a sample for rhythm."""
16
+ steps = []
17
+ descriptions = []
18
+ warnings = []
19
+
20
+ # Find drum/percussion tracks to layer alongside
21
+ drums = resolvers.find_tracks_by_role(kernel, ["drums", "percussion"])
22
+
23
+ # Create a new track for the chopped sample
24
+ steps.append(CompiledStep(
25
+ tool="create_midi_track",
26
+ params={"name": "Chop"},
27
+ description="Create track for chopped sample",
28
+ ))
29
+ descriptions.append("Create chop track")
30
+
31
+ # Load into Simpler — track index will be last + 1
32
+ tracks = kernel.get("session_info", {}).get("tracks", [])
33
+ new_idx = len(tracks)
34
+
35
+ steps.append(CompiledStep(
36
+ tool="load_sample_to_simpler",
37
+ params={"track_index": new_idx},
38
+ description="Load sample into Simpler for slicing",
39
+ ))
40
+
41
+ steps.append(CompiledStep(
42
+ tool="set_simpler_playback_mode",
43
+ params={"track_index": new_idx, "mode": "slice"},
44
+ description="Switch to slice mode for rhythmic chopping",
45
+ ))
46
+ descriptions.append("Slice sample")
47
+
48
+ # Balance against existing drums
49
+ if drums:
50
+ steps.append(CompiledStep(
51
+ tool="set_track_volume",
52
+ params={"track_index": new_idx, "volume": 0.55},
53
+ description="Set chop volume below main drums",
54
+ ))
55
+ else:
56
+ warnings.append("No drum tracks found — chop will be the primary rhythm")
57
+
58
+ steps.append(CompiledStep(
59
+ tool="get_track_meters",
60
+ params={"include_stereo": True},
61
+ description="Verify chopped sample producing audio",
62
+ ))
63
+
64
+ return CompiledPlan(
65
+ move_id=move.move_id,
66
+ intent=move.intent,
67
+ steps=steps,
68
+ risk_level="medium",
69
+ summary="; ".join(descriptions) if descriptions else "Chop sample for rhythm",
70
+ requires_approval=True,
71
+ warnings=warnings,
72
+ )
73
+
74
+
75
+ def _compile_sample_texture_layer(move: SemanticMove, kernel: dict) -> CompiledPlan:
76
+ """Compile 'sample_texture_layer': load and filter a sample as background texture."""
77
+ steps = []
78
+ descriptions = []
79
+
80
+ tracks = kernel.get("session_info", {}).get("tracks", [])
81
+ new_idx = len(tracks)
82
+
83
+ steps.append(CompiledStep(
84
+ tool="create_midi_track",
85
+ params={"name": "Texture"},
86
+ description="Create track for texture layer",
87
+ ))
88
+
89
+ steps.append(CompiledStep(
90
+ tool="load_sample_to_simpler",
91
+ params={"track_index": new_idx},
92
+ description="Load textural sample into Simpler",
93
+ ))
94
+ descriptions.append("Load texture sample")
95
+
96
+ # Low volume for background placement
97
+ steps.append(CompiledStep(
98
+ tool="set_track_volume",
99
+ params={"track_index": new_idx, "volume": 0.35},
100
+ description="Set texture low in mix for background presence",
101
+ ))
102
+ descriptions.append("Set background level")
103
+
104
+ # Add reverb send for spatial depth
105
+ steps.append(CompiledStep(
106
+ tool="set_track_send",
107
+ params={"track_index": new_idx, "send_index": 0, "value": 0.40},
108
+ description="Heavy reverb for spatial depth on texture",
109
+ ))
110
+ descriptions.append("Add reverb depth")
111
+
112
+ steps.append(CompiledStep(
113
+ tool="get_track_meters",
114
+ params={"include_stereo": True},
115
+ description="Verify texture layer producing audio at low level",
116
+ ))
117
+
118
+ return CompiledPlan(
119
+ move_id=move.move_id,
120
+ intent=move.intent,
121
+ steps=steps,
122
+ risk_level="low",
123
+ summary="; ".join(descriptions),
124
+ requires_approval=(kernel.get("mode", "improve") != "explore"),
125
+ )
126
+
127
+
128
+ def _compile_sample_vocal_ghost(move: SemanticMove, kernel: dict) -> CompiledPlan:
129
+ """Compile 'sample_vocal_ghost': reverse, pitch, and wash a vocal sample."""
130
+ steps = []
131
+ descriptions = []
132
+
133
+ tracks = kernel.get("session_info", {}).get("tracks", [])
134
+ new_idx = len(tracks)
135
+
136
+ steps.append(CompiledStep(
137
+ tool="create_midi_track",
138
+ params={"name": "Ghost Vox"},
139
+ description="Create track for ghost vocal",
140
+ ))
141
+
142
+ steps.append(CompiledStep(
143
+ tool="load_sample_to_simpler",
144
+ params={"track_index": new_idx},
145
+ description="Load vocal sample into Simpler",
146
+ ))
147
+
148
+ steps.append(CompiledStep(
149
+ tool="reverse_simpler",
150
+ params={"track_index": new_idx},
151
+ description="Reverse vocal for ghostly character",
152
+ ))
153
+ descriptions.append("Reverse vocal")
154
+
155
+ # Heavy reverb wash
156
+ steps.append(CompiledStep(
157
+ tool="set_track_send",
158
+ params={"track_index": new_idx, "send_index": 0, "value": 0.55},
159
+ description="Heavy reverb wash for ghostly depth",
160
+ ))
161
+ descriptions.append("Reverb wash")
162
+
163
+ # Low volume — ghosts live in the background
164
+ steps.append(CompiledStep(
165
+ tool="set_track_volume",
166
+ params={"track_index": new_idx, "volume": 0.30},
167
+ description="Set ghost vocal low in mix",
168
+ ))
169
+ descriptions.append("Background level")
170
+
171
+ steps.append(CompiledStep(
172
+ tool="get_track_meters",
173
+ params={"include_stereo": True},
174
+ description="Verify ghost vocal producing audio with reverb tail",
175
+ ))
176
+
177
+ return CompiledPlan(
178
+ move_id=move.move_id,
179
+ intent=move.intent,
180
+ steps=steps,
181
+ risk_level="medium",
182
+ summary="; ".join(descriptions),
183
+ requires_approval=True,
184
+ )
185
+
186
+
187
+ def _compile_sample_break_layer(move: SemanticMove, kernel: dict) -> CompiledPlan:
188
+ """Compile 'sample_break_layer': slice a break and layer over existing drums."""
189
+ steps = []
190
+ descriptions = []
191
+ warnings = []
192
+
193
+ drums = resolvers.find_tracks_by_role(kernel, ["drums", "percussion"])
194
+ if not drums:
195
+ warnings.append("No existing drum tracks — break will be the primary rhythm")
196
+
197
+ tracks = kernel.get("session_info", {}).get("tracks", [])
198
+ new_idx = len(tracks)
199
+
200
+ steps.append(CompiledStep(
201
+ tool="create_midi_track",
202
+ params={"name": "Break"},
203
+ description="Create track for breakbeat layer",
204
+ ))
205
+
206
+ steps.append(CompiledStep(
207
+ tool="load_sample_to_simpler",
208
+ params={"track_index": new_idx},
209
+ description="Load breakbeat into Simpler",
210
+ ))
211
+
212
+ steps.append(CompiledStep(
213
+ tool="set_simpler_playback_mode",
214
+ params={"track_index": new_idx, "mode": "slice"},
215
+ description="Slice break by transients for individual hits",
216
+ ))
217
+ descriptions.append("Slice break")
218
+
219
+ # Sit below main drums
220
+ steps.append(CompiledStep(
221
+ tool="set_track_volume",
222
+ params={"track_index": new_idx, "volume": 0.45},
223
+ description="Set break layer below main drums",
224
+ ))
225
+ descriptions.append("Balance break level")
226
+
227
+ steps.append(CompiledStep(
228
+ tool="get_track_meters",
229
+ params={"include_stereo": True},
230
+ description="Verify break layer producing audio alongside drums",
231
+ ))
232
+
233
+ return CompiledPlan(
234
+ move_id=move.move_id,
235
+ intent=move.intent,
236
+ steps=steps,
237
+ risk_level="medium",
238
+ summary="; ".join(descriptions) if descriptions else "Layer breakbeat",
239
+ requires_approval=True,
240
+ warnings=warnings,
241
+ )
242
+
243
+
244
+ def _compile_sample_resample_destroy(move: SemanticMove, kernel: dict) -> CompiledPlan:
245
+ """Compile 'sample_resample_destroy': warp and mangle a sample destructively.
246
+
247
+ SAFETY: This is a high-risk move — always requires approval.
248
+ Only adjusts device params when a known device is confirmed present.
249
+ """
250
+ steps = []
251
+ descriptions = []
252
+ warnings = ["High-risk: destructive processing — consider duplicating track first"]
253
+
254
+ tracks = kernel.get("session_info", {}).get("tracks", [])
255
+ new_idx = len(tracks)
256
+
257
+ steps.append(CompiledStep(
258
+ tool="create_midi_track",
259
+ params={"name": "Destroy"},
260
+ description="Create track for destructive resampling",
261
+ ))
262
+
263
+ steps.append(CompiledStep(
264
+ tool="load_sample_to_simpler",
265
+ params={"track_index": new_idx},
266
+ description="Load sample for destruction",
267
+ ))
268
+ descriptions.append("Load source")
269
+
270
+ steps.append(CompiledStep(
271
+ tool="warp_simpler",
272
+ params={"track_index": new_idx},
273
+ description="Apply extreme warp for time-stretch artifacts",
274
+ ))
275
+ descriptions.append("Warp for artifacts")
276
+
277
+ # Use volume + send instead of blindly setting device params
278
+ steps.append(CompiledStep(
279
+ tool="set_track_send",
280
+ params={"track_index": new_idx, "send_index": 0, "value": 0.30},
281
+ description="Add reverb send for destroyed texture depth",
282
+ ))
283
+
284
+ steps.append(CompiledStep(
285
+ tool="set_track_volume",
286
+ params={"track_index": new_idx, "volume": 0.50},
287
+ description="Set destroyed sample at moderate level",
288
+ ))
289
+ descriptions.append("Set level")
290
+
291
+ steps.append(CompiledStep(
292
+ tool="get_track_meters",
293
+ params={"include_stereo": True},
294
+ description="Verify destroyed sample producing audio",
295
+ ))
296
+
297
+ return CompiledPlan(
298
+ move_id=move.move_id,
299
+ intent=move.intent,
300
+ steps=steps,
301
+ risk_level="high",
302
+ summary="; ".join(descriptions),
303
+ requires_approval=True,
304
+ warnings=warnings,
305
+ )
306
+
307
+
308
+ def _compile_sample_one_shot_accent(move: SemanticMove, kernel: dict) -> CompiledPlan:
309
+ """Compile 'sample_one_shot_accent': load a one-shot for rhythmic punctuation."""
310
+ steps = []
311
+ descriptions = []
312
+
313
+ tracks = kernel.get("session_info", {}).get("tracks", [])
314
+ new_idx = len(tracks)
315
+
316
+ steps.append(CompiledStep(
317
+ tool="create_midi_track",
318
+ params={"name": "Accent"},
319
+ description="Create track for one-shot accent",
320
+ ))
321
+
322
+ steps.append(CompiledStep(
323
+ tool="load_sample_to_simpler",
324
+ params={"track_index": new_idx},
325
+ description="Load one-shot into Simpler",
326
+ ))
327
+
328
+ steps.append(CompiledStep(
329
+ tool="set_simpler_playback_mode",
330
+ params={"track_index": new_idx, "mode": "one_shot"},
331
+ description="One-shot mode for trigger playback",
332
+ ))
333
+ descriptions.append("One-shot mode")
334
+
335
+ steps.append(CompiledStep(
336
+ tool="crop_simpler",
337
+ params={"track_index": new_idx},
338
+ description="Tight crop around the transient",
339
+ ))
340
+ descriptions.append("Crop to transient")
341
+
342
+ # Accent should be punchy but not dominating
343
+ steps.append(CompiledStep(
344
+ tool="set_track_volume",
345
+ params={"track_index": new_idx, "volume": 0.60},
346
+ description="Set accent at punchy but balanced level",
347
+ ))
348
+
349
+ steps.append(CompiledStep(
350
+ tool="get_track_meters",
351
+ params={"include_stereo": True},
352
+ description="Verify one-shot accent triggers cleanly",
353
+ ))
354
+
355
+ return CompiledPlan(
356
+ move_id=move.move_id,
357
+ intent=move.intent,
358
+ steps=steps,
359
+ risk_level="low",
360
+ summary="; ".join(descriptions) if descriptions else "One-shot accent",
361
+ requires_approval=(kernel.get("mode", "improve") != "explore"),
362
+ )
363
+
364
+
365
+ # ── Register ────────────────────────────────────────────────────────────────
366
+
367
+ register_compiler("sample_chop_rhythm", _compile_sample_chop_rhythm)
368
+ register_compiler("sample_texture_layer", _compile_sample_texture_layer)
369
+ register_compiler("sample_vocal_ghost", _compile_sample_vocal_ghost)
370
+ register_compiler("sample_break_layer", _compile_sample_break_layer)
371
+ register_compiler("sample_resample_destroy", _compile_sample_resample_destroy)
372
+ register_compiler("sample_one_shot_accent", _compile_sample_one_shot_accent)