# The Ceiling Is Not the Corpus

*Last time we trained a music model on 159 tracks of minimal techno and the one person who listened preferred the model untouched. The obvious answer was that the corpus was too small and too scattered, so this time we fixed the corpus: 416 house tracks, of which 331 trained against the last run's 159, measurably more consistent, captioned from the artists' own tags instead of a placeholder, and the best of the five training passes shipped instead of whichever came last. Then the same person listened blind to twenty-four pairs and preferred the untouched model on eleven of the fifteen that could be told apart. On the four requests that actually asked for house, the untouched model won every pair our listener could separate. This is the fifth adapter of this series and the last, because the thing that is wrong with these tracks is not in the corpus and cannot be reached from there. Every clip from the run plays on the companion page, [Hear It for Yourself](/hear-it-for-yourself/), including the twelve pairs where both sides were the same file, so you can take the test our listener took.*

*Published 2026-09-09 (UTC) · A small (human) team and a fleet of AI agents.*

**the short version:** We trained a fifth adapter for ACE-Step, this time on house music — four hundred and sixteen Creative Commons tracks by ninety-five artists, twice the last training set, measurably tighter on the instrument we had sealed to measure it, captioned from the artists' own tags, the best training pass shipped instead of the last — and then one of us sat down blind with twenty-four pairs. The untouched model was preferred on eleven and the adapter on four; it needed eighteen to clear. On the four requests that asked for house by name, the untouched model won every time it could be told apart. The corpus was not the ceiling. What our listener heard as wrong is how the music is built — where it goes, what arrives and leaves — and that is not a layer an adapter of this kind can reach. Every clip plays on the companion page; every record is in the kit.

5,837 words · about 27 minutes (at 220 words/min) · 3 tables · data kit: yes

https://research.strata2signal.com/the-ceiling-is-not-the-corpus/

---

## What we were testing {#what-we-were-testing}

The engine is [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5), an open-weights text-to-music
model: you write a request in words, it writes audio. An adapter — a LoRA, in the jargon — is a
small file of weights, 44,040,192 numbers in this case, trained on top of that frozen model so its
output leans toward a particular sound. It comes with two controls: a strength dial from zero to
full, and a name tag — a made-up first word you put in your request to say which adapter you mean.
Everything on this page runs the dial at full. Ours are trained on Creative-Commons music, on
hardware in one room, and each has been published with its receipts whether it worked or not. This
is the fifth: after [Chopin](/chopin-in-five-minutes/),
[Sousa and Bach](/half-an-hour-with-dead-composers/), and
[minimal techno](/ten-minutes-with-living-artists/).

The minimal-techno one did not work. One of us listened to it against the untouched model and
preferred the untouched model both times. We published that, along with the cheapest explanations:
the corpus was 159 tracks matched on a single tag across forty-one releases whose metadata carried
twenty-eight creator strings — one of them "various artists", one a label — its captions were a
placeholder of the form `minimal techno, <title>`, and the training run's best pass had never been
written to disk.

Every one of those is a fault in the corpus or the recipe, and every one is fixable. So this run
fixed them, all at once, and asked one question: **if you repair everything a corpus can be faulted
for, does the ear change its mind?**

It did not. That is the finding. The rest of this page is how we know, what it cost, and several
things we learned on the way that are more useful than the verdict.

## Four hundred and sixteen tracks {#four-hundred-and-sixteen-tracks}

The corpus is house music from the [MTG-Jamendo dataset](https://github.com/MTG/mtg-jamendo-dataset),
a 2019 research snapshot of the Jamendo catalogue in which each track's licence was set by the
artist who uploaded it. We took every track tagged `house`, `deephouse` or `techhouse` licensed CC
BY or CC BY-SA — 574 tracks — and cut that pool twice.

The first cut is a style fence, and it was one of us making a judgement, not a filter finding an
answer. Shown the eighty-five distinct genre tags the pool actually carries, one of us ruled house,
deep house and tech house in, and acid house out, along with adjacent styles that would have widened
the sound: trance, EDM, drum and bass, dubstep, eurodance, breakbeat, hip hop, and the house hybrids
shading toward electro or progressive. That removed 141 tracks, 122 of them carrying the bare `house`
tag beside whatever got them fenced — a Jamendo track carries several genre tags at once. **The
corpus is smaller because a person decided what house means for this run.**

The second cut is the one we did not expect. On 2026-09-06, between 00:25 and 00:38 UTC, we re-read
all 574 tracks' licences against Jamendo's live catalogue, seven years after the snapshot. **284 of
them are gone from the catalogue entirely. Twenty more are still there but no longer openly
licensed.** Seventeen of those twenty had survived the style fence, and their moves were: eight from
CC BY-SA to non-commercial, six from CC BY to non-commercial no-derivatives, two from CC BY-SA to
non-commercial no-derivatives, one from CC BY-SA to non-commercial share-alike. **Every change was
toward more restrictive. Not one artist had loosened a licence.**

Those seventeen left the corpus. A Creative Commons grant is irrevocable for copies already
distributed, so keeping them would have been lawful; we dropped them on the reasoning that an
artist who has withdrawn an open licence has said something, and the cost of listening is seventeen
tracks. They are named in the corpus provenance with their old licence, their new licence, and the
timestamp we read it at.

That leaves **416 tracks, 35.1 hours, 95 artists, 278 CC BY-SA and 138 CC BY**. Of those, 331 go
into the training; the other 85 are kept back and never shown to the model, for a reason the
training section comes to. The split is smallest-first, so every single-track artist lands on the
unseen side and the training set is the lumpier half: 331 tracks by 36 artists.

The general lesson is worth stating for anyone reusing a research corpus: **an open-licence dataset
is a snapshot of consent, and nobody tells you when it expires.** More than half of this pool has
vanished or closed in seven years, and a paper citing the dataset by name is citing a set of
permissions that no longer exists in the form it describes.

## The audio came the slow way, on purpose {#the-audio-came-the-slow-way-on-purpose}

There looked to be two ways to get the audio, and either way we fetched the whole unfenced pool of 574, so that a re-ruled fence could never cost a second download. Jamendo's API promised the files
in under an hour with a free developer key. The dataset's own mirror serves them inside a hundred
tar archives totalling 545 gigabytes, sharded so that our tracks touch every one.

We tried the API first, on five files, against the dataset's published checksums. **Two of the
five it never returned at all, and zero of five matched.** The API serves the same music re-encoded
— 161 to 203 kilobits per second against the dataset's 320, correlating at 0.997 and 0.999 after
sample-exact alignment, but not the same bytes — and one track had lost 1.26 kHz off the top of its
spectrum. And it could not have served the corpus in any case: 209 of our 416 tracks are no longer
on the live catalogue at all.

So we took the slow road: a ranged walk that reads only the byte ranges it needs out of the
archives, one connection at a time, from 2026-09-06 at 00:17 UTC to 08:06 UTC, **45,603 requests,
6.2 gigabytes transferred out of 545, 574 of 574 placed, zero failures**, every file verified
against the dataset's own SHA-256 before it was written; an earlier leg that evening had moved
another 2,907 requests and 0.7 gigabytes before we widened the manifest. It cost a night, and it is
the reason every file in this corpus is the byte the 2019 licence record describes.

## The other corpus, and why it isn't here {#the-other-corpus-and-why-it-isnt-here}

Nothing in this adapter came from the Internet Archive — but the reason it did not is a warning
worth four hundred words, so here it is.

We surveyed the Archive for open-licence house, since it was the source of the minimal-techno
corpus. The survey audited 4,593 items and the arithmetic looked excellent: 6,029 usable tracks and 510
hours.

It is not usable, and the reason is a warning rather than a disappointment. **On the Internet
Archive the licence field is whatever the uploader typed, and nothing verifies that the uploader
held the rights they granted.** On the CC0 tier — the most permissive rung, the one that looks
cleanest in a table — two thirds of the house tracks were disqualified on inspection. Among them: a
major-label back catalogue whose own metadata names the streaming service it was ripped from, an
animation studio's music library, commercially released albums by well-known acts from 1978, 1990,
1992 and 1996, sample packs, sound-effect libraries, and items matching the word "house" while
being about a building, a parliament, or an ensemble.

Splitting the survey by provenance rather than by licence rung changes the picture completely. The items in
the Archive's curated netlabel collections — where a label that owns its recordings set the licence
— come to 944 tracks and 81 hours, and those we would trust. The third-party uploads are not a
licence tier; they are an assertion.

Two honesties about that survey. The mechanical screens catch little on their own: the largest
contaminated items were found by a human reading the table, and several commercial albums were
excluded only because they happened to carry a fenced genre tag, which is luck rather than a
control. And the overlap with Jamendo was counted at artist level, so it tells you which items need
a deduplication pass, not how many are duplicates. The netlabel slice stays on the shelf for a
future run.

## What the captions say {#what-the-captions-say}

The previous corpus captioned every track `minimal techno, <title>`, which teaches a model that a
title is a description. This one uses the artists' own tags and only those: a head term of `house`
or `deep house`, then up to three other genre tags, up to three instrument tags, up to two mood
tags, alphabetical, de-camelised so `drummachine` reads as `drum machine`. No title, no artist, no
tempo, no key. A typical caption reads `house, club, tech house, tribal, happy, summer`.

The limit is measurable and belongs in the record: **the tag vocabulary is thin.** Nearly half the
corpus gets a caption of genre words alone, because those tracks carry no instrument or mood tag at
all. No training track ended up with a one-word caption — the template's most degraded form never
fired — but "house, electronic" is a real caption for a real track, and it is not a description of
music.

So the caption regime is better than a placeholder and still not good. Any comparison between this
run and the previous one carries that difference along with genre, source, size, hardware and epoch
count, which is why nothing on this page is attributed to captions alone.

## Forty minutes on a card bought over five years ago {#forty-minutes-on-a-card-bought-over-five-years-ago}

The training run is the least surprising part of this page, which is the point of writing recipes
down. The whole of it ran on 2026-09-06 between 09:15 and 11:14 UTC — the training itself between
09:52 and 10:32 — on an **RTX 3090 purchased over five years ago**, with its power limit set to 250 watts, the lab's standing practice for sustained work rather than a tuning choice for this run.

We keep 85 of the tracks back and never show them to the model, so that anything it learned, it learned from the other 331. The two sides are split by artist rather than by track — no artist
appears on both — which leaves 59 of the 95 artists entirely unseen. The model then read those 331
tracks five times over: 415 small corrections in all.

| the run | measured |
|---|---:|
| preprocessing | 13 min 26 s (2.44 s per track) |
| training | 39 min 56 s |
| seconds per optimiser step | 5.73 |
| peak memory, the trainer's own allocator | 5.7 GiB (the card's own draw reads higher; both are in the kit) |
| adapter | 44,040,192 numbers |

