Skip to content

Commit 95140e8

Browse files
committed
docs(skills): fix what an eval of the audio preset docs found
Ran three realistic mixing tasks against the skill and against its state before the preset docs landed, six runs in all, and audited every claim in `presets.md` against the shipped catalogue. Four things came back. **Nodes need a `label`, and the skill never said so.** Zero of six runs wrote one — including the run that otherwise nailed the task, placing the exact shipped Tame Boominess and Reduce Boxiness settings. The rack shows that chain as two identical `peaking` rows, which is the precise problem the named jobs exist to dissolve. The doc taught the numbers and lost the naming, which was the point. `label` now appears in `attributes.md` with the reason, and the jobs section shows a labelled node. **Single-quoted attributes are invisible to `carve.mjs`.** Three of six runs wrote `data-fx-chain='{...}'`. The browser reads through `getAttribute` and does not care; the script finds attributes with a `name="..."` regex, so the carve sees no existing chain and overwrites work it cannot find. The convention was never written down. **"18 presets" — 19 ship.** The list was complete; only the numeral was wrong. Dropped rather than corrected, since nothing keeps it honest. **Every job also ships inside a preset at identical settings**, so `voice-clean` plus a Reduce Mud job cuts 250 Hz twice. The doc listed both vocabularies without connecting them. Also: "Not covered" said what not to do without saying what to do, and it cost real behaviour — asked to add a de-esser, the run with the doc changed nothing while the run without it shipped a narrow 7 kHz cut with the trade-off stated. The section now names the honest fallback per gap and says to apply it. Verified clean: the five job frequencies, all five profile curves and the parameters each derives, the level-matching claim, append-and-replace semantics, the leveller's 80th percentile, `presetAmount` and `fx.preset.<id>`.
1 parent fd0eb76 commit 95140e8

3 files changed

Lines changed: 44 additions & 10 deletions

File tree

skills/hyperframes-audio/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Exact JSON for each, and the rules a lane must satisfy: `references/attributes.m
3535
Every effect with its parameters, ranges and units: `references/fx-registry.md`.
3636
**Presets, named jobs and one-knob profiles, plus a symptom-to-fix table:
3737
`references/presets.md`** — read that before hand-building a chain, because one
38-
of the 18 presets or 5 jobs usually already names the problem.
38+
of the presets or named jobs usually already names the problem.
3939

4040
## How it fits together
4141

skills/hyperframes-audio/references/attributes.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,20 @@ that sounds plausible and is wrong.
1212
{
1313
"version": 1,
1414
"nodes": [
15-
{ "type": "highpass", "id": "n1", "params": { "frequency": 120, "q": 0.707, "poles": "2" } },
15+
{ "type": "highpass", "id": "n1", "label": "Remove Rumble", "params": { "frequency": 120, "q": 0.707, "poles": "2" } },
1616
{ "type": "peaking", "id": "n2", "fromCarve": true, "params": { "frequency": 1600, "gain": -6, "q": 1.4 } },
1717
{ "type": "limiter", "id": "n3", "enabled": false, "params": { "limit": -1, "attack": 5, "release": 50, "level_out": 0 } }
1818
]
1919
}
2020
```
2121

22+
**Write these attributes double-quoted, with the JSON's own quotes as `&quot;`.**
23+
The browser reads them through `getAttribute` and does not care, but
24+
`scripts/carve.mjs` finds them with a `name="..."` regex, so a single-quoted
25+
attribute is invisible to it — the carve reports no existing chain and quietly
26+
overwrites work it could not see. `&` becomes `&amp;`; nothing else needs
27+
escaping.
28+
2229
- **Order is signal order.** Each node processes what the one before produced.
2330
- `type` is an effect id from the registry. `params` are in the units a person
2431
thinks in — dB, ms, Hz — and out-of-range values are clamped on read, so a
@@ -28,6 +35,11 @@ that sounds plausible and is wrong.
2835
with no id loads fine but cannot be automated. Writing a chain by hand, any
2936
unique string works; Studio hands out the first free `n1`, `n2`, … so matching
3037
that convention keeps a hand-written chain and an edited one looking alike.
38+
- `label` is what the rack calls this node, replacing the effect's own name.
39+
Write one whenever the node is doing a named job — a chain with two `peaking`
40+
nodes otherwise shows the same row twice and the author cannot tell which is
41+
the mud cut and which is the clarity lift. Presets and jobs always set it; a
42+
hand-written node should too. See `presets.md` for the names they use.
3143
- `enabled: false` is bypass — the node stays in the chain, out of the signal
3244
path. Absent means enabled.
3345
- `fromCarve: true` marks a node the carve analysis generated. Re-running the

