shithub: pokecrystal

Download patch

ref: 36247945996feb163bc79e5079924ecc90c8baf6
parent: 2cb3f8e1b9e494f01ef2bcb65a0baf463d0efff8
author: yenatch <[email protected]>
date: Wed May 21 12:26:28 EDT 2014

Split bank 0 audio functions into home/audio.asm.

--- a/home.asm
+++ b/home.asm
@@ -2518,602 +2518,7 @@
 ; 3b4e
 
 
-SoundRestart:: ; 3b4e
-
-	push hl
-	push de
-	push bc
-	push af
-
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(_SoundRestart)
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	call _SoundRestart
-
-	pop af
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3b6a
-
-
-UpdateSound:: ; 3b6a
-
-	push hl
-	push de
-	push bc
-	push af
-
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(_UpdateSound)
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	call _UpdateSound
-
-	pop af
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3b86
-
-
-_LoadMusicByte:: ; 3b86
-; CurMusicByte = [a:de]
-GLOBAL LoadMusicByte
-
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	ld a, [de]
-	ld [CurMusicByte], a
-	ld a, BANK(LoadMusicByte)
-
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-	ret
-; 3b97
-
-
-PlayMusic:: ; 3b97
-; Play music de.
-
-	push hl
-	push de
-	push bc
-	push af
-
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(_PlayMusic) ; and BANK(_SoundRestart)
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	ld a, e
-	and a
-	jr z, .nomusic
-
-	call _PlayMusic
-	jr .end
-
-.nomusic
-	call _SoundRestart
-
-.end
-	pop af
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3bbc
-
-
-PlayMusic2:: ; 3bbc
-; Stop playing music, then play music de.
-
-	push hl
-	push de
-	push bc
-	push af
-
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(_PlayMusic)
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	push de
-	ld de, MUSIC_NONE
-	call _PlayMusic
-	call DelayFrame
-	pop de
-	call _PlayMusic
-
-	pop af
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-
-; 3be3
-
-
-PlayCryHeader:: ; 3be3
-; Play a cry given parameters at header de
-
-	push hl
-	push de
-	push bc
-	push af
-
-	ld a, [hROMBank]
-	push af
-
-	; Cry headers are stuck in one bank.
-	ld a, BANK(CryHeaders)
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	ld hl, CryHeaders
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	inc hl
-
-	ld a, [hli]
-	ld [CryPitch], a
-	ld a, [hli]
-	ld [CryEcho], a
-	ld a, [hli]
-	ld [CryLength], a
-	ld a, [hl]
-	ld [CryLength + 1], a
-
-	ld a, BANK(PlayCry)
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	call PlayCry
-
-	pop af
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-	
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3c23
-
-
-PlaySFX:: ; 3c23
-; Play sound effect de.
-; Sound effects are ordered by priority (lowest to highest)
-
-	push hl
-	push de
-	push bc
-	push af
-
-	; Is something already playing?
-	call CheckSFX
-	jr nc, .play
-
-	; Does it have priority?
-	ld a, [CurSFX]
-	cp e
-	jr c, .done
-
-.play
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(_PlaySFX)
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-	ld a, e
-	ld [CurSFX], a
-	call _PlaySFX
-
-	pop af
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-
-.done
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3c4e
-
-
-WaitPlaySFX:: ; 3c4e
-	call WaitSFX
-	call PlaySFX
-	ret
-; 3c55
-
-
-WaitSFX:: ; 3c55
-; infinite loop until sfx is done playing
-
-	push hl
-	
-.wait
-	ld hl, Channel5Flags
-	bit 0, [hl]
-	jr nz, .wait
-	ld hl, Channel6Flags
-	bit 0, [hl]
-	jr nz, .wait
-	ld hl, Channel7Flags
-	bit 0, [hl]
-	jr nz, .wait
-	ld hl, Channel8Flags
-	bit 0, [hl]
-	jr nz, .wait
-	
-	pop hl
-	ret
-; 3c74
-
-IsSFXPlaying:: ; 3c74
-; Return carry if no sound effect is playing.
-; The inverse of CheckSFX.
-	push hl
-
-	ld hl, Channel5Flags
-	bit 0, [hl]
-	jr nz, .playing
-	ld hl, Channel6Flags
-	bit 0, [hl]
-	jr nz, .playing
-	ld hl, Channel7Flags
-	bit 0, [hl]
-	jr nz, .playing
-	ld hl, Channel8Flags
-	bit 0, [hl]
-	jr nz, .playing
-
-	pop hl
-	scf
-	ret
-
-.playing
-	pop hl
-	and a
-	ret
-; 3c97
-
-MaxVolume:: ; 3c97
-	ld a, $77 ; max
-	ld [Volume], a
-	ret
-; 3c9d
-
-LowVolume:: ; 3c9d
-	ld a, $33 ; 40%
-	ld [Volume], a
-	ret
-; 3ca3
-
-VolumeOff:: ; 3ca3
-	xor a
-	ld [Volume], a
-	ret
-; 3ca8
-
-Function3ca8:: ; 3ca8
-	ld a, 4
-	ld [MusicFade], a
-	ret
-; 3cae
-
-Function3cae:: ; 3cae
-	ld a, 4 | 1 << 7
-	ld [MusicFade], a
-	ret
-; 3cb4
-
-SkipMusic:: ; 3cb4
-; Skip a frames of music.
-	and a
-	ret z
-	dec a
-	call UpdateSound
-	jr SkipMusic
-; 3cbc
-
-FadeToMapMusic:: ; 3cbc
-	push hl
-	push de
-	push bc
-	push af
-
-	call GetMapMusic
-	ld a, [wMapMusic]
-	cp e
-	jr z, .done
-
-	ld a, 8
-	ld [MusicFade], a
-	ld a, e
-	ld [MusicFadeIDLo], a
-	ld a, d
-	ld [MusicFadeIDHi], a
-	ld a, e
-	ld [wMapMusic], a
-
-.done
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3cdf
-
-PlayMapMusic:: ; 3cdf
-	push hl
-	push de
-	push bc
-	push af
-
-	call GetMapMusic
-	ld a, [wMapMusic]
-	cp e
-	jr z, .done
-
-	push de
-	ld de, MUSIC_NONE
-	call PlayMusic
-	call DelayFrame
-	pop de
-	ld a, e
-	ld [wMapMusic], a
-	call PlayMusic
-
-.done
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3d03
-
-EnterMapMusic:: ; 3d03
-	push hl
-	push de
-	push bc
-	push af
-
-	xor a
-	ld [$c2c1], a
-	ld de, MUSIC_BICYCLE
-	ld a, [PlayerState]
-	cp PLAYER_BIKE
-	jr z, .play
-	call GetMapMusic
-.play
-	push de
-	ld de, MUSIC_NONE
-	call PlayMusic
-	call DelayFrame
-	pop de
-
-	ld a, e
-	ld [wMapMusic], a
-	call PlayMusic
-
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3d2f
-
-Function3d2f:: ; 3d2f
-	ld a, [$c2c1]
-	and a
-	jr z, RestartMapMusic
-	xor a
-	ld [wMapMusic], a
-	ld de, MUSIC_NONE
-	call PlayMusic
-	call DelayFrame
-	xor a
-	ld [$c2c1], a
-	ret
-; 3d47
-
-RestartMapMusic:: ; 3d47
-	push hl
-	push de
-	push bc
-	push af
-	ld de, MUSIC_NONE
-	call PlayMusic
-	call DelayFrame
-	ld a, [wMapMusic]
-	ld e, a
-	ld d, 0
-	call PlayMusic
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3d62
-
-SpecialMapMusic:: ; 3d62
-	ld a, [PlayerState]
-	cp PLAYER_SURF
-	jr z, .surf
-	cp PLAYER_SURF_PIKA
-	jr z, .surf
-
-	ld a, [StatusFlags2]
-	bit 2, a
-	jr nz, .contest
-
-.no
-	and a
-	ret
-
-.bike
-	ld de, MUSIC_BICYCLE
-	scf
-	ret
-
-.surf
-	ld de, MUSIC_SURF
-	scf
-	ret
-
-.contest
-	ld a, [MapGroup]
-	cp GROUP_ROUTE_35_NATIONAL_PARK_GATE
-	jr nz, .no
-	ld a, [MapNumber]
-	cp MAP_ROUTE_35_NATIONAL_PARK_GATE
-	jr z, .ranking
-	cp MAP_ROUTE_36_NATIONAL_PARK_GATE
-	jr nz, .no
-
-.ranking
-	ld de, MUSIC_BUG_CATCHING_CONTEST_RANKING
-	scf
-	ret
-; 3d97
-
-GetMapMusic:: ; 3d97
-	call SpecialMapMusic
-	ret c
-	call GetMapHeaderMusic
-	ret
-; 3d9f
-
-Function3d9f:: ; 3d9f
-; Places a BCD number at the
-; upper center of the screen.
-; Unreferenced.
-	ld a, $20
-	ld [$c498], a
-	ld [$c49c], a
-	ld a, $50
-	ld [$c499], a
-	ld a, $58
-	ld [$c49d], a
-	xor a
-	ld [$c49b], a
-	ld [$c49f], a
-	ld a, [$c296]
-	cp $64
-	jr nc, .max
-	add 1
-	daa
-	ld b, a
-	swap a
-	and $f
-	add "0"
-	ld [$c49a], a
-	ld a, b
-	and $f
-	add "0"
-	ld [$c49e], a
-	ret
-
-.max
-	ld a, "9"
-	ld [$c49a], a
-	ld [$c49e], a
-	ret
-; 3dde
-
-CheckSFX:: ; 3dde
-; Return carry if any SFX channels are active.
-	ld a, [Channel5Flags]
-	bit 0, a
-	jr nz, .playing
-	ld a, [Channel6Flags]
-	bit 0, a
-	jr nz, .playing
-	ld a, [Channel7Flags]
-	bit 0, a
-	jr nz, .playing
-	ld a, [Channel8Flags]
-	bit 0, a
-	jr nz, .playing
-	and a
-	ret
-.playing
-	scf
-	ret
-; 3dfe
-
-Function3dfe:: ; 3dfe
-	xor a
-	ld [$c1cc], a
-	ld [SoundInput], a
-	ld [rNR10], a
-	ld [rNR11], a
-	ld [rNR12], a
-	ld [rNR13], a
-	ld [rNR14], a
-	ret
-; 3e10
-
-
-ChannelsOff:: ; 3e10
-; Quickly turn off music channels
-	xor a
-	ld [Channel1Flags], a
-	ld [Channel2Flags], a
-	ld [Channel3Flags], a
-	ld [Channel4Flags], a
-	ld [SoundInput], a
-	ret
-; 3e21
-
-SFXChannelsOff:: ; 3e21
-; Quickly turn off sound effect channels
-	xor a
-	ld [Channel5Flags], a
-	ld [Channel6Flags], a
-	ld [Channel7Flags], a
-	ld [Channel8Flags], a
-	ld [SoundInput], a
-	ret
-; 3e32
+INCLUDE "home/audio.asm"
 
 
 Function3e32:: ; 3e32
