From CloudModding MM Wiki

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.

Links

  • Zoinkity's Pastebin containing various notes on the VRS and the games that utilize it: [1]
  • Zoinkity's exploration of the MM VRS functions: [2]
  • Spreadsheet for exploring and disassembling VRS-related functions: [3]
  • MM (J) 1.0 MIPS Files: [4]