aboutsummaryrefslogtreecommitdiff
path: root/docs/index.html
blob: d6a0817bd52a6dc6b64913bb32685f8281546cc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Animalese pipeline — Animal Crossing (GC)</title>
<link rel="stylesheet" href="style.css">
</head>
<body>

<h1>Animalese: the text&nbsp;→&nbsp;speech pipeline</h1>
<p class="lede">How <em>Animal Crossing</em> (GameCube, <code>GAFE01</code>, USA rev&nbsp;0) turns a
message string into villager babble. Every claim here is traced to a function in the
<a href="https://github.com/Prakxo/ac-decomp">ac-decomp</a> tree.</p>

<h2>The short version</h2>

<pre>
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
</pre>

<p>A phoneme code is literally a <strong>soundfont instrument number plus one</strong>. The whole
"engine" is a lookup table with about fifty special cases; the character comes almost
entirely from the samples.</p>

<h2>Pages</h2>

<ul class="toc">
  <li><a href="gating.html">1. Gating &amp; voice selection</a>
    <span>When animalese plays at all, and which of the three voices you hear.
    Specs 2–9, the click fallback, and the player's own voice.</span></li>

  <li><a href="encoding.html">2. Text → voice code</a>
    <span>The game's character set, the 256-entry voice table, case folding,
    accent folding, and the eight punctuation codes.</span></li>

  <li><a href="scheduling.html">3. Windowing &amp; timing</a>
    <span>How three characters get bundled into one call, why it fires from the
    font renderer, and the every-other-frame cursor.</span></li>

  <li><a href="phonology.html">4. The phonology engine</a>
    <span><code>Na_VoiceSe</code> in full: the 55-entry digraph table, short/long
    vowel tables, silent&nbsp;e, magic&nbsp;e, and punctuation flush.</span></li>

  <li><a href="playback.html">5. Playback</a>
    <span>Sequences, banks, the two alternating subtracks, per-spec timbre,
    the emotion LFO, and the deferred second syllable.</span></li>

  <li><a href="soundfont.html">6. The soundfont lookup</a>
    <span>Sequences, banks and instruments as data: the four archive tables, the
    bank blob, load-time relocation, and where the PCM actually lives.</span></li>

  <li><a href="editor.html">7. The editor path</a>
    <span>Mode&nbsp;1 — an undocumented third calling convention that bypasses
    phonology entirely, and what it says about samples 0x53–0x76.</span></li>

  <li><a href="quirks.html">8. Quirks, dead code &amp; corrections</a>
    <span>The dead volume store, the tautological dedup, vestigial mouth-shape
    tracking, and corrections to earlier notes.</span></li>

  <li><a href="reference.html">9. Reference tables</a>
    <span>Everything in one place: voice codes, digraphs, phoneme tables,
    control codes, source line index.</span></li>
</ul>

<h2>Scope</h2>
<p>These pages document the <em>runtime</em> pipeline as decompiled. Extracting the
actual audio samples from a disc image is covered separately in
<code>../extraction.md</code>, which also carries the audio table-of-contents,
bank/sample formats, and VADPCM decoding notes.</p>

<div class="note">
<strong>No game assets here.</strong> Everything on these pages is derived from decompiled
source. Reproducing audible animalese needs a legally dumped copy of the game.
</div>

<p class="src">Verified against ac-decomp at commit <code>09ca8e8b</code> (DOL and REL 100 % linked).</p>

</body>
</html>