VRC7 audio: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(filling out VRC7 info)
(explaining channel registers)
Line 18: Line 18:
=== Internal Audio Registers ===
=== Internal Audio Registers ===


The VRCVII appears to have 26 internal registers, with other register values in $9010 being ignored.
The VRCVII appears to have 26 internal registers.
Registers $00-$07 define a custom patch that can be played on any channel set to use instrument $0.
Registers $00-$07 define a custom patch that can be played on any channel set to use instrument $0.
Registers $10-$15, $20-25, and $30-35 control 6 channels for FM synthesis.
Registers $10-$15, $20-25, and $30-35 control 6 channels for FM synthesis.
Other register values appear to be ignored.
=== Custom patch ===


{| class="tabular"
{| class="tabular"
Line 40: Line 43:
|-
|-
| $07 || <tt>SSSS RRRR</tt> || Carrier sustain (S), release (R)
| $07 || <tt>SSSS RRRR</tt> || Carrier sustain (S), release (R)
|}
=== Channels ===
{| class="tabular"
! Register || Bitfield || Description
|-
|-
| $10-$15 || <tt>LLLL LLLL</tt> || Channel low 8 bits of frequency
| $10-$15 || <tt>LLLL LLLL</tt> || Channel low 8 bits of frequency
Line 48: Line 57:
|}
|}


== Channels ==
Each channel ''x'' is controlled by three registers at $1''x'', $2''x'', and $3''x''.
 
The 8 bits of $1''x'' with a 9th bit from bit 0 of $2''x'' create a 9-bit frequency value (''freq'').
This is combined with a 3-bit octave value from $2''x'' (''octave'') to define the output frequency (''F''):


TODO output frequency, what do the bits do, etc.
      49722 hz * freq
F = -----------------
      2^(19 - octave)


== Custom patch ==
Writing to register $2''x'' either begins a key-on or key-off event, depending on the value in the trigger bit (T).
If the trigger bit is 1, a new note begins, if it is 0 it will begin the release portion of its envelope which
will eventually silence the channel. If it was already 0, no new key-off will be generated. Note that the octave
and high frequency bit cannot be altered between key-on and key-off, but the low 8 bits of frequency in $1''x'' can
be used to apply vibrato and pitch bends.


TODO how custom patch works
Register $3''x'' selects the instrument patch to use, and chooses a volume. Note that volume value is inverted;
$F  the lowest volume, and $0 is the highest.


== Internal patch set ==
== Internal patch set ==

Revision as of 19:30, 13 April 2012

The Konami VRC7, in addition to being a mapper chip, also produces 6 channels of 2-operator FM Synthesis Audio. The synthesis core appears to be mostly compatible with the Yamaha YM2413 OPLL.

Registers

Audio Register Select ($9010)

7......0
VVVVVVVV
++++++++- The 8-bit internal register to select for use with $9030

Audio Register Write ($9030)

7......0
VVVVVVVV
++++++++- The 8-bit value to write to the internal register selected with $9010

Internal Audio Registers

The VRCVII appears to have 26 internal registers. Registers $00-$07 define a custom patch that can be played on any channel set to use instrument $0. Registers $10-$15, $20-25, and $30-35 control 6 channels for FM synthesis. Other register values appear to be ignored.

Custom patch

Register Bitfield Description
$00 TVSK MMMM Modulator tremolo (T), vibrato (V), sustain (S), key scaling (K), multiplier (M)
$01 TVSK MMMM Carrier tremolo (T), vibrato (V), sustain (S), key scaling (K), multiplier (M)
$02 KKOO OOOO Modulator key scale level (K), output level (O)
$03 KK-Q WEEE Carrier key scale level (K), unused 0 ? (-), carrier waveform (Q), modulator waveform (W), feedback (E)
$04 AAAA DDDD Modulator attack (A), decay (D)
$05 AAAA DDDD Carrier attack (A), decay (D)
$06 SSSS RRRR Modulator sustain (S), release (R)
$07 SSSS RRRR Carrier sustain (S), release (R)

Channels

Register Bitfield Description
$10-$15 LLLL LLLL Channel low 8 bits of frequency
$20-$25 --ST OOOH Channel sustain (S), trigger (T), octave (O), high bit of frequency (H)
$30-$35 IIII VVVV Channel instrument (I), volume (V)

Each channel x is controlled by three registers at $1x, $2x, and $3x.

The 8 bits of $1x with a 9th bit from bit 0 of $2x create a 9-bit frequency value (freq). This is combined with a 3-bit octave value from $2x (octave) to define the output frequency (F):

     49722 hz * freq
F = -----------------
     2^(19 - octave)

Writing to register $2x either begins a key-on or key-off event, depending on the value in the trigger bit (T). If the trigger bit is 1, a new note begins, if it is 0 it will begin the release portion of its envelope which will eventually silence the channel. If it was already 0, no new key-off will be generated. Note that the octave and high frequency bit cannot be altered between key-on and key-off, but the low 8 bits of frequency in $1x can be used to apply vibrato and pitch bends.

Register $3x selects the instrument patch to use, and chooses a volume. Note that volume value is inverted; $F the lowest volume, and $0 is the highest.

Internal patch set

There are 16 different instrument patches available on the VRC7. With the exception of instrument $0, which can be controlled by registers $00-$07 (see above), these are hardwired into the chip and cannot be altered.

Exact values for the fixed patch set are not yet known, the following table is conjectural:

     00 01 02 03 04 05 06 07
     -----------------------
 0 | -- -- -- -- -- -- -- --
 1 | 31 22 23 07 F0 F0 E8 F7
 2 | 03 31 68 05 F2 74 79 9C
 3 | 01 51 72 04 F1 D3 9D 8B
 4 | 22 61 1B 05 C0 A1 F8 E8
 5 | 22 61 2C 03 D2 A1 A7 E8
 6 | 31 22 FA 01 F1 F1 F4 EE
 7 | 21 61 28 06 F1 F1 CE 9B
 8 | 27 61 60 00 F0 F0 FF FD
 9 | 60 21 2B 06 85 F1 79 9D
 A | 31 A1 FF 0A 53 62 5E AF
 B | 03 A1 70 0F D4 A3 94 BE
 C | 2B 61 E4 07 F6 93 BD AC
 D | 21 63 ED 07 77 F1 C7 E8
 E | 21 61 2A 03 F3 E2 B6 D9
 F | 21 63 37 03 F3 E2 B6 D9

Differences with OPLL

  • Register layout is the same
  • VRC7 has 6 channels, OPLL has 9
  • VRC7 has no rhythm channels, OPLL does (the last 3 channels are either FM or Rhythm on OPLL)
  • VRC7 built-in instruments are NOT the same as OPLL instruments (except for instruments 4,5,7,8 which might be the same on both)
  • VRC7 has no readily-accessible status register, under normal circumstances it is write-only; OPLL has an undocumented, 2-bit 'internal state' register.
  • VRC7 has an internal state output pin (may be serial version of the 2 bit internal state register) and has one output pin for audio, multiplexed for all 6 channels; OPLL has two output pins, one for FM and one for Rhythm, and has no special status pin.

References

  • VRC7 chip info by Kevin Horton: [kevtris.org/nes/vrcvii.txt kevtris.org/nes/vrcvii.txt]