-
fix(foundry): the loops have holes in them — an aggregate cannot see a hole · 672b0fb3
PLN opened fred_angie_bass, the first kit he tried, and found two bad loops immediately: ":0 starts, then silence, then starts again" and ":2 why is this not trimmed, silence before silence after?". Both had shipped as tier S with zero flags, one at grade 0.991. He was right, and it is worse than two files. Binning each loop's envelope on its own beat grid says 12 of 111 loops carry dead air — and 5 of 14 bass loops, 36%, which is why he hit it on his first click. angie:0 has beats 7-9 of 32 at -88 dBFS; bighen_bass:1 has a five-beat hole and 62.5% occupancy at grade 0.983. This is the third time this session that silence beat the grader, and the reason is the same each time, one level further down. Silence-as-optimum was fixed at export, then again in the finder before ranking, but every one of those checks is an AGGREGATE: file peak, whole-file RMS, max of the beat table. An aggregate cannot see a hole. A loud loop with a silent bar inside it passes all three. And kitcheck's dead-bar rejector looks at BARS, so a 2.5-beat gap straddling a bar boundary is invisible — angie:0's two bars read -18.3 and -15.9 dBFS while the beats between them read -88. Resolution was a correctness input and I had treated it as a detail. So this commit does not fix it, it measures it. beatocc.py bins the envelope on the loop's own beat grid (bpm and bars from the manifest, never re-estimated) and reports SHAPE rather than level: head and tail dead beats, longest interior dead run, occupancy, plus a beat map under -v. It exits non-zero when any loop has dead air, so it can go straight into kitgate once the thresholds are known. Thresholds deliberately not chosen yet. Occupancy floors have to be per family like the periodicity floors — marea_vox/06_breaths_1b at 25% occupancy is a breath, not a defect, while a bass loop at 62% is broken — and the head-silence question has three plausible answers (trim, rotate, reject) with rotation ruled out already, since angie:2's offset is 1.17 beats and _rotate_to_downbeat snaps to beats. Placing those floors by guess is how silence got graded A in the first place. #24 on the board carries the open decisions and the data needed for each. The Fred pack section is now marked DEFECTIVE rather than SHIPPED. It needs a re-cut once the shape check exists, and PLN's verdict stands as written: "tbh i dont think the loops are usable."
PLN (Algolia) authored672b0fb3
×