---
log: 016
title: "Packs — the grouping above the folder, and the mismatch that's the story"
date: 2026-06-23
task: "#85 pack-level sample grouping"
tags: [tooling, audio, samples, taxonomy, dataviz]
shareable: true
---

## Cap (what & why)
We resolve samples at two grains: the SAMPLE (ground truth) and the FOLDER (a loose
convention). But `rampleA0..rampleS57` is really ONE sample bank; `808bd/cy/hc/mc` is
ONE drum machine; `bass_commodore/fx_commodore/synth_commodore` is ONE chip sliced by
role. PLN's insight: there's a third grain ABOVE the folder — the **pack** (the
real-world origin) — and we'd been blind to it.

## Manœuvre (how)
`sample_packs.py` reads the already-grounded `sample_families.json` (no audio → fast,
doesn't fight the demucs batch running next door). A curated REGISTRY tags each pack
with a TYPE — `drum_machine` / `bank` / `chip` / `source` / `genre` — and an
auto-grouper proposes packs the registry missed (alpha-prefix-before-digit + underscore
head/tail tokens, ≥2 folders). The auto pass caught `trance_*` and `voices_*`; folded
them in, then it went quiet — registry complete. A pack needs ≥2 grounded folders (a
1-folder pack is just a folder; it may gain siblings when #84 grounds all 718).

## Prise (findings / artifacts)
- `sample_packs.py` + `sample_packs.json`. 22 packs over 83/150 folders; 67 singletons.
- Rolls per-SAMPLE family counts up to the pack, then asks: one family, or the whole
  wheel? 15 of 22 packs span multiple families **by design**:
  - `rample` → 8 families (snare/kick/hat/fx/break/pad…) — a bank IS a grab-bag.
  - `jungle` → 11 — a genre's whole kit. `808` → kick/hat/perc — one box, three voices.
  - `commodore` → bass/fx/pad/lead/synth — the chip, every role.
- 7 packs DO cohere (`fbreak`→break, `voices`→vox, `vec1`→snare): there, origin ≈ sound.

## Sel (the shareable learning)
Grouping is layered, and each layer answers a different question. The folder asks "what
did the pack author call this slice?"; the pack asks "where did this come from?"; only
the sample asks "what does this actually sound like?". The interesting signal isn't when
they agree — it's the **mismatch**: a pack defined by ORIGIN (a song, a machine, a
console) is *expected* to scatter across the audio clusters, and that scatter is a story,
not an error. So we derive packs as a lens to COMPARE against the audio, and never let a
pack boundary bias the analysis. Same discipline as the folder: a hint, never a law.

## Hameçon (hook)
One Commodore 64 chip shows up in five different "families" — bass, lead, pad, FX, synth
— because a pack is a *place a sound came from*, not a *kind of sound*. The machine that
groups by ear and the human who groups by origin will never fully agree, and the gap
between them is a map of how a sound's history diverges from its timbre.
