How Animal Crossing (GameCube, GAFE01, USA rev 0) turns a
message string into villager babble. Every claim here is traced to a function in the
ac-decomp tree.
message text (game charset, 1 byte/char) │ │ 1. mMsg_sound_voice_get() 256-entry table ▼ char code ──► voice code (0x53–0x86) gating + voice selection │ 2. mMsg_sound_voice_mode_get() animalese / click / silent │ mNpc_GetNpcSoundSpec() speaker ──► spec 2–9 ▼ Na_SpecChange() spec ──► sequence 243/244/245 windowing │ 3. mMsg_sound_voice_entry() collect (a, b, c) over two cursor steps ▼ ~1 character per 2 game frames draw-time trigger │ 4. mFontSentence_animal_voice_se() glyph scale ──► volume ▼ sAdo_VoiceSe(a, b, c, npc, scale, mode) phonology │ 5. Na_VoiceSe() digraphs, long vowels, silent e ▼ ──► phoneme code 0x01–0x77 playback │ 6. Sou_VoiceStart() write port 0 of a JAudio2 subtrack │ sequence dyntbl ──► instrument (code − 1) ▼ 7. ProgToVp(bank, inst) ──► NoteToVoice() ──► smzwavetable DSP ──► one ~190 ms VADPCM sample, 22050 Hz
A phoneme code is literally a soundfont instrument number plus one. The whole "engine" is a lookup table with about fifty special cases; the character comes almost entirely from the samples.
Na_VoiceSe in full: the 55-entry digraph table, short/long
vowel tables, silent e, magic e, and punctuation flush.These pages document the runtime pipeline as decompiled. Extracting the
actual audio samples from a disc image is covered separately in
../extraction.md, which also carries the audio table-of-contents,
bank/sample formats, and VADPCM decoding notes.
Verified against ac-decomp at commit 09ca8e8b (DOL and REL 100 % linked).