diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index 2901482..05f8983 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -40,9 +40,24 @@ packet boundary, so `seek_pos % 2048` is a second and structural derivation of the offset (99.97 % on the labelled set). It resolves 26 of the 28 correctly and none wrongly; the combined rule is 99.95 %. -**Still open**: ❔ why 69.8 % of banks declare more `data` than they store, and -❔ why the offset takes exactly four values by directory (see -[`structures/slb-data-offset.md`](structures/slb-data-offset.md)). +**Both remaining questions closed the same day**, and both by correcting an +error of mine rather than by finding something new: + +* ❌ **"69.8 % of banks declare more `data` than they store"** — the declared + sizes are **honest**. Every `RIFF`-bearing entry on the disc carries `seek` + magic at exactly `data_at + declared_size` with `packet_count × 2048 == + declared`, **7 620 / 7 620**. The TOC window is simply not the wave boundary. + My supporting case, `VOICE_TCAF_608`, was not truncated either: it is **stereo** + (170 of 8 021 banks are) and I decoded it as mono, which yields one frame. Read + correctly it is 33.96 s, agreeing with both length signals inside the bank. +* ❌ **"the offset takes four values by directory"** — the *cause* was wrong. + `X = (cumulative start of the .pNN segment) mod 2048`; the per-directory table + was a correlation, because directories cluster into segments. There is no + header: those bytes are the previous bank's audio. + +Both are written up in +[`structures/slb-data-offset.md`](structures/slb-data-offset.md), including the +`seek` layout (little-endian, packet count at `+12`) and the boundary recipe. --- diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index 2cdb80d..383342f 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -94,7 +94,7 @@ files, which is how the same ground got covered twice. | [`idxd-legacy-reader-audit.md`](idxd-legacy-reader-audit.md) | The legacy IDXD string-pool reader vs the real field table — what the old numbers got wrong | 🟡 shape CONFIRMED by hand (`FCSRange`, `ShieldRatio`, hangar `Model`); disc-wide rates are single-source | | [`structures/idxd-container.md`](structures/idxd-container.md) | The IDXD/IXUD container — record/field table, and the two beliefs it withdraws | ✅ CONFIRMED disc-wide, 7 750/7 750 objects and 1 271 462/1 271 462 named fields, zero failures | | [`structures/hud-glyph-quad.md`](structures/hud-glyph-quad.md) | The HUD's glyph quad — vtable `0x820B2A64` | ✅ CONFIRMED for the object layout and the atlas size, read live off | -| [`structures/slb-data-offset.md`](structures/slb-data-offset.md) | `.slb` leading-stream offset is `first_riff % 2048`, not the constant 1392 | ✅ CONFIRMED by decoding — 85 of 140 sampled banks yield more audio (median 70×), 54 identical controls; offset recovery for `RIFF`-less banks is 99.95 % on the labelled set | +| [`structures/slb-data-offset.md`](structures/slb-data-offset.md) | `.slb` leading-stream offset is `first_riff % 2048`, not the constant 1392 | ✅ CONFIRMED by decoding — 85 of 140 sampled banks yield more audio (median 70×), 54 identical controls. ⚠️ The *cause* is a segment-packing phase, not a header: `X = (cumulative .pNN start) mod 2048`. Wave boundaries are exact — `seek` magic at `data_at + declared_size`, **7 620/7 620** — and `Channels` must be read from `RIFF+49` (2.12 % are stereo) | | [`structures/sound-pak-contents.md`](structures/sound-pak-contents.md) | Census of `sound.pak`, and the limit of the leading-region rule | ✅ CONFIRMED, 5 135/5 135 names hash into the TOC and **9 519/9 519** entries accounted for; ⚠️ leading-region rule holds for 1 571/4 382 eng and 0/5 100 jpn | | [`structures/sound-cue-table.md`](structures/sound-cue-table.md) | The cue index in `tables.pak` — message id -> cue -> sound id -> `.slb` bank | ✅ CONFIRMED, 1 326/1 338 script message ids bind to a bank; SOUNDS and FILES agree on the same 12 absentees, 0 orphan files | | [`structures/cutscene-message-table.md`](structures/cutscene-message-table.md) | Cutscene dialogue — speaker, portrait, on-screen seconds, audio cue per page | ✅ CONFIRMED, field count = 9·PageCount+2 for all 7 PageCounts, 1 252/1 252 caption keys match, 138 ids close both ways |