How to Improve the Drum Channel - pret/pokecrystal GitHub Wiki

In Pokemon Gold/Silver/Crystal, there was support for Generation 1 percussion, but the sounds are distorted. Additionally, some of the new sounds tend to sound a little slurred. The main problem stems from an instruction in ReadNoiseSample.

First, let's see how wNoiseSampleDelay is used.

	ld a, [wNoiseSampleDelay]
	and a
	jr z, ReadNoiseSample
	dec a
	ld [wNoiseSampleDelay], a

When a sample is first loaded, we come around to see if the delay is 0. That means, if done right, a note can play at any frame within 256 of the last. If wNoiseSampleDelay is 0, we read the next sample in ReadNoiseSample.

Here's the problem though. While register a is reduced to a 4-bit value, it's incremented before it gets stored into ReadNoiseSample. Instead of 1-16 frames, it's raised to 2-17; no drum sound can last less than 2 frames. Here's the fix in audio/engine.asm:

	ld a, [de] 
	inc de

	cp sound_ret_cmd
	jr z, .quit

	and $f
-	inc a
	ld [wNoiseSampleDelay], a

There you go. Now the noise channel will play as intended. Enjoy the clean, clear new samples and the Gen 1 proper sound on the noise channel.