Add a new music command to change drumkits - pret/pokecrystal GitHub Wiki

In this tutorial we'll implement a new command is called noisesampleset. It basically changes the drumkit used on the fly. For some background information, there are many different noise "notes" but each drumkit only has 12 slots, so there are multiple different drumkits to choose from. The original game has a command to set the drumkit (togglenoise), but using it again turns off the noise channel entirely. For compatibility reasons, it's better to create a new command to do this than change the original one.

(This code was adapted from Polished Crystal)

Edit macros/scripts/audio.asm:

- const unknownmusic0xf9_cmd ; $f9
- unknownmusic0xf9: MACRO
- 	db unknownmusic0xf9_cmd
- ENDM

+	const noisesampleset_cmd ; $f9
+noisesampleset: MACRO
+	db noisesampleset_cmd
+	db \1 ; noise
+ ENDM

Edit audio/engine.asm in these spots:

MusicCommands:
(...)
	dw MusicF1 ; nothing
	dw MusicF2 ; nothing
	dw MusicF3 ; nothing
	dw MusicF4 ; nothing
	dw MusicF5 ; nothing
	dw MusicF6 ; nothing
	dw MusicF7 ; nothing
	dw MusicF8 ; nothing
-       dw MusicF9 ; unused
+       dw Music_ChangeNoiseSampleSet ; noisesampleset
	dw Music_SetCondition ; set condition
	dw Music_JumpIf ; jumpif
	dw Music_Jump ; jump
	dw Music_Loop ; loop
	dw Music_Call ; call
	dw Music_Ret ; return

_PlayMusic::
(...)
.loop
; start playing channels
	push af
	call LoadChannel
	call StartChannel
	pop af
	dec a
	jr nz, .loop
	xor a
-	ld [wUnusedMusicF9Flag], a
	ld [wChannel1JumpCondition], a
	ld [wChannel2JumpCondition], a

(...)
-MusicF9:
-; sets some flag
-; seems to be unused
-; params: 0
-	ld a, TRUE
-	ld [wUnusedMusicF9Flag], a
-	ret
(...)

Music_ToggleNoise: ; e893b
(...)
.on
	; turn noise sampling on
	set SOUND_NOISE, [hl]
+Music_ChangeNoiseSampleSet:
	call GetMusicByte
	ld [MusicNoiseSampleSet], a
	ret

That's pretty much it! We are just removing an unused music command and replacing it with our new one, which reuses a piece of code from Music_ToggleNoise that already exists.