Game Boy Sound Operation
| Game Boy Sound Operation | |
| ------------------------ | |
| Shay Green (blargg) | |
| gblargg@gmail.com | |
| http://www.slack.net/~ant/ | |
| ** This is an incomplete draft | |
| This documents the behavior of Game Boy sound; details which aren't | |
| relevant to the observable behavior have been omitted unless they | |
| clarify understanding. It is aimed at answering all questions about | |
| exact operation, rather than describing how to use sound effectively in | |
| Game Boy programs. Values in hexadecimal (base 16) are generally written | |
| with a $ prefix. Bits are numbered from 0 to 7, where bit N has a weight | |
| of 2^N. A nybble is 4 bits, half a byte. Obscure behavior is described | |
| separately to increase clarity elsewhere. | |
| Contact me for a set of test ROMs that verify most behavior described | |
| here. | |
| Contents | |
| -------- | |
| - Overview | |
| - Registers | |
| - Channels | |
| - Timer | |
| - Frame Sequencer | |
| - Length Counter | |
| - Volume Envelope | |
| - Square Wave | |
| - Frequency Sweep | |
| - Noise Channel | |
| - Wave Channel | |
| - Channel DAC | |
| - Trigger Event | |
| - Mixer | |
| - Power Control | |
| - Register Reading | |
| - Vin Mixing | |
| - Obscure Behavior | |
| - Differences | |
| - To Do | |
| - Thanks | |
| Overview | |
| -------- | |
| The Game Boy has four sound channels: two square waves with adjustable | |
| duty, a programmable wave table, and a noise generator. Each has some | |
| kind of frequency (pitch) control. The first square channel also has an | |
| automatic frequency sweep unit to help with sound effects. The squares | |
| and noise each have a volume envelope unit to help with fading notes and | |
| sound effects, while the wave channel has only limited manual volume | |
| control. Each channel has a length counter that can silence the channel | |
| after a preset time, to handle note durations. Each channel can be | |
| individually panned to the far left, center, or far right. The master | |
| volume of the left and right outputs can also be adjusted. | |
| Different versions of the Game Boy sound hardware have slightly | |
| different behavior. The following models have been tested: | |
| DMG-CPU-03 original Game Boy | |
| DMG-CPU-05 | |
| DMG-CPU-06 | |
| MGB-LCPU-01 Game Boy Pocket | |
| CGB-CPU-02 Game Boy Color | |
| CGB-CPU-04 | |
| CGB-CPU-05 | |
| Registers | |
| --------- | |
| Sound registers are mapped to $FF10-$FF3F in memory. Each channel has | |
| five logical registers, NRx0-NRx4, though some don't use NRx0. The value | |
| written to bits marked with '-' has no effect. Reference to the value in | |
| a register means the last value written to it. | |
| Name Addr 7654 3210 Function | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
| Square 1 | |
| NR10 FF10 -PPP NSSS Sweep period, negate, shift | |
| NR11 FF11 DDLL LLLL Duty, Length load (64-L) | |
| NR12 FF12 VVVV APPP Starting volume, Envelope add mode, period | |
| NR13 FF13 FFFF FFFF Frequency LSB | |
| NR14 FF14 TL-- -FFF Trigger, Length enable, Frequency MSB | |
| Square 2 | |
| FF15 ---- ---- Not used | |
| NR21 FF16 DDLL LLLL Duty, Length load (64-L) | |
| NR22 FF17 VVVV APPP Starting volume, Envelope add mode, period | |
| NR23 FF18 FFFF FFFF Frequency LSB | |
| NR24 FF19 TL-- -FFF Trigger, Length enable, Frequency MSB | |
| Wave | |
| NR30 FF1A E--- ---- DAC power | |
| NR31 FF1B LLLL LLLL Length load (256-L) | |
| NR32 FF1C -VV- ---- Volume code (00=0%, 01=100%, 10=50%, 11=25%) | |
| NR33 FF1D FFFF FFFF Frequency LSB | |
| NR34 FF1E TL-- -FFF Trigger, Length enable, Frequency MSB | |
| Noise | |
| FF1F ---- ---- Not used | |
| NR41 FF20 --LL LLLL Length load (64-L) | |
| NR42 FF21 VVVV APPP Starting volume, Envelope add mode, period | |
| NR43 FF22 SSSS WDDD Clock shift, Width mode of LFSR, Divisor code | |
| NR44 FF23 TL-- ---- Trigger, Length enable | |
| Control/Status | |
| NR50 FF24 ALLL BRRR Vin L enable, Left vol, Vin R enable, Right | |
| vol | |
| NR51 FF25 NW21 NW21 Left enables, Right enables | |
| NR52 FF26 P--- NW21 Power control/status, Channel length statuses | |
| Not used | |
| FF27 ---- ---- | |
| .... ---- ---- | |
| FF2F ---- ---- | |
| Wave Table | |
| FF30 0000 1111 Samples 0 and 1 | |
| .... | |
| FF3F 0000 1111 Samples 30 and 31 | |
| Channels | |
| -------- | |
| Each channel has a frequency timer which clocks a waveform generator. | |
| The waveform's volume is adjusted and fed to the mixer. The mixer | |
| converts each channel's waveform into an electrical signal and outputs | |
| this to the left and/or right channels. Finally, a master volume control | |
| adjusts the left and right outputs. The channels have the following | |
| units that are connected from left to right: | |
| Square 1: Sweep -> Timer -> Duty -> Length Counter -> Envelope -> Mixer | |
| Square 2: Timer -> Duty -> Length Counter -> Envelope -> Mixer | |
| Wave: Timer -> Wave -> Length Counter -> Volume -> Mixer | |
| Noise: Timer -> LFSR -> Length Counter -> Envelope -> Mixer | |
| The mixer has a separate DAC for each channel, followed by on/off | |
| controls for left and right outputs. The left/right outputs from each | |
| channel are then added together and fed to the left/right master volume | |
| controls. | |
| In general, all units in the channels are always running. For example, | |
| even if a channel is silent, several units will still be calculating | |
| values even though they aren't used. | |
| Timer | |
| ----- | |
| A timer generates an output clock every N input clocks, where N is the | |
| timer's period. If a timer's rate is given as a frequency, its period is | |
| 4194304/frequency in Hz. Each timer has an internal counter that is | |
| decremented on each input clock. When the counter becomes zero, it is | |
| reloaded with the period and an output clock is generated. | |
| Frame Sequencer | |
| --------------- | |
| The frame sequencer generates low frequency clocks for the modulation | |
| units. It is clocked by a 512 Hz timer. | |
| Step Length Ctr Vol Env Sweep | |
| - - - - - - - - - - - - - - - - - - - - | |
| 0 Clock - - | |
| 1 - - - | |
| 2 Clock - Clock | |
| 3 - - - | |
| 4 Clock - - | |
| 5 - - - | |
| 6 Clock - Clock | |
| 7 - Clock - | |
| - - - - - - - - - - - - - - - - - - - - | |
| Rate 256 Hz 64 Hz 128 Hz | |
| Length Counter | |
| -------------- | |
| A length counter disables a channel when it decrements to zero. It | |
| contains an internal counter and enabled flag. Writing a byte to NRx1 | |
| loads the counter with 64-data (256-data for wave channel). The counter | |
| can be reloaded at any time. | |
| A channel is said to be disabled when the internal enabled flag is | |
| clear. When a channel is disabled, its volume unit receives 0, otherwise | |
| its volume unit receives the output of the waveform generator. Other | |
| units besides the length counter can enable/disable the channel as well. | |
| Each length counter is clocked at 256 Hz by the frame sequencer. When | |
| clocked while enabled by NRx4 and the counter is not zero, it is | |
| decremented. If it becomes zero, the channel is disabled. | |
| Volume Envelope | |
| --------------- | |
| A volume envelope has a volume counter and an internal timer clocked at | |
| 64 Hz by the frame sequencer. When the timer generates a clock and the | |
| envelope period is not zero, a new volume is calculated by adding or | |
| subtracting (as set by NRx2) one from the current volume. If this new | |
| volume within the 0 to 15 range, the volume is updated, otherwise it is | |
| left unchanged and no further automatic increments/decrements are made | |
| to the volume until the channel is triggered again. | |
| When the waveform input is zero the envelope outputs zero, otherwise it | |
| outputs the current volume. | |
| Writing to NRx2 causes obscure effects on the volume that differ on | |
| different Game Boy models (see obscure behavior). | |
| Square Wave | |
| ----------- | |
| A square channel's frequency timer period is set to (2048-frequency)*4. | |
| Four duty cycles are available, each waveform taking 8 frequency timer | |
| clocks to cycle through: | |
| Duty Waveform Ratio | |
| - - - - - - - - - - - - - | |
| 0 00000001 12.5% | |
| 1 10000001 25% | |
| 2 10000111 50% | |
| 3 01111110 75% | |
| Frequency Sweep | |
| --------------- | |
| The first square channel has a frequency sweep unit, controlled by NR10. | |
| This has a timer, internal enabled flag, and frequency shadow register. | |
| It can periodically adjust square 1's frequency up or down. | |
| During a trigger event, several things occur: | |
| - Square 1's frequency is copied to the shadow register. | |
| - The sweep timer is reloaded. | |
| - The internal enabled flag is set if either the sweep period or shift | |
| are non-zero, cleared otherwise. | |
| - If the sweep shift is non-zero, frequency calculation and the overflow | |
| check are performed immediately. | |
| Frequency calculation consists of taking the value in the frequency | |
| shadow register, shifting it right by sweep shift, optionally negating | |
| the value, and summing this with the frequency shadow register to | |
| produce a new frequency. What is done with this new frequency depends on | |
| the context. | |
| The overflow check simply calculates the new frequency and if this is | |
| greater than 2047, square 1 is disabled. | |
| The sweep timer is clocked at 128 Hz by the frame sequencer. When it | |
| generates a clock and the sweep's internal enabled flag is set and the | |
| sweep period is not zero, a new frequency is calculated and the overflow | |
| check is performed. If the new frequency is 2047 or less and the sweep | |
| shift is not zero, this new frequency is written back to the shadow | |
| frequency and square 1's frequency in NR13 and NR14, then frequency | |
| calculation and overflow check are run AGAIN immediately using this new | |
| value, but this second new frequency is not written back. | |
| Square 1's frequency can be modified via NR13 and NR14 while sweep is | |
| active, but the shadow frequency won't be affected so the next time the | |
| sweep updates the channel's frequency this modification will be lost. | |
| Noise Channel | |
| ------------- | |
| The noise channel's frequency timer period is set by a base divisor | |
| shifted left some number of bits. | |
| Divisor code Divisor | |
| - - - - - - - - - - - - | |
| 0 8 | |
| 1 16 | |
| 2 32 | |
| 3 48 | |
| 4 64 | |
| 5 80 | |
| 6 96 | |
| 7 112 | |
| The linear feedback shift register (LFSR) generates a pseudo-random bit | |
| sequence. It has a 15-bit shift register with feedback. When clocked by | |
| the frequency timer, the low two bits (0 and 1) are XORed, all bits are | |
| shifted right by one, and the result of the XOR is put into the | |
| now-empty high bit. If width mode is 1 (NR43), the XOR result is ALSO | |
| put into bit 6 AFTER the shift, resulting in a 7-bit LFSR. The waveform | |
| output is bit 0 of the LFSR, INVERTED. | |
| Wave Channel | |
| ------------ | |
| The wave channel plays a 32-entry wave table made up of 4-bit samples. | |
| Each byte encodes two samples, the first in the high bits. The wave | |
| channel has a sample buffer and position counter. | |
| The wave channel's frequency timer period is set to (2048-frequency)*2. | |
| When the timer generates a clock, the position counter is advanced one | |
| sample in the wave table, looping back to the beginning when it goes | |
| past the end, then a sample is read into the sample buffer from this NEW | |
| position. | |
| The DAC receives the current value from the upper/lower nybble of the | |
| sample buffer, shifted right by the volume control. | |
| Code Shift Volume | |
| - - - - - - - - - - - - | |
| 0 4 0% (silent) | |
| 1 0 100% | |
| 2 1 50% | |
| 3 2 25% | |
| Wave RAM can only be properly accessed when the channel is disabled (see | |
| obscure behavior). | |
| Trigger Event | |
| ------------- | |
| Writing a value to NRx4 with bit 7 set causes the following things to | |
| occur: | |
| - Channel is enabled (see length counter). | |
| - If length counter is zero, it is set to 64 (256 for wave channel). | |
| - Frequency timer is reloaded with period. | |
| - Volume envelope timer is reloaded with period. | |
| - Channel volume is reloaded from NRx2. | |
| - Noise channel's LFSR bits are all set to 1. | |
| - Wave channel's position is set to 0 but sample buffer is NOT refilled. | |
| - Square 1's sweep does several things (see frequency sweep). | |
| Note that if the channel's DAC is off, after the above actions occur the | |
| channel will be immediately disabled again. | |
| Channel DAC | |
| ----------- | |
| Each channel has a 4-bit digital-to-analog convertor (DAC). This | |
| converts the input value to a proportional output voltage. An input of 0 | |
| generates -1.0 and an input of 15 generates +1.0, using arbitrary | |
| voltage units. | |
| DAC power is controlled by the upper 5 bits of NRx2 (top bit of NR30 for | |
| wave channel). If these bits are not all clear, the DAC is on, otherwise | |
| it's off and outputs 0 volts. Also, any time the DAC is off the channel | |
| is kept disabled (but turning the DAC back on does NOT enable the | |
| channel). | |
| Mixer | |
| ----- | |
| Each channel's DAC output goes to a pair of on/off switches for the left | |
| and right channels before they are sent to the left/right mixers. A | |
| mixer simply adds the voltages from each channel together. These | |
| left/right switches are controlled by NR51. When a switch is off, the | |
| mixer receives 0 volts. | |
| The Vin bits of NR50 control mixing of the Vin signal from the | |
| cartridge, allowing extra sound hardware. | |
| The mixed left/right signals go to the left/right master volume | |
| controls. These multiply the signal by (volume+1). The volume step | |
| relative to the channel DAC is such that a single channel enabled via | |
| NR51 playing at volume of 2 with a master volume of 7 is about as loud | |
| as that channel playing at volume 15 with a master volume of 0. | |
| Power Control | |
| ------------- | |
| NR52 controls power to the sound hardware. When powered off, all | |
| registers (NR10-NR51) are instantly written with zero and any writes to | |
| those registers are ignored while power remains off (except on the DMG, | |
| where length counters are unaffected by power and can still be written | |
| while off). When powered on, the frame sequencer is reset so that the | |
| next step will be 0, the square duty units are reset to the first step | |
| of the waveform, and the wave channel's sample buffer is reset to 0. | |
| Power state does not affect wave memory, which can always be | |
| read/written. It also does not affect the 512 Hz timer that feeds the | |
| frame sequencer. | |
| When the Game Boy is switched on (before the internal boot ROM | |
| executes), the values in the wave table depend on the model. On the DMG, | |
| they are somewhat random, though the particular pattern is generally the | |
| same for each individual Game Boy unit. The game R-Type doesn't | |
| initialize wave RAM and thus relies on these. One set of values is | |
| 84 40 43 AA 2D 78 92 3C 60 59 59 B0 34 B8 2E DA | |
| On the Game Boy Color, the values are consistently | |
| 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF | |
| Register Reading | |
| ---------------- | |
| Reading NR52 yields the current power status and each channel's enabled | |
| status (from the length counter). | |
| Wave RAM reads back as the last value written. | |
| When an NRxx register is read back, the last written value ORed with the | |
| following is returned: | |
| NRx0 NRx1 NRx2 NRx3 NRx4 | |
| - - - - - - - - - - - - - - | |
| NR1x $80 $3F $00 $FF $BF | |
| NR2x $FF $3F $00 $FF $BF | |
| NR3x $7F $FF $9F $FF $BF | |
| NR4x $FF $FF $00 $00 $BF | |
| NR5x $00 $00 $70 | |
| $FF27-$FF2F always read back as $FF | |
| That is, the channel length counters, frequencies, and unused bits | |
| always read back as set to all 1s. | |
| Vin Mixing | |
| ---------- | |
| The cartridge connector includes a sound input called Vin. When enabled | |
| via NR50, it is mixed in before the master volume controls. On the DMG | |
| and MGB, 0.847 volts gives equivalent to 0 on a channel DAC, and 3.710 | |
| volts is equivalent to 15 on a DAC, with other values linearly | |
| distributed between those voltages. On the CGB, the range is 1.920 volts | |
| to 2.740 volts, a quarter of the DMG range, thus sound fed to the CGB's | |
| Vin is significantly louder. | |
| Obscure Behavior | |
| ---------------- | |
| - The volume envelope and sweep timers treat a period of 0 as 8. | |
| - Just after powering on, the first duty step of the square waves after | |
| they are triggered for the first time is played as if it were 0. Also, | |
| the square duty sequence clocking is disabled until the first trigger. | |
| - When triggering the wave channel, the first sample to play is the | |
| previous one still in the high nybble of the sample buffer, and the next | |
| sample is the second nybble from the wave table. This is because it | |
| doesn't load the first byte on trigger like it "should". The first | |
| nybble from the wave table is thus not played until the waveform loops. | |
| - When triggering a square channel, the low two bits of the frequency | |
| timer are NOT modified. | |
| - Extra length clocking occurs when writing to NRx4 when the frame | |
| sequencer's next step is one that doesn't clock the length counter. In | |
| this case, if the length counter was PREVIOUSLY disabled and now enabled | |
| and the length counter is not zero, it is decremented. If this decrement | |
| makes it zero and trigger is clear, the channel is disabled. On the | |
| CGB-02, the length counter only has to have been disabled before; the | |
| current length enable state doesn't matter. This breaks at least one | |
| game (Prehistorik Man), and was fixed on CGB-04 and CGB-05. | |
| - If a channel is triggered when the frame sequencer's next step is one | |
| that doesn't clock the length counter and the length counter is now | |
| enabled and length is being set to 64 (256 for wave channel) because it | |
| was previously zero, it is set to 63 instead (255 for wave channel). | |
| - If a channel is triggered when the frame sequencer's next step will | |
| clock the volume envelope, the envelope's timer is reloaded with one | |
| greater than it would have been. | |
| - Using a noise channel clock shift of 14 or 15 results in the LFSR | |
| receiving no clocks. | |
| - Clearing the sweep negate mode bit in NR10 after at least one sweep | |
| calculation has been made using the negate mode since the last trigger | |
| causes the channel to be immediately disabled. This prevents you from | |
| having the sweep lower the frequency then raise the frequency without a | |
| trigger inbetween. | |
| - If the wave channel is enabled, accessing any byte from $FF30-$FF3F is | |
| equivalent to accessing the current byte selected by the waveform | |
| position. Further, on the DMG accesses will only work in this manner if | |
| made within a couple of clocks of the wave channel accessing wave RAM; | |
| if made at any other time, reads return $FF and writes have no effect. | |
| - Triggering the wave channel on the DMG while it reads a sample byte | |
| will alter the first four bytes of wave RAM. If the channel was reading | |
| one of the first four bytes, only the first byte will be rewritten with | |
| the byte being read. If the channel was reading one of the later 12 | |
| bytes, the first FOUR bytes of wave RAM will be rewritten with the four | |
| aligned bytes that the read was from (bytes 4-7, 8-11, or 12-15); for | |
| example if it were reading byte 9 when it was retriggered, the first | |
| four bytes would be rewritten with the contents of bytes 8-11. To avoid | |
| this corruption you should stop the wave by writing 0 then $80 to NR30 | |
| before triggering it again. The game Duck Tales encounters this issue | |
| part way through most songs. | |
| - "Zombie" mode: the volume can be manually altered while a channel is | |
| playing by writing to NRx2. Behavior depends on the old and new values | |
| of NRx2, and whether the envlope has stopped automatic updates. The | |
| CGB-02 and CGB-04 are the most consistent: | |
| - If the old envelope period was zero and the envelope is still | |
| doing automatic updates, volume is incremented by 1, otherwise if the | |
| envelope was in subtract mode, volume is incremented by 2. | |
| - If the mode was changed (add to subtract or subtract to add), | |
| volume is set to 16-volume. | |
| - Only the low 4 bits of volume are kept after the above operations. | |
| Other models behave differently, especially the DMG units which have | |
| crazy behavior in some cases. The only useful consistent behavior is | |
| using add mode with a period of zero in order to increment the volume by | |
| 1. That is, write $V8 to NRx2 to set the initial volume to V before | |
| triggering the channel, then write $08 to NRx2 to increment the volume | |
| as the sound plays (repeat 15 times to decrement the volume by 1). This | |
| allows manual volume control on all units tested. | |
| - When all four channel DACs are off, the master volume units are | |
| disconnected from the sound output and the output level becomes 0. When | |
| any channel DAC is on, a high-pass filter capacitor is connected which | |
| slowly removes any DC component from the signal. The following code | |
| applied at 4194304 Hz implements these two behaviors for one of the DMG | |
| output channels (unoptimized floating point for clarity): | |
| static double capacitor = 0.0; | |
| double high_pass( double in, bool dacs_enabled ) | |
| { | |
| double out = 0.0; | |
| if ( dacs_enabled ) | |
| { | |
| out = in - capacitor; | |
| // capacitor slowly charges to 'in' via their difference | |
| capacitor = in - out * 0.999958; // use 0.998943 for MGB&CGB | |
| } | |
| return out; | |
| } | |
| The charge factor can be calculated for any output sampling rate as | |
| 0.999958^(4194304/rate). So if you were applying high_pass() at 44100 | |
| Hz, you'd use a charge factor of 0.996. | |
| Differences | |
| ----------- | |
| This summarizes differences I've found among the models tested. | |
| Wave RAM access: | |
| - Possible only when it's doing wave RAM read (DMG-03, DMG-05, DMG-06, | |
| MGB-01). | |
| - Can be accessed any time (CGB-02, CGB-04, CGB-05). | |
| Wave channel re-trigger without disabling first (via NR30): | |
| - Re-writes first four bytes of wave RAM (DMG-03, DMG-05, DMG-06, | |
| MGB-01). | |
| - Behaves normally (CGB-02, CGB-04, CGB-05). | |
| Length counters and power off: | |
| - Preserved and can be written while off (DMG-03, DMG-05, DMG-06, | |
| MGB-01). | |
| - Always zero at power on (CGB-02, CGB-04, CGB-05). | |
| Length clocking on NRx4: | |
| - New length enable doesn't matter (CGB-02). | |
| - Length must now be enabled (DMG-03, DMG-05, DMG-06, CGB-04, CGB-05, | |
| MGB-01). | |
| Volume changes on NRx2 write: | |
| - $x0 to $xx and $x7 to $xx are very screwey (DMG-03, DMG-05, DMG-06, | |
| MGB-01). | |
| - Behavior as described in obscure behavior (CGB-02, CGB-04). | |
| - If mode isn't being changed, only $x8 to $xx affects volume. Mode | |
| change is also a bit different (CGB-05). | |
| To Do | |
| ----- | |
| - Using an envelope or sweep period of 0 then switching to another | |
| period also causes an extra clock in some cases. | |
| - Frequency sweep has some really intricate behavior when rewriting | |
| sweep register | |
| - Noise's frequency timer is more complex than described, resulting in | |
| trigger doing something more than simply reloading it. It may have | |
| multiple dividers to achieve the documented periods, with only some of | |
| them being reset on trigger. | |
| - Behavior when triggering and writing to registers within a few clocks | |
| of frame sequencer events has yet to be determined. There will be lots | |
| of odd things uncovered for sure. | |
| - Figure out exactly how noise LFSR is implemented with regard to mode | |
| changes. | |
| - Document exact timing for DMG wave issues. | |
| Thanks | |
| ------ | |
| - Lord Nightmare for GBSOUND.txt, assistance, testing, GBs to test. | |
| - Laguna for the gnuboy emulator. | |
| - Ville Helin for WLA DX GB-Z80 assembler. | |
| - sinamas for feedback about this document and my test ROMs. | |
| -- | |
| Shay Green <gblargg@gmail.com> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment