scnf: sead's config, sound/sead.config
- Source
docs/formats/scnf.md- SHA-256
ba1350f7…410cbdc6
The settings of Square Enix's sead sound engine: its sound categories, buses, effect presets, events and the like. One file, sound/sead.config (3,008 bytes), with no wrapping (no RotXor or ZIP). It is built like a sound bank (sabf): a 16-byte header, a table of chunks, and chunks that start with a header and a table of offsets to what they hold.
| Based on | sound/sead.config, 3,008 bytes; the unpacked executable, SHA-256 7b0230a11498f40396c9048345e7cfe0ef442cb7ca8faffc6f197920d2669599. |
| Checked | 2026-10-11 |
| Method | A single-file C# program (scnf.cs, session scratchpad) that walks the header, chunk table and each chunk's offsets; hex inspection; static analysis with Ghidra 12.1.4 through the decompiled code in local/exe/decomp/ of the sound system's setup (0x1401a9020) and sead's config loader (0x1405e2560, and the readers 0x1405dbd50 and its siblings); ftsound.cs (the file table's sound/ records); the R31 review of names (2026-10-11). One file, so every value below is that file's. Not yet decoded or rebuilt by the toolchain, and no in-game tests. |
Header
| Offset | Size | Type | Name | Meaning | Confidence | Source |
|---|---|---|---|---|---|---|
| 0x00 | 4 | raw[4] | magic |
scnf. sead checks it. |
confirmed | Hex; checked by 0x1405dca50. |
| 0x04 | 1 | u8 | unk_0x04 |
0. The config reader ignores it and takes the chunk table at header_size; in a bank this byte is version. |
— | scnf.cs; 0x1405dbd50. |
| 0x05 | 1 | u8 | unk_0x05 |
0. | — | scnf.cs. |
| 0x06 | 2 | u16 | header_size |
0x10. |
confirmed | scnf.cs. |
| 0x08 | 1 | u8 | chunk_count |
13. | confirmed | scnf.cs. |
| 0x09 | 1 | u8 | unk_0x09 |
0. The config reader ignores it; in a bank this byte is name_length. |
— | scnf.cs; 0x1405dbd50. |
| 0x0A | 2 | u16 | unk_0x0A |
0. | — | scnf.cs. |
| 0x0C | 4 | u32 | file_size |
3,008, the file's size. sead copies this many bytes of the file into its own buffer, so it must not be larger than the file. | confirmed | scnf.cs (= the size); its use: 0x1405e2560, likely. |
Chunk table
At 0x10, 13 records of 16 bytes, laid out as a bank's (sabf.md): a 4-byte tag, three fields that are 0, 0 and 16, the chunk's offset from the start of the file, and 0. The chunks follow the table back to back, each at a 16-byte boundary, the last ending at the end of the file (confirmed, scnf.cs).
| Chunk | Tag | Offset | Count | What it holds |
|---|---|---|---|---|
| 0 | ctgr |
0xE0 |
6 | Categories: music, se, voice, amb_se, sys_se, mouse_se. |
| 1 | bus |
0x1D0 |
2 | Buses: Master, SpeedChange. |
| 2 | mcr |
0x290 |
2 | Macros. |
| 3 | epsp |
0x300 |
4 | Effect preset packs: Speed_Normal, Speed_Double, Speed_Triple, Speed_Quad. |
| 4 | eps |
0x460 |
22 | Effect presets (bus-effect parameter blocks). |
| 5 | curv |
0x980 |
1 | Curves. |
| 6 | expr |
0x9D0 |
0 | External parameters (ExternalParameterChunk); none here. |
| 7 | hcam |
0x9E0 |
— | Not an offset table: 16 bytes, with 44100 at +0x4 (HCA-MX settings, by sead's ConfigFile names). |
| 8 | evt |
0x9F0 |
4 | Events: Play1xSpeed, Play2xSpeed, Play4xSpeed, Play3xSpeed (the battle-speed setting). |
| 9 | ctgl |
0xB10 |
1 | Category layers (CONFIGCATEGORYLAYER): default. |
| 10 | spka |
0xB50 |
— | Not an offset table: the speaker angles setting (CONFIGSPEAKERANGLESSETTING). |
| 11 | pext |
0xBA0 |
0 | Platform extra settings; none here. |
| 12 | zeon |
0xBB0 |
0 | Zero-one (sead's "zeroone"); none here. |
The names in the last column are the items' own name strings (scnf.cs, hex), and for the chunks' kinds sead's class names in the executable (ConfigFile::CategoryChunk, ExternalParameterChunk, CONFIGBUSEFFECT*, CONFIGCATEGORYLAYER, CONFIGSPEAKERANGLESSETTING, …): likely. sead's list of config tags is at 0x1406a66b0.
How the game reads it
- likely: the sound system's setup reads the file whole, by the path
Data/sound/sead.configjoined to a folder the file manager keeps (at0x140f6c770+0x28), with0x1401973b0, and passes the buffer to sead's initialize (0x1405b9020). It is not opened through the file table, and has no record there (confirmed,ftsound.cs), so a changed size needs noFileTable.binchange. Source:0x1401a9020(Ghidra names itStreamEventHandler::StreamEventHandler; it is the sound system's setup). - likely: sead checks the magic (failing the setup if it's wrong), copies
file_sizebytes into a buffer of its own, and reads the categories, external parameters and the rest from the copy by their tags. Source:0x1405e2560,0x1405dca50. - likely: when it sets up the categories, sead checks each one's parent and limit-parent references, and logs an error (
Category::Initialize … Please update configfile!!and others) but carries on when one is missing. Source:0x1405f0dc0.
Leads
- Lay out what each chunk holds; only the names are read here.
- What the game's sound IDs, banks or the battle-speed events need from this file: whether adding a category or bus is possible without changing the executable.
expr,pextandzeonare empty; what they would hold.- Whether the 16-byte header is one structure shared by
sabf,mabfandscnf(no class shows it: banks areAudioBinaryFile, the config isConfigFile); if so, bytes0x04and0x09would take the bank's names.