APU Mixer Emulation: Difference between revisions
m (Created page with 'The NES APU Mixer can be efficiently emulated using a lookup table or a less-accurate linear approximation. == Lookup Table == The APU mixer formulas can be effic...') |
Rainwarrior (talk | contribs) m (APU category) |
||
Line 1: | Line 1: | ||
[[Category:APU]] | |||
The [[APU Mixer|NES APU Mixer]] can be efficiently emulated using a lookup table or a less-accurate linear approximation. | The [[APU Mixer|NES APU Mixer]] can be efficiently emulated using a lookup table or a less-accurate linear approximation. | ||
Revision as of 20:01, 26 May 2012
The NES APU Mixer can be efficiently emulated using a lookup table or a less-accurate linear approximation.
Lookup Table
The APU mixer formulas can be efficiently implemented using two lookup tables: a 31-entry table for the two pulse channels and a 203-entry table for the remaining channels (due to the approximation of tnd_out, the numerators are adjusted slightly to preserve the normalized output range).
output = pulse_out + tnd_out pulse_table [n] = 95.52 / (8128.0 / n + 100) pulse_out = pulse_table [pulse1 + pulse2]
The tnd_out table is approximated (within 4%) by using a base unit close to the DMC's DAC.
tnd_table [n] = 163.67 / (24329.0 / n + 100) tnd_out = tnd_table [3 * triangle + 2 * noise + dmc]
Linear Approximation
A linear approximation can also be used, which results in slightly louder DMC samples, but otherwise fairly accurate operation since the wave channels use a small portion of the transfer curve. The overall volume will be reduced due to the headroom required by the DMC approximation.
output = pulse_out + tnd_out pulse_out = 0.00752 * (pulse1 + pulse2) tnd_out = 0.00851 * triangle + 0.00494 * noise + 0.00335 * dmc