re: close both remaining .slb questions in the backlog -- both were my errors

The declared sizes are honest (seek magic at data_at + declared_size, 7620/7620)
and VOICE_TCAF_608 was stereo decoded as mono, not truncated. The four offsets
are a segment-packing phase, not a per-directory header size. Neither was closed
by finding something new; both were closed by correcting a mistake of mine.
This commit is contained in:
Sylpheed RE agent
2026-08-26 05:30:57 +00:00
parent c3ff6aa0e8
commit e676210e9b
2 changed files with 19 additions and 4 deletions

View File

@@ -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.
---

View File

@@ -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 |