The next sentence is for anyone who wants to rebuild this run exactly; if it means nothing to you,
nothing later on this page depends on it. Every figure there belongs to one recipe: LoRA rank 64,
alpha 128, dropout 0.1, on the `q`, `k`, `v` and `o` projections, batch 1 with gradient accumulation
4, learning rate 1e-4 on a cosine schedule, bf16, gradient checkpointing on, samples capped at 240
seconds — which truncates sixty-eight per cent of this corpus, so the trainer heard twenty-one of
the training side's twenty-eight and a half hours — seed 42. The seconds-per-step figure is the sum of the five epoch timings divided by 415
steps; two other defensible denominators give 5.74 and 5.77, and the data kit published with this
page carries all three with the rule that produced each. For scale, the previous adapter trained at
1.5 seconds per step on a 96 GB workstation card, so this is roughly 3.8 times slower on hardware
anyone can buy used.

Two things in the run deserve a reader's attention.

**The requested warmup was not the warmup.** The warmup is the stretch at the start of training
where the model is nudged gently before the real corrections begin. The launch line asked for 100
warmup steps and the configuration echoed 100 back, but the trainer silently used 41, because its
own code takes the smaller of the requested value and a tenth of the total steps. We know it was 41
because we read it off the learning-rate curve rather than off the configuration. Every warmup
figure we publish for this run is 41, and the database that records our training runs stores the
requested value with no column for the effective one, and that is now a known gap rather than a surprise.

**The best pass was not the last pass.** The five training passes scored 0.8833, 0.6778, 0.6480,
0.6494, 0.6494 — falling hard for two passes, bottoming out on the third, then ticking up once and
sitting there: passes four and five are identical to four decimal places. The shipped adapter is
pass three. Under the previous run's recipe, which wrote a checkpoint every fifth epoch, pass three
would never have reached disk and we would have shipped 0.6494 believing it was the best available.
The margin is 0.2 %, so this is not a rescue; it is a receipt that a fix written down after a
failure caught the same failure the first time it was tried. It also says the model had stopped learning from this corpus by the third pass, which is a useful number for the next run and a claim about nothing
else.

## The corpus really was tighter {#the-corpus-really-was-tighter}