skills/hyperframes-audio/references/presets.md

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Diagnose in this order, because each step changes what the next one hears:
6464

6565
## Presets
6666

67-
18, in four families. Apply one and it **appends** — stacking a character preset
67+
Four families, listed in full below. Apply one and it **appends** — stacking a character preset
6868
onto an already-cleaned voice is a real thing to want. Re-applying one that is
6969
already present replaces its own nodes in place, because position in the chain
7070
is signal order.
@@ -135,6 +135,20 @@ Each is an ordinary `peaking` node underneath — the frequency is a starting
135135
point, not a cage. Prefer a job to a bare `peaking` when one matches: it arrives
136136
already aimed, and the rack names it for the work rather than the mechanism.
137137

138+
Writing one by hand, **carry the name in `label`** — `{"type":"peaking","id":"n2",
139+
"label":"Reduce Mud","params":{"frequency":250,"gain":-3,"q":1.2}}`. The
140+
parameters alone are not the job. A chain with three unlabelled `peaking` nodes
141+
shows the author three identical rows, which is the exact problem jobs exist to
142+
dissolve.
143+
144+
**Every job also ships inside a preset, at identical settings** — that is where
145+
the five came from. `boom-tame` *is* Tame Boominess; `harsh-tame` *is* Soften
146+
Harshness; `voice-clean` contains Reduce Mud and Add Clarity; `voice-broadcast`
147+
contains Reduce Boxiness. So check what a preset already contains before adding
148+
a job on top of it, or the cut lands twice — `voice-clean` plus a Reduce Mud job
149+
is −6 dB at 250 Hz where −3 was meant. The rack shows the contained nodes by
150+
name once the preset is expanded, which is the fastest way to see it.
151+
138152
---
139153

140154
## One-knob profiles
@@ -184,11 +198,19 @@ Two things measure the audio before they act, so they cannot be a fixed chain:
184198

185199
## Not covered by anything shipped
186200

187-
Say so rather than reaching for the nearest preset:
188-
189-
- **De-essing.** `harsh-tame` is a broad always-on cut, not a de-esser. A real
190-
one needs a detector faster than the analysis hop available here.
191-
- **Tone matching** one track to another. The Tone EQ does the job predictably
192-
by hand instead.
201+
Name the gap rather than reaching for the nearest preset and calling it the
202+
thing — but then **ship the honest fallback anyway**, with its cost stated. An
203+
author who asked for a fix and got only an explanation has been told something
204+
true and handed nothing. Say what it is, say what it costs, apply it.
205+
206+
- **De-essing.** `harsh-tame` is a broad always-on cut centred a band too low,
207+
not a de-esser. A real one needs a detector faster than the analysis hop
208+
available here. *Fallback:* a narrow `peaking` cut in the Edge band — sweep
209+
5–9 kHz to find where this voice actually spits, Q 3–4, −3 to −5 dB. It is
210+
always on, so it costs a little air on every word; that trade is usually worth
211+
it and is the author's to reject.
212+
- **Tone matching** one track to another. *Fallback:* the Tone EQ by hand, which
213+
is predictable in a way a match curve derived from two takes would not be.
193214
- **Noise removal.** `room-gate` closes the gaps; the noise under speech is
194-
untouched. A source with audible hiss under the voice needs a better source.
215+
untouched. There is no fallback for hiss beneath the words — a source with
216+
audible hiss needs a better source, and saying so is the whole answer.

0 commit comments

Comments
 (0)