music/MEASURED_LOOP_PROOF.md
CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
Canon served:docs/spine/CH_02.md§ Asset anchors (music_mood) and § Mechanical anchors
(main_boss_win_condition);
build/audio/music_cue_table.csvrows MC_0026, MC_0035. Authority order:docs/DOC_MAP.md§ 0.
Lane law: docs/pipeline_review/tech_research/PIPE_AUDIO_MUSIC_2026-07-29.md. Program parent:
docs/proposals/music/MASTERPIECE_PROGRAM.md (this executes its rungs 1 and 5 at pilot scale).
If this document disagrees with canon, CANON WINS and this document is the defect.
"How are you doing on the calculations for all the patterns and curves and trends and difs etc
for the music to be able to generate our 12-20+ tracks. Give me a few sample tracks so I can know
you can actually do this and improve before I go spend $1000 more."
measured formula card — 21 scalar dimensions and 6 curves — with every prompt clause carrying
the dimension and the measured number behind it. No clause without a number.
site, labelled at their honest tier.
and the result is a per-dimension diff plus one distance number.
materially closer (−0.0722, an 18% cut) and two moved slightly further; the mean moved
−0.0055. That is the honest result and it is stated as such below.
closed with teeth. They are the most valuable output of this lane.
| Artifact | What it does |
|---|---|
harness/music_gen/masterpiece_proof.py | The whole loop: spec derives a generation spec from a target card, diff compares a generated card against it, spec --revise fires deterministic revision rules from a measured miss, report emits the tables, guard-run refuses a wrong-generator run, verify-tokens checks the prompt against the real tokenizer. 25 self-test controls. |
harness/music_gen/emit_proof_picks.py | The site seam — a fifth picks producer, 7 controls, rung_rank 0 so a pipeline sample never competes with the score. |
build/audio/proof/ | Specs, audio, measured cards, diffs, run summaries, and the config-comparison evidence. |
Three classes, each with a MEASURED reference card. The reference supplies the GRAMMAR; canon
supplies the subject. The two are never mixed.
| Sample | Class | Reference card (measured) | Canon anchor |
|---|---|---|---|
MPX_CH02_EXPLORE | EXPLORATION_ENVIRONMENT | Desolation (Hong Kong canal) — Deus Ex | docs/spine/CH_02.md § Asset anchors · music_mood — "survival-horror-opener mood, low-and-tense rising to the crater-lake climax" |
MPX_CH02_BATTLE | BATTLE | Airfield action — Deus Ex | docs/spine/CH_02.md § Asset anchors · music_mood — "combat-cue register for the stalk"; § Mechanical anchors · main_boss_win_condition (the polo encounter) |
MPX_TITLE_MAIN | CREDITS_TRIUMPH | Want You Gone — Portal 2 (corpus row EX_110, ACQUIRED) | MASTERPIECE_PROGRAM.md § 3 · Credits / triumph — "the summation form, motif recall economy" |
Why these references. Desolation is the corpus's sparsest sustained-tension cue — mean 3.69
simultaneous lanes against a 9-lane ceiling, a 6.2% silence budget, 2 tutti arrivals in 88
seconds, energy peak held to 72% through. That is the measured grammar of low-and-tense-that-
rises-late, which is what the chapter's own row asks for. Airfield action was chosen over the
denser Hong Kong action because the latter measures 0 complexity steps — a dimension reading
zero cannot show a distance shrinking. EX_110 is the one ACQUIRED-and-MATCHED card in the corpus,
so its purpose class is the corpus's own rather than this lane's guess; it is targeted for form
and event grammar only, never for its vocal.
What "the card speaking" means. The exploration spec, generated verbatim from the card:
An original instrumental cue for a volcanic crater-lake rim at altitude, cold air off the
water, a lone depleted child moving through it with nothing. About 88 seconds long, in 8
clearly different sections. Very sparse: typically only two or three things sound at once, with
the upper register left empty for long stretches. The full texture must not arrive until about
22 seconds in. Rest is a real part of it: roughly 6 percent of the running time is
near-silence, in held gaps rather than a fade. Instrumentation is generic orchestral and
untuned percussion only: no gamelan, no gong ensemble, no bonang, no named regional instrument
of any living tradition. Instrumental only, no vocals, no singing, no spoken word.
Every sentence traces to a measured dimension in spec_r1.json :: derived_from[].caption_trace.
88 is the card's total_length_s; 8 its section_count; "two or three at once" its
simultaneity_curve.mean of 3.686; 22 seconds its time_to_full_texture_s; 6 percent its
silence_budget.fraction. The duration, bpm and key passed to the generator are the card's own
numbers, rounded.
The care clause is not decoration. The chapter's row names the Flores gong-waning tradition.
Following the attended §17.1 read's standing reframe
(build/audio/attended_care_release.json :: what_reframed_means) the generation makes the PLACE
and never a living culture's instrument, with the denial stated positively inside the prompt so
it carries its own guardrail. It is a priority-0 clause and can never be shed.
Both would have made a "we can do this" claim false while every artifact looked green.
ACE-Step tokenises the DiT prompt at max_length=256, truncation=True
(D:/audio/acestep/repo/acestep/core/generation/handler/conditioning_text.py L127-131). The
prompt is a template — # Instruction … # Caption … # Metas … — and the metas come last. The
first revision's captions measured 294-347 tokens against that ceiling. What was being discarded
was everything written last: the care guardrail, the instrumental invariant, and **the bpm,
keyscale and duration conditioning**. The generator was asked for 144 bpm in E major and received
neither, and without a token count that reads as the model ignoring the prompt rather than as the
prompt never arriving.
Closed three ways: a measured caption budget (189 tokens; the wrapper costs 55, measured), a
priority order in which the care clause and the instrumental invariant can never be shed, and
verify-tokens, which rebuilds the exact prompt string and checks it against the real
Qwen3-Embedding tokenizer. Shed clauses are reported on the spec, never dropped silently.
A second consequence: revision clauses were being APPENDED, which doubled the caption straight
through the ceiling and left two contradictory instructions per dimension with the later one
truncated away. A revision now SUBSTITUTES the base clause for the same dimension, in place.
This lane's first pass ran --dit acestep-v15-xl-sft --no-lm, reasoning that XL-SFT is the
higher-quality checkpoint. It is — and its caption conditioning does not arrive without its LM.
Measured on two maximally opposed brightness captions at one fixed seed:
| Checkpoint | dark pole | bright pole | Verdict |
|---|---|---|---|
acestep-v15-turbo | 1892 Hz | 2138 Hz | separates, correct direction |
acestep-v15-base | 1378 Hz | 1304 Hz | does not separate, WRONG direction |
acestep-v15-xl-sft | 1980 Hz | 1976 Hz | does not separate at all |
The XL-SFT audio measured plausibly on every card dimension and answered nothing the caption
asked. The formula card has no opinion about whether the prompt arrived — it will describe
noise in the same vocabulary it describes Uematsu. The proven invocation is the one
D:/audio/acestep/logs/beds.log actually ran; it is pinned in code with the evidence above
attached, and guard-run refuses a run that used anything else.
Everything in §5 was regenerated on the pinned config. The evidence lives at
build/audio/proof/pole_turbo/, pole_base/ and probe_audio/.
Beat trackers pick a metrical level, and the formula card says so itself. Revision 1's
exploration sample was requested at 144 bpm and read back at 86 — half-time. The uncorrected
ratio told the revision rule to ask for 240, clipped to 220: a correction that had chased an
octave while reporting it was closing in. Both the diff and the rule now fold by octaves first.
Full tables: build/audio/proof/TABLES.md (script-emitted from the diff files, never retyped).
The distance is 0.6 × mean scalar error + 0.4 × mean curve error, each scalar error being the
absolute miss over its own scale clipped at 1. It is a DISTANCE, not a quality score — it
says nothing about whether either track is good.
| Sample | r1 | r2 | Change |
|---|---|---|---|
MPX_CH02_EXPLORE | 0.3431 | 0.3794 | +0.0363 further |
MPX_CH02_BATTLE | 0.4008 | 0.3286 | −0.0722 closer |
MPX_TITLE_MAIN | 0.3395 | 0.3589 | +0.0194 further |
| mean | 0.3611 | 0.3556 | −0.0055 |
Six curves are compared per sample, resampled onto normalised position so an 81-second cue and a
142-second cue are comparable: the flow curve (energy over time), the simultaneity curve (the
arrangement's story), the tempo function, the dynamics arc, the per-bar complexity index, and the
octave-band register balance.
The seed is pinned across revisions. An earlier draft used seed + revision, which would
have made every revision a reroll and left the improvement claim unable to separate "the spec got
better" from "the dice landed better". With the seed fixed, the caption and the bpm parameter are
the only things that move.
MPX_CH02_BATTLE is the clean demonstration. Three rules fired off the r1 measurement, each
naming its miss:
section_count — "measured 6 sections against a target of 8 — too static" → *"Changematerially about 8 times: each section brings in or removes an element so the seam is audible."*
mean_lanes — "measured 2.88 simultaneous lanes against a target of 6.963 — too thin" → *"Fillthe arrangement out: keep six or more layers sounding together."*
silence_fraction — "measured a 0.041 silence budget against a target of 0.011 — too gappy" →*"Keep it continuous; do not leave long empty gaps."*
What the re-measurement returned:
| Dimension | Target | r1 | r2 | Error r1 → r2 |
|---|---|---|---|---|
section_count | 8 | 6 | 8 | 0.250 → 0.000 |
mean_lanes | 6.963 | 2.880 | 3.808 | 0.586 → 0.453 |
drops_per_min | 6.681 | 25.185 | 11.111 | 1.000 → 0.663 |
silence_fraction | 0.0106 | 0.0413 | 0.0398 | 0.307 → 0.292 |
time_to_hook_s | 0.116 | 0.093 | 0.116 | 0.001 → 0.000 |
The instruction was obeyed on the dimension it named, in the direction it named, and the distance
fell 18%. That is the "can actually do this and improve" claim, demonstrated once.
Why it is not yet three for three. Per sample, 8-11 of the 21 scalar dimensions moved between
two very different captions and 10-13 did not move at all — and the stuck ones carry roughly
half the residual distance (0.196-0.248 of a 0.366-0.445 scalar distance). Several sit pinned
at full error in every run: tuttis_per_min (the generator never gathers the full ensemble),
time_to_full_texture_s, raises_per_min, dynamic_range_db. When half the distance lives in
dimensions the prompt cannot reach, a single revision's net movement is dominated by drift on the
dimensions it did not name. That is a measurement about ACE-Step's control surface, not a
failure of the loop — and it is exactly the argument for §8.
One dimension is deliberately not chased. onset_type reads fade_in on every OST exemplar
because album mastering fades a ripped game cue up. Our own engine law forbids a baked fade
(generate.py pins fade_in_duration=0.0 for the stem/loop contract). Chasing it would mean
fighting our engine to imitate a mastering artefact. It is still measured and still scored, so it
contributes a full 1.0 miss to every revision equally and can never manufacture an improvement.
tile on the site says exactly that.
(hummable leitmotifs, composer-in-loop, ACE-Step = beds). Nothing here claims a hook worth
remembering; the loop measures whether a generation matches a target's *grammar*, and grammar
is not melody. The authored lane (theme_compositions.py, nostalgia_score.py) remains where
melody is judged.
has what the target measurably has"; it cannot certify that it is beautiful. Josh's ear remains
the only subjective gate.
redistributed, never model input. What crossed into a generation is a number and an English
clause derived from it — a score study, not a sample.
The measured corpus today is 2 matched cards (EX_110, EX_124) plus ~100 UNMATCHED cards
from three soundtracks that happened to be free or already owned: Portal 2, Deus Ex, and the
ULTRAKILL/Okami set now landing. That is why this proof targets a Deus Ex ambient cue for the
Flores register — **not because it is the right reference, but because it is the reference that
exists.**
What the corpus cannot currently supply, and what the exemplar list was built to buy:
exploration and action, and has almost nothing for melancholic/tragic, boss/climax, or
title/character theme. The bands in MASTERPIECE_STANDARD cannot be derived from two cards.
Mitsuda, Shimomura, Kondo — and not one of those tracks is measured. The school grammars
are extracted from published analysis; the cards are not.
MASTERPIECE_PROGRAM.md §4 requires that the scorerrank the exemplars above our own tracks. With 2 matched cards there is no population to rank.
The purchase run and its verified routes are already emitted at
build/audio/exemplars/BUY_SHEET.md (STARTER TEN, $64.59) with 17 rows declared as having no
legitimate route at any price, each carrying a named substitute.
One honest caution on the spend. §4.2 and §6 together show that ACE-Step reaches perhaps half
the dimensions a card measures. Buying more cards sharpens the TARGETS; it does not widen the
generator's control surface. The cards are worth buying because they are the specification the
composer and the authored lane work to — they are not a lever on this particular generator.
1. Run the full 8-dimension control-surface probe to completion (masterpiece_proof.py probe;
16 tracks generated, 12 measured, the run stopped on measurement time under CPU contention).
The result names precisely which dimensions prompt revision can reach.
2. Iterate the two samples that drifted, now that the octave fold and the substitution rule are
in. Two revisions per sample, not one.
3. Card the ULTRAKILL and Okami sets already on disk — free class anchors for BATTLE and for the
melodic/regional register — before spending.
4. Then the STARTER TEN, aimed at the classes with no anchor at all.
python harness/music_gen/masterpiece_proof.py --self-test python harness/music_gen/masterpiece_proof.py spec --out build/audio/proof/spec_r1.json --revision 1 D:/audio/acestep/venv/Scripts/python.exe harness/music_gen/masterpiece_proof.py verify-tokens --spec build/audio/proof/spec_r1.json D:/audio/acestep/venv/Scripts/python.exe harness/music_gen/generate.py --spec build/audio/proof/spec_r1.json --out-dir build/audio/proof/audio --dit acestep-v15-turbo --no-lm --summary build/audio/proof/run_r1.json python harness/music_gen/masterpiece_proof.py guard-run --spec build/audio/proof/spec_r1.json --run build/audio/proof/run_r1.json D:/audio/rig/venv/Scripts/python.exe harness/music_gen/acquire_exemplar.py --audio build/audio/proof/audio/MPX_CH02_BATTLE_r1.wav --no-corpus --out-root build/audio/proof/cards python harness/music_gen/masterpiece_proof.py diff --sample MPX_CH02_BATTLE --revision 1 python harness/music_gen/masterpiece_proof.py spec --out build/audio/proof/spec_r2.json --revision 2 --revise 1 python harness/music_gen/masterpiece_proof.py report --out build/audio/proof/TABLES.md --revisions 1,2 python harness/music_gen/emit_proof_picks.py --revision 2