@mthines/reaper-mcp 0.19.0 → 0.70.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.
Files changed (116) hide show
  1. package/README.md +19 -570
  2. package/bridge-ui/mcp_bridge.html +129 -0
  3. package/bridge-ui/mcp_bridge.webmanifest +16 -0
  4. package/bridge-ui/mcp_bridge_icon_192.png +0 -0
  5. package/bridge-ui/mcp_bridge_icon_512.png +0 -0
  6. package/bridge-ui/mcp_bridge_sw.js +35 -0
  7. package/claude/agents/plugin-researcher.md +188 -0
  8. package/claude/knowledge/reference/aesthetics-scoring.md +48 -0
  9. package/{knowledge → claude/knowledge}/reference/common-mistakes.md +1 -1
  10. package/claude/knowledge/reference/lorekit-setup.md +36 -0
  11. package/claude/knowledge/reference/memory-protocol.md +377 -0
  12. package/{knowledge → claude/knowledge}/reference/metering.md +5 -5
  13. package/claude/knowledge/reference/perceived-loudness.md +182 -0
  14. package/{knowledge → claude/knowledge}/workflows/editing.md +4 -0
  15. package/{knowledge → claude/knowledge}/workflows/gain-staging.md +21 -23
  16. package/{knowledge → claude/knowledge}/workflows/learn-plugin.md +15 -48
  17. package/{knowledge → claude/knowledge}/workflows/master-bus.md +13 -1
  18. package/claude/knowledge/workflows/section-levels.md +138 -0
  19. package/{knowledge → claude/knowledge}/workflows/session-prep.md +4 -0
  20. package/claude/knowledge/workflows/transient-lighting.md +52 -0
  21. package/claude/skills/critique/SKILL.md +131 -0
  22. package/claude/skills/editing/SKILL.md +281 -0
  23. package/claude/skills/learn-plugin/SKILL.md +210 -0
  24. package/claude/skills/mastering/SKILL.md +151 -0
  25. package/claude/skills/mix-memory/SKILL.md +140 -0
  26. package/claude/skills/mixer/SKILL.md +253 -0
  27. package/claude/skills/new-extension/SKILL.md +324 -0
  28. package/main.js +7843 -1940
  29. package/package.json +17 -15
  30. package/reaper/CLAUDE.md +22 -4
  31. package/reaper/mcp_actions_lib.lua +375 -0
  32. package/reaper/mcp_analyzer.jsfx +27 -12
  33. package/reaper/mcp_arrange_lib.lua +949 -0
  34. package/reaper/mcp_bridge.lua +2321 -758
  35. package/reaper/mcp_edit_views_lib.lua +1378 -0
  36. package/reaper/mcp_envelopes_lib.lua +748 -0
  37. package/reaper/mcp_extensions_lib.lua +55 -0
  38. package/reaper/mcp_fxstate_lib.lua +144 -0
  39. package/reaper/mcp_gain_trace.jsfx +126 -0
  40. package/reaper/mcp_items_lib.lua +877 -0
  41. package/reaper/mcp_lufs_meter.jsfx +16 -13
  42. package/reaper/mcp_midi_lib.lua +555 -0
  43. package/reaper/mcp_mixing_lib.lua +1021 -0
  44. package/reaper/mcp_plan_lib.lua +801 -0
  45. package/reaper/mcp_prefs_lib.lua +127 -0
  46. package/reaper/mcp_project_lib.lua +1088 -0
  47. package/reaper/mcp_recording_lib.lua +595 -0
  48. package/reaper/mcp_render_lib.lua +492 -0
  49. package/reaper/mcp_snapshot_lib.lua +547 -120
  50. package/reaper/mcp_snapshot_next.lua +10 -4
  51. package/reaper/mcp_snapshot_prev.lua +11 -4
  52. package/reaper/mcp_snapshot_quick_save.lua +7 -32
  53. package/reaper/mcp_snapshots_ui_lib.lua +258 -0
  54. package/reaper/mcp_tracks_lib.lua +409 -0
  55. package/sidecar/analysis.py +661 -0
  56. package/sidecar/chords.py +96 -0
  57. package/sidecar/mixcheck.py +295 -0
  58. package/sidecar/requirements-chords.txt +6 -0
  59. package/sidecar/requirements-separation.txt +3 -0
  60. package/sidecar/requirements.txt +17 -0
  61. package/sidecar/separation.py +142 -0
  62. package/sidecar/server.py +622 -0
  63. package/sidecar/tests/test_analysis.py +249 -0
  64. package/sidecar/tests/test_chords.py +117 -0
  65. package/sidecar/tests/test_mixcheck.py +163 -0
  66. package/sidecar/tests/test_separation.py +73 -0
  67. package/sidecar/tests/test_server.py +464 -0
  68. package/sidecar/tests/test_verify.py +243 -0
  69. package/sidecar/tests/test_voice_render.py +268 -0
  70. package/sidecar/tests/test_voice_sketch.py +140 -0
  71. package/sidecar/verify.py +224 -0
  72. package/sidecar/voice_render.py +295 -0
  73. package/sidecar/voice_sketch.py +280 -0
  74. package/claude-agents/critique.md +0 -147
  75. package/claude-agents/editor.md +0 -184
  76. package/claude-agents/levels.md +0 -107
  77. package/claude-agents/mastering.md +0 -129
  78. package/claude-agents/mixer.md +0 -248
  79. package/claude-agents/preflight.md +0 -149
  80. package/claude-agents/producer.md +0 -159
  81. package/claude-agents/setup.md +0 -150
  82. package/claude-agents/stems.md +0 -135
  83. package/claude-rules/architecture.md +0 -39
  84. package/claude-rules/development.md +0 -54
  85. package/claude-rules/lua-bridge.md +0 -50
  86. package/claude-rules/testing.md +0 -42
  87. package/claude-skills/learn-plugin.md +0 -123
  88. package/knowledge/CLAUDE.md +0 -71
  89. package/knowledge/plugins/_template.md +0 -82
  90. package/knowledge/plugins/fabfilter/pro-c-2.md +0 -117
  91. package/knowledge/plugins/fabfilter/pro-l-2.md +0 -95
  92. package/knowledge/plugins/fabfilter/pro-q-3.md +0 -112
  93. package/knowledge/plugins/neural-dsp/helix-native.md +0 -104
  94. package/knowledge/plugins/stock-reaper/js-1175-compressor.md +0 -94
  95. package/knowledge/plugins/stock-reaper/rea-comp.md +0 -100
  96. package/knowledge/plugins/stock-reaper/rea-delay.md +0 -95
  97. package/knowledge/plugins/stock-reaper/rea-eq.md +0 -103
  98. package/knowledge/plugins/stock-reaper/rea-gate.md +0 -99
  99. package/knowledge/plugins/stock-reaper/rea-limit.md +0 -75
  100. package/knowledge/plugins/stock-reaper/rea-verb.md +0 -76
  101. package/knowledge/reference/perceived-loudness.md +0 -122
  102. package/reaper/mcp_snapshot_manager.lua +0 -1001
  103. /package/{knowledge → claude/knowledge}/genres/_template.md +0 -0
  104. /package/{knowledge → claude/knowledge}/genres/electronic.md +0 -0
  105. /package/{knowledge → claude/knowledge}/genres/hip-hop.md +0 -0
  106. /package/{knowledge → claude/knowledge}/genres/metal.md +0 -0
  107. /package/{knowledge → claude/knowledge}/genres/orchestral.md +0 -0
  108. /package/{knowledge → claude/knowledge}/genres/pop.md +0 -0
  109. /package/{knowledge → claude/knowledge}/genres/rock.md +0 -0
  110. /package/{knowledge → claude/knowledge}/reference/compression.md +0 -0
  111. /package/{knowledge → claude/knowledge}/reference/frequencies.md +0 -0
  112. /package/{knowledge → claude/knowledge}/workflows/delivery.md +0 -0
  113. /package/{knowledge → claude/knowledge}/workflows/drum-bus.md +0 -0
  114. /package/{knowledge → claude/knowledge}/workflows/low-end.md +0 -0
  115. /package/{knowledge → claude/knowledge}/workflows/stem-prep.md +0 -0
  116. /package/{knowledge → claude/knowledge}/workflows/vocal-chain.md +0 -0
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "REAPER MCP Bridge",
3
+ "short_name": "MCP Bridge",
4
+ "description": "Live status and command log for the reaper-mcp bridge",
5
+ "id": "/mcp_bridge.html",
6
+ "start_url": "/mcp_bridge.html?app",
7
+ "scope": "/mcp_bridge",
8
+ "display": "standalone",
9
+ "background_color": "#0e0f11",
10
+ "theme_color": "#0e0f11",
11
+ "icons": [
12
+ { "src": "/mcp_bridge_icon_192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
13
+ { "src": "/mcp_bridge_icon_512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
14
+ { "src": "/mcp_bridge_icon_512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
15
+ ]
16
+ }
@@ -0,0 +1,35 @@
1
+ // Service worker for the installable bridge status page (scope: /mcp_bridge*).
2
+ // Network-first for the app shell so updates land immediately; the cached copy lets the
3
+ // installed app open while REAPER is closed and show its "Can't reach REAPER" state.
4
+ // REAPER's /_/ command API is outside the scope and never touched.
5
+ const CACHE = 'mcp-bridge-v2';
6
+ const SHELL = ['/mcp_bridge.html', '/mcp_bridge.webmanifest', '/mcp_bridge_icon_192.png', '/mcp_bridge_icon_512.png'];
7
+
8
+ self.addEventListener('install', (event) => {
9
+ event.waitUntil(caches.open(CACHE).then((cache) => cache.addAll(SHELL)).then(() => self.skipWaiting()));
10
+ });
11
+
12
+ self.addEventListener('activate', (event) => {
13
+ event.waitUntil(
14
+ caches
15
+ .keys()
16
+ .then((keys) => Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k))))
17
+ .then(() => self.clients.claim()),
18
+ );
19
+ });
20
+
21
+ self.addEventListener('fetch', (event) => {
22
+ const url = new URL(event.request.url);
23
+ if (event.request.method !== 'GET' || url.origin !== location.origin || !url.pathname.startsWith('/mcp_bridge')) return;
24
+ event.respondWith(
25
+ fetch(event.request)
26
+ .then((res) => {
27
+ if (res.ok) {
28
+ const copy = res.clone();
29
+ caches.open(CACHE).then((cache) => cache.put(url.pathname, copy));
30
+ }
31
+ return res;
32
+ })
33
+ .catch(() => caches.match(url.pathname).then((hit) => hit ?? Response.error())),
34
+ );
35
+ });
@@ -0,0 +1,188 @@
1
+ ---
2
+ name: plugin-researcher
3
+ description: Researches one REAPER plugin on its own — web research, then loading it on a scratch track and probing its parameters — and writes its plugin knowledge record to LoreKit (`user::plugins::<vendor>/<plugin>`). Returns a short report plus only the questions it could not answer itself. Dispatched by /learn-plugin, and by /mixer and /mastering to bootstrap a plugin they don't know.
4
+ ---
5
+
6
+ # Plugin Researcher
7
+
8
+ You research **one** plugin and write its plugin knowledge record to LoreKit
9
+ without asking anybody anything. You run in the background: you cannot ask the
10
+ user questions. Anything you cannot work out yourself goes back as an open
11
+ question in your report.
12
+
13
+ The record shape, tags, field guide and write call are in the **Plugin
14
+ knowledge** section of `memory-protocol.md`. Read that section first. It is at
15
+ `~/.claude/knowledge/reference/memory-protocol.md` (in the repo:
16
+ `knowledge/reference/memory-protocol.md`). Follow it exactly. Write only the
17
+ `user::` key, never a built-in `plugins::` key.
18
+
19
+ Your input is a plugin name, and sometimes context from the caller (what it will
20
+ be used for, the user's own notes). Treat context from the caller as facts the
21
+ user gave and prefer them over your research.
22
+
23
+ ## Step 1 — Find what's already known
24
+
25
+ 1. `get_builtin_knowledge { key: "plugins::<vendor>/<plugin>" }` and
26
+ `memory.read { scope: "project::reaper-mcp", key: "user::plugins::<vendor>/<plugin>" }`.
27
+ If you're not sure of the slug, look for the plugin's name in the `fx::` tags
28
+ (`list_builtin_knowledge { kind: "plugins", limit: 100 }`,
29
+ `memory.list { scope: "project::reaper-mcp", tags: ["plugin-knowledge"], view: "summary", limit: 100 }`).
30
+ 2. If a record already exists, you are **refining** it, not starting over. Keep
31
+ its `## Learned notes`, its kept settings and anything the user wrote. Fill
32
+ in the gaps and add what you verify.
33
+
34
+ ## Step 2 — Identify it in REAPER
35
+
36
+ `search_fx` with the plugin name (then `list_available_fx` if the search finds
37
+ nothing). From the results:
38
+
39
+ - **Matches FX:** every exact FX-browser name of this plugin (VST3, VST, AU,
40
+ CLAP), plus a short form for the `fx::` tags.
41
+ - **Vendor:** from the name in brackets, e.g. `VST3: Pro-Q 3 (FabFilter)`.
42
+ - If several versions are installed, inspect the one REAPER would pick first:
43
+ VST3 before VST, VST before AU.
44
+
45
+ Not installed, or the bridge is down (`get_project_info` fails)? Write a
46
+ research-only record. Leave `## Learned notes` out and say why in the report.
47
+
48
+ ## Step 3 — Research the web
49
+
50
+ Use `WebSearch` / `WebFetch`, in this order: the manufacturer's manual or
51
+ product page, then the vendor's own tutorials, then well-known reviews or
52
+ mixing articles. Collect:
53
+
54
+ - what it is and what it models (category, style, sonic character)
55
+ - what each main control does, with its range and unit
56
+ - typical starting settings for common sources (vocal, kick, bass, bus, master)
57
+ - factory presets worth knowing
58
+ - known quirks (latency, oversampling modes, CPU cost, auto-gain)
59
+ - what it is usually picked over, and why
60
+
61
+ Keep the source URLs for the report. Don't present your own guesses as facts
62
+ from a source. If you inferred something, say so in the report.
63
+
64
+ ## Step 4 — Test it in REAPER
65
+
66
+ **Does an extension drive this plugin?** Before probing host parameters, call
67
+ `list_tool_categories` and look for a category named after the plugin (for example
68
+ `vital`), or `reaper-mcp extension list` via Bash. If there is one, its `read_*`
69
+ tool shows the plugin's real structure (oscillators, wavetables, modulation, effects)
70
+ far better than 0/0.25/0.5/0.75/1 probes can: use it on the scratch track, record
71
+ what it returns in `## Learned notes` (setting names, raw scales, enums), tag the
72
+ record `extension::<name>`, and probe host parameters only for what it doesn't cover.
73
+ No extension, and the plugin keeps most of its sound in internal state (wavetables, a
74
+ mod matrix, patch graphs the host parameters don't expose): say so in the report as
75
+ an open question, with `reaper-mcp extension new <name>` as the way to add one.
76
+
77
+ This is ground truth for **this** build. It beats the web wherever the two
78
+ disagree.
79
+
80
+ **Use a scratch track only.** Never add the plugin to the user's tracks, and
81
+ never change their tracks, FX, selection or transport. Don't start playback
82
+ (that would play their project out loud).
83
+
84
+ Other researchers may be running at the same time on the same project, each
85
+ with its own scratch track. So:
86
+
87
+ - Name your track `[MCP] plugin-research <TAG>`, where `<TAG>` is a short
88
+ uppercase form of the plugin name (e.g. `PROQ4`). Use the tag the caller
89
+ gives you, if any.
90
+ - Track indexes shift while other researchers add and delete their tracks.
91
+ Write by your exact track name (`run_plan` targets accept names). Before
92
+ every index-only call, `list_tracks` for your track's current index, and
93
+ check that the `fxName` in each result is your plugin; discard a result that
94
+ isn't.
95
+ - Never touch another `[MCP] plugin-research …` track, and ignore them when you
96
+ check that nothing else changed.
97
+ - Under load the bridge can be slow: retry a timed-out call once.
98
+
99
+ 1. `add_track { name: "[MCP] plugin-research <TAG>" }` at the end of the track
100
+ list. Then `add_fx` the exact FX name from Step 2 on it. (`run_plan` with
101
+ `add_track` + `add_fx` does both in one undo step.)
102
+ 2. `get_fx_parameters` (all params): the real parameter names and indices,
103
+ their defaults, and their formatted values. Note the param count, and which
104
+ params are bypass/wet/delta/internal.
105
+ 3. **Probe the key parameters**, at most about 12 (the ones a mixer actually
106
+ turns). For each one: `set_fx_parameter` to 0, 0.25, 0.5, 0.75 and 1, read
107
+ the formatted value back with `get_fx_parameters`, and work out the mapping
108
+ (linear, log frequency, stepped/enum with its option list, inverted).
109
+ Afterwards put the default back. For a stepped parameter, list every option
110
+ with the normalized value that picks it.
111
+ 4. `get_fx_preset_list`: the factory presets, as names. A list over 256
112
+ comes back `truncated` (generic program slots); say so in the record.
113
+ 5. **Clean up, always**, even if a step failed: `delete_track` your scratch
114
+ track (look up its current index by name first). Then `list_tracks` to
115
+ check it's gone and nothing else changed. If
116
+ the delete fails, report it as the first line of your report.
117
+
118
+ ## Step 5 — Build and write the record
119
+
120
+ Build the record in the protocol's shape:
121
+
122
+ - **Header:** category and style from research. Vendor from the FX name.
123
+ **Preference:** a proposal from the field guide (30–50 stock/fallback, 55–70
124
+ good third-party, 70–85 go-to, 85–95 industry standard). It is the user's
125
+ taste, so always list it as an open question for them to confirm.
126
+ - `## What it does`, `## Key parameters by name` (exact names from Step 4, with
127
+ ranges from the probes), `## Recommended settings` (one `###` per use case,
128
+ values in the plugin's own units), `## Presets worth knowing`,
129
+ `## When to prefer this`.
130
+ - `## Learned notes`, only with what you verified in Step 4: the param-index
131
+ map, the normalized scaling (with probe → readback), the stepped options, and
132
+ gotchas. No kept settings: those come from real mixes.
133
+
134
+ Merge with the existing `user::` record (Step 1). If only a built-in record
135
+ exists, write an **overlay**: its tags plus only what you add or change. Then
136
+ call `memory.write` with the protocol's tags, `kind: "signal"`, `host: "mixing"`,
137
+ `trigger: "manual"`, `source_agent: "plugin-researcher"` and no `ttl_days`.
138
+
139
+ ## Step 6 — Report (this is all the caller sees)
140
+
141
+ Keep it short. Don't paste the record; the overview below is the readable
142
+ version.
143
+
144
+ ```text
145
+ Wrote user::plugins::<vendor>/<plugin> (<new | refined | overlay on built-in>)
146
+ FX: <exact FX name(s)> Category: <cat> Style: <style> Preference (proposed): <n>
147
+ Verified live: <N> params, <K> probed (<names>) — or: not inspected: <why>
148
+ Sources: <2–4 URLs>
149
+ Open questions:
150
+ 1. <question> — current value in the record: <what you wrote>
151
+ …
152
+
153
+ How it works:
154
+ <the overview, see below>
155
+ ```
156
+
157
+ **The overview** explains the plugin to a musician in plain language, from what
158
+ you researched and verified. Use this structure, about 25–40 lines:
159
+
160
+ 1. **What it is**: one or two sentences on what the plugin does and what it's
161
+ for.
162
+ 2. **The key point**: the one thing that matters most when an agent drives this
163
+ plugin through REAPER. Examples: the tone lives in the plugin's own window
164
+ and isn't a REAPER parameter; a control's scale is surprising; an auto-gain
165
+ that changes how loudness reads.
166
+ 3. **What REAPER can control**: a table with the columns Control | What it does
167
+ | How the mixer uses it. List the controls that matter (group the generic or
168
+ repeated ones), with their real ranges from your probes.
169
+ 4. **Presets**: where they live, and whether `set_fx_preset` can load them.
170
+ 5. **Your setup**: what the caller context told you about how this user runs the
171
+ plugin. Leave the section out if there's none.
172
+ 6. **In practice**: what the mixer can and can't do with the plugin, as a short
173
+ list, and what it has to ask the user for.
174
+
175
+ Only claim what you verified or found in a source. If you never tested the
176
+ plugin in REAPER, say so in "The key point".
177
+
178
+ Ask only what neither research nor testing could settle. Every question says
179
+ what you wrote in its place, so the caller can keep that answer if the user
180
+ skips the question. Typical questions:
181
+
182
+ - preference (always)
183
+ - when the user picks this over their other <category> plugins (their habit; the
184
+ web only says what's typical)
185
+ - the user's own starting settings, if they have any
186
+ - a fact the sources disagree on that testing couldn't settle
187
+
188
+ No open questions besides preference? Say so.
@@ -0,0 +1,48 @@
1
+ # Aesthetics Scoring Reference
2
+
3
+ How to read `analyze_track_aesthetics` (Meta Audiobox Aesthetics, CC-BY 4.0) and how big a difference has to be before it means anything. The numbers below were measured on a real session (a full mix and a solo lead vocal) on 2026-10-29.
4
+
5
+ ## The four scores (0-10)
6
+
7
+ | Score | Measures | Use it to judge a mix change? |
8
+ |-------|----------|-------------------------------|
9
+ | PQ — Production Quality | Clarity, fidelity, balance, technical quality | **Yes** — the main signal |
10
+ | CU — Content Usefulness | How usable the audio is as material | **Yes**, as a second opinion |
11
+ | CE — Content Enjoyment | How enjoyable the content is | No — follows the arrangement, and rises with level |
12
+ | PC — Production Complexity | How many sources / how dense | No — follows the arrangement |
13
+
14
+ ## Noise floor
15
+
16
+ The model itself is deterministic: scoring the same file three times gives identical scores. The noise comes from REAPER renders of the same range not being bit-identical (plugins with internal randomness, modulation, analog modelling).
17
+
18
+ | Clip length | PQ spread over 3 re-renders of the same range |
19
+ |-------------|-----------------------------------------------|
20
+ | 10 s | 0.38 (7.32 / 7.19 / 6.94) |
21
+ | 30 s | 0.04 (6.69 / 6.70 / 6.73) |
22
+
23
+ - Score **30 s clips** (the tool's default). A 10 s clip is too noisy to compare two mix versions.
24
+ - With 30 s clips, treat **PQ differences under ~0.1 as no change**.
25
+ - Sections differ: consecutive 10 s sections of one song ranged PQ 5.76-7.32. Always compare the **same range** before and after a change, never two different sections.
26
+
27
+ ## Level
28
+
29
+ Louder audio does not raise PQ much, but it does raise CE. A fixed vocal clip normalized to different loudnesses:
30
+
31
+ | Loudness | PQ | CE |
32
+ |----------|----|----|
33
+ | -30 LUFS | 7.68 | 5.77 |
34
+ | -18 LUFS | 7.67 | 6.10 |
35
+ | -12 LUFS | 7.64 | 6.15 |
36
+ | -6 LUFS | 7.62 | 6.16 |
37
+
38
+ `analyze_track_aesthetics` normalizes every clip to -18 LUFS before scoring (`normalizeLufs`, default -18; `false` scores the audio as rendered) and reports `inputLufs` and `gainDb`. Keep the default for every A/B so that a version which is only louder does not look better.
39
+
40
+ ## A/B workflow
41
+
42
+ 1. `snapshot_save` the current state.
43
+ 2. `analyze_track_aesthetics` on the master (or the bus) over a representative 30 s range. Note PQ and CU.
44
+ 3. Make the change.
45
+ 4. Score the **same** 30 s range again.
46
+ 5. PQ up by more than ~0.1 → keep. Within ±0.1 → no measurable difference; decide with the other measurements (`analyze_track_offline`) and the user's ears. Down → `snapshot_restore`.
47
+
48
+ The score is one opinion. It does not know the genre or the user's intent; do not overrule a clear user preference with it.
@@ -282,7 +282,7 @@ Each mistake is listed with:
282
282
  - Read mix bus meters across the song: if chorus and verse peak levels are within 1–2 dB of each other, there's no dynamic contrast
283
283
  - The arrangement may be densely filled throughout
284
284
 
285
- **Fix**: Mix engineers create dynamics through level automation, FX density (more reverb in chorus, less in verse), and arrangement guidance (ask the producer if this is intentional). Verse averages 3–6 dB quieter than chorus is a starting point. Adjust automation on the mix bus or main buses to create contrast.
285
+ **Fix**: Mix engineers create dynamics through level automation, FX density (more reverb in chorus, less in verse), and arrangement guidance (ask the producer if this is intentional). Verse averages 3–6 dB quieter than chorus is a starting point. Adjust automation on the mix bus or main buses to create contrast. For one element per section (a vocal, a guitar bus), use pooled automation items on its Volume envelope, one pool per section type, never item gain: see `workflows/section-levels.md`.
286
286
 
287
287
  ---
288
288
 
@@ -0,0 +1,36 @@
1
+ # Connecting LoreKit (so the mix skills can remember)
2
+
3
+ Read this when a skill needs LoreKit and the `memory.*` tools are not there. The person
4
+ you are talking to is most likely a musician, not a developer: use plain words, one step
5
+ at a time, and never paste commands without saying what they do.
6
+
7
+ ## What it is, in one breath
8
+
9
+ LoreKit is a free memory for AI assistants. With it connected, the mixer remembers every
10
+ plugin it has learned and every correction you gave it, in every project. Without it,
11
+ everything still works, it just starts from zero each session. The built-in plugin
12
+ library needs no account.
13
+
14
+ ## How to tell if it is connected
15
+
16
+ The tools whose names start with `memory.` (or `mcp__lorekit__memory_`) are available in
17
+ this session. If you cannot see any, it is not connected (or Claude Code has not been
18
+ restarted since it was).
19
+
20
+ ## Walk the user through it
21
+
22
+ 1. **Make a free account** at https://lorekit.io (sign-in takes a minute).
23
+ 2. **Copy the connection details** LoreKit shows after sign-in. It gives you either a
24
+ one-line command to paste into Terminal, or a small settings snippet. Use exactly
25
+ what the site shows; do not guess a URL or token.
26
+ 3. **Restart Claude Code** (close it and open it again), so it picks the connection up.
27
+ Typing `/mcp` should list `lorekit` as connected.
28
+ 4. **Run the original request again** (for example `/learn-plugin <plugin>`).
29
+
30
+ ## Rules for you
31
+
32
+ - Offer to wait while they do it; do not carry on pretending the memory exists.
33
+ - If they would rather skip it: skills that only read memory continue with the built-in
34
+ knowledge and say so once. `/learn-plugin` and `/mix-memory` have nothing to save to
35
+ without LoreKit, so say that plainly and stop; do not write the record anywhere else.
36
+ - Never ask for, store or repeat their LoreKit token in chat.