Hyper Voice

From WSdev Wiki
Revision as of 13:50, 24 March 2024 by Asie (talk | contribs)
Jump to navigationJump to search

Hyper Voice is a headphone-only sample output channel introduced with the WonderSwan Color. It allows converting 8-bit signed and unsigned, mono and stereo samples into 16-bit signed PCM sent directly to the headphone output, after mixing with the traditional four channels.

I/O Ports

Hyper Voice Left Output ($64, $65 write)

Hyper Voice Right Output ($66, $67 write)

15  bit  8  7  bit  0
 ---- ----  ---- ----
 ssss ssss  ssss ssss
 |||| ||||  |||| ||||
 ++++-++++--++++-++++- Signed 16-bit sample.

Unlike the Sound sample output registers, these can be written to - allowing for direct 16-bit sample output.

Hyper Voice Input ($69 write)

7  bit  0
---- ----
ssss ssss
|||| ||||
++++-++++- Signed 8-bit sample.

Hyper Voice samples are typically written by Sound DMA, but can also be written manually by the user. In the latter case, the "channel mode" setting is ignored - it always behaves as if it were in "stereo" mode, writing one channel after the other in sequence.

Hyper Voice Control ($6A, $6B)

15  bit  8  7  bit  0
 ---- ----  ---- ----
 .mmc ????  errr ffss
  |||       |||| ||||
  |||       |||| ||++- Shift/Volume:
  |||       |||| ||      0 = 100%   1 = 50%
  |||       |||| ||      2 = 25%    3 = 12.5%
  |||       |||| ++--- Sample scaling mode:
  |||       ||||         0 = Unsigned
  |||       ||||         1 = Unsigned, negated
  |||       ||||         2 = Signed
  |||       ||||         3 = Ignored
  |||       |+++------ Update sample rate/Divisor:
  |||       |            0 = 24000/1  = 24000 Hz
  |||       |            1 = 24000/2  = 12000 Hz
  |||       |            2 = 24000/3  =  8000 Hz
  |||       |            3 = 24000/4  =  6000 Hz
  |||       |            4 = 24000/5  =  4800 Hz
  |||       |            5 = 24000/6  =  4000 Hz
  |||       |            6 = 24000/8  =  3000 Hz
  |||       |            7 = 24000/12 =  2000 Hz
  |||       +--------- Enable: 0 = off, 1 = on
  ||+----------------- Reset: When 1 is written, the following DMA sample
  ||                          will be used for the left channel.
  ++------------------ Channel mode:
                         0 = Stereo
                         1 = Mono, left channel only
                         2 = Mono, right channel only
                         3 = Mono, both channels

Input samples are treated as signed 8-bit values. If volume is not 100% and sample scaling mode is not ignored, they may instead be treated as unsigned and/or be rescaled to the following value ranges:

Sample scaling modes - resulting sample ranges
Algorithm/Volume 100% 50% 25% 12.5%
Unsigned 0x0000 .. 0xFFFF 0x8000 .. 0xFFFF 0x8000 .. 0xBFFF 0x8000 .. 0x9FFF
Unsigned, negated 0x0000 .. 0xFFFF 0x0000 .. 0x7FFF 0x4000 .. 0x7FFF 0x6000 .. 0x7FFF
Signed 0x0000 .. 0xFFFF 0x4000 .. 0xBFFF 0x6000 .. 0x9FFF 0x7000 .. 0x8FFF
Ignored 0x0000 .. 0xFFFF 0x0000 .. 0xFFFF 0x0000 .. 0xFFFF 0x0000 .. 0xFFFF