From 9ca1a1c1c7bf56e39b516c299b4e0d3efe59652b Mon Sep 17 00:00:00 2001 From: Alexander Kassouni Date: Tue, 8 Sep 2026 20:11:06 -0700 Subject: better docs --- docs/playback.html | 51 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 19 deletions(-) (limited to 'docs/playback.html') diff --git a/docs/playback.html b/docs/playback.html index 73be9a2..4addb30 100644 --- a/docs/playback.html +++ b/docs/playback.html @@ -118,16 +118,25 @@ r29 != 0x84).

Each voice sequence's subtrack sits in a spin loop:

-
L_0019: delay 1 frame
-        macro_read_port0
-        branch_rel_not_eq_zero L_0019   ; wait until Sou_VoiceStart writes the port
-        set_dyntbl D_0026
-        dyntbl_call                     ; index the table with the phoneme code
-        branch L_0019
- -

The dynamic table has 128 entries pointing at 10-byte routines -C1 <instrument> / 88 <note> / FF. Entry v selects instrument -v − 1. Entry 0 is an immediate FF — nothing.

+
loop:   delay 1 tick
+        MACRO_SET 1                ; publish "I am sequence 1/2/3" …
+        PORT1_WRITE_MACRO_REG      ; … to port 1 (the load-race handshake)
+        MACRO_READ_PORT0           ; value ← port 0, port 0 ← -1
+        branch loop if value < 0   ; port empty
+        SET_DYNTBL 0x0026
+        DYNTBL_CALL                ; call routine dyntbl[phoneme code]
+        branch loop
+ +

The dynamic table has 128 entries pointing at routines of the shape +C1 <instrument> / 88 <layer addr> / FF, where the note layer holds the +actual note, delay and velocity. Entry v selects instrument +v − 1; entry 0 is an immediate FF — nothing. The +full annotated disassembly, the per-code note/delay/velocity map, and the tick math are +on the disc page. Two headlines from it: dialogue phonemes play +at semitone 44 / 41 / 39 (sequences 243 / 244 / 245) against a pitch table with unity at +48, so each bank is pitched down 4–9 semitones from its recordings; and port reads are +destructive (the port resets to −1), which is why one Sou_VoiceStart write +triggers exactly one syllable.

Per-frame parameter push

@@ -177,15 +186,19 @@ deferred syllable's parameters land one frame late.

bank id (5 for all three), and all have zero drums and zero SFX. 119 instruments = phoneme codes 0x01–0x77 exactly.

-

Bank 157 stopping at 83 is not an omission: instruments 0–82 cover codes -0x01–0x53, and the phonology engine never produces a code above -0x52 apart from 0x77. The missing range -0x53–0x76 is the editor's letter-name block, -which spec 3 can never reach. The only thing spec-3 voices genuinely lack is -you.

- -

Sample details are in ../extraction.md: N64 VADPCM, tuning 0.6891 -(22050 Hz), order 2, two predictors, no loop, ~190 ms each.

+

Bank 157 stopping at 83 is not an omission, and nothing is lost. The phonology +engine's maximum output is 0x52 plus 0x77; instruments 0–81 +cover 0x01–0x52, and the missing +0x53–0x76 range is the +editor's letter-name block, which spec 3 can never reach. +For you (0x77), sequence 244's dynamic table explicitly routes +the code to instrument 82 — the bank's 83rd and last instrument, which +sits above the phonology range and is reachable by nothing else. Bank 157 carries one +extra instrument precisely to be its you.

+ +

Sample details are on the disc page: N64 VADPCM, tuning +0.689062 (22050 Hz at a 32000 Hz mixer), order 2, two predictors, no loop, +32–407 ms each (mean ≈ 190 ms).

← 4. The phonology engine -- cgit v1.3.1