Before the model saw a frame, we measured whether the new corpus is more consistent than the old
one, on the same embedding instrument we pinned for the previous article. The measure is the mean
distance between every pair of tracks, in a space where similar-sounding music sits close together.
Lower is tighter. All three are measured at nineteen tracks per corpus — the equal-size axis this
programme pinned before the previous article, set by the smallest corpus it had measured then, and
reused here rather than re-derived after the numbers existed.

| corpus | tracks | mean pairwise distance | 95 % interval |
|---|---:|---:|---|
| minimal techno, the previous run | 159 | 0.4489 | 0.365 to 0.524 |
| **house, this run** | **331** | **0.3774** | 0.315 to 0.428 |
| one house artist | 37 | 0.2203 | 0.172 to 0.278 |

Read down the distance column: the house set is 15.9 % tighter than the techno set it replaced, and
one artist's own catalogue is tighter again than either.

The two registered tests disagree about whether the house-versus-techno difference is established,
and the pre-registration said that a disagreement is itself the finding. The interval
beside each number is how far that number wanders when the same corpus is sampled again and again;
the strict test asks whether the two intervals come apart, and they do not — the older corpus's is
about forty per cent wider, 0.159 against 0.113, and the two still touch, so the answer is **not
detected**. The second test asks the question the other way round: reshuffle the two corpora's
tracks at random ten thousand times and count how often chance alone opens a gap this big. It never
did once. Both are reported; neither is quietly dropped.

The within-run comparison is the sturdier one: the house corpus against a single house artist's
catalogue, 0.3774 against 0.2203, intervals apart, and again not one of ten thousand reshuffles
closed the gap. One caveat travels with it: those 37 tracks are a subset of the 331 that trained,
not an independent set. Even so, the shape holds — a tag is looser than an artist — and it holds
here at a different size and in a different genre from the last time we measured it. **That is the
one result on this page that replicates.**

We also ran, and failed to support, three registered predictions about whether the adapter pulls its
renders toward its corpus in that same space. It did on 15 of 24 pairs, indistinguishable from
chance; the same test at half strength scored 10 of 24, below a coin; the dose-response version
scored 7 of 24 monotone. The
previous run got the same shape of answer with less power. The registered words for that outcome
were written before the numbers existed: **the dial moves the audio, but not along the corpus axis.**

## The blind sitting {#the-blind-sitting}

Twenty-four pairs, on 2026-09-06 between about 23:10 and 23:50 UTC. Each pair is the same written
request at the same seed rendered twice, once by the untouched model and once with the adapter at
full strength, loudness-matched, order randomised from a seed fixed before the sheet existed,
labels neutral, the key sealed outside the page's own directory so it never travelled with the clips. Twelve further presentations were sentinels: the identical file on
both sides. The threshold was fixed in advance — the adapter clears at 18 of 24.

| the 24 scored pairs | count |
|---|---:|
| pairs where a preference was expressed | 15 |
| pairs where our listener heard no difference | 9 |
| **preferred the untouched model** | **11** |
| **preferred the adapter** | **4** |

It does not clear, and it is not close. The lean toward the untouched model is not itself
established — on the fifteen answered pairs, a coin would land this way or worse about six times in
a hundred — so the honest statement is that **no large effect was detected in the adapter's favour,
and what direction there is runs the other way.** With twenty-four pairs and one listener, a real
moderate improvement would be missed most of the time; that was computed and published before the
sitting, which is why this page does not say "no effect".

**Three deviations from the registered design, all ours, all disclosed here.** The design carried no
"no preference" option, deliberately, because abstentions pull the coin off 50/50; our listener
abstained on nine of the twenty-four pairs anyway, so the registered twenty-four-trial statistic was
never collected and the number above is computed on what our listener answered. The test treats the
fifteen as independent, while the design pairs each of twelve prompts at two seeds, so it is
optimistic. And the sentinel block was registered with an acceptance band of two to ten directional
answers out of twelve, which assumed forced choice; our listener gave one, which is outside the band
as written.

That last one needs saying carefully, because it cuts both ways. **Under the band as registered, the
sentinel block does not accept.** Under what actually happened, eleven of the twelve identical pairs
were correctly heard as identical, which is the better outcome and the one we would have hoped for.
One was not: on two files with the same fingerprint, our listener wrote "B sounds slightly cleaner / tighter on the beats". That is one honest false positive in twelve, on a page easier to write
without it, and it is the strongest evidence here that the other answers were perception rather than
expectation. It is also a small lesson about listening: tell a listener that two things differ and the ear will sometimes find the difference anyway.

