@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.
- package/README.md +19 -570
- package/bridge-ui/mcp_bridge.html +129 -0
- package/bridge-ui/mcp_bridge.webmanifest +16 -0
- package/bridge-ui/mcp_bridge_icon_192.png +0 -0
- package/bridge-ui/mcp_bridge_icon_512.png +0 -0
- package/bridge-ui/mcp_bridge_sw.js +35 -0
- package/claude/agents/plugin-researcher.md +188 -0
- package/claude/knowledge/reference/aesthetics-scoring.md +48 -0
- package/{knowledge → claude/knowledge}/reference/common-mistakes.md +1 -1
- package/claude/knowledge/reference/lorekit-setup.md +36 -0
- package/claude/knowledge/reference/memory-protocol.md +377 -0
- package/{knowledge → claude/knowledge}/reference/metering.md +5 -5
- package/claude/knowledge/reference/perceived-loudness.md +182 -0
- package/{knowledge → claude/knowledge}/workflows/editing.md +4 -0
- package/{knowledge → claude/knowledge}/workflows/gain-staging.md +21 -23
- package/{knowledge → claude/knowledge}/workflows/learn-plugin.md +15 -48
- package/{knowledge → claude/knowledge}/workflows/master-bus.md +13 -1
- package/claude/knowledge/workflows/section-levels.md +138 -0
- package/{knowledge → claude/knowledge}/workflows/session-prep.md +4 -0
- package/claude/knowledge/workflows/transient-lighting.md +52 -0
- package/claude/skills/critique/SKILL.md +131 -0
- package/claude/skills/editing/SKILL.md +281 -0
- package/claude/skills/learn-plugin/SKILL.md +210 -0
- package/claude/skills/mastering/SKILL.md +151 -0
- package/claude/skills/mix-memory/SKILL.md +140 -0
- package/claude/skills/mixer/SKILL.md +253 -0
- package/claude/skills/new-extension/SKILL.md +324 -0
- package/main.js +7843 -1940
- package/package.json +17 -15
- package/reaper/CLAUDE.md +22 -4
- package/reaper/mcp_actions_lib.lua +375 -0
- package/reaper/mcp_analyzer.jsfx +27 -12
- package/reaper/mcp_arrange_lib.lua +949 -0
- package/reaper/mcp_bridge.lua +2321 -758
- package/reaper/mcp_edit_views_lib.lua +1378 -0
- package/reaper/mcp_envelopes_lib.lua +748 -0
- package/reaper/mcp_extensions_lib.lua +55 -0
- package/reaper/mcp_fxstate_lib.lua +144 -0
- package/reaper/mcp_gain_trace.jsfx +126 -0
- package/reaper/mcp_items_lib.lua +877 -0
- package/reaper/mcp_lufs_meter.jsfx +16 -13
- package/reaper/mcp_midi_lib.lua +555 -0
- package/reaper/mcp_mixing_lib.lua +1021 -0
- package/reaper/mcp_plan_lib.lua +801 -0
- package/reaper/mcp_prefs_lib.lua +127 -0
- package/reaper/mcp_project_lib.lua +1088 -0
- package/reaper/mcp_recording_lib.lua +595 -0
- package/reaper/mcp_render_lib.lua +492 -0
- package/reaper/mcp_snapshot_lib.lua +547 -120
- package/reaper/mcp_snapshot_next.lua +10 -4
- package/reaper/mcp_snapshot_prev.lua +11 -4
- package/reaper/mcp_snapshot_quick_save.lua +7 -32
- package/reaper/mcp_snapshots_ui_lib.lua +258 -0
- package/reaper/mcp_tracks_lib.lua +409 -0
- package/sidecar/analysis.py +661 -0
- package/sidecar/chords.py +96 -0
- package/sidecar/mixcheck.py +295 -0
- package/sidecar/requirements-chords.txt +6 -0
- package/sidecar/requirements-separation.txt +3 -0
- package/sidecar/requirements.txt +17 -0
- package/sidecar/separation.py +142 -0
- package/sidecar/server.py +622 -0
- package/sidecar/tests/test_analysis.py +249 -0
- package/sidecar/tests/test_chords.py +117 -0
- package/sidecar/tests/test_mixcheck.py +163 -0
- package/sidecar/tests/test_separation.py +73 -0
- package/sidecar/tests/test_server.py +464 -0
- package/sidecar/tests/test_verify.py +243 -0
- package/sidecar/tests/test_voice_render.py +268 -0
- package/sidecar/tests/test_voice_sketch.py +140 -0
- package/sidecar/verify.py +224 -0
- package/sidecar/voice_render.py +295 -0
- package/sidecar/voice_sketch.py +280 -0
- package/claude-agents/critique.md +0 -147
- package/claude-agents/editor.md +0 -184
- package/claude-agents/levels.md +0 -107
- package/claude-agents/mastering.md +0 -129
- package/claude-agents/mixer.md +0 -248
- package/claude-agents/preflight.md +0 -149
- package/claude-agents/producer.md +0 -159
- package/claude-agents/setup.md +0 -150
- package/claude-agents/stems.md +0 -135
- package/claude-rules/architecture.md +0 -39
- package/claude-rules/development.md +0 -54
- package/claude-rules/lua-bridge.md +0 -50
- package/claude-rules/testing.md +0 -42
- package/claude-skills/learn-plugin.md +0 -123
- package/knowledge/CLAUDE.md +0 -71
- package/knowledge/plugins/_template.md +0 -82
- package/knowledge/plugins/fabfilter/pro-c-2.md +0 -117
- package/knowledge/plugins/fabfilter/pro-l-2.md +0 -95
- package/knowledge/plugins/fabfilter/pro-q-3.md +0 -112
- package/knowledge/plugins/neural-dsp/helix-native.md +0 -104
- package/knowledge/plugins/stock-reaper/js-1175-compressor.md +0 -94
- package/knowledge/plugins/stock-reaper/rea-comp.md +0 -100
- package/knowledge/plugins/stock-reaper/rea-delay.md +0 -95
- package/knowledge/plugins/stock-reaper/rea-eq.md +0 -103
- package/knowledge/plugins/stock-reaper/rea-gate.md +0 -99
- package/knowledge/plugins/stock-reaper/rea-limit.md +0 -75
- package/knowledge/plugins/stock-reaper/rea-verb.md +0 -76
- package/knowledge/reference/perceived-loudness.md +0 -122
- package/reaper/mcp_snapshot_manager.lua +0 -1001
- /package/{knowledge → claude/knowledge}/genres/_template.md +0 -0
- /package/{knowledge → claude/knowledge}/genres/electronic.md +0 -0
- /package/{knowledge → claude/knowledge}/genres/hip-hop.md +0 -0
- /package/{knowledge → claude/knowledge}/genres/metal.md +0 -0
- /package/{knowledge → claude/knowledge}/genres/orchestral.md +0 -0
- /package/{knowledge → claude/knowledge}/genres/pop.md +0 -0
- /package/{knowledge → claude/knowledge}/genres/rock.md +0 -0
- /package/{knowledge → claude/knowledge}/reference/compression.md +0 -0
- /package/{knowledge → claude/knowledge}/reference/frequencies.md +0 -0
- /package/{knowledge → claude/knowledge}/workflows/delivery.md +0 -0
- /package/{knowledge → claude/knowledge}/workflows/drum-bus.md +0 -0
- /package/{knowledge → claude/knowledge}/workflows/low-end.md +0 -0
- /package/{knowledge → claude/knowledge}/workflows/stem-prep.md +0 -0
- /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
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -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.
|