--- /dev/null
+++ b/home/audio.asm
@@ -1,0 +1,598 @@
+; Audio interfaces.
+
+SoundRestart:: ; 3b4e
+
+	push hl
+	push de
+	push bc
+	push af
+
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(_SoundRestart)
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	call _SoundRestart
+
+	pop af
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3b6a
+
+
+UpdateSound:: ; 3b6a
+
+	push hl
+	push de
+	push bc
+	push af
+
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(_UpdateSound)
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	call _UpdateSound
+
+	pop af
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3b86
+
+
+_LoadMusicByte:: ; 3b86
+; CurMusicByte = [a:de]
+GLOBAL LoadMusicByte
+
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	ld a, [de]
+	ld [CurMusicByte], a
+	ld a, BANK(LoadMusicByte)
+
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+	ret
+; 3b97
+
+
+PlayMusic:: ; 3b97
+; Play music de.
+
+	push hl
+	push de
+	push bc
+	push af
+
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(_PlayMusic) ; and BANK(_SoundRestart)
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	ld a, e
+	and a
+	jr z, .nomusic
+
+	call _PlayMusic
+	jr .end
+
+.nomusic
+	call _SoundRestart
+
+.end
+	pop af
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3bbc
+
+
+PlayMusic2:: ; 3bbc
+; Stop playing music, then play music de.
+
+	push hl
+	push de
+	push bc
+	push af
+
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(_PlayMusic)
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	push de
+	ld de, MUSIC_NONE
+	call _PlayMusic
+	call DelayFrame
+	pop de
+	call _PlayMusic
+
+	pop af
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+
+; 3be3
+
+
+PlayCryHeader:: ; 3be3
+; Play a cry given parameters at header de
+
+	push hl
+	push de
+	push bc
+	push af
+
+	ld a, [hROMBank]
+	push af
+
+	; Cry headers are stuck in one bank.
+	ld a, BANK(CryHeaders)
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	ld hl, CryHeaders
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	inc hl
+
+	ld a, [hli]
+	ld [CryPitch], a
+	ld a, [hli]
+	ld [CryEcho], a
+	ld a, [hli]
+	ld [CryLength], a
+	ld a, [hl]
+	ld [CryLength + 1], a
+
+	ld a, BANK(PlayCry)
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	call PlayCry
+
+	pop af
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+	
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3c23
+
+
+PlaySFX:: ; 3c23
+; Play sound effect de.
+; Sound effects are ordered by priority (lowest to highest)
+
+	push hl
+	push de
+	push bc
+	push af
+
+	; Is something already playing?
+	call CheckSFX
+	jr nc, .play
+
+	; Does it have priority?
+	ld a, [CurSFX]
+	cp e
+	jr c, .done
+
+.play
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(_PlaySFX)
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+	ld a, e
+	ld [CurSFX], a
+	call _PlaySFX
+
+	pop af
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+
+.done
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3c4e
+
+
+WaitPlaySFX:: ; 3c4e
+	call WaitSFX
+	call PlaySFX
+	ret
+; 3c55
+
+
+WaitSFX:: ; 3c55
+; infinite loop until sfx is done playing
+
+	push hl
+	
+.wait
+	ld hl, Channel5Flags
+	bit 0, [hl]
+	jr nz, .wait
+	ld hl, Channel6Flags
+	bit 0, [hl]
+	jr nz, .wait
+	ld hl, Channel7Flags
+	bit 0, [hl]
+	jr nz, .wait
+	ld hl, Channel8Flags
+	bit 0, [hl]
+	jr nz, .wait
+	
+	pop hl
+	ret
+; 3c74
+
+IsSFXPlaying:: ; 3c74
+; Return carry if no sound effect is playing.
+; The inverse of CheckSFX.
+	push hl
+
+	ld hl, Channel5Flags
+	bit 0, [hl]
+	jr nz, .playing
+	ld hl, Channel6Flags
+	bit 0, [hl]
+	jr nz, .playing
+	ld hl, Channel7Flags
+	bit 0, [hl]
+	jr nz, .playing
+	ld hl, Channel8Flags
+	bit 0, [hl]
+	jr nz, .playing
+
+	pop hl
+	scf
+	ret
+
+.playing
+	pop hl
+	and a
+	ret
+; 3c97
+
+MaxVolume:: ; 3c97
+	ld a, $77 ; max
+	ld [Volume], a
+	ret
+; 3c9d
+
+LowVolume:: ; 3c9d
+	ld a, $33 ; 40%
+	ld [Volume], a
+	ret
+; 3ca3
+
+VolumeOff:: ; 3ca3
+	xor a
+	ld [Volume], a
+	ret
+; 3ca8
+
+Function3ca8:: ; 3ca8
+	ld a, 4
+	ld [MusicFade], a
+	ret
+; 3cae
+
+Function3cae:: ; 3cae
+	ld a, 4 | 1 << 7
+	ld [MusicFade], a
+	ret
+; 3cb4
+
+SkipMusic:: ; 3cb4
+; Skip a frames of music.
+	and a
+	ret z
+	dec a
+	call UpdateSound
+	jr SkipMusic
+; 3cbc
+
+FadeToMapMusic:: ; 3cbc
+	push hl
+	push de
+	push bc
+	push af
+
+	call GetMapMusic
+	ld a, [wMapMusic]
+	cp e
+	jr z, .done
+
+	ld a, 8
+	ld [MusicFade], a
+	ld a, e
+	ld [MusicFadeIDLo], a
+	ld a, d
+	ld [MusicFadeIDHi], a
+	ld a, e
+	ld [wMapMusic], a
+
+.done
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3cdf
+
+PlayMapMusic:: ; 3cdf
+	push hl
+	push de
+	push bc
+	push af
+
+	call GetMapMusic
+	ld a, [wMapMusic]
+	cp e
+	jr z, .done
+
+	push de
+	ld de, MUSIC_NONE
+	call PlayMusic
+	call DelayFrame
+	pop de
+	ld a, e
+	ld [wMapMusic], a
+	call PlayMusic
+
+.done
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3d03
+
+EnterMapMusic:: ; 3d03
+	push hl
+	push de
+	push bc
+	push af
+
+	xor a
+	ld [$c2c1], a
+	ld de, MUSIC_BICYCLE
+	ld a, [PlayerState]
+	cp PLAYER_BIKE
+	jr z, .play
+	call GetMapMusic
+.play
+	push de
+	ld de, MUSIC_NONE
+	call PlayMusic
+	call DelayFrame
+	pop de
+
+	ld a, e
+	ld [wMapMusic], a
+	call PlayMusic
+
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3d2f
+
+Function3d2f:: ; 3d2f
+	ld a, [$c2c1]
+	and a
+	jr z, RestartMapMusic
+	xor a
+	ld [wMapMusic], a
+	ld de, MUSIC_NONE
+	call PlayMusic
+	call DelayFrame
+	xor a
+	ld [$c2c1], a
+	ret
+; 3d47
+
+RestartMapMusic:: ; 3d47
+	push hl
+	push de
+	push bc
+	push af
+	ld de, MUSIC_NONE
+	call PlayMusic
+	call DelayFrame
+	ld a, [wMapMusic]
+	ld e, a
+	ld d, 0
+	call PlayMusic
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3d62
+
+SpecialMapMusic:: ; 3d62
+	ld a, [PlayerState]
+	cp PLAYER_SURF
+	jr z, .surf
+	cp PLAYER_SURF_PIKA
+	jr z, .surf
+
+	ld a, [StatusFlags2]
+	bit 2, a
+	jr nz, .contest
+
+.no
+	and a
+	ret
+
+.bike
+	ld de, MUSIC_BICYCLE
+	scf
+	ret
+
+.surf
+	ld de, MUSIC_SURF
+	scf
+	ret
+
+.contest
+	ld a, [MapGroup]
+	cp GROUP_ROUTE_35_NATIONAL_PARK_GATE
+	jr nz, .no
+	ld a, [MapNumber]
+	cp MAP_ROUTE_35_NATIONAL_PARK_GATE
+	jr z, .ranking
+	cp MAP_ROUTE_36_NATIONAL_PARK_GATE
+	jr nz, .no
+
+.ranking
+	ld de, MUSIC_BUG_CATCHING_CONTEST_RANKING
+	scf
+	ret
+; 3d97
+
+GetMapMusic:: ; 3d97
+	call SpecialMapMusic
+	ret c
+	call GetMapHeaderMusic
+	ret
+; 3d9f
+
+Function3d9f:: ; 3d9f
+; Places a BCD number at the
+; upper center of the screen.
+; Unreferenced.
+	ld a, $20
+	ld [$c498], a
+	ld [$c49c], a
+	ld a, $50
+	ld [$c499], a
+	ld a, $58
+	ld [$c49d], a
+	xor a
+	ld [$c49b], a
+	ld [$c49f], a
+	ld a, [$c296]
+	cp $64
+	jr nc, .max
+	add 1
+	daa
+	ld b, a
+	swap a
+	and $f
+	add "0"
+	ld [$c49a], a
+	ld a, b
+	and $f
+	add "0"
+	ld [$c49e], a
+	ret
+
+.max
+	ld a, "9"
+	ld [$c49a], a
+	ld [$c49e], a
+	ret
+; 3dde
+
+CheckSFX:: ; 3dde
+; Return carry if any SFX channels are active.
+	ld a, [Channel5Flags]
+	bit 0, a
+	jr nz, .playing
+	ld a, [Channel6Flags]
+	bit 0, a
+	jr nz, .playing
+	ld a, [Channel7Flags]
+	bit 0, a
+	jr nz, .playing
+	ld a, [Channel8Flags]
+	bit 0, a
+	jr nz, .playing
+	and a
+	ret
+.playing
+	scf
+	ret
+; 3dfe
+
+Function3dfe:: ; 3dfe
+	xor a
+	ld [$c1cc], a
+	ld [SoundInput], a
+	ld [rNR10], a
+	ld [rNR11], a
+	ld [rNR12], a
+	ld [rNR13], a
+	ld [rNR14], a
+	ret
+; 3e10
+
+
+ChannelsOff:: ; 3e10
+; Quickly turn off music channels
+	xor a
+	ld [Channel1Flags], a
+	ld [Channel2Flags], a
+	ld [Channel3Flags], a
+	ld [Channel4Flags], a
+	ld [SoundInput], a
+	ret
+; 3e21
+
+SFXChannelsOff:: ; 3e21
+; Quickly turn off sound effect channels
+	xor a
+	ld [Channel5Flags], a
+	ld [Channel6Flags], a
+	ld [Channel7Flags], a
+	ld [Channel8Flags], a
+	ld [SoundInput], a
+	ret
+; 3e32