**And the one check on the room itself was never run.** Every pair above has an untouched side and
an adapter side. The check we owed was twelve pairs with no adapter on either side — the untouched
model against itself, once plain and once with only the name tag an adapter request carries —
because a systematic preference there could only be the presentation, not the music. Those twelve
renders were spent as sentinels instead. That caveat was registered to travel with every result on
this page, and it does.

## What the adapter actually did {#what-the-adapter-actually-did}

The tally is the verdict; the pattern underneath it is the interesting part, and we found it after
the fact rather than predicting it, so treat it as an observation and not a test.

**All four pairs the adapter won were requests for something other than house.** Acid techno,
Detroit techno, dub techno, uplifting trance. **On the four requests that asked for house — deep
house, tech house, disco house, progressive house — our listener expressed a preference five times,
and chose the untouched model all five.** Five is a small number and this subgroup was not
registered in advance, so it is a thread to pull, not a result. But it is the plainest description
of the data: a house adapter that lost every house prompt its listener could separate.

Our listener's notes on the two clips called most house-like sharpen it further. On a tech-house
request: "A is way better, actually resembles house". On a dub-techno one: "A sounds better, sounds more like house type music (cleaner)". Both were the model with no adapter loaded — and on the
second, it was the adapter's request, not the untouched one, that carried the word house.

Where the adapter did win, two of the four notes describe rhythm: "A def better, actually has a hat
at the start where B is void of one", and "A sounds way better, and these tracks sound WAY
different, like A actually has a 4-4 beat to start, whereas B has none". A hat is a hi-hat, the
metallic tick between the kicks; a 4-4 beat is the steady four-to-the-bar pulse a house track is
counted on. Both notes are saying the same thing: the adapter's side had a beat where the other
side had none. The other two are a bare preference and a remark about ambient background sound.
Something arriving on the grid that otherwise did not arrive is not what an adapter of this kind is
supposed to be able to do, so we flag it as a question for a bench rather than build a theory on two
trials.

One control we could run, and did: an adapter render's request carries the name tag the untouched
request does not, so the word is a suspect alongside the weights. Measured separately, **the name
tag alone moved renders toward the corpus in 3 of 12 cases; the weights moved them in 7 of 12.**
Whatever modest drift exists belongs to the training, not to the word.

One automatic check was binding, and it passed: a quality floor, set before the run at the untouched
model's own score minus three tenths, which would have failed the run outright had the adapter
degraded the audio. The untouched model scored 7.9527 on that instrument, putting the floor at
7.6527; the adapter's clips scored 7.9462 — six and a half thousandths below it and nowhere near the floor. **The adapter did not make the audio worse. It made it different, and the difference
did not help.**

## What this page does not claim {#what-this-page-does-not-claim}

The pre-registration wrote its forbidden sentences before the numbers existed, and they bind now
that the numbers are unflattering.

Nothing here is a claim about captions: this run changed genre, source, size, caption regime,
hardware and epochs at once. Nothing here is a claim that more data is better or worse; the size
comparison this programme registers is against a size-matched run we have not done. Nothing here is
a claim about house music — "house" on this page is three tags on one dataset snapshot under two
licences, minus a block-list a person chose. Nothing here is a claim about music models in general:
one engine, one adapter recipe, one embedding space, one listener. And nothing here rests on two
under-powered benches agreeing with each other; where this page reaches a conclusion, it reaches it
from what the engine's own source code does, and that argument is at the end of this page under
**What to take with you**.

One criterion degraded honestly. Before the first training step we owed ourselves a filed rule for
the memorisation screen — the check that asks whether the adapter is reproducing tracks it was
trained on rather than writing new ones — and we did not file it in time. Our own rule says an
unfiled criterion becomes descriptive rather than silently becoming a pass, so the screen was
computed to its own specification and is reported as description, not as a verdict. What it found:
of the twenty-four clips, five sat closer to some training track than the training tracks typically
sit to each other, and the closest of all scored 0.8649 — inside the range the corpus already
occupies on its own. Nothing there looks like a copy, and nothing there is a pass, because we did
not earn one. The run therefore fails its listening clause, misses its sentinel clause as written,
passes its quality floor, and carries its memorisation clause as description. Nothing was
back-dated. The rule catching our own omission is worth more than a clean sweep would have been.

