7. The editor path

There is a third calling convention into Na_VoiceSe that skips the phonology engine entirely, and it explains what a third of the voice samples are for.

Mode 1

The text editor overlay — used for letters, town and player names, patterns, and anywhere else the player types — speaks each keystroke from src/game/m_editor_ovl.c:712:

if (command == mED_COMMAND_OUTPUT_CODE) {
    int voice = mMsg_sound_voice_get_for_editor(editor_ovl->now_code);

    if (voice == 0x85 || voice == 0x80 || voice == 0x81 ||
        voice == 0x82 || voice == 0x83 || voice == -1)
        voice = 0x86;

    sAdo_VoiceSe(voice, 0xFF, 0xFF, 0, 32, 1);      // ← mode 1
}
else if (command == mED_COMMAND_EXCHANGE_CODE) {    // cursor moved onto a character
    if (exchange_code != -1 && mED_exchange_se_list[exchange_code])
        sAdo_VoiceSe(mMsg_sound_voice_get_for_editor(exchange_code), 0xFF, 0xFF, 0, 32, 1);
    else
        sAdo_SysTrgStart(0x36);
}

After both filters, only three things survive: letters (0x5D–0x76), digits (0x53–0x5C), and the click (0x86).

What mode 1 does inside Na_VoiceSe

Na_VoiceSe's two switch (f) blocks handle only cases 0 and 2. With f == 1 both fall through, so:

The editor always runs at spec 5 or 6 (see gating), which routes 0x86 to NA_SE_BEBE and passes everything else through. The final guard is if (a != 0 && a <= 0x77), and letters and digits both satisfy it. So:

typing 'a'  →  Sou_VoiceStart(subtrack, 0x5D)  →  instrument 0x5C
typing 'z'  →  Sou_VoiceStart(subtrack, 0x76)  →  instrument 0x75
typing '0'  →  Sou_VoiceStart(subtrack, 0x53)  →  instrument 0x52

What this tells us about the sample set

Trace the reachable phoneme codes across the whole engine:

Code rangeInstrumentsReached by
0x01–0x520–81the phonology engine — short/long vowels, consonants, all 52 two-character digraphs plus you
0x01–0x40also the anti-repetition random substitution (rand() >> 2)
0x53–0x7682–117only mode 1 — one entry per digit and letter, in order (on bank 157, instrument 82 is instead the you substitute, see below)
0x77118the you digraph, and nothing else

The 0x53–0x76 block is exactly 36 codes: ten digits then twenty-six letters, in the same order as the voice-code alphabet, and it is unreachable through any dialogue. The obvious reading is that these 36 samples are the spoken names of the digits and letters — what you hear when typing a name one character at a time.

Confidence. The code path is unambiguous; the interpretation of the samples as letter names is inference. It is testable: extract instruments 82–117 from bank 156 and listen. It also predicts that bank 157, which stops at 83 instruments, is a phonology-only bank — and that is exactly what it is.

Why bank 157 is short

Spec 3 (Wendell, Pete, Booker, Jack) uses sequence 244 / bank 157, which has 83 instruments — one more than the phonology output range (0x01–0x52 → instruments 0–81) — and omits the letter-name block that spec 3 can never reach, since the editor is always spec 5 or 6.

The 83rd instrument is not spare. Sequence 244's dynamic table maps codes 0x53–0x76 to explicit silence and maps you (0x77) to instrument 82 — a sample reachable through no other path, played at a lower note than the other two voices' you (semitone 41 vs 44; see the disc page). So bank 157 carries a dedicated you substitute, and spec-3 voices lack nothing audible. Whether instrument 82 is an actual "you" recording is testable the same way as the letter names: extract it and listen.

This corrects two earlier readings. Working notes once described bank 157 as "collapsing every digraph sample above 0x53 onto one sound" — nothing above 0x53 is a digraph, the block is not phonology at all. A later revision of these pages then claimed the dynamic table "clamps out-of-range entries to the last routine" — it does not; the mapping of 0x77 → instrument 82 is an explicit table entry, verified on disc.
← 6. The soundfont lookup 8. Walking the disc image →