Spec §9.8 ships three factory kits — 40 samples, all synthesised procedurally by scripts/build-factory.mjs so the publicly deployed MIT-licensed repo carries no sample provenance risk.
The build is verified mechanically. src/core/project/factoryPacks.test.ts asserts every shipped sample is 48 kHz mono 16-bit, is non-silent (peak > 0.5), ends at zero so retriggers do not click, and that its frame count matches its samples row.
None of that is a judgement about whether they sound good. Nobody has listened to them critically. They are the first thing a new user hears — §9.8's stated purpose is "so a new user can make sound before sourcing any audio of their own" — so "technically correct" is a low bar to stop at.
What to listen for
- 808 kit — the kick's sweep time and decay curve carry the whole character; the cowbell is two detuned squares and may be too pure.
- 909 kit — the click transient on the kick, and whether the hats read as metal rather than as filtered noise.
- Acoustic kit — the most likely to disappoint. Snare wires and shell noise are approximated with band-passed noise; the toms may sound synthetic rather than "acoustic-ish".
- Across all three: relative levels between pads (everything is peak-normalised to 0.89, which is not the same as being perceptually balanced), and whether the cymbals' 1.2–1.8 s tails are too long or too short in a mix.
Where to change things
All tuning constants are in scripts/factory/kits.mjs, with the synthesis primitives in scripts/factory/synth.mjs. Both are pure and well commented.
Iteration is cheap and safe: npm run build:factory takes about a second, and each sample's PRNG is seeded from its own name, so changing one sound cannot alter the bytes of any other. The determinism test will fail if anyone reaches for Math.random() or Date.now().
Note this is explicitly out of reach of automated verification — spec §13.5 names human listening QA as the final polish gate, not the primary one, and this is that gate.
Working notes
Do the work in a git worktree per spec §13.3.4 (git worktree add -b factory-kit-voicing .claude/worktrees/factory-kit-voicing). Only scripts/factory/ should need to change; if a test in factoryPacks.test.ts starts failing, that is the guard working, not a test to relax.
Subagents: not appropriate. This is a human listening task — an agent cannot hear the output, and an agent that "improves" the synthesis without listening is just changing numbers. An agent can usefully prepare the ground by rendering the 40 samples to a directory of WAVs for auditioning.
Spec §9.8 ships three factory kits — 40 samples, all synthesised procedurally by
scripts/build-factory.mjsso the publicly deployed MIT-licensed repo carries no sample provenance risk.The build is verified mechanically.
src/core/project/factoryPacks.test.tsasserts every shipped sample is 48 kHz mono 16-bit, is non-silent (peak > 0.5), ends at zero so retriggers do not click, and that its frame count matches itssamplesrow.None of that is a judgement about whether they sound good. Nobody has listened to them critically. They are the first thing a new user hears — §9.8's stated purpose is "so a new user can make sound before sourcing any audio of their own" — so "technically correct" is a low bar to stop at.
What to listen for
Where to change things
All tuning constants are in
scripts/factory/kits.mjs, with the synthesis primitives inscripts/factory/synth.mjs. Both are pure and well commented.Iteration is cheap and safe:
npm run build:factorytakes about a second, and each sample's PRNG is seeded from its own name, so changing one sound cannot alter the bytes of any other. The determinism test will fail if anyone reaches forMath.random()orDate.now().Note this is explicitly out of reach of automated verification — spec §13.5 names human listening QA as the final polish gate, not the primary one, and this is that gate.
Working notes
Do the work in a git worktree per spec §13.3.4 (
git worktree add -b factory-kit-voicing .claude/worktrees/factory-kit-voicing). Onlyscripts/factory/should need to change; if a test infactoryPacks.test.tsstarts failing, that is the guard working, not a test to relax.Subagents: not appropriate. This is a human listening task — an agent cannot hear the output, and an agent that "improves" the synthesis without listening is just changing numbers. An agent can usefully prepare the ground by rendering the 40 samples to a directory of WAVs for auditioning.