## Two faults in our own listening copies {#two-faults-in-our-own-listening-copies}

Both of these are about the clips our listener actually heard, not about the model — and both are
ours. The first we found before the sitting: our first pass at loudness-matching the listening
copies left eighteen of the eighty-five 1 to 2.3 dB louder than target, and in a forced-choice test
louder wins, so that was a live confound inside the gate, assigned to the two sides by accident. We
switched to the two-pass form, and all eighty-five landed within tolerance of −16 LUFS — loudness
measured across a whole clip rather than at any one moment, so that the two sides of a pair arrive
at the ear at the same level.

The second we found afterwards, in the fix. Turning a clip up should be one multiplication applied
evenly to the whole thing. When the tool cannot do that without the loudest peaks overshooting, it
quietly rides the level up and down instead, and says so nowhere. We compared every listening copy
against its own render, sample by sample: **38 of the 85 had not been turned up evenly.** The worst
was nearly half of full scale away from any single multiplier — 0.46, and 0.41 among the clips the
scored pairs actually played — with no shift in time we could measure: a moving hand on the fader,
not a delay. So the clips our listener heard had been processed, not merely levelled, and that changes the very thing that was being judged. It is the same trap this
series ruled out for the previous article's companion page, hit again in the place we had just
repaired.

It does not move the verdict, and we checked rather than assuming: the delivered loudness is
−16.012 LUFS for the untouched side against −16.005 for the adapter — seven thousandths of a unit
apart, where one whole unit is about a third of a notch on a mixer's fader — and the reshaped copies
fall 14 of 24 on one side and 9 of 24 on the other, a split that chance produces one time in four. The
processing did not favour a side. But it is a difference between the audio the numbers describe and
the audio a person judged, so the companion page serves a strictly linear re-master instead, prints
all three fingerprints for every clip — the render, the copy our listener actually heard, and the
linear master the player plays — and says which is which.

One more thing about bytes, and it is not a fault in the copies: renders of the same request at the same seed on two different machines are not byte-identical.
Our pre-registration had reserved the right to call this run's untouched renders byte-comparable
with the previous article's; they are not, and that reservation is withdrawn — comparisons across
our articles are same-recipe, not same-bytes. Within one machine the path is deterministic, and the
run's own repeat control proves it.

## What to take with you {#what-to-take-with-you}

We repaired everything a corpus can be faulted for. The set is twice the last one's by the only
measure that compares — 331 tracks that trained against 159, and 21.0 hours of audio the trainer
actually read against 10.4 — measurably tighter on an instrument pinned before we looked, captioned
from the artists' own vocabulary, split so most of its artists are unseen, verified file by file
against published checksums, and trained with the best pass shipped instead of the last. The ear
went the other way anyway, and on the requests that actually asked for house it went the other way
every time it could tell the difference at all.

Our listener said it plainly, mid-sitting, before any key was opened:

> "none of them really sound that great, and i think the biggest part is the track composition,
> which is something we can't fix with the adapters"

That sentence is why this is the last adapter in the series, and the engine's own source code agrees
with it. This engine works in two halves. One half is a planner — a small language model that reads
your request and writes out the shape of the song before any sound exists. The other half paints
audio onto that plan. **Every adapter anyone trains for this model, ours included, patches four
small places inside the painting half.** Composition lives in the planner, and no adapter reaches
it — the trainer that ships excludes the planner by name, in a single line that skips it. We
searched for a published adapter for the planner and found none.

That is the ceiling. Not the size of the corpus, not its tightness, not its captions — a limit on
how good these tracks can be that sits one layer above everything this run repaired, in the half of
the engine an adapter cannot touch.

That is where this work goes next, and a second path runs beside it: a small symbolic model of our
own, trained from scratch on patterns and section maps rather than audio, cheap enough to run on a
laptop's processor, answering the same question from the other end.

Better ingredients cannot fix a bad arrangement. That is not a complaint about the model; it is a
statement about which layer the problem lives in, and it took a bigger corpus, a tighter corpus,
better captions, and a blind sitting to earn the right to say it.

## The rest of the seminar {#the-rest-of-the-seminar}

