VRS Support
Contents
Background Information
On December 12th, 1998, Nintendo released a short-lived accessory for the N64 called the VRS (Voice Recognition System). Two years later, on November 6th, 2000, it was also released in America as the VRU (Voice Recognition Unit). To paraphrase from Wikipedia:
The VRU had only two compatible games: Hey You, Pikachu! and Densha de Go! 64. A VRU was included with every factory package of Hey You, Pikachu!, because it was required to play the game. Densha de Go! 64 did not require the VRU, so they were sold separately.The peripheral consisted of a ballast (NUS-020) connected to controller port 4 of the system, a microphone (NUS-021), a yellow foam cover for the microphone, and a clip for clipping the microphone to the controller (NUS-025, bundled with Hey You, Pikachu!) or a plastic neck holder for hands free usage (NUS-022, bundled with Densha de Go! 64).
The VRU is calibrated for best recognition of a high-pitched voice, such as a child's voice. As a result, adults and teenagers are less likely to have their speech recognized properly by the VRU.
VRUs are region dependent, and a USA region VRU cannot be used with Japanese games and vice versa (foreign region VRUs are not detected by the games). No VRU compatible game was launched in the EUR region (PAL, Europe), so there is no EUR-region VRU.
So, what does this have to do with Majora's Mask? Curiously enough, despite its obscurity, evidence in the game files suggests that its developers were once considering utilizing the VRS for this title, too.
Audio Editor - VRS Page
Page 7 of the Debug ROM's Audio Editor is meant for use with the Voice Recognition System. It's currently unknown if any functionality is left.
Controls
A + B | D-Pad | C-Buttons | |||
---|---|---|---|---|---|
A | - | D-Left | Choose ENTRY DICT | C-Left | - |
D-Down | - | C-Down | - | ||
B | - | D-Right | Choose ALL DICT | C-Right | - |
D-Up | - | C-Up | - |
Debug Text
The game's code file contains some VRS-related debug text.
Debug ROM only:
0x00E0B2B8 0x000B "../padmgr.c" 0x00E0B2C4 0x001C "音声認識装置を初期化しました" VRS initialized. 0x00E0B2E4 0x001E "標準コントローラを認識しました" Standard controller recognized. 0x00E0B304 0x0018 "マウス装置を認識しました" Mouse recognized. 0x00E0B320 0x001A "音声認識装置を認識しました" VRS recognized. 0x00E0B33C 0x002E "知らない種類のコントローラ(%04x)を認識しました" Unknown controller type (%04x) recognized. 0x00E0B36C 0x000C "応答しません" No response.
(J) 1.0 only:
../padmgr.c ../padmgr.c osVoiceInit rt=%d
(J) 1.0 & Debug ROM:
0x00E0EF4C 0x0017 "NOT CONNECT VRS UNIT!!!" 0x00E0EF64 0x0008 "%02x:%s" 0x00E0EF70 0x0008 "%02x:%s" 0x00E0EF7C 0x0006 "ANSWER" 0x00E0EF84 0x0008 "%02x:%s" 0x00E0EF90 0x0001 "*" 0x00E0EF94 0x0001 "V" 0x00E0EF98 0x000E "%04d %04d %04x"
0x00E0F4C0 0x0009 "Error %d\x0A" 0x00E0F4CC 0x0022 "NAI_VRS:osVoiceClearDictionary %d\x0A" 0x00E0F4F0 0x0021 "NAI_VRS:dict entry (%d-%d %s %s)\x0A" 0x00E0F514 0x001F "NAI_VRS:dict error! (%d-%d %s)\x0A" 0x00E0F534 0x001E "NAI_VRS:Ina_SetVruGain Error!\x0A" 0x00E0F554 0x0014 "NAI_VRS:mask on %d\x0A" 0x00E0F56C 0x0014 "NAI_VRS:mask off %d\x0A" 0x00E0F584 0x0042 "NAI_VRS:answer No.:%d Dist:%d Warn:%04X Level:%5d SN:%5d (Num:%d)\x0A" 0x00E0F5C8 0x0044 "NAI_VRS:error !! (ANS_MAX:%d DIST:%d WARNING:%04X LEVEL:%5d SN:%5d)\x0A" 0x00E0F66B 0x0001 "D" 0x00E0F723 0x0001 "0"
Actor Notes
(J) 1.0
The following actors contain JALs to VRS-related code function 801A0060:
En_Cow Cow En_Gs Gossip Stone En_Hidden_Nuts Sleeping Deku Scrub En_Horse Epona
The following actors contain JALs to VRS-related code function 8019FFE0:
En_Gs Gossip Stone
Function Notes
(J) 1.0
Function 8019FF38, in the code file, gets called each time a scene is loaded.
The byte at 801D356C must be 0x1 to 0x3. If the byte at 801D356C is set to 01, it takes effect on some scene changes. If it's 02, it takes effect instantly. If it's set to 0x3, both of these things happen.
The function has to check the return value of a low level function not yet understood before it decides to convert the katakana strings. Perhaps it's checking to see if the VRS is connected?
Function 8008FCD0, found in the boot file, has to return 0. (Boot function 8008FCD0 normally returns 0xB.)
There's a handful of functions around 801A0000 that might help meet the first condition.
One of the functions nested in 8008FCD0 disables interrupts.
Debug ROM
If you set 8021B0CC to 03 the "NOT CONNECT VRS UNIT!!!" debug text in the Audio Editor changes to "ANSWER", and 8021AE70 gets written to 8025A090. 8021AE70 points to the string table below.
Playtendo has a Japanese VRS unit, but couldn't get the game to recognize it. Perhaps one can force it to be recognized somehow? Regardless, is there a way to know if the game would do anything if it did recognize the unit?
Data Notes
A 0x260 byte long section of data in the game's code file is used by the functions described above.
Version | ROM | RAM | ||
---|---|---|---|---|
St. | Ed. | St. | Ed. | |
(J) 1.0 | 12BC70 | 12BED0 | 801D3310 | 801D3570 |
(J) 1.1 | 801D3520 | |||
Demo (U) | 801D83F0 | |||
(U) 1.0 | 801D8BE0 | |||
(E) 1.0 | 801D1170 | |||
(E) 1.1 | 801D1510 | |||
GameCube (J) | 801D7E50 | |||
GameCube (U) | 801D7E60 | |||
GameCube (E) | 801CFAB0 | |||
Debug ROM | 8021AE70 |
The section from 0x0 to 0x258 is reserved for a table of 0x1E byte long text strings. In the retail versions of the game, this table contains 6 strings, while in the Debug ROM, it contains 8, even though it has room for a total of 20 text strings.
The data from 0x258 to 0x25C contains the number of strings in the table.
The data from 0x25C to 0x260 contains the byte at 801D356C that (J) 1.0 code function 0x8019FF38, mentioned above, watches for.
The purpose of the data from 0x260 to 0x270 is unknown.
Following this data is two tables of gojūon syllables (basically, the Japanese alphabet) written in romaji with nulls (converted to tabs for the sake of this article) between each:
aa AA ii II uu UU ee EE oo OO KA GA KI GI KU GU KE GE KO GO SA ZA SI ZI SU ZU SE ZE SO ZO TA DA TI DI tu TU DU TE DE TO DO NA NI NU NE NO HA BA PA HI BI PI HU BU PU HE BE PE HO BO PO MA MI MU ME MO ya YA yu YU yo YO RA RI RU RE RO wa WA WI WE WO NN VU ka ke
aa AA ii II uu UU ee EE oo OO KA GA KI GI KU GU KE GE KO GO SA ZA SI ZI SU ZU SE ZE SO ZO TA DA TI DI tu TU DU TE DE TO DO NA NI NU NE NO HA BA PA HI BI PI HU BU PU HE BE PE HO BO PO MA MI MU ME MO ya YA yu YU yo YO RA RI RU RE RO wa WA WI WE WO NN VU ka ke
The syllables in these tables are converted into katakana, and used to write the strings in the string table below. The only difference between the two is that the second one has two spaces after MI, for some reason.
Strings
Table Offset |
String | Translation | Notes |
---|---|---|---|
00 | アトナンジカン | How many hours left? | Asking Gossip Stones what time it is? One of the VRU functions is linked by En_Gs, the Gossip Stone actor. |
1E | ハイチーズ | Say cheese! | Taking a pictograph? |
3C | オキロー | Wake up | Waking a sleeping NPC? |
5A | オスワリ | Sit | Commanding a dog? |
78 | ミルク | Milk | Getting milk from cows? |
96 | ハイヤー | Hi-yah | Spurring on Epona? |
B4 | ヒダリ | Left | Debug ROM only. |
D2 | ミギ | Right | Debug ROM only. |