re: full bank manifest -- 4114 banks, 390.9 minutes, and the durations self-validate

With the wave boundary exact and Channels read rather than assumed, every field
describing a bank can be read: path, cue, sound id, channels, rate, data bytes,
packets, samples, seconds. Duration comes from the last cumulative sample in the
seek table over the sample rate -- arithmetic, no decoding.

Nothing was fitted to an expectation, yet every category lands where its content
says it should: BGM mean 146 s, Movie mean 79 s with an 11-minute maximum,
Briefing 10.8 s, in-mission Voice 2.79 s never exceeding 7.3. If the boundary
rule, the channel field or the seek table were misread, the numbers would not
sort into those five shapes.

Incidental: 4 banks run at 44100 Hz against 48000 everywhere else, and the BGM
tracks are the stereo ones. 1021 of the 5135 FILES paths have no RIFF and are
excluded as headerless.
This commit is contained in:
Sylpheed RE agent
2026-08-26 05:39:16 +00:00
parent 16a19219e8
commit 856fd64b3b
3 changed files with 4161 additions and 1 deletions

View File

@@ -95,7 +95,7 @@ files, which is how the same ground got covered twice.
| [`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. ⚠️ 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-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, **9 519/9 519** entries accounted for, and a full 4 114-bank manifest (390.9 min of audio) computed from the seek tables without decoding; ⚠️ 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 |
| [`structures/isl-message-dialogue-link.md`](structures/isl-message-dialogue-link.md) | Mission scripts as dialogue — built-in 64 -> message id -> caption text | ✅ CONFIRMED total, 2 683/2 683 call sites across all 28 stages resolve, no residue |

File diff suppressed because it is too large Load Diff

View File

@@ -112,3 +112,40 @@ was wrong.
* **Why 55 English banks have their first `RIFF` at or before 1392**, inside
what the headerless reading treats as the header.
* **Nothing here was run.** This is a static census of the archive.
## ✅ A full bank manifest — and the durations validate the whole chain
**2026-08-26.** With the wave boundary exact and `Channels` read rather than
assumed, every field needed to describe a bank can be *read*:
path | cue | sound id | channels | rate | data bytes | packets | samples | seconds
Committed as [`../data/voice-bank-manifest.txt`](../data/voice-bank-manifest.txt)
**4 114 banks**, every one carrying a full `RIFF`/`fmt `/`data`/`seek`
structure. (1 021 of the 5 135 `FILES` paths have no `RIFF` and are excluded;
those are the headerless banks.) Duration comes from the **last cumulative
sample** in the `seek` table divided by the sample rate — arithmetic, no
decoding.
**Total: 390.9 minutes — about 6½ hours of audio.**
The reason this is worth more than a listing is that nothing in it was fitted to
an expectation, yet every category lands where its content says it should:
| directory | banks | total | mean | longest |
|---|---|---|---|---|
| root (`BGM_*`, `JNGL_*`) | 34 | 82.8 min | **146.0 s** | 277.5 s |
| `Movie` | 62 | 81.4 min | **78.8 s** | **672.7 s** |
| `Briefing` | 72 | 12.9 min | **10.8 s** | 26.8 s |
| `etc` | 1 776 | 112.9 min | **3.8 s** | 136.8 s |
| `Voice` | 2 170 | 100.9 min | **2.79 s** | 7.3 s |
Music tracks average two and a half minutes; a cutscene track runs up to eleven
minutes; briefing lines are ten seconds; and in-mission radio chatter averages
**2.8 seconds and never exceeds 7.3**. If the boundary rule, the channel field
or the seek table were being misread, these numbers would not sort themselves
into those five shapes.
Two incidental facts fall out: **4 banks run at 44 100 Hz** where everything else
is 48 000, and the `BGM_*` tracks are the stereo ones.