Part one — [*Teaching a Music Model Chopin in Five Minutes*](/chopin-in-five-minutes/) — is the
field guide. Part two — [*Half an Hour with Dead Composers*](/half-an-hour-with-dead-composers/) —
is Sousa, Bach and the algebra of blending them. Part three —
[*Ten Minutes with Living Artists*](/ten-minutes-with-living-artists/) — is the first negative
result, and the corpus this page set out to repair. That page promised three more adapters: the
cost of a corpus by the second, the memory question part one left open, and a curated retrain
chosen by a person instead of a tag. The third of those is the style fence above, on a better corpus. The other two are not coming as adapters, because the finding on this page is that
the layer they would improve is not the layer that is wrong. Five adapters is where the audio half
of this ends; what comes next is the planner, and the small symbolic model beside it.

## How to check our work {#how-to-check-our-work}

Every clip the run produced plays on the companion page (its one byte-identical repeat excepted),
[Hear It for Yourself](/hear-it-for-yourself/) — the raw renders, the loudness-matched copies our
listener actually heard, and the linear masters the players play, all three labelled and
fingerprinted, including the twelve sentinel pairs.

Everything else is in the data kit: the corpus manifest with each track's licence, source and
fingerprint; the provenance and credits files, including the seventeen excluded tracks and the
licences their artists have since chosen; the style fence as a machine-readable file with its own
fingerprint; the training log, the per-epoch losses, and the learning-rate series the warmup figure
was read from; the walk's own log; the coherence bench's inputs, outputs and checksum file; the
blind sheet's sealed key and our listener's answers exactly as typed, timestamped before the key was
opened; and the pre-registration itself, with both of its fingerprints — the sealed file as written,
and the file as it was sealed — so that anyone can cut the two dated amendment blocks off its tail,
put one line back to its placeholder, take the fingerprint of what is left, and compare. The kit's records carry the hub's usual CC BY 4.0; the audio on the companion page is share-alike, because the corpus is, and it is filed apart from the kit for that reason.

The pre-registration was sealed before the first training step and amended twice, additively and
dated, each time before the step the amendment governed. Neither amendment moved a threshold.

## Who ran this, and thanks {#who-ran-this-and-thanks}

The music first. Four hundred and sixteen tracks by ninety-five artists, licensed CC BY and CC BY-SA
by the artists themselves on Jamendo and catalogued by the Music Technology Group at Universitat
Pompeu Fabra in the [MTG-Jamendo dataset](https://github.com/MTG/mtg-jamendo-dataset), where we read
every tag, licence and checksum, and whose mirror — served from Freesound's content network —
answered the archives our walk read from. The dataset itself is offered for non-commercial research
and academic use, and its metadata under Attribution-NonCommercial-ShareAlike; this work is private
research, and the audio's own licences are the artists'. Each track is credited by title, artist and licence in the
kit. The share-alike terms travel with the adapter and with anything made from it. Seventeen further
tracks are named in the credits as excluded, with the licences their artists have since chosen; they
are not in the corpus and are not credited as though they were.

The engine: [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5), MIT-licensed — its row on our
[licence ledger](/licences/). Its repository asks that AI involvement be disclosed, and every clip
this run produced is AI-generated and says so. The trainer:
[Side-Step](https://github.com/koda-dernet/Side-Step), the corrected-timestep LoRA trainer vendored
inside it, whose upstream licence is CC BY-NC-SA 4.0 while the vendored copy points at ACE-Step's
MIT; we proceed on the stricter reading and have written to ask.

The instruments. The coherence bench ran on LAION's CLAP, the `laion_clap` package at 1.1.7 with the
`lukewys/laion_clap` music checkpoint, whose licence file on disk reads CC0 1.0 — the same package
and checkpoint the previous article pinned, so the two runs' numbers are comparable. The quality
floor ran on Meta's Audiobox-Aesthetics at 0.0.4, CC BY 4.0.

Beneath all of it, the open tools this work stood on without modifying: PyTorch, Hugging Face's PEFT,
NumPy, and FFmpeg, which decoded every training file, cut every crop, and measured every loudness
figure. Every fetch went out under a user agent that names us and says how to reach us:
`strata2signal-research/1.0 (private research; contact via strata2signal.com)`.

A small team and a fleet of AI agents did the work; the humans signed the numbers, and one human did
all of the listening.

<!-- derived 2026-09-16 (UTC) by tools/derive_md.py from the pour source.
     source html sha256: a0e49ca4437f05a533382119c1b7686e41bb96f84b6a1dc2389f68d96bd33692
     derivation sha256:  934992ae2cba5e3ef7a169fbc514d76418ae96051b9f76048092083281b8fbcb
     the {#id} on each heading is the anchor that heading carries on the page. -->
