livepilot 1.26.0 → 1.26.2
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 +41 -0
- package/README.md +1 -1
- package/installer/codex.js +87 -9
- package/livepilot/.Codex-plugin/plugin.json +8 -0
- package/livepilot/.claude-plugin/plugin.json +8 -0
- package/livepilot/.mcp.json +8 -0
- package/livepilot/agents/livepilot-producer/AGENT.md +314 -0
- package/livepilot/commands/arrange.md +47 -0
- package/livepilot/commands/beat.md +81 -0
- package/livepilot/commands/evaluate.md +51 -0
- package/livepilot/commands/memory.md +22 -0
- package/livepilot/commands/mix.md +47 -0
- package/livepilot/commands/perform.md +42 -0
- package/livepilot/commands/session.md +13 -0
- package/livepilot/commands/sounddesign.md +58 -0
- package/livepilot/rubrics/default_preset_check.md +82 -0
- package/livepilot/rubrics/layer_accumulation.md +79 -0
- package/livepilot/rubrics/layer_precision.md +79 -0
- package/livepilot/rubrics/modulation_presence.md +63 -0
- package/livepilot/rubrics/sound_design_depth.md +40 -0
- package/livepilot/skills/livepilot-arrangement/SKILL.md +164 -0
- package/livepilot/skills/livepilot-composition-engine/SKILL.md +151 -0
- package/livepilot/skills/livepilot-composition-engine/references/form-patterns.md +97 -0
- package/livepilot/skills/livepilot-composition-engine/references/transition-archetypes.md +102 -0
- package/livepilot/skills/livepilot-core/SKILL.md +261 -0
- package/livepilot/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
- package/livepilot/skills/livepilot-core/references/affordances/_schema.md +160 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/auto-filter.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/chorus-ensemble.yaml +91 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/compressor.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/convolution-reverb.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/corpus.yaml +84 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/drift.yaml +105 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/echo.yaml +108 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/eq-eight.yaml +95 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/glue-compressor.yaml +88 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/granulator-iii.yaml +104 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/hybrid-reverb.yaml +83 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/operator.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/ping-pong-delay.yaml +104 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/poli.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/saturator.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/shifter.yaml +77 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/simpler.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/utility.yaml +95 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/vinyl-distortion.yaml +92 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/wavetable.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/artist-vocabularies.md +389 -0
- package/livepilot/skills/livepilot-core/references/automation-atlas.md +272 -0
- package/livepilot/skills/livepilot-core/references/concepts/_schema.md +158 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/akufen.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/aphex-twin.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/arca-sophie.yaml +131 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/autechre.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/basic-channel.yaml +140 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/basinski.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/boards-of-canada.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/burial.yaml +127 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/com-truise-tycho.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/daft-punk.yaml +117 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/dj-premier-rza.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/gas.yaml +134 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/hawtin.yaml +127 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/isolee-luomo.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/j-dilla.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/jeff-mills.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/johannsson-richter.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/madlib.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/moodymann-theo-parrish.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/oneohtrix-point-never.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/photek-source-direct.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/rashad-spinn-traxman.yaml +122 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/robert-henke.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/shackleton.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/skream-mala.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/stars-of-the-lid.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/tim-hecker.yaml +122 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/villalobos.yaml +135 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/ambient.yaml +137 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/boom_bap.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/deep-minimal.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/deep_house.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/detroit_techno.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/disco.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/downtempo.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/drone.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/drum-and-bass.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dub-techno.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dub.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dubstep.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/experimental.yaml +136 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/footwork.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/hip-hop.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/house.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/hyperpop.yaml +128 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/idm.yaml +134 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/lo_fi.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/microhouse.yaml +138 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/minimal-techno.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/modern-classical.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/soul.yaml +125 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/synthwave.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/techno.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/trap.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/uk-garage.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/00-index.md +110 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/distortion-and-character.md +687 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/drums-and-percussion.md +753 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/dynamics-and-punch.md +525 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/eq-and-filtering.md +402 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/midi-tools.md +963 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/movement-and-modulation.md +874 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/space-and-depth.md +571 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/spectral-and-weird.md +714 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/synths-native.md +953 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/00-index.md +34 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/automation-as-music.md +204 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/chains-genre.md +173 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/creative-thinking.md +211 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-distortion.md +188 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-space.md +162 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-spectral.md +229 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/instruments-synths.md +243 -0
- package/livepilot/skills/livepilot-core/references/genre-vocabularies.md +382 -0
- package/livepilot/skills/livepilot-core/references/m4l-devices.md +352 -0
- package/livepilot/skills/livepilot-core/references/memory-guide.md +178 -0
- package/livepilot/skills/livepilot-core/references/midi-recipes.md +402 -0
- package/livepilot/skills/livepilot-core/references/mixing-patterns.md +578 -0
- package/livepilot/skills/livepilot-core/references/overview.md +300 -0
- package/livepilot/skills/livepilot-core/references/pack-knowledge.md +319 -0
- package/livepilot/skills/livepilot-core/references/sample-manipulation.md +724 -0
- package/livepilot/skills/livepilot-core/references/sound-design-deep.md +140 -0
- package/livepilot/skills/livepilot-core/references/sound-design.md +393 -0
- package/livepilot/skills/livepilot-corpus-builder/SKILL.md +379 -0
- package/livepilot/skills/livepilot-creative-director/SKILL.md +462 -0
- package/livepilot/skills/livepilot-creative-director/references/anti-repetition-rules.md +214 -0
- package/livepilot/skills/livepilot-creative-director/references/creative-brief-template.md +222 -0
- package/livepilot/skills/livepilot-creative-director/references/hybrid-compilation.md +185 -0
- package/livepilot/skills/livepilot-creative-director/references/move-family-diversity-rule.md +258 -0
- package/livepilot/skills/livepilot-creative-director/references/phase-6-execution.md +409 -0
- package/livepilot/skills/livepilot-creative-director/references/the-four-move-rule.md +192 -0
- package/livepilot/skills/livepilot-devices/SKILL.md +213 -0
- package/livepilot/skills/livepilot-devices/references/load_browser_item-uri-grammar.md +82 -0
- package/livepilot/skills/livepilot-evaluation/SKILL.md +195 -0
- package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +176 -0
- package/livepilot/skills/livepilot-evaluation/references/evaluation-contracts.md +121 -0
- package/livepilot/skills/livepilot-evaluation/references/memory-promotion.md +110 -0
- package/livepilot/skills/livepilot-mix-engine/SKILL.md +144 -0
- package/livepilot/skills/livepilot-mix-engine/references/mix-critics.md +143 -0
- package/livepilot/skills/livepilot-mix-engine/references/mix-moves.md +105 -0
- package/livepilot/skills/livepilot-mixing/SKILL.md +164 -0
- package/livepilot/skills/livepilot-notes/SKILL.md +130 -0
- package/livepilot/skills/livepilot-performance-engine/SKILL.md +122 -0
- package/livepilot/skills/livepilot-performance-engine/references/performance-safety.md +98 -0
- package/livepilot/skills/livepilot-release/SKILL.md +151 -0
- package/livepilot/skills/livepilot-sample-engine/SKILL.md +117 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-critics.md +87 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-philosophy.md +51 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-techniques.md +131 -0
- package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +247 -0
- package/livepilot/skills/livepilot-sound-design-engine/references/patch-model.md +119 -0
- package/livepilot/skills/livepilot-sound-design-engine/references/sound-design-critics.md +118 -0
- package/livepilot/skills/livepilot-wonder/SKILL.md +143 -0
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/LivePilot_Elektron.amxd +0 -0
- package/m4l_device/LivePilot_Elektron.maxpat +758 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/m4l_device/livepilot_elektron_bridge.js +82 -0
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/composer/develop/apply.py +1 -1
- package/mcp_server/composer/full/apply.py +32 -6
- package/mcp_server/composer/full/brief_builder.py +9 -0
- package/mcp_server/evaluation/feature_extractors.py +152 -8
- package/mcp_server/m4l_bridge.py +5 -0
- package/mcp_server/mix_engine/state_builder.py +19 -2
- package/mcp_server/mix_engine/tools.py +22 -0
- package/mcp_server/runtime/execution_router.py +6 -0
- package/mcp_server/runtime/mcp_dispatch.py +18 -0
- package/mcp_server/runtime/remote_commands.py +2 -0
- package/mcp_server/server.py +11 -7
- package/mcp_server/sound_design/tools.py +33 -0
- package/mcp_server/tools/_agent_os_engine/evaluation.py +7 -44
- package/mcp_server/tools/_agent_os_engine/models.py +2 -1
- package/mcp_server/tools/_conductor.py +5 -2
- package/mcp_server/tools/_evaluation_contracts.py +1 -1
- package/mcp_server/tools/_snapshot_normalizer.py +32 -3
- package/package.json +20 -5
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/server.py +63 -2
- package/requirements.txt +3 -3
- package/server.json +3 -3
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# The Four-Move Rule
|
|
2
|
+
|
|
3
|
+
A creative pass should touch four dimensions: **structural**,
|
|
4
|
+
**rhythmic**, **timbral**, **spatial**. The three plans generated in
|
|
5
|
+
Phase 3 distribute across these dimensions — they do not duplicate one.
|
|
6
|
+
|
|
7
|
+
This is the complement to the move-family diversity rule. Family
|
|
8
|
+
diversity enforces "different machinery"; four-move coverage enforces
|
|
9
|
+
"different musical consequence."
|
|
10
|
+
|
|
11
|
+
## The four dimensions
|
|
12
|
+
|
|
13
|
+
Dimensions are orthogonal to `move.family`. A plan has ONE dominant
|
|
14
|
+
dimension and ONE dominant family. Multiple dimensions can map to the
|
|
15
|
+
same family (e.g. an `arrangement`-family plan can be structural OR
|
|
16
|
+
rhythmic depending on what it does). See
|
|
17
|
+
`move-family-diversity-rule.md` §"Family vs. dimension" for the split.
|
|
18
|
+
|
|
19
|
+
| Dimension | What it is | Dominant family typically | Tag with | Also uses |
|
|
20
|
+
|---|---|---|---|---|
|
|
21
|
+
| **Structural** | Section-level form — adds, removes, reshapes sections or clip density | `arrangement` or `transition` | `dimension_hint` optional (family implies it) | `livepilot-arrangement`, `livepilot-composition-engine`, scene/arrangement tools |
|
|
22
|
+
| **Rhythmic** | Timing, groove, swing, motif patterns, polyrhythm, per-hit velocity/probability | `arrangement` (clip pattern edits) OR `sound_design` (per-hit feel) | `dimension_hint: "rhythmic"` REQUIRED — there is no rhythmic family in the registry | `livepilot-notes`, `assign_clip_groove`, `modify_notes`, motif tools, Euclidean rhythm |
|
|
23
|
+
| **Timbral** | Source character — instrument choice, patch, saturation, texture | `sound_design` or `device_creation` | `dimension_hint` optional | `livepilot-sound-design-engine`, `livepilot-devices`, atlas lookups |
|
|
24
|
+
| **Spatial** | Space and stereo field — reverb, delay, pan, width, depth | `mix` (space-oriented moves) | `dimension_hint: "spatial"` recommended when family=mix (distinguishes from level/EQ mix plans) | `set_track_send`, `set_track_pan`, return-track routing, `add_space` |
|
|
25
|
+
|
|
26
|
+
Note that `performance` family is orthogonal — it rarely applies on
|
|
27
|
+
first-pass creative work; it's for live contexts.
|
|
28
|
+
|
|
29
|
+
**The fudge is not a fudge:** earlier drafts of this rule described
|
|
30
|
+
rhythmic plans as "fudged" because they borrow the `arrangement` or
|
|
31
|
+
`sound_design` family. That framing was wrong. The family axis and the
|
|
32
|
+
dimension axis are orthogonal by design — a rhythmic plan has an
|
|
33
|
+
honest family tag AND an honest dimension tag, via `dimension_hint`.
|
|
34
|
+
State both explicitly in the turn. No apology needed.
|
|
35
|
+
|
|
36
|
+
## The rule
|
|
37
|
+
|
|
38
|
+
For a creative pass of 3 plans, coverage should span at least 3 of the
|
|
39
|
+
4 dimensions. Plans may overlap only after all four dimensions have
|
|
40
|
+
been considered.
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
dimensions_touched = {dominant_dimension(p) for p in plans}
|
|
44
|
+
len(dimensions_touched) >= 3 # default
|
|
45
|
+
len(dimensions_touched) >= 4 # ideal
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Falling below 3 distinct dimensions is the same failure mode as
|
|
49
|
+
falling below 3 distinct families — the agent is clustering.
|
|
50
|
+
|
|
51
|
+
## How to identify a plan's dominant dimension
|
|
52
|
+
|
|
53
|
+
Use the move-family → dimension map, then confirm against the plan's
|
|
54
|
+
audible consequence:
|
|
55
|
+
|
|
56
|
+
1. If dominant move's family is `arrangement` or `transition` → **structural**
|
|
57
|
+
2. If dominant move's family is `sound_design` or `device_creation` → **timbral**
|
|
58
|
+
3. If dominant move's family is `mix` AND the move is space-oriented
|
|
59
|
+
(`add_space`, `widen_stereo`, reverb-related) → **spatial**
|
|
60
|
+
4. If dominant move's family is `mix` AND the move is level / EQ /
|
|
61
|
+
dynamics → still **spatial** for this taxonomy (mix's audible
|
|
62
|
+
consequence is positional)
|
|
63
|
+
5. If the plan is primarily MIDI-editing (notes, grooves, motif
|
|
64
|
+
transforms) → **rhythmic**, regardless of family tagging
|
|
65
|
+
|
|
66
|
+
Ambiguous? Tag the seed explicitly in `seed.dimension_hint`.
|
|
67
|
+
|
|
68
|
+
## Interaction with `locked_dimensions`
|
|
69
|
+
|
|
70
|
+
If the brief's `locked_dimensions` includes a dimension, that dimension
|
|
71
|
+
is off-limits. The remaining three must be covered across the three
|
|
72
|
+
plans.
|
|
73
|
+
|
|
74
|
+
| Locked | Must cover |
|
|
75
|
+
|---|---|
|
|
76
|
+
| (nothing) | any 3 of 4 (all 4 ideal) |
|
|
77
|
+
| `structural` | rhythmic + timbral + spatial |
|
|
78
|
+
| `timbral` | structural + rhythmic + spatial |
|
|
79
|
+
| `rhythmic` | structural + timbral + spatial |
|
|
80
|
+
| `spatial` | structural + rhythmic + timbral |
|
|
81
|
+
| two locks | the remaining two — ship 2 plans, not 3 |
|
|
82
|
+
|
|
83
|
+
Two locks on a 4-dimension space means the problem is narrow. Two
|
|
84
|
+
plans is honest; faking a third by sneaking into a locked dimension
|
|
85
|
+
violates both this rule AND the user's explicit constraint.
|
|
86
|
+
|
|
87
|
+
## Example 1 — "Make it feel like Basic Channel if Dilla touched the swing"
|
|
88
|
+
|
|
89
|
+
No locked dimensions. Ideal coverage = 4/4 but we only have 3 plans.
|
|
90
|
+
Each plan tagged `family / dimension`:
|
|
91
|
+
|
|
92
|
+
- Plan A (`arrangement` / **structural**): Add an 8-bar breakdown at bar 48 where kick drops out and only ghost hats + dub-chord tail remain.
|
|
93
|
+
- Plan B (`arrangement` / **rhythmic**, dimension_hint="rhythmic"): Micro-shift hi-hat notes by −8 to +12 ticks, add ghost notes at 62% probability, assign a "Dilla-esque" groove.
|
|
94
|
+
- Plan C (`sound_design` / **timbral**): Load Drift for the chord, route to a send with Ping Pong Delay + Auto Filter on the return, print 25% wet.
|
|
95
|
+
|
|
96
|
+
Family-diversity note: Plans A and B are BOTH `arrangement` family —
|
|
97
|
+
this is a rule violation unless corrected. Swap Plan B to tag
|
|
98
|
+
`sound_design` family instead (per-hit velocity + micro-timing counts
|
|
99
|
+
as feel-shaping sound_design per the family→dimension map), OR swap
|
|
100
|
+
Plan A to `transition` family (create_breakdown semantic move). Either
|
|
101
|
+
fix keeps all three dimensions covered. The point: rhythmic as a
|
|
102
|
+
dimension does not exempt the plan from the three-distinct-families
|
|
103
|
+
constraint — the director must still land family diversity, just via
|
|
104
|
+
the appropriate tag.
|
|
105
|
+
|
|
106
|
+
Corrected version:
|
|
107
|
+
- Plan A (`transition` / **structural**): `create_breakdown` semantic move at bar 48.
|
|
108
|
+
- Plan B (`arrangement` / **rhythmic**, dimension_hint="rhythmic"): groove + probability edits to clip.
|
|
109
|
+
- Plan C (`sound_design` / **timbral**): Drift + send chain.
|
|
110
|
+
|
|
111
|
+
Spatial dimension is not directly touched by a plan — but Plan C's
|
|
112
|
+
send-chain IS spatial in consequence. Coverage is honest: 3 explicit
|
|
113
|
+
dimensions, one implicit.
|
|
114
|
+
|
|
115
|
+
## Example 2 — "Make the drums more interesting, don't touch the arrangement"
|
|
116
|
+
|
|
117
|
+
Locked: `structural`. Must cover rhythmic + timbral + spatial.
|
|
118
|
+
|
|
119
|
+
- Plan A (`arrangement` / **rhythmic**, dimension_hint="rhythmic"): Add probability 70-90% to the hat and clap clip; apply a 58% swing groove from `list_grooves`. Family is `arrangement` because the target is clip content; dimension is rhythmic because the audible consequence is feel. The `structural` lock concerns SECTION-level arrangement, not clip-level edits — locked_dimensions semantics resolve at the dimension level, not the family level.
|
|
120
|
+
- Plan B (`sound_design` / **timbral**): Layer a parallel drum bus with Saturator + Drum Bus; per-hit velocity mod on snare.
|
|
121
|
+
- Plan C (`mix` / **spatial**, dimension_hint="spatial"): Send hats and ghost snares to a short plate reverb at -14 dB; narrow the kick to mono under 80 Hz.
|
|
122
|
+
|
|
123
|
+
All three dimensions hit. Section arrangement untouched. Three families
|
|
124
|
+
distinct. Honest.
|
|
125
|
+
|
|
126
|
+
## Example 3 — Narrow request: "the pad is too static"
|
|
127
|
+
|
|
128
|
+
Ambiguous whether "static" means timbre or space. The agent should
|
|
129
|
+
compile a brief that acknowledges this and generate plans across both:
|
|
130
|
+
|
|
131
|
+
- Plan A (`sound_design` / **timbral**): Enable wavetable position LFO + macro
|
|
132
|
+
modulation on Drift.
|
|
133
|
+
- Plan B (`mix` / **spatial**, dimension_hint="spatial"): Send the pad to a long convolution reverb on a
|
|
134
|
+
return with Auto Filter LFO.
|
|
135
|
+
- Plan C (`arrangement` / **rhythmic**, dimension_hint="rhythmic"): Automate a slow 8-bar amplitude envelope so
|
|
136
|
+
the pad breathes with the section.
|
|
137
|
+
|
|
138
|
+
This is an explicit case where the structural dimension is not
|
|
139
|
+
relevant (it's one sound, not an arrangement decision). Three of four
|
|
140
|
+
is the natural coverage. Shipping a structural plan would be
|
|
141
|
+
fabricated.
|
|
142
|
+
|
|
143
|
+
## When to drop below three dimensions
|
|
144
|
+
|
|
145
|
+
Drop to 2 of 4 (or 1 of 4) ONLY in these situations. In all cases:
|
|
146
|
+
ship fewer plans honestly. Do not fake coverage.
|
|
147
|
+
|
|
148
|
+
1. **Two or more dimensions locked.** User explicitly locked two
|
|
149
|
+
dimensions → at most 2 dimensions remain → at most 2 honest plans.
|
|
150
|
+
|
|
151
|
+
2. **Genuinely narrow task AND concept packet confirms no other
|
|
152
|
+
dimension is in scope.** Example: "make this one reverb return
|
|
153
|
+
less muddy" is spatial-only.
|
|
154
|
+
|
|
155
|
+
3. **Low novelty_budget + narrow-idiom concept packet.** When the
|
|
156
|
+
user's request is reference-adjacent (`novelty_budget` ≤ 0.50) AND
|
|
157
|
+
the concept packet explicitly de-prioritizes certain dimensions,
|
|
158
|
+
dropping those dimensions is idiomatic, not fabricated. Examples:
|
|
159
|
+
|
|
160
|
+
- **Dub-techno packets** (Basic Channel / Rhythm & Sound) explicitly
|
|
161
|
+
de-emphasize the rhythmic dimension ("percussion implied not
|
|
162
|
+
stated"). Three plans may legitimately cluster in
|
|
163
|
+
timbral + spatial + (optional) structural. Rhythmic absent is
|
|
164
|
+
idiomatic honesty.
|
|
165
|
+
- **Ambient packets** (Gas / Basinski / Stars of the Lid) explicitly
|
|
166
|
+
de-emphasize rhythmic AND structural (static with very slow
|
|
167
|
+
evolution). Three plans clustering in timbral + spatial is
|
|
168
|
+
idiomatic.
|
|
169
|
+
- **Beat-focused packets** (Dilla / Premier) explicitly
|
|
170
|
+
de-emphasize the spatial dimension (dry intimacy is the aesthetic).
|
|
171
|
+
Three plans clustering in rhythmic + timbral + structural is
|
|
172
|
+
idiomatic.
|
|
173
|
+
|
|
174
|
+
When this rule fires, document the decision in the turn: *"The
|
|
175
|
+
packet's aesthetic de-prioritizes <dimension>; dropping it here is
|
|
176
|
+
idiomatic rather than coverage failure."* This prevents future
|
|
177
|
+
agents from mistaking the under-coverage for a skill bug.
|
|
178
|
+
|
|
179
|
+
**Never-drop rule:** even when dropping dimensions, the family
|
|
180
|
+
diversity rule still applies to whatever plans you DO ship. Two plans
|
|
181
|
+
must have different families; three plans must have three different
|
|
182
|
+
families. Narrow doesn't excuse fabricated distinctness.
|
|
183
|
+
|
|
184
|
+
## Why this rule works
|
|
185
|
+
|
|
186
|
+
"Layered and complex output" — what the user asks for when they say
|
|
187
|
+
"more interesting" — is almost always a DISTRIBUTION problem, not a
|
|
188
|
+
depth problem. A pass that touches rhythm + timbre + space feels
|
|
189
|
+
three-dimensional even if each individual change is small. A pass that
|
|
190
|
+
stacks three `mix` moves feels thin even when the changes are large.
|
|
191
|
+
|
|
192
|
+
Force distribution. Depth emerges.
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: livepilot-devices
|
|
3
|
+
description: This skill should be used when the user asks to "load a device", "add an effect", "find a plugin", "device chain", "rack", "preset", "sound design setup", "load instrument", "find a synth", or wants to browse, load, and configure devices in Ableton Live.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Device Loading and Configuration
|
|
7
|
+
|
|
8
|
+
Load instruments, effects, and plugins into Ableton Live tracks. Every device operation follows one discipline: search first, verify after.
|
|
9
|
+
|
|
10
|
+
## Primary Workflow — Atlas-Driven
|
|
11
|
+
|
|
12
|
+
The device atlas contains 1,305 devices with sonic descriptions, recipes, and recommendations. Always start here:
|
|
13
|
+
|
|
14
|
+
1. **Discover:** `atlas_search(query)` — find devices by name, sound character, or genre
|
|
15
|
+
2. **Learn:** `atlas_device_info(device_id)` — full parameters, recipes, gotchas, pairings
|
|
16
|
+
3. **Suggest:** `atlas_suggest(intent, genre)` — "I need a warm pad" → ranked device+recipe combos
|
|
17
|
+
4. **Chain:** `atlas_chain_suggest(role, genre)` — full device chain for a track role (instrument + effects)
|
|
18
|
+
5. **Load:** Use the URI from atlas results → `load_browser_item(uri)` or `find_and_load_device(name)`
|
|
19
|
+
6. **Recipe:** Apply starter recipe params → `batch_set_parameters(params)` from the atlas entry
|
|
20
|
+
7. **Verify:** `get_device_info(track_index, device_index)` — check health flags
|
|
21
|
+
|
|
22
|
+
If the atlas doesn't have a device (newly installed plugin, user sample), fall back to the browser workflow below.
|
|
23
|
+
|
|
24
|
+
## Browser Workflow — The Fallback Path
|
|
25
|
+
|
|
26
|
+
Use the browser workflow when the atlas doesn't have what you need:
|
|
27
|
+
|
|
28
|
+
1. **Search:** `search_browser(path, name_filter)` — returns a list of matching items with exact URIs
|
|
29
|
+
2. **Inspect:** Read the results. Confirm the item name, type, and path match what you need
|
|
30
|
+
3. **Load:** `load_browser_item(uri)` — pass the exact URI string from search results
|
|
31
|
+
|
|
32
|
+
Common search paths:
|
|
33
|
+
- `path="Instruments"` — synths, samplers, instrument racks
|
|
34
|
+
- `path="Drums"` — drum racks, drum kits, percussion
|
|
35
|
+
- `path="Audio Effects"` — reverb, delay, compressor, EQ, saturator
|
|
36
|
+
- `path="MIDI Effects"` — arpeggiator, chord, scale, random
|
|
37
|
+
- `path="Sounds"` — preset sounds organized by category
|
|
38
|
+
- `path="Samples"` — audio samples, one-shots, loops
|
|
39
|
+
|
|
40
|
+
Combine path with `name_filter` to narrow results. Example: `search_browser(path="Drums", name_filter="808 Kit")`.
|
|
41
|
+
|
|
42
|
+
NEVER invent device or preset names. A hallucinated name like "echomorph-hpf" or "Drift Pad Wonk" will crash the load. Always search first, then use the exact URI from results.
|
|
43
|
+
|
|
44
|
+
For the full URI grammar reference (the three forms — FileId, bare-name, path-style — failure modes, and discovery recipe), see `references/load_browser_item-uri-grammar.md`.
|
|
45
|
+
|
|
46
|
+
## find_and_load_device — The Shortcut
|
|
47
|
+
|
|
48
|
+
Use `find_and_load_device(name)` ONLY for these simple built-in effects:
|
|
49
|
+
- "Reverb"
|
|
50
|
+
- "Delay"
|
|
51
|
+
- "Compressor"
|
|
52
|
+
- "EQ Eight"
|
|
53
|
+
- "Saturator"
|
|
54
|
+
- "Utility"
|
|
55
|
+
|
|
56
|
+
For everything else — instruments, racks, presets, AU/VST plugins — use the browser workflow. The shortcut matches greedily and can load a sample file instead of a synth when names overlap (e.g., "Drift" matches "Synth Bass Drift Pad Wonk Bass.wav" before the Drift synthesizer).
|
|
57
|
+
|
|
58
|
+
## Plugin Health Verification
|
|
59
|
+
|
|
60
|
+
After loading any device, verify it actually works:
|
|
61
|
+
|
|
62
|
+
1. Call `get_device_info(track_index, device_index)` on the newly loaded device
|
|
63
|
+
2. Check `parameter_count` — if the device is an AU/VST plugin (`class_name` contains "PluginDevice") and `parameter_count` is 1 or less, the plugin is dead. The shell loaded but the DSP engine crashed.
|
|
64
|
+
3. Check `health_flags` for `opaque_or_failed_plugin` (dead or untweakable AU/VST) or `sample_dependent` (needs source audio)
|
|
65
|
+
4. Check `plugin_host_status` and `mcp_sound_design_ready`
|
|
66
|
+
5. If `mcp_sound_design_ready` is `false`: delete the device with `delete_device`, replace it with a native Ableton alternative, and report the failure to the user
|
|
67
|
+
|
|
68
|
+
Dead plugin recovery pattern:
|
|
69
|
+
```
|
|
70
|
+
get_device_info → parameter_count <= 1 on PluginDevice?
|
|
71
|
+
→ delete_device(track_index, device_index)
|
|
72
|
+
→ search_browser for native alternative
|
|
73
|
+
→ load_browser_item with replacement URI
|
|
74
|
+
→ report failure and substitution to user
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Rack Introspection
|
|
78
|
+
|
|
79
|
+
Use `walk_device_tree(track_index)` to see the full nested structure of racks on a track — Instrument Racks, Audio Effect Racks, and Drum Racks with all their chains and sub-devices.
|
|
80
|
+
|
|
81
|
+
Use `get_rack_chains(track_index, device_index)` to inspect individual rack chain contents. For Drum Racks, this reveals which pads have samples loaded and which chains exist. An empty Drum Rack (zero chains) produces silence.
|
|
82
|
+
|
|
83
|
+
Set chain volumes with `set_chain_volume(track_index, device_index, chain_index, volume)` to balance rack layers.
|
|
84
|
+
|
|
85
|
+
## Drum Rack Rule
|
|
86
|
+
|
|
87
|
+
NEVER load a bare "Drum Rack" — it is an empty container with zero chains and produces silence. Always load a kit preset through the browser:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
search_browser(path="Drums", name_filter="Kit")
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Pick a real kit from results: "909 Core Kit", "808 Core Kit", "Boom Bap Kit", "Lo-Fi Kit", etc. These come pre-loaded with samples on their pads.
|
|
94
|
+
|
|
95
|
+
After loading any Drum Rack preset, verify with `get_rack_chains` that chains exist and have named pads like "Bass Drum", "Snare", "Hi-Hat".
|
|
96
|
+
|
|
97
|
+
## Custom Drum Rack Construction (build a kit from one-shots)
|
|
98
|
+
|
|
99
|
+
When the user asks for a custom kit ("build me a minimal-techno kit", "make a Dilla-style boom-bap kit from these samples"), use `add_drum_rack_pad` — NOT repeated `load_browser_item` calls.
|
|
100
|
+
|
|
101
|
+
**Why this matters (BUG-2026-04-22 #1):** Calling `load_browser_item` repeatedly on a track that contains a Drum Rack does NOT add new pads. The first call creates a chain at note 36; every subsequent call REPLACES the existing chain instead of appending to the next pad. After 7 sequential drops you end up with exactly 1 chain — only the last sample. This is a Live API limitation, not something to work around with retry loops.
|
|
102
|
+
|
|
103
|
+
**The canonical workflow:**
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
# 1. Make sure a Drum Rack exists on the track. Either:
|
|
107
|
+
# - Load a preset kit and clear it, or
|
|
108
|
+
# - insert_device(track_index=N, device_name="Drum Rack") for an empty rack
|
|
109
|
+
# 2. For each sample:
|
|
110
|
+
add_drum_rack_pad(
|
|
111
|
+
track_index=N,
|
|
112
|
+
pad_note=36, # 36=Kick, 38=Snare, 42=Closed HH, 46=Open HH
|
|
113
|
+
file_path="/abs/path/to/sample.wav",
|
|
114
|
+
)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`add_drum_rack_pad` does the full atomic build per pad: insert_rack_chain → set_drum_chain_note → insert empty Simpler into the chain → load sample via the native Live 12.4 replace_sample API with nested addressing. Returns `{ok, chain_index, pad_note, nested_device_index}` so you can verify and chain further calls.
|
|
118
|
+
|
|
119
|
+
Requires Live 12.4+ (uses native nested-sample loading). On older versions returns an error directing the caller to the legacy separate-tracks workaround.
|
|
120
|
+
|
|
121
|
+
For nested-Simpler operations on existing pads (e.g., adjust loop points after the kit is built), `replace_simpler_sample` and `load_sample_to_simpler` accept `chain_index` and `nested_device_index` for explicit deep addressing.
|
|
122
|
+
|
|
123
|
+
## Sample-Dependent Devices
|
|
124
|
+
|
|
125
|
+
These devices load "successfully" with many parameters but produce zero audio without source material. Since MCP tools cannot load samples into third-party plugin UIs, NEVER use these as standalone instruments:
|
|
126
|
+
|
|
127
|
+
- **Granular synths:** iDensity, Tardigrain, Koala Sampler, Burns Audio Granular
|
|
128
|
+
- **Bare samplers:** Simpler (empty), Sampler (empty) — always load a preset, never the empty shell
|
|
129
|
+
- **Sample players:** AudioLayer, sEGments
|
|
130
|
+
|
|
131
|
+
Use self-contained synthesizers instead — these produce sound immediately from MIDI input alone:
|
|
132
|
+
- **Wavetable** — versatile wavetable synthesis
|
|
133
|
+
- **Operator** — FM synthesis, 4 operators
|
|
134
|
+
- **Drift** — analog-modeled, warm and organic
|
|
135
|
+
- **Analog** — subtractive analog modeling
|
|
136
|
+
- **Meld** — MPE-ready, two engines
|
|
137
|
+
- **Collision** — physical modeling, mallet/resonator
|
|
138
|
+
- **Tension** — physical modeling, string/exciter
|
|
139
|
+
|
|
140
|
+
If granular textures are needed: use Wavetable with aggressive wavetable position modulation, Operator with FM feedback and short envelopes, or load a Simpler/Sampler **preset** (not the bare instrument) from the Sounds browser.
|
|
141
|
+
|
|
142
|
+
## Simpler Operations
|
|
143
|
+
|
|
144
|
+
For Simpler devices that already have samples loaded:
|
|
145
|
+
|
|
146
|
+
- `load_sample_to_simpler(track_index, device_index, file_path)` — load audio into Simpler
|
|
147
|
+
- `replace_simpler_sample(track_index, device_index, file_path)` — swap the current sample. Only works on Simplers that already have a sample loaded.
|
|
148
|
+
- `crop_simpler(track_index, device_index)` — trim sample to current start/end points
|
|
149
|
+
- `reverse_simpler(track_index, device_index)` — reverse the loaded sample
|
|
150
|
+
- `get_simpler_slices(track_index, device_index)` — retrieve auto-detected slice points (Slice mode)
|
|
151
|
+
- `set_simpler_playback_mode(track_index, device_index, playback_mode)` — switch modes: 0=Classic, 1=One-Shot, 2=Slice. Optional: `slice_by` (0=Transient, 1=Beat, 2=Region, 3=Manual), `sensitivity` (0.0-1.0, Transient only)
|
|
152
|
+
- `warp_simpler(track_index, device_index, beats)` — warp sample to fit N beats
|
|
153
|
+
|
|
154
|
+
### Slice Workflow
|
|
155
|
+
|
|
156
|
+
For slice-based production, use `plan_slice_workflow`:
|
|
157
|
+
1. `plan_slice_workflow(file_path=..., intent="rhythm")` — generates a complete workflow with Simpler setup, slice mapping, and MIDI notes
|
|
158
|
+
2. Intents: `rhythm`, `hook`, `texture`, `percussion`, `melodic`
|
|
159
|
+
3. The tool returns a step-by-step plan — execute each tool call in sequence
|
|
160
|
+
|
|
161
|
+
Manual slice workflow: load sample → `set_simpler_playback_mode(playback_mode=2)` → `get_simpler_slices` → program MIDI notes targeting slice indices (C3 = slice 0, C#3 = slice 1, etc.)
|
|
162
|
+
|
|
163
|
+
### New Device Operations (12.3+)
|
|
164
|
+
|
|
165
|
+
- `insert_device(track_index, device_name)` — insert native device by name (10x faster than browser, 12.3+)
|
|
166
|
+
- `insert_rack_chain(track_index, device_index)` — add chain to Instrument/Audio/Drum Rack
|
|
167
|
+
- `set_drum_chain_note(track_index, device_index, chain_index, note)` — assign MIDI note to Drum Rack chain
|
|
168
|
+
- `add_drum_rack_pad(track_index, pad_note, file_path)` — atomic single-pad build (chain + note + Simpler + sample). 12.4+. Use this for custom kit construction; see the "Custom Drum Rack Construction" section above.
|
|
169
|
+
- `move_device(track_index, device_index, new_index)` — reorder devices on a track
|
|
170
|
+
|
|
171
|
+
### Plugin Deep Control
|
|
172
|
+
|
|
173
|
+
- `get_plugin_parameters(track_index, device_index)` — all AU/VST plugin parameters
|
|
174
|
+
- `map_plugin_parameter(track_index, device_index, parameter_index)` — map for automation
|
|
175
|
+
- `get_plugin_presets(track_index, device_index)` — list plugin presets
|
|
176
|
+
|
|
177
|
+
## Parameter Name Quirks (BUG-2026-04-22 #10)
|
|
178
|
+
|
|
179
|
+
Ableton's parameter names are inconsistent across devices. When `set_device_parameter` or `batch_set_parameters` errors with "Parameter 'X' not found," the response already lists the first 20 available names — read it and pick the right one. Common surprises:
|
|
180
|
+
|
|
181
|
+
| You'd expect | Actual name | Where |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| `Width` | `Stereo Width` | Utility |
|
|
184
|
+
| `Cutoff` | `Filter Freq` / `Frequency` | Various filters — check per-device |
|
|
185
|
+
| `Resonance` | `Filter Resonance` / `Q` | Same |
|
|
186
|
+
| `Drive` | `Drive` (Saturator) but `Drive Amount` (some racks) | Saturator vs racks |
|
|
187
|
+
| `Mix` | `Dry/Wet` | Almost every native effect |
|
|
188
|
+
| `Volume` | `Volume` (mixer) but `Sample Volume` / `Out Volume` | On certain devices |
|
|
189
|
+
|
|
190
|
+
When in doubt, call `get_device_parameters(track_index, device_index)` first — it returns the exact `name` of every parameter and the `name` field is what `set_device_parameter` accepts.
|
|
191
|
+
|
|
192
|
+
## Effect Chain Best Practices
|
|
193
|
+
|
|
194
|
+
After loading any effect, verify its key parameters are not at pass-through defaults:
|
|
195
|
+
- **Reverb:** `Dry/Wet` should be > 0 (typically 20-40% for subtle, 60-100% for creative)
|
|
196
|
+
- **Delay:** `Dry/Wet` > 0, `Feedback` set appropriately
|
|
197
|
+
- **Compressor:** `Threshold` below signal level, `Ratio` > 1:1
|
|
198
|
+
- **EQ Eight:** At least one band with non-zero gain
|
|
199
|
+
- **Saturator:** `Drive` > 0 dB
|
|
200
|
+
- **Utility:** `Gain` at target value, `Width` as needed
|
|
201
|
+
|
|
202
|
+
Use `get_device_parameters` to read current values, then `set_device_parameter` or `batch_set_parameters` to configure. Use `toggle_device` to bypass/enable devices for A/B comparison.
|
|
203
|
+
|
|
204
|
+
## Device Presets
|
|
205
|
+
|
|
206
|
+
- `get_device_presets(track_index, device_index)` — list available presets for the loaded device
|
|
207
|
+
- `get_plugin_parameters(track_index, device_index)` — see all AU/VST plugin parameters
|
|
208
|
+
- `get_plugin_presets(track_index, device_index)` — list presets for AU/VST plugins
|
|
209
|
+
- `map_plugin_parameter(track_index, device_index, parameter_index)` — map a plugin parameter for automation
|
|
210
|
+
|
|
211
|
+
## Device Atlas Reference
|
|
212
|
+
|
|
213
|
+
Consult `references/device-atlas/` in the livepilot-core skill for the full corpus of 280+ instruments, 139 drum kits, and 350+ impulse responses. The atlas contains real browser URIs, preset names, and sonic descriptions. Use it as your lookup table before loading any device — never guess a name that is not in the atlas or in browser search results.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# `load_browser_item` URI Grammar
|
|
2
|
+
|
|
3
|
+
> Reference for the URI strings accepted by `load_browser_item(track_index, uri, ...)`.
|
|
4
|
+
> Resolves the BUG-2026-04-22 #14 friction (URI format was undocumented and required reverse-engineering).
|
|
5
|
+
|
|
6
|
+
## TL;DR
|
|
7
|
+
|
|
8
|
+
URIs are produced by `search_browser` / `get_browser_items` / `get_browser_tree` — never invent them by hand. The format is `query:<Top-Level-Folder>#<Item-Identifier>`. Three known forms in the wild:
|
|
9
|
+
|
|
10
|
+
| Form | Example | When you'll see it |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| **File ID** | `query:Drums#FileId_29738` | Browser items that resolve to a file in Live's installed packs (samples, presets, kits). The numeric FileId is stable across sessions on the same machine. |
|
|
13
|
+
| **Bare name** | `query:Synths#Operator` | Native devices and effects whose name is unique within the folder. Most built-in instruments. |
|
|
14
|
+
| **Path-like** | `query:UserLibrary#Samples:Splice:Filename.wav` | Items inside the User Library or other deep folder paths. The fragment uses `:` as a path separator within the URI's hash. |
|
|
15
|
+
|
|
16
|
+
## Discovery recipe
|
|
17
|
+
|
|
18
|
+
You almost never need to construct a URI from scratch. Always:
|
|
19
|
+
|
|
20
|
+
1. **Search:** `search_browser(path="Drums", name_filter="909 Core")` — returns each match with its exact `uri` field.
|
|
21
|
+
2. **Or browse:** `get_browser_tree()` for the top-level structure; `get_browser_items(path="Drums")` to drill down. Items include their URI.
|
|
22
|
+
3. **Use the URI verbatim:** pass the exact string from the result to `load_browser_item(uri=...)`. Do not modify, normalize, or reconstruct it.
|
|
23
|
+
|
|
24
|
+
## Why three forms exist
|
|
25
|
+
|
|
26
|
+
Live's browser is backed by multiple resolvers under the hood:
|
|
27
|
+
|
|
28
|
+
- **Pack content** is keyed by an internal FileId from a per-machine SQLite index — fast lookup, opaque names.
|
|
29
|
+
- **Native devices** are addressed by their stable English class name within their folder.
|
|
30
|
+
- **User Library / Samples** items use a path-style fragment because they're filesystem-rooted, not pack-indexed.
|
|
31
|
+
|
|
32
|
+
The URI you receive from search/browse already has the correct form for that item — there is no "preferred" or "canonical" form, only "the one Live's browser knows."
|
|
33
|
+
|
|
34
|
+
## What goes wrong if you guess
|
|
35
|
+
|
|
36
|
+
- **Guessed FileId**: silently fails or loads the wrong sample.
|
|
37
|
+
- **Guessed bare name** for a non-unique item: loads whatever Live's matcher hits first (e.g., `query:Synths#Drift` may match a `Drift Pad Wonk Bass.wav` sample before the `Drift` synth — see the `find_and_load_device` warning in `livepilot-devices` SKILL).
|
|
38
|
+
- **Path with wrong separator** (using `/` instead of `:`): URI parses but resolves to nothing.
|
|
39
|
+
- **Stale FileId** copied from a different machine: stale FileIds aren't portable.
|
|
40
|
+
|
|
41
|
+
## Top-level folders (current Live 12.4)
|
|
42
|
+
|
|
43
|
+
| Folder | Typical content |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `Sounds` | Genre-organized presets across all native synths |
|
|
46
|
+
| `Drums` | Drum Racks, drum kits, percussion one-shots |
|
|
47
|
+
| `Instruments` | Synths, samplers, instrument racks (top-level entries) |
|
|
48
|
+
| `Audio Effects` | Reverb, delay, compressor, EQ, saturator, etc. |
|
|
49
|
+
| `MIDI Effects` | Arpeggiator, chord, scale, random, MPE Tools |
|
|
50
|
+
| `Max for Live` | Native + installed M4L devices |
|
|
51
|
+
| `Plug-ins` | Installed AU/VST plugins |
|
|
52
|
+
| `Clips` | Sample loops + MIDI clips that ship with packs |
|
|
53
|
+
| `Samples` | The big one — ~22,000 individual audio files |
|
|
54
|
+
| `Packs` | Pack-level entries that resolve to internal preset/sample lists |
|
|
55
|
+
| `User Library` | Your personal saved devices, racks, samples, sets |
|
|
56
|
+
| `Current Project` | Items in the current Live set's project folder |
|
|
57
|
+
|
|
58
|
+
## Behaviour after load (BUG-2026-04-22 #16)
|
|
59
|
+
|
|
60
|
+
`load_browser_item` is context-dependent — same URI, different result:
|
|
61
|
+
|
|
62
|
+
- **Empty track:** creates a Simpler with the sample loaded (instruments load directly).
|
|
63
|
+
- **Track with an instrument already:** drops the new device after the existing one (Live's "load to selected" behavior).
|
|
64
|
+
- **Track with a Drum Rack:** the FIRST `load_browser_item` of a sample creates a chain on note 36; **every subsequent call REPLACES that chain** instead of appending to the next pad. To build a kit pad-by-pad, use `add_drum_rack_pad(track_index, pad_note, file_path)` instead — it does the chain + note + Simpler + sample sequence atomically per pad.
|
|
65
|
+
|
|
66
|
+
See the "Custom Drum Rack Construction" section in `livepilot-devices` SKILL for the canonical kit-build flow.
|
|
67
|
+
|
|
68
|
+
## Role-aware defaults (BUG-2026-04-22 #17 + #18)
|
|
69
|
+
|
|
70
|
+
`load_browser_item(role=...)` applies post-load Simpler defaults so the loaded sample plays correctly without per-bug-memory hand-tweaking:
|
|
71
|
+
|
|
72
|
+
| Role | Snap | Volume | Trigger Mode | Root note |
|
|
73
|
+
|---|---|---|---|---|
|
|
74
|
+
| `"drum"` | 0 | 0 dB | 0 (Trigger / one-shot) | C1 (36) |
|
|
75
|
+
| `"melodic"` | 1 | 0 dB | 1 (Gate / held) | C3 (60) |
|
|
76
|
+
| `"texture"` | 0 | -6 dB | 1 (Gate) | C3 (60) |
|
|
77
|
+
|
|
78
|
+
Omit `role` to keep Live's raw defaults (Volume=-12 dB, Snap=1, root=C3). Useful when loading a non-Simpler device or when you want the legacy behavior.
|
|
79
|
+
|
|
80
|
+
## Trigger Mode polarity (BUG-2026-04-22 #9)
|
|
81
|
+
|
|
82
|
+
Reverse from intuition: `Trigger Mode value=0` is **Trigger** (one-shot), `value=1` is **Gate** (held). The `role="drum"` default sets it to 0, the others to 1.
|