static.slb (8970240 bytes, the shared SE bank) and Pj_Silph.xgs (533 bytes, XACT global settings) both hash into the TOC. Their names come from the BANK_SE and SETTINGS records of the very IDXD object this page documents -- I had printed them at the top of the write-up and then reported the entries as unidentified. 9519 of 9519 now: 5100 jpn + 4382 eng + 35 root + these 2.
115 lines
5.7 KiB
Markdown
115 lines
5.7 KiB
Markdown
# What is actually in `sound.pak` — and the language substitution
|
||
|
||
**✅ Settled 2026-08-26.** `sound.pak`'s 9 519 entries are almost entirely
|
||
accounted for: the Japanese voice set, the English voice set, and 35 music /
|
||
jingle banks. The `FILES` record in `tables.pak` names the Japanese half, and
|
||
the game reaches the English half by **substituting the leading directory**.
|
||
|
||
Until now the corpus described `sound.pak` as "~9 519 headerless entries, params
|
||
in an unknown table". The table is
|
||
[`sound-cue-table.md`](sound-cue-table.md), and this page is the census.
|
||
|
||
## The name is the key
|
||
|
||
Every path in `FILES` hashes straight into the `sound.pak` TOC with
|
||
`name_hash` — **5 135 of 5 135**, using the path exactly as stored
|
||
(backslashes, case-insensitive):
|
||
|
||
jpn\etc\VOICE_D_257.slb -> name_hash -> TOC entry (offset, size)
|
||
|
||
No transformation, no prefix, no stem. Taking the basename instead resolves only
|
||
35 — precisely the 35 root-level `BGM_*` / `JNGL_*` banks whose basename *is*
|
||
their path, which is the control that shows the full path is what matters.
|
||
|
||
This is not luck: the hash's low 24 bits are a residue mod `0x00FFF9D7` and the
|
||
top byte is a byte-sum, so for 5 135 probes against 9 519 occupied slots the
|
||
expected number of accidental hits is about **0.01**.
|
||
|
||
## The census
|
||
|
||
| what | entries |
|
||
|---|---|
|
||
| `jpn\…` — named directly by `FILES` | 5 100 |
|
||
| `eng\…` — the same names with the directory substituted | 4 382 |
|
||
| `BGM_*.slb`, `JNGL_*.slb` at the root | 35 |
|
||
| `static.slb` and `Pj_Silph.xgs` — named by `BANK_SE` / `SETTINGS` | 2 |
|
||
| **total accounted** | **9 519** |
|
||
| TOC total | **9 519** |
|
||
|
||
**The archive is now fully accounted for.** The last two took a correction:
|
||
I first reported them as unidentified, having looked past the fact that the
|
||
same IDXD object names them. `BANK_SE`'s single field is `Static.slb`
|
||
(8 970 240 bytes — the shared sound-effect bank) and `SETTINGS.PARAM` is
|
||
`Pj_Silph.xgs` (533 bytes — the XACT global settings). Both hash into the TOC,
|
||
and both were sitting in the table I had already printed at the top of this
|
||
page. For 18 candidate names against 9 519 occupied slots the expected number of
|
||
accidental matches is about 4 × 10⁻⁵, and these two are corroborated by being
|
||
named in the table rather than guessed.
|
||
|
||
Only `eng` and `jpn` resolve. `deu`, `fra`, `ita`, `esp` and the alternative
|
||
spellings `fre`/`ger`/`spa` produce **zero** hits, which is the measurement
|
||
behind the claim that only two voice sets are shipped — the other four languages
|
||
are subtitle-only.
|
||
|
||
**718 of the 5 100 Japanese banks have no English counterpart.** That is
|
||
consistent with the previously recorded finding that a set of lines exists only
|
||
undubbed, and it puts a number on it from the archive side.
|
||
|
||
> ❌ **CORRECTED the same day — see [slb-data-offset.md](slb-data-offset.md).**
|
||
> The section below measures correctly but concludes wrongly. The Japanese banks
|
||
> are **not** a different layout: the leading-stream offset is
|
||
> `first_riff % 2048`, which is 1392 only in `<lang>\etc\`. Every "misaligned"
|
||
> row here is a bank being decoded mid-packet, in English as well as Japanese.
|
||
> The numbers stand as a measurement of the *old constant's* reach; the
|
||
> interpretation does not.
|
||
|
||
## ⚠️ The leading-region rule is English-only
|
||
|
||
This is the part that matters most, and it bounds an existing result.
|
||
|
||
[`voice-bank-leading-region.md`](../voice-bank-leading-region.md) established
|
||
the hybrid layout: a bank may carry a leading headerless XMA1 region before its
|
||
first `RIFF`, recognised by the first `RIFF` sitting exactly at
|
||
`1392 + n·2048`. That was derived from `VOICE_D_450`–`454`, and it reproduces
|
||
**exactly** — all five, at 16 384 / 2 048 / 14 336 / 45 056 / 59 392 bytes,
|
||
matching the recorded figures to the byte. The pipeline is sound.
|
||
|
||
But those five are `eng\etc\` banks, and the rule does not generalise:
|
||
|
||
| set | aligned | misaligned | no `RIFF` | first `RIFF` ≤ 1392 |
|
||
|---|---|---|---|---|
|
||
| `eng\…` (4 382) | **1 571** | 2 060 | 696 | 55 |
|
||
| `jpn\…` (5 100) | **0** | 4 301 | 799 | — |
|
||
|
||
**Not one of the 5 100 Japanese banks satisfies the alignment condition.** The
|
||
rule describes a third of the English set and none of the Japanese set.
|
||
|
||
Being careful about what that does and does not mean: "misaligned" only means
|
||
the leading-segment branch does not fire, and `to_xma_riffs` still walks the
|
||
bank's sub-waves normally — so this is not evidence that those banks are
|
||
broken. What it does mean is that **the leading-region finding is a property of
|
||
some English banks, not of `.slb` in general**, and any code or documentation
|
||
that treats it as the bank format is overreaching. The Japanese banks are
|
||
laid out differently and that layout is **not decoded**.
|
||
|
||
## How I nearly got this wrong
|
||
|
||
I first resolved the five documented banks through their `FILES` paths, which
|
||
are `jpn\etc\…`, and got leading regions of 59 600 / — / 6 352 / 14 544 /
|
||
28 880 — none a multiple of 2 048, none matching the recorded figures. The
|
||
tempting reading was that my extraction was broken. The alignment condition is
|
||
what said otherwise: a broken reader would not produce *exactly* the recorded
|
||
numbers for `eng\etc\`, which it then did, for all five. The extraction was
|
||
right and the assumption that `FILES`' path was the one the corpus had measured
|
||
was wrong.
|
||
|
||
## What this does not settle
|
||
|
||
* **The 2 unaccounted TOC entries.**
|
||
* **The Japanese bank layout.** 4 301 banks have a `RIFF` at an unaligned
|
||
offset and 799 have none at all; neither shape has been decoded, and no
|
||
Japanese bank has been decoded to audio here.
|
||
* **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.
|