shithub: pokered

Download patch

ref: bbb0e7e82deb6741f75a12b48f81076d92f5d9dc
parent: ac7263b1adef941f8978b775d4b7629a7d8620e3
author: Rangi <[email protected]>
date: Thu Aug 11 17:23:08 EDT 2022

Use the same music headers as pokecrystal (#382)


--- a/audio.asm
+++ b/audio.asm
@@ -44,7 +44,7 @@
 INCLUDE "audio/sfx/noise_instrument19_1.asm"
 
 Audio1_WavePointers:
-INCLUDE "audio/wave_instruments.asm"
+INCLUDE "audio/wave_samples.asm"
 
 INCLUDE "audio/sfx/start_menu_1.asm"
 INCLUDE "audio/sfx/pokeflute.asm"
@@ -144,7 +144,7 @@
 INCLUDE "audio/sfx/noise_instrument19_2.asm"
 
 Audio2_WavePointers:
-INCLUDE "audio/wave_instruments.asm"
+INCLUDE "audio/wave_samples.asm"
 
 INCLUDE "audio/sfx/press_ab_2.asm"
 INCLUDE "audio/sfx/start_menu_2.asm"
@@ -270,7 +270,7 @@
 INCLUDE "audio/sfx/noise_instrument19_3.asm"
 
 Audio3_WavePointers:
-INCLUDE "audio/wave_instruments.asm"
+INCLUDE "audio/wave_samples.asm"
 
 INCLUDE "audio/sfx/start_menu_3.asm"
 INCLUDE "audio/sfx/cut_3.asm"
--- a/audio/engine_1.asm
+++ b/audio/engine_1.asm
@@ -1,7 +1,7 @@
 ; The first of three duplicated sound engines.
 
 Audio1_UpdateMusic::
-	ld c, Ch1
+	ld c, CHAN1
 .loop
 	ld b, 0
 	ld hl, wChannelSoundIDs
@@ -10,7 +10,7 @@
 	and a
 	jr z, .nextChannel
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .applyAffects ; if sfx channel
 	ld a, [wMuteAudioAndPauseMusic]
 	and a
@@ -30,7 +30,7 @@
 .nextChannel
 	ld a, c
 	inc c ; inc channel number
-	cp Ch8
+	cp CHAN8
 	jr nz, .loop
 	ret
 
@@ -46,9 +46,9 @@
 	dec a ; otherwise, decrease the delay timer
 	ld [hl], a
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .startChecks ; if a sfx channel
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -171,7 +171,7 @@
 	bit BIT_SOUND_CALL, [hl]
 	jr nz, .returnFromCall
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr nc, .noiseOrSfxChannel
 	jr .disableChannelOutput
 .noiseOrSfxChannel
@@ -179,7 +179,7 @@
 	ld hl, wChannelFlags2
 	add hl, bc
 	res BIT_EXECUTE_MUSIC, [hl]
-	cp Ch7
+	cp CHAN7
 	jr nz, .skipSfxChannel3
 ; restart hardware channel 3 (wave channel) output
 	ld a, $0
@@ -223,12 +223,12 @@
 	and [hl]
 	ldh [rNR51], a
 .afterDisable
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_START
 	jr nc, .maybeCry
 	jr .skipCry
 .maybeCry
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_END
 	jr z, .skipCry
 	jr c, .cry
@@ -235,7 +235,7 @@
 	jr .skipCry
 .cry
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr z, .skipRewind
 	call Audio1_GoBackOneCommandIfCry
 	ret c
@@ -336,14 +336,14 @@
 	add hl, bc
 	ld [hl], a ; store low nibble as speed
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr z, .noiseChannel ; noise channel has 0 params
 	call Audio1_GetNextMusicByte
 	ld d, a
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .musicChannel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .skipChannel3
 	ld hl, wSfxWaveInstrument
 	jr .channel3
@@ -477,7 +477,7 @@
 	cp tempo_cmd
 	jr nz, Audio1_stereo_panning
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel
 	call Audio1_GetNextMusicByte
 	ld [wMusicTempo], a ; store first param
@@ -520,10 +520,10 @@
 	ld a, [wDisableChannelOutputWhenSfxEnds]
 	and a
 	jr nz, .skip
-	ld a, [wChannelSoundIDs + Ch8]
+	ld a, [wChannelSoundIDs + CHAN8]
 	ld [wDisableChannelOutputWhenSfxEnds], a
 	xor a
-	ld [wChannelSoundIDs + Ch8], a
+	ld [wChannelSoundIDs + CHAN8], a
 .skip
 	jp Audio1_sound_ret
 
@@ -577,7 +577,7 @@
 	cp sfx_note_cmd
 	jr nz, Audio1_pitch_sweep
 	ld a, c
-	cp Ch4 ; is this a noise or sfx channel?
+	cp CHAN4 ; is this a noise or sfx channel?
 	jr c, Audio1_pitch_sweep ; no
 	ld b, 0
 	ld hl, wChannelFlags2
@@ -607,7 +607,7 @@
 	call Audio1_GetNextMusicByte
 	ld e, a
 	ld a, c
-	cp Ch8
+	cp CHAN8
 	ld a, 0
 	jr z, .skip
 ; Channels 1 through 3 have 2 registers that control frequency, but the noise
@@ -627,7 +627,7 @@
 
 Audio1_pitch_sweep:
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr c, Audio1_note ; if not a sfx
 	ld a, d
 	cp pitch_sweep_cmd
@@ -643,7 +643,7 @@
 
 Audio1_note:
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr nz, Audio1_note_length ; if not noise channel
 	ld a, d
 	and $f0
@@ -701,7 +701,7 @@
 	ld l, b
 	call Audio1_MultiplyAdd
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel
 	ld a, [wMusicTempo]
 	ld d, a
@@ -711,7 +711,7 @@
 .sfxChannel
 	ld d, $1
 	ld e, $0
-	cp Ch8
+	cp CHAN8
 	jr z, .skip ; if noise channel
 	call Audio1_SetSfxTempo
 	ld a, [wSfxTempo]
@@ -751,10 +751,10 @@
 	cp rest_cmd
 	jr nz, .notRest
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .next
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -762,9 +762,9 @@
 	; fall through
 .next
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .channel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .notChannel3
 .channel3
 	ld b, 0
@@ -800,10 +800,10 @@
 .skipPitchSlide
 	push de
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel ; if sfx channel
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	ld d, 0
 	ld e, a
 	add hl, de
@@ -848,12 +848,12 @@
 	or [hl] ; set this channel's bits
 	ld d, a
 	ld a, c
-	cp Ch8
+	cp CHAN8
 	jr z, .noiseChannelOrNoSfx
-	cp Ch5
+	cp CHAN5
 	jr nc, .skip ; if sfx channel
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -883,9 +883,9 @@
 	add hl, bc
 	ld d, [hl]
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .skipDuty ; if music channel 3
-	cp Ch7
+	cp CHAN7
 	jr z, .skipDuty ; if sfx channel 3
 ; include duty cycle (except on channel 3 which doesn't have it)
 	ld a, d
@@ -904,15 +904,15 @@
 
 Audio1_ApplyWavePatternAndFrequency:
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .channel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .notChannel3
 	; fall through
 .channel3
 	push de
 	ld de, wMusicWaveInstrument
-	cp Ch3
+	cp CHAN3
 	jr z, .next
 	ld de, wSfxWaveInstrument
 .next
@@ -1016,7 +1016,7 @@
 
 Audio1_IsCry:
 ; Returns whether the currently playing audio is a cry in carry.
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_START
 	jr nc, .next
 	jr .no
@@ -1453,7 +1453,7 @@
 	and a
 	jr z, .playChannel
 	ld a, e
-	cp Ch8
+	cp CHAN8
 	jr nz, .notNoiseChannel
 	ld a, [wSoundID]
 	cp NOISE_INSTRUMENTS_END
@@ -1552,7 +1552,7 @@
 	add hl, de
 	ld [hl], a
 	ld a, e
-	cp Ch5
+	cp CHAN5
 	jr nz, .skipSweepDisable
 	ld a, $8
 	ldh [rNR10], a ; sweep off
@@ -1654,7 +1654,7 @@
 	ld a, [wSoundID]
 	ld [hl], a
 	pop af
-	cp Ch4
+	cp CHAN4
 	jr c, .skipSettingFlag
 	ld hl, wChannelFlags1
 	add hl, bc
@@ -1686,12 +1686,12 @@
 	jr c, .cry
 	jr .done
 .cry
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	ld [hli], a
 	ld [hli], a
 	ld [hli], a
 	ld [hl], a
-	ld hl, wChannelCommandPointers + Ch7 * 2 ; sfx wave channel pointer
+	ld hl, wChannelCommandPointers + CHAN7 * 2 ; sfx wave channel pointer
 	ld de, Audio1_CryRet
 	ld [hl], e
 	inc hl
--- a/audio/engine_2.asm
+++ b/audio/engine_2.asm
@@ -3,7 +3,7 @@
 ; and the low health alarm that plays in battle
 
 Audio2_UpdateMusic::
-	ld c, Ch1
+	ld c, CHAN1
 .loop
 	ld b, 0
 	ld hl, wChannelSoundIDs
@@ -12,7 +12,7 @@
 	and a
 	jr z, .nextChannel
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .applyAffects ; if sfx channel
 	ld a, [wMuteAudioAndPauseMusic]
 	and a
@@ -32,7 +32,7 @@
 .nextChannel
 	ld a, c
 	inc c ; inc channel number
-	cp Ch8
+	cp CHAN8
 	jr nz, .loop
 	ret
 
@@ -48,9 +48,9 @@
 	dec a ; otherwise, decrease the delay timer
 	ld [hl], a
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .startChecks ; if a sfx channel
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -161,7 +161,7 @@
 	res BIT_PITCH_SLIDE_DECREASING, [hl]
 	; --- this section is only present in this copy of the sound engine
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nz, .beginChecks
 	ld a, [wLowHealthAlarm] ; low health alarm enabled?
 	bit 7, a
@@ -182,7 +182,7 @@
 	bit BIT_SOUND_CALL, [hl]
 	jr nz, .returnFromCall
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr nc, .noiseOrSfxChannel
 	jr .disableChannelOutput
 .noiseOrSfxChannel
@@ -190,7 +190,7 @@
 	ld hl, wChannelFlags2
 	add hl, bc
 	res BIT_EXECUTE_MUSIC, [hl]
-	cp Ch7
+	cp CHAN7
 	jr nz, .skipSfxChannel3
 ; restart hardware channel 3 (wave channel) output
 	ld a, $0
@@ -234,12 +234,12 @@
 	and [hl]
 	ldh [rNR51], a
 .afterDisable
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_START
 	jr nc, .maybeCry
 	jr .skipCry
 .maybeCry
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_END
 	jr z, .skipCry
 	jr c, .cry
@@ -246,7 +246,7 @@
 	jr .skipCry
 .cry
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr z, .skipRewind
 	call Audio2_GoBackOneCommandIfCry
 	ret c
@@ -347,14 +347,14 @@
 	add hl, bc
 	ld [hl], a ; store low nibble as speed
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr z, .noiseChannel ; noise channel has 0 params
 	call Audio2_GetNextMusicByte
 	ld d, a
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .musicChannel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .skipChannel3
 	ld hl, wSfxWaveInstrument
 	jr .channel3
@@ -488,7 +488,7 @@
 	cp tempo_cmd
 	jr nz, Audio2_stereo_panning
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel
 	call Audio2_GetNextMusicByte
 	ld [wMusicTempo], a ; store first param
@@ -531,10 +531,10 @@
 	ld a, [wDisableChannelOutputWhenSfxEnds]
 	and a
 	jr nz, .skip
-	ld a, [wChannelSoundIDs + Ch8]
+	ld a, [wChannelSoundIDs + CHAN8]
 	ld [wDisableChannelOutputWhenSfxEnds], a
 	xor a
-	ld [wChannelSoundIDs + Ch8], a
+	ld [wChannelSoundIDs + CHAN8], a
 .skip
 	jp Audio2_sound_ret
 
@@ -588,7 +588,7 @@
 	cp sfx_note_cmd
 	jr nz, Audio2_pitch_sweep
 	ld a, c
-	cp Ch4 ; is this a noise or sfx channel?
+	cp CHAN4 ; is this a noise or sfx channel?
 	jr c, Audio2_pitch_sweep ; no
 	ld b, 0
 	ld hl, wChannelFlags2
@@ -618,7 +618,7 @@
 	call Audio2_GetNextMusicByte
 	ld e, a
 	ld a, c
-	cp Ch8
+	cp CHAN8
 	ld a, 0
 	jr z, .skip
 ; Channels 1 through 3 have 2 registers that control frequency, but the noise
@@ -638,7 +638,7 @@
 
 Audio2_pitch_sweep:
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr c, Audio2_note ; if not a sfx
 	ld a, d
 	cp pitch_sweep_cmd
@@ -654,7 +654,7 @@
 
 Audio2_note:
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr nz, Audio2_note_length ; if not noise channel
 	ld a, d
 	and $f0
@@ -712,7 +712,7 @@
 	ld l, b
 	call Audio2_MultiplyAdd
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel
 	ld a, [wMusicTempo]
 	ld d, a
@@ -722,7 +722,7 @@
 .sfxChannel
 	ld d, $1
 	ld e, $0
-	cp Ch8
+	cp CHAN8
 	jr z, .skip ; if noise channel
 	call Audio2_SetSfxTempo
 	ld a, [wSfxTempo]
@@ -762,10 +762,10 @@
 	cp rest_cmd
 	jr nz, .notRest
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .next
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -773,9 +773,9 @@
 	; fall through
 .next
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .channel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .notChannel3
 .channel3
 	ld b, 0
@@ -811,10 +811,10 @@
 .skipPitchSlide
 	push de
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel ; if sfx channel
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	ld d, 0
 	ld e, a
 	add hl, de
@@ -859,12 +859,12 @@
 	or [hl] ; set this channel's bits
 	ld d, a
 	ld a, c
-	cp Ch8
+	cp CHAN8
 	jr z, .noiseChannelOrNoSfx
-	cp Ch5
+	cp CHAN5
 	jr nc, .skip ; if sfx channel
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -894,9 +894,9 @@
 	add hl, bc
 	ld d, [hl]
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .skipDuty ; if music channel 3
-	cp Ch7
+	cp CHAN7
 	jr z, .skipDuty ; if sfx channel 3
 ; include duty cycle (except on channel 3 which doesn't have it)
 	ld a, d
@@ -915,15 +915,15 @@
 
 Audio2_ApplyWavePatternAndFrequency:
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .channel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .notChannel3
 	; fall through
 .channel3
 	push de
 	ld de, wMusicWaveInstrument
-	cp Ch3
+	cp CHAN3
 	jr z, .next
 	ld de, wSfxWaveInstrument
 .next
@@ -963,7 +963,7 @@
 	ld [hl], d ; store frequency high byte
 	; --- this section is only present in this copy of the sound engine
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr c, .musicChannel
 	call Audio2_ApplyFrequencyModifier
 .musicChannel
@@ -974,7 +974,7 @@
 ; unused
 Audio2_ResetCryModifiers:
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nz, .skip
 	ld a, [wLowHealthAlarm]
 	bit 7, a
@@ -1056,7 +1056,7 @@
 
 Audio2_IsCry:
 ; Returns whether the currently playing audio is a cry in carry.
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_START
 	jr nc, .next
 	jr .no
@@ -1075,9 +1075,9 @@
 ; --- this section is only present in this copy of the sound engine
 Audio2_IsBattleSFX:
 ; Returns whether the currently playing audio is a battle sfx in carry.
-	ld a, [wChannelSoundIDs + Ch8]
+	ld a, [wChannelSoundIDs + CHAN8]
 	ld b, a
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	or b
 	cp BATTLE_SFX_START
 	jr nc, .next
@@ -1516,7 +1516,7 @@
 	and a
 	jr z, .playChannel
 	ld a, e
-	cp Ch8
+	cp CHAN8
 	jr nz, .notNoiseChannel
 	ld a, [wSoundID]
 	cp NOISE_INSTRUMENTS_END
@@ -1615,7 +1615,7 @@
 	add hl, de
 	ld [hl], a
 	ld a, e
-	cp Ch5
+	cp CHAN5
 	jr nz, .skipSweepDisable
 	ld a, $8
 	ldh [rNR10], a ; sweep off
@@ -1717,7 +1717,7 @@
 	ld a, [wSoundID]
 	ld [hl], a
 	pop af
-	cp Ch4
+	cp CHAN4
 	jr c, .skipSettingFlag
 	ld hl, wChannelFlags1
 	add hl, bc
@@ -1749,12 +1749,12 @@
 	jr c, .cry
 	jr .done
 .cry
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	ld [hli], a
 	ld [hli], a
 	ld [hli], a
 	ld [hl], a
-	ld hl, wChannelCommandPointers + Ch7 * 2 ; sfx wave channel pointer
+	ld hl, wChannelCommandPointers + CHAN7 * 2 ; sfx wave channel pointer
 	ld de, Audio2_CryRet
 	ld [hl], e
 	inc hl
--- a/audio/engine_3.asm
+++ b/audio/engine_3.asm
@@ -1,7 +1,7 @@
 ; The third of three duplicated sound engines.
 
 Audio3_UpdateMusic::
-	ld c, Ch1
+	ld c, CHAN1
 .loop
 	ld b, 0
 	ld hl, wChannelSoundIDs
@@ -10,7 +10,7 @@
 	and a
 	jr z, .nextChannel
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .applyAffects ; if sfx channel
 	ld a, [wMuteAudioAndPauseMusic]
 	and a
@@ -30,7 +30,7 @@
 .nextChannel
 	ld a, c
 	inc c ; inc channel number
-	cp Ch8
+	cp CHAN8
 	jr nz, .loop
 	ret
 
@@ -46,9 +46,9 @@
 	dec a ; otherwise, decrease the delay timer
 	ld [hl], a
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .startChecks ; if a sfx channel
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -171,7 +171,7 @@
 	bit BIT_SOUND_CALL, [hl]
 	jr nz, .returnFromCall
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr nc, .noiseOrSfxChannel
 	jr .disableChannelOutput
 .noiseOrSfxChannel
@@ -179,7 +179,7 @@
 	ld hl, wChannelFlags2
 	add hl, bc
 	res BIT_EXECUTE_MUSIC, [hl]
-	cp Ch7
+	cp CHAN7
 	jr nz, .skipSfxChannel3
 ; restart hardware channel 3 (wave channel) output
 	ld a, $0
@@ -223,12 +223,12 @@
 	and [hl]
 	ldh [rNR51], a
 .afterDisable
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_START
 	jr nc, .maybeCry
 	jr .skipCry
 .maybeCry
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_END
 	jr z, .skipCry
 	jr c, .cry
@@ -235,7 +235,7 @@
 	jr .skipCry
 .cry
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr z, .skipRewind
 	call Audio3_GoBackOneCommandIfCry
 	ret c
@@ -336,14 +336,14 @@
 	add hl, bc
 	ld [hl], a ; store low nibble as speed
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr z, .noiseChannel ; noise channel has 0 params
 	call Audio3_GetNextMusicByte
 	ld d, a
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .musicChannel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .skipChannel3
 	ld hl, wSfxWaveInstrument
 	jr .channel3
@@ -477,7 +477,7 @@
 	cp tempo_cmd
 	jr nz, Audio3_stereo_panning
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel
 	call Audio3_GetNextMusicByte
 	ld [wMusicTempo], a ; store first param
@@ -520,10 +520,10 @@
 	ld a, [wDisableChannelOutputWhenSfxEnds]
 	and a
 	jr nz, .skip
-	ld a, [wChannelSoundIDs + Ch8]
+	ld a, [wChannelSoundIDs + CHAN8]
 	ld [wDisableChannelOutputWhenSfxEnds], a
 	xor a
-	ld [wChannelSoundIDs + Ch8], a
+	ld [wChannelSoundIDs + CHAN8], a
 .skip
 	jp Audio3_sound_ret
 
@@ -577,7 +577,7 @@
 	cp sfx_note_cmd
 	jr nz, Audio3_pitch_sweep
 	ld a, c
-	cp Ch4 ; is this a noise or sfx channel?
+	cp CHAN4 ; is this a noise or sfx channel?
 	jr c, Audio3_pitch_sweep ; no
 	ld b, 0
 	ld hl, wChannelFlags2
@@ -607,7 +607,7 @@
 	call Audio3_GetNextMusicByte
 	ld e, a
 	ld a, c
-	cp Ch8
+	cp CHAN8
 	ld a, 0
 	jr z, .skip
 ; Channels 1 through 3 have 2 registers that control frequency, but the noise
@@ -627,7 +627,7 @@
 
 Audio3_pitch_sweep:
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr c, Audio3_note ; if not a sfx
 	ld a, d
 	cp pitch_sweep_cmd
@@ -643,7 +643,7 @@
 
 Audio3_note:
 	ld a, c
-	cp Ch4
+	cp CHAN4
 	jr nz, Audio3_note_length ; if not noise channel
 	ld a, d
 	and $f0
@@ -701,7 +701,7 @@
 	ld l, b
 	call Audio3_MultiplyAdd
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel
 	ld a, [wMusicTempo]
 	ld d, a
@@ -711,7 +711,7 @@
 .sfxChannel
 	ld d, $1
 	ld e, $0
-	cp Ch8
+	cp CHAN8
 	jr z, .skip ; if noise channel
 	call Audio3_SetSfxTempo
 	ld a, [wSfxTempo]
@@ -751,10 +751,10 @@
 	cp rest_cmd
 	jr nz, .notRest
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .next
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -762,9 +762,9 @@
 	; fall through
 .next
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .channel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .notChannel3
 .channel3
 	ld b, 0
@@ -800,10 +800,10 @@
 .skipPitchSlide
 	push de
 	ld a, c
-	cp Ch5
+	cp CHAN5
 	jr nc, .sfxChannel ; if sfx channel
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	ld d, 0
 	ld e, a
 	add hl, de
@@ -848,12 +848,12 @@
 	or [hl] ; set this channel's bits
 	ld d, a
 	ld a, c
-	cp Ch8
+	cp CHAN8
 	jr z, .noiseChannelOrNoSfx
-	cp Ch5
+	cp CHAN5
 	jr nc, .skip ; if sfx channel
 ; If this isn't an SFX channel, try the corresponding SFX channel.
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	add hl, bc
 	ld a, [hl]
 	and a
@@ -883,9 +883,9 @@
 	add hl, bc
 	ld d, [hl]
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .skipDuty ; if music channel 3
-	cp Ch7
+	cp CHAN7
 	jr z, .skipDuty ; if sfx channel 3
 ; include duty cycle (except on channel 3 which doesn't have it)
 	ld a, d
@@ -904,15 +904,15 @@
 
 Audio3_ApplyWavePatternAndFrequency:
 	ld a, c
-	cp Ch3
+	cp CHAN3
 	jr z, .channel3
-	cp Ch7
+	cp CHAN7
 	jr nz, .notChannel3
 	; fall through
 .channel3
 	push de
 	ld de, wMusicWaveInstrument
-	cp Ch3
+	cp CHAN3
 	jr z, .next
 	ld de, wSfxWaveInstrument
 .next
@@ -1016,7 +1016,7 @@
 
 Audio3_IsCry:
 ; Returns whether the currently playing audio is a cry in carry.
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp CRY_SFX_START
 	jr nc, .next
 	jr .no
@@ -1453,7 +1453,7 @@
 	and a
 	jr z, .playChannel
 	ld a, e
-	cp Ch8
+	cp CHAN8
 	jr nz, .notNoiseChannel
 	ld a, [wSoundID]
 	cp NOISE_INSTRUMENTS_END
@@ -1552,7 +1552,7 @@
 	add hl, de
 	ld [hl], a
 	ld a, e
-	cp Ch5
+	cp CHAN5
 	jr nz, .skipSweepDisable
 	ld a, $8
 	ldh [rNR10], a ; sweep off
@@ -1654,7 +1654,7 @@
 	ld a, [wSoundID]
 	ld [hl], a
 	pop af
-	cp Ch4
+	cp CHAN4
 	jr c, .skipSettingFlag
 	ld hl, wChannelFlags1
 	add hl, bc
@@ -1686,12 +1686,12 @@
 	jr c, .cry
 	jr .done
 .cry
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	ld [hli], a
 	ld [hli], a
 	ld [hli], a
 	ld [hl], a
-	ld hl, wChannelCommandPointers + Ch7 * 2 ; sfx wave channel pointer
+	ld hl, wChannelCommandPointers + CHAN7 * 2 ; sfx wave channel pointer
 	ld de, Audio3_CryRet
 	ld [hl], e
 	inc hl
--- a/audio/headers/musicheaders1.asm
+++ b/audio/headers/musicheaders1.asm
@@ -1,66 +1,135 @@
 Music_PalletTown::
-	audio_header Music_PalletTown, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_PalletTown_Ch1
+	channel 2, Music_PalletTown_Ch2
+	channel 3, Music_PalletTown_Ch3
 
 Music_Pokecenter::
-	audio_header Music_Pokecenter, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_Pokecenter_Ch1
+	channel 2, Music_Pokecenter_Ch2
+	channel 3, Music_Pokecenter_Ch3
 
 Music_Gym::
-	audio_header Music_Gym, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_Gym_Ch1
+	channel 2, Music_Gym_Ch2
+	channel 3, Music_Gym_Ch3
 
 ; Viridian City, Pewter City, Saffron City
 Music_Cities1::
-	audio_header Music_Cities1, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Cities1_Ch1
+	channel 2, Music_Cities1_Ch2
+	channel 3, Music_Cities1_Ch3
+	channel 4, Music_Cities1_Ch4
 
 ; Cerulean City, Fuchsia City
 Music_Cities2::
-	audio_header Music_Cities2, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_Cities2_Ch1
+	channel 2, Music_Cities2_Ch2
+	channel 3, Music_Cities2_Ch3
 
 Music_Celadon::
-	audio_header Music_Celadon, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_Celadon_Ch1
+	channel 2, Music_Celadon_Ch2
+	channel 3, Music_Celadon_Ch3
 
 Music_Cinnabar::
-	audio_header Music_Cinnabar, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_Cinnabar_Ch1
+	channel 2, Music_Cinnabar_Ch2
+	channel 3, Music_Cinnabar_Ch3
 
 Music_Vermilion::
-	audio_header Music_Vermilion, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Vermilion_Ch1
+	channel 2, Music_Vermilion_Ch2
+	channel 3, Music_Vermilion_Ch3
+	channel 4, Music_Vermilion_Ch4
 
 Music_Lavender::
-	audio_header Music_Lavender, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Lavender_Ch1
+	channel 2, Music_Lavender_Ch2
+	channel 3, Music_Lavender_Ch3
+	channel 4, Music_Lavender_Ch4
 
 Music_SSAnne::
-	audio_header Music_SSAnne, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_SSAnne_Ch1
+	channel 2, Music_SSAnne_Ch2
+	channel 3, Music_SSAnne_Ch3
 
 Music_MeetProfOak::
-	audio_header Music_MeetProfOak, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_MeetProfOak_Ch1
+	channel 2, Music_MeetProfOak_Ch2
+	channel 3, Music_MeetProfOak_Ch3
 
 Music_MeetRival::
-	audio_header Music_MeetRival, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_MeetRival_Ch1
+	channel 2, Music_MeetRival_Ch2
+	channel 3, Music_MeetRival_Ch3
 
 Music_MuseumGuy::
-	audio_header Music_MuseumGuy, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_MuseumGuy_Ch1
+	channel 2, Music_MuseumGuy_Ch2
+	channel 3, Music_MuseumGuy_Ch3
+	channel 4, Music_MuseumGuy_Ch4
 
 Music_SafariZone::
-	audio_header Music_SafariZone, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_SafariZone_Ch1
+	channel 2, Music_SafariZone_Ch2
+	channel 3, Music_SafariZone_Ch3
 
 Music_PkmnHealed::
-	audio_header Music_PkmnHealed, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_PkmnHealed_Ch1
+	channel 2, Music_PkmnHealed_Ch2
+	channel 3, Music_PkmnHealed_Ch3
 
 ; Routes 1 and 2
 Music_Routes1::
-	audio_header Music_Routes1, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Routes1_Ch1
+	channel 2, Music_Routes1_Ch2
+	channel 3, Music_Routes1_Ch3
+	channel 4, Music_Routes1_Ch4
 
 ; Routes 24 and 25
 Music_Routes2::
-	audio_header Music_Routes2, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Routes2_Ch1
+	channel 2, Music_Routes2_Ch2
+	channel 3, Music_Routes2_Ch3
+	channel 4, Music_Routes2_Ch4
 
 ; Routes 3, 4, 5, 6, 7, 8, 9, 10, 16, 17, 18, 19, 20, 21, 22
 Music_Routes3::
-	audio_header Music_Routes3, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Routes3_Ch1
+	channel 2, Music_Routes3_Ch2
+	channel 3, Music_Routes3_Ch3
+	channel 4, Music_Routes3_Ch4
 
 ; Routes 11, 12, 13, 14, 15
 Music_Routes4::
-	audio_header Music_Routes4, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Routes4_Ch1
+	channel 2, Music_Routes4_Ch2
+	channel 3, Music_Routes4_Ch3
+	channel 4, Music_Routes4_Ch4
 
 ; Route 23, Indigo Plateau
 Music_IndigoPlateau::
-	audio_header Music_IndigoPlateau, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_IndigoPlateau_Ch1
+	channel 2, Music_IndigoPlateau_Ch2
+	channel 3, Music_IndigoPlateau_Ch3
+	channel 4, Music_IndigoPlateau_Ch4
--- a/audio/headers/musicheaders2.asm
+++ b/audio/headers/musicheaders2.asm
@@ -1,20 +1,41 @@
 Music_GymLeaderBattle::
-	audio_header Music_GymLeaderBattle, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_GymLeaderBattle_Ch1
+	channel 2, Music_GymLeaderBattle_Ch2
+	channel 3, Music_GymLeaderBattle_Ch3
 
 Music_TrainerBattle::
-	audio_header Music_TrainerBattle, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_TrainerBattle_Ch1
+	channel 2, Music_TrainerBattle_Ch2
+	channel 3, Music_TrainerBattle_Ch3
 
 Music_WildBattle::
-	audio_header Music_WildBattle, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_WildBattle_Ch1
+	channel 2, Music_WildBattle_Ch2
+	channel 3, Music_WildBattle_Ch3
 
 Music_FinalBattle::
-	audio_header Music_FinalBattle, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_FinalBattle_Ch1
+	channel 2, Music_FinalBattle_Ch2
+	channel 3, Music_FinalBattle_Ch3
 
 Music_DefeatedTrainer::
-	audio_header Music_DefeatedTrainer, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_DefeatedTrainer_Ch1
+	channel 2, Music_DefeatedTrainer_Ch2
+	channel 3, Music_DefeatedTrainer_Ch3
 
 Music_DefeatedWildMon::
-	audio_header Music_DefeatedWildMon, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_DefeatedWildMon_Ch1
+	channel 2, Music_DefeatedWildMon_Ch2
+	channel 3, Music_DefeatedWildMon_Ch3
 
 Music_DefeatedGymLeader::
-	audio_header Music_DefeatedGymLeader, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_DefeatedGymLeader_Ch1
+	channel 2, Music_DefeatedGymLeader_Ch2
+	channel 3, Music_DefeatedGymLeader_Ch3
--- a/audio/headers/musicheaders3.asm
+++ b/audio/headers/musicheaders3.asm
@@ -1,56 +1,116 @@
 Music_TitleScreen::
-	audio_header Music_TitleScreen, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_TitleScreen_Ch1
+	channel 2, Music_TitleScreen_Ch2
+	channel 3, Music_TitleScreen_Ch3
+	channel 4, Music_TitleScreen_Ch4
 
 Music_Credits::
-	audio_header Music_Credits, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_Credits_Ch1
+	channel 2, Music_Credits_Ch2
+	channel 3, Music_Credits_Ch3
 
 Music_HallOfFame::
-	audio_header Music_HallOfFame, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_HallOfFame_Ch1
+	channel 2, Music_HallOfFame_Ch2
+	channel 3, Music_HallOfFame_Ch3
 
 Music_OaksLab::
-	audio_header Music_OaksLab, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_OaksLab_Ch1
+	channel 2, Music_OaksLab_Ch2
+	channel 3, Music_OaksLab_Ch3
 
 Music_JigglypuffSong::
-	audio_header Music_JigglypuffSong, Ch1, Ch2
+	channel_count 2
+	channel 1, Music_JigglypuffSong_Ch1
+	channel 2, Music_JigglypuffSong_Ch2
 
 Music_BikeRiding::
-	audio_header Music_BikeRiding, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_BikeRiding_Ch1
+	channel 2, Music_BikeRiding_Ch2
+	channel 3, Music_BikeRiding_Ch3
+	channel 4, Music_BikeRiding_Ch4
 
 Music_Surfing::
-	audio_header Music_Surfing, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_Surfing_Ch1
+	channel 2, Music_Surfing_Ch2
+	channel 3, Music_Surfing_Ch3
 
 Music_GameCorner::
-	audio_header Music_GameCorner, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_GameCorner_Ch1
+	channel 2, Music_GameCorner_Ch2
+	channel 3, Music_GameCorner_Ch3
 
 Music_IntroBattle::
-	audio_header Music_IntroBattle, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_IntroBattle_Ch1
+	channel 2, Music_IntroBattle_Ch2
+	channel 3, Music_IntroBattle_Ch3
+	channel 4, Music_IntroBattle_Ch4
 
 ; Power Plant, Cerulean Cave, Rocket HQ
 Music_Dungeon1::
-	audio_header Music_Dungeon1, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Dungeon1_Ch1
+	channel 2, Music_Dungeon1_Ch2
+	channel 3, Music_Dungeon1_Ch3
+	channel 4, Music_Dungeon1_Ch4
 
 ; Viridian Forest, Seafoam Islands
 Music_Dungeon2::
-	audio_header Music_Dungeon2, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Dungeon2_Ch1
+	channel 2, Music_Dungeon2_Ch2
+	channel 3, Music_Dungeon2_Ch3
+	channel 4, Music_Dungeon2_Ch4
 
 ; Mt. Moon, Rock Tunnel, Victory Road
 Music_Dungeon3::
-	audio_header Music_Dungeon3, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_Dungeon3_Ch1
+	channel 2, Music_Dungeon3_Ch2
+	channel 3, Music_Dungeon3_Ch3
+	channel 4, Music_Dungeon3_Ch4
 
 Music_CinnabarMansion::
-	audio_header Music_CinnabarMansion, Ch1, Ch2, Ch3, Ch4
+	channel_count 4
+	channel 1, Music_CinnabarMansion_Ch1
+	channel 2, Music_CinnabarMansion_Ch2
+	channel 3, Music_CinnabarMansion_Ch3
+	channel 4, Music_CinnabarMansion_Ch4
 
 Music_PokemonTower::
-	audio_header Music_PokemonTower, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_PokemonTower_Ch1
+	channel 2, Music_PokemonTower_Ch2
+	channel 3, Music_PokemonTower_Ch3
 
 Music_SilphCo::
-	audio_header Music_SilphCo, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_SilphCo_Ch1
+	channel 2, Music_SilphCo_Ch2
+	channel 3, Music_SilphCo_Ch3
 
 Music_MeetEvilTrainer::
-	audio_header Music_MeetEvilTrainer, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_MeetEvilTrainer_Ch1
+	channel 2, Music_MeetEvilTrainer_Ch2
+	channel 3, Music_MeetEvilTrainer_Ch3
 
 Music_MeetFemaleTrainer::
-	audio_header Music_MeetFemaleTrainer, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_MeetFemaleTrainer_Ch1
+	channel 2, Music_MeetFemaleTrainer_Ch2
+	channel 3, Music_MeetFemaleTrainer_Ch3
 
 Music_MeetMaleTrainer::
-	audio_header Music_MeetMaleTrainer, Ch1, Ch2, Ch3
+	channel_count 3
+	channel 1, Music_MeetMaleTrainer_Ch1
+	channel 2, Music_MeetMaleTrainer_Ch2
+	channel 3, Music_MeetMaleTrainer_Ch3
--- a/audio/headers/sfxheaders1.asm
+++ b/audio/headers/sfxheaders1.asm
@@ -2,287 +2,472 @@
 	db $ff, $ff, $ff ; padding
 
 SFX_Noise_Instrument01_1::
-	audio_header SFX_Noise_Instrument01_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument01_1_Ch8
 
 SFX_Noise_Instrument02_1::
-	audio_header SFX_Noise_Instrument02_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument02_1_Ch8
 
 SFX_Noise_Instrument03_1::
-	audio_header SFX_Noise_Instrument03_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument03_1_Ch8
 
 SFX_Noise_Instrument04_1::
-	audio_header SFX_Noise_Instrument04_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument04_1_Ch8
 
 SFX_Noise_Instrument05_1::
-	audio_header SFX_Noise_Instrument05_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument05_1_Ch8
 
 SFX_Noise_Instrument06_1::
-	audio_header SFX_Noise_Instrument06_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument06_1_Ch8
 
 SFX_Noise_Instrument07_1::
-	audio_header SFX_Noise_Instrument07_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument07_1_Ch8
 
 SFX_Noise_Instrument08_1::
-	audio_header SFX_Noise_Instrument08_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument08_1_Ch8
 
 SFX_Noise_Instrument09_1::
-	audio_header SFX_Noise_Instrument09_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument09_1_Ch8
 
 SFX_Noise_Instrument10_1::
-	audio_header SFX_Noise_Instrument10_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument10_1_Ch8
 
 SFX_Noise_Instrument11_1::
-	audio_header SFX_Noise_Instrument11_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument11_1_Ch8
 
 SFX_Noise_Instrument12_1::
-	audio_header SFX_Noise_Instrument12_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument12_1_Ch8
 
 SFX_Noise_Instrument13_1::
-	audio_header SFX_Noise_Instrument13_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument13_1_Ch8
 
 SFX_Noise_Instrument14_1::
-	audio_header SFX_Noise_Instrument14_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument14_1_Ch8
 
 SFX_Noise_Instrument15_1::
-	audio_header SFX_Noise_Instrument15_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument15_1_Ch8
 
 SFX_Noise_Instrument16_1::
-	audio_header SFX_Noise_Instrument16_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument16_1_Ch8
 
 SFX_Noise_Instrument17_1::
-	audio_header SFX_Noise_Instrument17_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument17_1_Ch8
 
 SFX_Noise_Instrument18_1::
-	audio_header SFX_Noise_Instrument18_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument18_1_Ch8
 
 SFX_Noise_Instrument19_1::
-	audio_header SFX_Noise_Instrument19_1, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument19_1_Ch8
 
 SFX_Cry00_1::
-	audio_header SFX_Cry00_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry00_1_Ch5
+	channel 6, SFX_Cry00_1_Ch6
+	channel 8, SFX_Cry00_1_Ch8
 
 SFX_Cry01_1::
-	audio_header SFX_Cry01_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry01_1_Ch5
+	channel 6, SFX_Cry01_1_Ch6
+	channel 8, SFX_Cry01_1_Ch8
 
 SFX_Cry02_1::
-	audio_header SFX_Cry02_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry02_1_Ch5
+	channel 6, SFX_Cry02_1_Ch6
+	channel 8, SFX_Cry02_1_Ch8
 
 SFX_Cry03_1::
-	audio_header SFX_Cry03_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry03_1_Ch5
+	channel 6, SFX_Cry03_1_Ch6
+	channel 8, SFX_Cry03_1_Ch8
 
 SFX_Cry04_1::
-	audio_header SFX_Cry04_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry04_1_Ch5
+	channel 6, SFX_Cry04_1_Ch6
+	channel 8, SFX_Cry04_1_Ch8
 
 SFX_Cry05_1::
-	audio_header SFX_Cry05_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry05_1_Ch5
+	channel 6, SFX_Cry05_1_Ch6
+	channel 8, SFX_Cry05_1_Ch8
 
 SFX_Cry06_1::
-	audio_header SFX_Cry06_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry06_1_Ch5
+	channel 6, SFX_Cry06_1_Ch6
+	channel 8, SFX_Cry06_1_Ch8
 
 SFX_Cry07_1::
-	audio_header SFX_Cry07_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry07_1_Ch5
+	channel 6, SFX_Cry07_1_Ch6
+	channel 8, SFX_Cry07_1_Ch8
 
 SFX_Cry08_1::
-	audio_header SFX_Cry08_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry08_1_Ch5
+	channel 6, SFX_Cry08_1_Ch6
+	channel 8, SFX_Cry08_1_Ch8
 
 SFX_Cry09_1::
-	audio_header SFX_Cry09_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry09_1_Ch5
+	channel 6, SFX_Cry09_1_Ch6
+	channel 8, SFX_Cry09_1_Ch8
 
 SFX_Cry0A_1::
-	audio_header SFX_Cry0A_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0A_1_Ch5
+	channel 6, SFX_Cry0A_1_Ch6
+	channel 8, SFX_Cry0A_1_Ch8
 
 SFX_Cry0B_1::
-	audio_header SFX_Cry0B_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0B_1_Ch5
+	channel 6, SFX_Cry0B_1_Ch6
+	channel 8, SFX_Cry0B_1_Ch8
 
 SFX_Cry0C_1::
-	audio_header SFX_Cry0C_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0C_1_Ch5
+	channel 6, SFX_Cry0C_1_Ch6
+	channel 8, SFX_Cry0C_1_Ch8
 
 SFX_Cry0D_1::
-	audio_header SFX_Cry0D_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0D_1_Ch5
+	channel 6, SFX_Cry0D_1_Ch6
+	channel 8, SFX_Cry0D_1_Ch8
 
 SFX_Cry0E_1::
-	audio_header SFX_Cry0E_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0E_1_Ch5
+	channel 6, SFX_Cry0E_1_Ch6
+	channel 8, SFX_Cry0E_1_Ch8
 
 SFX_Cry0F_1::
-	audio_header SFX_Cry0F_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0F_1_Ch5
+	channel 6, SFX_Cry0F_1_Ch6
+	channel 8, SFX_Cry0F_1_Ch8
 
 SFX_Cry10_1::
-	audio_header SFX_Cry10_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry10_1_Ch5
+	channel 6, SFX_Cry10_1_Ch6
+	channel 8, SFX_Cry10_1_Ch8
 
 SFX_Cry11_1::
-	audio_header SFX_Cry11_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry11_1_Ch5
+	channel 6, SFX_Cry11_1_Ch6
+	channel 8, SFX_Cry11_1_Ch8
 
 SFX_Cry12_1::
-	audio_header SFX_Cry12_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry12_1_Ch5
+	channel 6, SFX_Cry12_1_Ch6
+	channel 8, SFX_Cry12_1_Ch8
 
 SFX_Cry13_1::
-	audio_header SFX_Cry13_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry13_1_Ch5
+	channel 6, SFX_Cry13_1_Ch6
+	channel 8, SFX_Cry13_1_Ch8
 
 SFX_Cry14_1::
-	audio_header SFX_Cry14_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry14_1_Ch5
+	channel 6, SFX_Cry14_1_Ch6
+	channel 8, SFX_Cry14_1_Ch8
 
 SFX_Cry15_1::
-	audio_header SFX_Cry15_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry15_1_Ch5
+	channel 6, SFX_Cry15_1_Ch6
+	channel 8, SFX_Cry15_1_Ch8
 
 SFX_Cry16_1::
-	audio_header SFX_Cry16_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry16_1_Ch5
+	channel 6, SFX_Cry16_1_Ch6
+	channel 8, SFX_Cry16_1_Ch8
 
 SFX_Cry17_1::
-	audio_header SFX_Cry17_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry17_1_Ch5
+	channel 6, SFX_Cry17_1_Ch6
+	channel 8, SFX_Cry17_1_Ch8
 
 SFX_Cry18_1::
-	audio_header SFX_Cry18_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry18_1_Ch5
+	channel 6, SFX_Cry18_1_Ch6
+	channel 8, SFX_Cry18_1_Ch8
 
 SFX_Cry19_1::
-	audio_header SFX_Cry19_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry19_1_Ch5
+	channel 6, SFX_Cry19_1_Ch6
+	channel 8, SFX_Cry19_1_Ch8
 
 SFX_Cry1A_1::
-	audio_header SFX_Cry1A_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1A_1_Ch5
+	channel 6, SFX_Cry1A_1_Ch6
+	channel 8, SFX_Cry1A_1_Ch8
 
 SFX_Cry1B_1::
-	audio_header SFX_Cry1B_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1B_1_Ch5
+	channel 6, SFX_Cry1B_1_Ch6
+	channel 8, SFX_Cry1B_1_Ch8
 
 SFX_Cry1C_1::
-	audio_header SFX_Cry1C_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1C_1_Ch5
+	channel 6, SFX_Cry1C_1_Ch6
+	channel 8, SFX_Cry1C_1_Ch8
 
 SFX_Cry1D_1::
-	audio_header SFX_Cry1D_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1D_1_Ch5
+	channel 6, SFX_Cry1D_1_Ch6
+	channel 8, SFX_Cry1D_1_Ch8
 
 SFX_Cry1E_1::
-	audio_header SFX_Cry1E_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1E_1_Ch5
+	channel 6, SFX_Cry1E_1_Ch6
+	channel 8, SFX_Cry1E_1_Ch8
 
 SFX_Cry1F_1::
-	audio_header SFX_Cry1F_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1F_1_Ch5
+	channel 6, SFX_Cry1F_1_Ch6
+	channel 8, SFX_Cry1F_1_Ch8
 
 SFX_Cry20_1::
-	audio_header SFX_Cry20_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry20_1_Ch5
+	channel 6, SFX_Cry20_1_Ch6
+	channel 8, SFX_Cry20_1_Ch8
 
 SFX_Cry21_1::
-	audio_header SFX_Cry21_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry21_1_Ch5
+	channel 6, SFX_Cry21_1_Ch6
+	channel 8, SFX_Cry21_1_Ch8
 
 SFX_Cry22_1::
-	audio_header SFX_Cry22_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry22_1_Ch5
+	channel 6, SFX_Cry22_1_Ch6
+	channel 8, SFX_Cry22_1_Ch8
 
 SFX_Cry23_1::
-	audio_header SFX_Cry23_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry23_1_Ch5
+	channel 6, SFX_Cry23_1_Ch6
+	channel 8, SFX_Cry23_1_Ch8
 
 SFX_Cry24_1::
-	audio_header SFX_Cry24_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry24_1_Ch5
+	channel 6, SFX_Cry24_1_Ch6
+	channel 8, SFX_Cry24_1_Ch8
 
 SFX_Cry25_1::
-	audio_header SFX_Cry25_1, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry25_1_Ch5
+	channel 6, SFX_Cry25_1_Ch6
+	channel 8, SFX_Cry25_1_Ch8
 
 SFX_Get_Item1_1::
-	audio_header SFX_Get_Item1_1, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Get_Item1_1_Ch5
+	channel 6, SFX_Get_Item1_1_Ch6
+	channel 7, SFX_Get_Item1_1_Ch7
 
 SFX_Get_Item2_1::
-	audio_header SFX_Get_Item2_1, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Get_Item2_1_Ch5
+	channel 6, SFX_Get_Item2_1_Ch6
+	channel 7, SFX_Get_Item2_1_Ch7
 
 SFX_Tink_1::
-	audio_header SFX_Tink_1, Ch5
+	channel_count 1
+	channel 5, SFX_Tink_1_Ch5
 
 SFX_Heal_HP_1::
-	audio_header SFX_Heal_HP_1, Ch5
+	channel_count 1
+	channel 5, SFX_Heal_HP_1_Ch5
 
 SFX_Heal_Ailment_1::
-	audio_header SFX_Heal_Ailment_1, Ch5
+	channel_count 1
+	channel 5, SFX_Heal_Ailment_1_Ch5
 
 SFX_Start_Menu_1::
-	audio_header SFX_Start_Menu_1, Ch8
+	channel_count 1
+	channel 8, SFX_Start_Menu_1_Ch8
 
 SFX_Press_AB_1::
-	audio_header SFX_Press_AB_1, Ch5
+	channel_count 1
+	channel 5, SFX_Press_AB_1_Ch5
 
 SFX_Pokedex_Rating_1::
-	audio_header SFX_Pokedex_Rating_1, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Pokedex_Rating_1_Ch5
+	channel 6, SFX_Pokedex_Rating_1_Ch6
+	channel 7, SFX_Pokedex_Rating_1_Ch7
 
 SFX_Get_Key_Item_1::
-	audio_header SFX_Get_Key_Item_1, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Get_Key_Item_1_Ch5
+	channel 6, SFX_Get_Key_Item_1_Ch6
+	channel 7, SFX_Get_Key_Item_1_Ch7
 
 SFX_Poisoned_1::
-	audio_header SFX_Poisoned_1, Ch5
+	channel_count 1
+	channel 5, SFX_Poisoned_1_Ch5
 
 SFX_Trade_Machine_1::
-	audio_header SFX_Trade_Machine_1, Ch5
+	channel_count 1
+	channel 5, SFX_Trade_Machine_1_Ch5
 
 SFX_Turn_On_PC_1::
-	audio_header SFX_Turn_On_PC_1, Ch5
+	channel_count 1
+	channel 5, SFX_Turn_On_PC_1_Ch5
 
 SFX_Turn_Off_PC_1::
-	audio_header SFX_Turn_Off_PC_1, Ch5
+	channel_count 1
+	channel 5, SFX_Turn_Off_PC_1_Ch5
 
 SFX_Enter_PC_1::
-	audio_header SFX_Enter_PC_1, Ch5
+	channel_count 1
+	channel 5, SFX_Enter_PC_1_Ch5
 
 SFX_Shrink_1::
-	audio_header SFX_Shrink_1, Ch5
+	channel_count 1
+	channel 5, SFX_Shrink_1_Ch5
 
 SFX_Switch_1::
-	audio_header SFX_Switch_1, Ch5
+	channel_count 1
+	channel 5, SFX_Switch_1_Ch5
 
 SFX_Healing_Machine_1::
-	audio_header SFX_Healing_Machine_1, Ch5
+	channel_count 1
+	channel 5, SFX_Healing_Machine_1_Ch5
 
 SFX_Teleport_Exit1_1::
-	audio_header SFX_Teleport_Exit1_1, Ch5
+	channel_count 1
+	channel 5, SFX_Teleport_Exit1_1_Ch5
 
 SFX_Teleport_Enter1_1::
-	audio_header SFX_Teleport_Enter1_1, Ch5
+	channel_count 1
+	channel 5, SFX_Teleport_Enter1_1_Ch5
 
 SFX_Teleport_Exit2_1::
-	audio_header SFX_Teleport_Exit2_1, Ch5
+	channel_count 1
+	channel 5, SFX_Teleport_Exit2_1_Ch5
 
 SFX_Ledge_1::
-	audio_header SFX_Ledge_1, Ch5
+	channel_count 1
+	channel 5, SFX_Ledge_1_Ch5
 
 SFX_Teleport_Enter2_1::
-	audio_header SFX_Teleport_Enter2_1, Ch8
+	channel_count 1
+	channel 8, SFX_Teleport_Enter2_1_Ch8
 
 SFX_Fly_1::
-	audio_header SFX_Fly_1, Ch8
+	channel_count 1
+	channel 8, SFX_Fly_1_Ch8
 
 SFX_Denied_1::
-	audio_header SFX_Denied_1, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Denied_1_Ch5
+	channel 6, SFX_Denied_1_Ch6
 
 SFX_Arrow_Tiles_1::
-	audio_header SFX_Arrow_Tiles_1, Ch5
+	channel_count 1
+	channel 5, SFX_Arrow_Tiles_1_Ch5
 
 SFX_Push_Boulder_1::
-	audio_header SFX_Push_Boulder_1, Ch8
+	channel_count 1
+	channel 8, SFX_Push_Boulder_1_Ch8
 
 SFX_SS_Anne_Horn_1::
-	audio_header SFX_SS_Anne_Horn_1, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_SS_Anne_Horn_1_Ch5
+	channel 6, SFX_SS_Anne_Horn_1_Ch6
 
 SFX_Withdraw_Deposit_1::
-	audio_header SFX_Withdraw_Deposit_1, Ch5
+	channel_count 1
+	channel 5, SFX_Withdraw_Deposit_1_Ch5
 
 SFX_Cut_1::
-	audio_header SFX_Cut_1, Ch8
+	channel_count 1
+	channel 8, SFX_Cut_1_Ch8
 
 SFX_Go_Inside_1::
-	audio_header SFX_Go_Inside_1, Ch8
+	channel_count 1
+	channel 8, SFX_Go_Inside_1_Ch8
 
 SFX_Swap_1::
-	audio_header SFX_Swap_1, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Swap_1_Ch5
+	channel 6, SFX_Swap_1_Ch6
 
 SFX_59_1::
-	audio_header SFX_59_1, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_59_1_Ch5
+	channel 6, SFX_59_1_Ch6
 
 SFX_Purchase_1::
-	audio_header SFX_Purchase_1, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Purchase_1_Ch5
+	channel 6, SFX_Purchase_1_Ch6
 
 SFX_Collision_1::
-	audio_header SFX_Collision_1, Ch5
+	channel_count 1
+	channel 5, SFX_Collision_1_Ch5
 
 SFX_Go_Outside_1::
-	audio_header SFX_Go_Outside_1, Ch8
+	channel_count 1
+	channel 8, SFX_Go_Outside_1_Ch8
 
 SFX_Save_1::
-	audio_header SFX_Save_1, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Save_1_Ch5
+	channel 6, SFX_Save_1_Ch6
 
 ; the Pokeflute sound effect directly hijacks channel 3
 SFX_Pokeflute::
-	audio_header SFX_Pokeflute, Ch3
+	channel_count 1
+	channel 3, SFX_Pokeflute_Ch3
 
 SFX_Safari_Zone_PA::
-	audio_header SFX_Safari_Zone_PA, Ch5
+	channel_count 1
+	channel 5, SFX_Safari_Zone_PA_Ch5
--- a/audio/headers/sfxheaders2.asm
+++ b/audio/headers/sfxheaders2.asm
@@ -2,358 +2,591 @@
 	db $ff, $ff, $ff ; padding
 
 SFX_Noise_Instrument01_2::
-	audio_header SFX_Noise_Instrument01_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument01_2_Ch8
 
 SFX_Noise_Instrument02_2::
-	audio_header SFX_Noise_Instrument02_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument02_2_Ch8
 
 SFX_Noise_Instrument03_2::
-	audio_header SFX_Noise_Instrument03_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument03_2_Ch8
 
 SFX_Noise_Instrument04_2::
-	audio_header SFX_Noise_Instrument04_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument04_2_Ch8
 
 SFX_Noise_Instrument05_2::
-	audio_header SFX_Noise_Instrument05_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument05_2_Ch8
 
 SFX_Noise_Instrument06_2::
-	audio_header SFX_Noise_Instrument06_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument06_2_Ch8
 
 SFX_Noise_Instrument07_2::
-	audio_header SFX_Noise_Instrument07_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument07_2_Ch8
 
 SFX_Noise_Instrument08_2::
-	audio_header SFX_Noise_Instrument08_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument08_2_Ch8
 
 SFX_Noise_Instrument09_2::
-	audio_header SFX_Noise_Instrument09_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument09_2_Ch8
 
 SFX_Noise_Instrument10_2::
-	audio_header SFX_Noise_Instrument10_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument10_2_Ch8
 
 SFX_Noise_Instrument11_2::
-	audio_header SFX_Noise_Instrument11_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument11_2_Ch8
 
 SFX_Noise_Instrument12_2::
-	audio_header SFX_Noise_Instrument12_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument12_2_Ch8
 
 SFX_Noise_Instrument13_2::
-	audio_header SFX_Noise_Instrument13_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument13_2_Ch8
 
 SFX_Noise_Instrument14_2::
-	audio_header SFX_Noise_Instrument14_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument14_2_Ch8
 
 SFX_Noise_Instrument15_2::
-	audio_header SFX_Noise_Instrument15_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument15_2_Ch8
 
 SFX_Noise_Instrument16_2::
-	audio_header SFX_Noise_Instrument16_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument16_2_Ch8
 
 SFX_Noise_Instrument17_2::
-	audio_header SFX_Noise_Instrument17_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument17_2_Ch8
 
 SFX_Noise_Instrument18_2::
-	audio_header SFX_Noise_Instrument18_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument18_2_Ch8
 
 SFX_Noise_Instrument19_2::
-	audio_header SFX_Noise_Instrument19_2, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument19_2_Ch8
 
 SFX_Cry00_2::
-	audio_header SFX_Cry00_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry00_2_Ch5
+	channel 6, SFX_Cry00_2_Ch6
+	channel 8, SFX_Cry00_2_Ch8
 
 SFX_Cry01_2::
-	audio_header SFX_Cry01_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry01_2_Ch5
+	channel 6, SFX_Cry01_2_Ch6
+	channel 8, SFX_Cry01_2_Ch8
 
 SFX_Cry02_2::
-	audio_header SFX_Cry02_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry02_2_Ch5
+	channel 6, SFX_Cry02_2_Ch6
+	channel 8, SFX_Cry02_2_Ch8
 
 SFX_Cry03_2::
-	audio_header SFX_Cry03_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry03_2_Ch5
+	channel 6, SFX_Cry03_2_Ch6
+	channel 8, SFX_Cry03_2_Ch8
 
 SFX_Cry04_2::
-	audio_header SFX_Cry04_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry04_2_Ch5
+	channel 6, SFX_Cry04_2_Ch6
+	channel 8, SFX_Cry04_2_Ch8
 
 SFX_Cry05_2::
-	audio_header SFX_Cry05_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry05_2_Ch5
+	channel 6, SFX_Cry05_2_Ch6
+	channel 8, SFX_Cry05_2_Ch8
 
 SFX_Cry06_2::
-	audio_header SFX_Cry06_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry06_2_Ch5
+	channel 6, SFX_Cry06_2_Ch6
+	channel 8, SFX_Cry06_2_Ch8
 
 SFX_Cry07_2::
-	audio_header SFX_Cry07_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry07_2_Ch5
+	channel 6, SFX_Cry07_2_Ch6
+	channel 8, SFX_Cry07_2_Ch8
 
 SFX_Cry08_2::
-	audio_header SFX_Cry08_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry08_2_Ch5
+	channel 6, SFX_Cry08_2_Ch6
+	channel 8, SFX_Cry08_2_Ch8
 
 SFX_Cry09_2::
-	audio_header SFX_Cry09_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry09_2_Ch5
+	channel 6, SFX_Cry09_2_Ch6
+	channel 8, SFX_Cry09_2_Ch8
 
 SFX_Cry0A_2::
-	audio_header SFX_Cry0A_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0A_2_Ch5
+	channel 6, SFX_Cry0A_2_Ch6
+	channel 8, SFX_Cry0A_2_Ch8
 
 SFX_Cry0B_2::
-	audio_header SFX_Cry0B_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0B_2_Ch5
+	channel 6, SFX_Cry0B_2_Ch6
+	channel 8, SFX_Cry0B_2_Ch8
 
 SFX_Cry0C_2::
-	audio_header SFX_Cry0C_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0C_2_Ch5
+	channel 6, SFX_Cry0C_2_Ch6
+	channel 8, SFX_Cry0C_2_Ch8
 
 SFX_Cry0D_2::
-	audio_header SFX_Cry0D_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0D_2_Ch5
+	channel 6, SFX_Cry0D_2_Ch6
+	channel 8, SFX_Cry0D_2_Ch8
 
 SFX_Cry0E_2::
-	audio_header SFX_Cry0E_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0E_2_Ch5
+	channel 6, SFX_Cry0E_2_Ch6
+	channel 8, SFX_Cry0E_2_Ch8
 
 SFX_Cry0F_2::
-	audio_header SFX_Cry0F_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0F_2_Ch5
+	channel 6, SFX_Cry0F_2_Ch6
+	channel 8, SFX_Cry0F_2_Ch8
 
 SFX_Cry10_2::
-	audio_header SFX_Cry10_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry10_2_Ch5
+	channel 6, SFX_Cry10_2_Ch6
+	channel 8, SFX_Cry10_2_Ch8
 
 SFX_Cry11_2::
-	audio_header SFX_Cry11_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry11_2_Ch5
+	channel 6, SFX_Cry11_2_Ch6
+	channel 8, SFX_Cry11_2_Ch8
 
 SFX_Cry12_2::
-	audio_header SFX_Cry12_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry12_2_Ch5
+	channel 6, SFX_Cry12_2_Ch6
+	channel 8, SFX_Cry12_2_Ch8
 
 SFX_Cry13_2::
-	audio_header SFX_Cry13_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry13_2_Ch5
+	channel 6, SFX_Cry13_2_Ch6
+	channel 8, SFX_Cry13_2_Ch8
 
 SFX_Cry14_2::
-	audio_header SFX_Cry14_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry14_2_Ch5
+	channel 6, SFX_Cry14_2_Ch6
+	channel 8, SFX_Cry14_2_Ch8
 
 SFX_Cry15_2::
-	audio_header SFX_Cry15_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry15_2_Ch5
+	channel 6, SFX_Cry15_2_Ch6
+	channel 8, SFX_Cry15_2_Ch8
 
 SFX_Cry16_2::
-	audio_header SFX_Cry16_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry16_2_Ch5
+	channel 6, SFX_Cry16_2_Ch6
+	channel 8, SFX_Cry16_2_Ch8
 
 SFX_Cry17_2::
-	audio_header SFX_Cry17_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry17_2_Ch5
+	channel 6, SFX_Cry17_2_Ch6
+	channel 8, SFX_Cry17_2_Ch8
 
 SFX_Cry18_2::
-	audio_header SFX_Cry18_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry18_2_Ch5
+	channel 6, SFX_Cry18_2_Ch6
+	channel 8, SFX_Cry18_2_Ch8
 
 SFX_Cry19_2::
-	audio_header SFX_Cry19_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry19_2_Ch5
+	channel 6, SFX_Cry19_2_Ch6
+	channel 8, SFX_Cry19_2_Ch8
 
 SFX_Cry1A_2::
-	audio_header SFX_Cry1A_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1A_2_Ch5
+	channel 6, SFX_Cry1A_2_Ch6
+	channel 8, SFX_Cry1A_2_Ch8
 
 SFX_Cry1B_2::
-	audio_header SFX_Cry1B_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1B_2_Ch5
+	channel 6, SFX_Cry1B_2_Ch6
+	channel 8, SFX_Cry1B_2_Ch8
 
 SFX_Cry1C_2::
-	audio_header SFX_Cry1C_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1C_2_Ch5
+	channel 6, SFX_Cry1C_2_Ch6
+	channel 8, SFX_Cry1C_2_Ch8
 
 SFX_Cry1D_2::
-	audio_header SFX_Cry1D_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1D_2_Ch5
+	channel 6, SFX_Cry1D_2_Ch6
+	channel 8, SFX_Cry1D_2_Ch8
 
 SFX_Cry1E_2::
-	audio_header SFX_Cry1E_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1E_2_Ch5
+	channel 6, SFX_Cry1E_2_Ch6
+	channel 8, SFX_Cry1E_2_Ch8
 
 SFX_Cry1F_2::
-	audio_header SFX_Cry1F_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1F_2_Ch5
+	channel 6, SFX_Cry1F_2_Ch6
+	channel 8, SFX_Cry1F_2_Ch8
 
 SFX_Cry20_2::
-	audio_header SFX_Cry20_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry20_2_Ch5
+	channel 6, SFX_Cry20_2_Ch6
+	channel 8, SFX_Cry20_2_Ch8
 
 SFX_Cry21_2::
-	audio_header SFX_Cry21_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry21_2_Ch5
+	channel 6, SFX_Cry21_2_Ch6
+	channel 8, SFX_Cry21_2_Ch8
 
 SFX_Cry22_2::
-	audio_header SFX_Cry22_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry22_2_Ch5
+	channel 6, SFX_Cry22_2_Ch6
+	channel 8, SFX_Cry22_2_Ch8
 
 SFX_Cry23_2::
-	audio_header SFX_Cry23_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry23_2_Ch5
+	channel 6, SFX_Cry23_2_Ch6
+	channel 8, SFX_Cry23_2_Ch8
 
 SFX_Cry24_2::
-	audio_header SFX_Cry24_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry24_2_Ch5
+	channel 6, SFX_Cry24_2_Ch6
+	channel 8, SFX_Cry24_2_Ch8
 
 SFX_Cry25_2::
-	audio_header SFX_Cry25_2, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry25_2_Ch5
+	channel 6, SFX_Cry25_2_Ch6
+	channel 8, SFX_Cry25_2_Ch8
 
 SFX_Level_Up::
-	audio_header SFX_Level_Up, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Level_Up_Ch5
+	channel 6, SFX_Level_Up_Ch6
+	channel 7, SFX_Level_Up_Ch7
 
 SFX_Get_Item2_2::
-	audio_header SFX_Get_Item2_2, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Get_Item2_2_Ch5
+	channel 6, SFX_Get_Item2_2_Ch6
+	channel 7, SFX_Get_Item2_2_Ch7
 
 SFX_Tink_2::
-	audio_header SFX_Tink_2, Ch5
+	channel_count 1
+	channel 5, SFX_Tink_2_Ch5
 
 SFX_Heal_HP_2::
-	audio_header SFX_Heal_HP_2, Ch5
+	channel_count 1
+	channel 5, SFX_Heal_HP_2_Ch5
 
 SFX_Heal_Ailment_2::
-	audio_header SFX_Heal_Ailment_2, Ch5
+	channel_count 1
+	channel 5, SFX_Heal_Ailment_2_Ch5
 
 SFX_Start_Menu_2::
-	audio_header SFX_Start_Menu_2, Ch8
+	channel_count 1
+	channel 8, SFX_Start_Menu_2_Ch8
 
 SFX_Press_AB_2::
-	audio_header SFX_Press_AB_2, Ch5
+	channel_count 1
+	channel 5, SFX_Press_AB_2_Ch5
 
 SFX_Ball_Toss::
-	audio_header SFX_Ball_Toss, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Ball_Toss_Ch5
+	channel 6, SFX_Ball_Toss_Ch6
 
 SFX_Ball_Poof::
-	audio_header SFX_Ball_Poof, Ch5, Ch8
+	channel_count 2
+	channel 5, SFX_Ball_Poof_Ch5
+	channel 8, SFX_Ball_Poof_Ch8
 
 SFX_Faint_Thud::
-	audio_header SFX_Faint_Thud, Ch5, Ch8
+	channel_count 2
+	channel 5, SFX_Faint_Thud_Ch5
+	channel 8, SFX_Faint_Thud_Ch8
 
 SFX_Run::
-	audio_header SFX_Run, Ch8
+	channel_count 1
+	channel 8, SFX_Run_Ch8
 
 SFX_Dex_Page_Added::
-	audio_header SFX_Dex_Page_Added, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Dex_Page_Added_Ch5
+	channel 6, SFX_Dex_Page_Added_Ch6
 
 SFX_Caught_Mon::
-	audio_header SFX_Caught_Mon, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Caught_Mon_Ch5
+	channel 6, SFX_Caught_Mon_Ch6
+	channel 7, SFX_Caught_Mon_Ch7
 
 SFX_Peck::
-	audio_header SFX_Peck, Ch8
+	channel_count 1
+	channel 8, SFX_Peck_Ch8
 
 SFX_Faint_Fall::
-	audio_header SFX_Faint_Fall, Ch5
+	channel_count 1
+	channel 5, SFX_Faint_Fall_Ch5
 
 SFX_Battle_09::
-	audio_header SFX_Battle_09, Ch5
+	channel_count 1
+	channel 5, SFX_Battle_09_Ch5
 
 SFX_Pound::
-	audio_header SFX_Pound, Ch8
+	channel_count 1
+	channel 8, SFX_Pound_Ch8
 
 SFX_Battle_0B::
-	audio_header SFX_Battle_0B, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_0B_Ch8
 
 SFX_Battle_0C::
-	audio_header SFX_Battle_0C, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_0C_Ch8
 
 SFX_Battle_0D::
-	audio_header SFX_Battle_0D, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_0D_Ch8
 
 SFX_Battle_0E::
-	audio_header SFX_Battle_0E, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_0E_Ch8
 
 SFX_Battle_0F::
-	audio_header SFX_Battle_0F, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_0F_Ch8
 
 SFX_Damage::
-	audio_header SFX_Damage, Ch8
+	channel_count 1
+	channel 8, SFX_Damage_Ch8
 
 SFX_Not_Very_Effective::
-	audio_header SFX_Not_Very_Effective, Ch8
+	channel_count 1
+	channel 8, SFX_Not_Very_Effective_Ch8
 
 SFX_Battle_12::
-	audio_header SFX_Battle_12, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_12_Ch8
 
 SFX_Battle_13::
-	audio_header SFX_Battle_13, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_13_Ch8
 
 SFX_Battle_14::
-	audio_header SFX_Battle_14, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_14_Ch8
 
 SFX_Vine_Whip::
-	audio_header SFX_Vine_Whip, Ch8
+	channel_count 1
+	channel 8, SFX_Vine_Whip_Ch8
 
 SFX_Battle_16::
-	audio_header SFX_Battle_16, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_16_Ch8
 
 SFX_Battle_17::
-	audio_header SFX_Battle_17, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_17_Ch8
 
 SFX_Battle_18::
-	audio_header SFX_Battle_18, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_18_Ch8
 
 SFX_Battle_19::
-	audio_header SFX_Battle_19, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_19_Ch8
 
 SFX_Super_Effective::
-	audio_header SFX_Super_Effective, Ch8
+	channel_count 1
+	channel 8, SFX_Super_Effective_Ch8
 
 SFX_Battle_1B::
-	audio_header SFX_Battle_1B, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_1B_Ch8
 
 SFX_Battle_1C::
-	audio_header SFX_Battle_1C, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_1C_Ch8
 
 SFX_Doubleslap::
-	audio_header SFX_Doubleslap, Ch8
+	channel_count 1
+	channel 8, SFX_Doubleslap_Ch8
 
 SFX_Battle_1E::
-	audio_header SFX_Battle_1E, Ch5, Ch8
+	channel_count 2
+	channel 5, SFX_Battle_1E_Ch5
+	channel 8, SFX_Battle_1E_Ch8
 
 SFX_Horn_Drill::
-	audio_header SFX_Horn_Drill, Ch8
+	channel_count 1
+	channel 8, SFX_Horn_Drill_Ch8
 
 SFX_Battle_20::
-	audio_header SFX_Battle_20, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_20_Ch8
 
 SFX_Battle_21::
-	audio_header SFX_Battle_21, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_21_Ch8
 
 SFX_Battle_22::
-	audio_header SFX_Battle_22, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_22_Ch8
 
 SFX_Battle_23::
-	audio_header SFX_Battle_23, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_23_Ch8
 
 SFX_Battle_24::
-	audio_header SFX_Battle_24, Ch5, Ch8
+	channel_count 2
+	channel 5, SFX_Battle_24_Ch5
+	channel 8, SFX_Battle_24_Ch8
 
 SFX_Battle_25::
-	audio_header SFX_Battle_25, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_25_Ch8
 
 SFX_Battle_26::
-	audio_header SFX_Battle_26, Ch8
+	channel_count 1
+	channel 8, SFX_Battle_26_Ch8
 
 SFX_Battle_27::
-	audio_header SFX_Battle_27, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Battle_27_Ch5
+	channel 6, SFX_Battle_27_Ch6
+	channel 8, SFX_Battle_27_Ch8
 
 SFX_Battle_28::
-	audio_header SFX_Battle_28, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Battle_28_Ch5
+	channel 6, SFX_Battle_28_Ch6
+	channel 8, SFX_Battle_28_Ch8
 
 SFX_Battle_29::
-	audio_header SFX_Battle_29, Ch5, Ch8
+	channel_count 2
+	channel 5, SFX_Battle_29_Ch5
+	channel 8, SFX_Battle_29_Ch8
 
 SFX_Battle_2A::
-	audio_header SFX_Battle_2A, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Battle_2A_Ch5
+	channel 6, SFX_Battle_2A_Ch6
+	channel 8, SFX_Battle_2A_Ch8
 
 SFX_Battle_2B::
-	audio_header SFX_Battle_2B, Ch5, Ch8
+	channel_count 2
+	channel 5, SFX_Battle_2B_Ch5
+	channel 8, SFX_Battle_2B_Ch8
 
 SFX_Battle_2C::
-	audio_header SFX_Battle_2C, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Battle_2C_Ch5
+	channel 6, SFX_Battle_2C_Ch6
+	channel 8, SFX_Battle_2C_Ch8
 
 SFX_Psybeam::
-	audio_header SFX_Psybeam, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Psybeam_Ch5
+	channel 6, SFX_Psybeam_Ch6
+	channel 8, SFX_Psybeam_Ch8
 
 SFX_Battle_2E::
-	audio_header SFX_Battle_2E, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Battle_2E_Ch5
+	channel 6, SFX_Battle_2E_Ch6
+	channel 8, SFX_Battle_2E_Ch8
 
 SFX_Battle_2F::
-	audio_header SFX_Battle_2F, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Battle_2F_Ch5
+	channel 6, SFX_Battle_2F_Ch6
+	channel 8, SFX_Battle_2F_Ch8
 
 SFX_Psychic_M::
-	audio_header SFX_Psychic_M, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Psychic_M_Ch5
+	channel 6, SFX_Psychic_M_Ch6
+	channel 8, SFX_Psychic_M_Ch8
 
 SFX_Battle_31::
-	audio_header SFX_Battle_31, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Battle_31_Ch5
+	channel 6, SFX_Battle_31_Ch6
 
 SFX_Battle_32::
-	audio_header SFX_Battle_32, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Battle_32_Ch5
+	channel 6, SFX_Battle_32_Ch6
 
 SFX_Battle_33::
-	audio_header SFX_Battle_33, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Battle_33_Ch5
+	channel 6, SFX_Battle_33_Ch6
 
 SFX_Battle_34::
-	audio_header SFX_Battle_34, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Battle_34_Ch5
+	channel 6, SFX_Battle_34_Ch6
+	channel 8, SFX_Battle_34_Ch8
 
 SFX_Battle_35::
-	audio_header SFX_Battle_35, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Battle_35_Ch5
+	channel 6, SFX_Battle_35_Ch6
 
 SFX_Battle_36::
-	audio_header SFX_Battle_36, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Battle_36_Ch5
+	channel 6, SFX_Battle_36_Ch6
+	channel 8, SFX_Battle_36_Ch8
 
 SFX_Silph_Scope::
-	audio_header SFX_Silph_Scope, Ch5
+	channel_count 1
+	channel 5, SFX_Silph_Scope_Ch5
--- a/audio/headers/sfxheaders3.asm
+++ b/audio/headers/sfxheaders3.asm
@@ -2,310 +2,504 @@
 	db $ff, $ff, $ff ; padding
 
 SFX_Noise_Instrument01_3::
-	audio_header SFX_Noise_Instrument01_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument01_3_Ch8
 
 SFX_Noise_Instrument02_3::
-	audio_header SFX_Noise_Instrument02_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument02_3_Ch8
 
 SFX_Noise_Instrument03_3::
-	audio_header SFX_Noise_Instrument03_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument03_3_Ch8
 
 SFX_Noise_Instrument04_3::
-	audio_header SFX_Noise_Instrument04_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument04_3_Ch8
 
 SFX_Noise_Instrument05_3::
-	audio_header SFX_Noise_Instrument05_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument05_3_Ch8
 
 SFX_Noise_Instrument06_3::
-	audio_header SFX_Noise_Instrument06_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument06_3_Ch8
 
 SFX_Noise_Instrument07_3::
-	audio_header SFX_Noise_Instrument07_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument07_3_Ch8
 
 SFX_Noise_Instrument08_3::
-	audio_header SFX_Noise_Instrument08_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument08_3_Ch8
 
 SFX_Noise_Instrument09_3::
-	audio_header SFX_Noise_Instrument09_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument09_3_Ch8
 
 SFX_Noise_Instrument10_3::
-	audio_header SFX_Noise_Instrument10_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument10_3_Ch8
 
 SFX_Noise_Instrument11_3::
-	audio_header SFX_Noise_Instrument11_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument11_3_Ch8
 
 SFX_Noise_Instrument12_3::
-	audio_header SFX_Noise_Instrument12_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument12_3_Ch8
 
 SFX_Noise_Instrument13_3::
-	audio_header SFX_Noise_Instrument13_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument13_3_Ch8
 
 SFX_Noise_Instrument14_3::
-	audio_header SFX_Noise_Instrument14_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument14_3_Ch8
 
 SFX_Noise_Instrument15_3::
-	audio_header SFX_Noise_Instrument15_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument15_3_Ch8
 
 SFX_Noise_Instrument16_3::
-	audio_header SFX_Noise_Instrument16_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument16_3_Ch8
 
 SFX_Noise_Instrument17_3::
-	audio_header SFX_Noise_Instrument17_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument17_3_Ch8
 
 SFX_Noise_Instrument18_3::
-	audio_header SFX_Noise_Instrument18_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument18_3_Ch8
 
 SFX_Noise_Instrument19_3::
-	audio_header SFX_Noise_Instrument19_3, Ch8
+	channel_count 1
+	channel 8, SFX_Noise_Instrument19_3_Ch8
 
 SFX_Cry00_3::
-	audio_header SFX_Cry00_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry00_3_Ch5
+	channel 6, SFX_Cry00_3_Ch6
+	channel 8, SFX_Cry00_3_Ch8
 
 SFX_Cry01_3::
-	audio_header SFX_Cry01_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry01_3_Ch5
+	channel 6, SFX_Cry01_3_Ch6
+	channel 8, SFX_Cry01_3_Ch8
 
 SFX_Cry02_3::
-	audio_header SFX_Cry02_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry02_3_Ch5
+	channel 6, SFX_Cry02_3_Ch6
+	channel 8, SFX_Cry02_3_Ch8
 
 SFX_Cry03_3::
-	audio_header SFX_Cry03_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry03_3_Ch5
+	channel 6, SFX_Cry03_3_Ch6
+	channel 8, SFX_Cry03_3_Ch8
 
 SFX_Cry04_3::
-	audio_header SFX_Cry04_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry04_3_Ch5
+	channel 6, SFX_Cry04_3_Ch6
+	channel 8, SFX_Cry04_3_Ch8
 
 SFX_Cry05_3::
-	audio_header SFX_Cry05_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry05_3_Ch5
+	channel 6, SFX_Cry05_3_Ch6
+	channel 8, SFX_Cry05_3_Ch8
 
 SFX_Cry06_3::
-	audio_header SFX_Cry06_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry06_3_Ch5
+	channel 6, SFX_Cry06_3_Ch6
+	channel 8, SFX_Cry06_3_Ch8
 
 SFX_Cry07_3::
-	audio_header SFX_Cry07_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry07_3_Ch5
+	channel 6, SFX_Cry07_3_Ch6
+	channel 8, SFX_Cry07_3_Ch8
 
 SFX_Cry08_3::
-	audio_header SFX_Cry08_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry08_3_Ch5
+	channel 6, SFX_Cry08_3_Ch6
+	channel 8, SFX_Cry08_3_Ch8
 
 SFX_Cry09_3::
-	audio_header SFX_Cry09_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry09_3_Ch5
+	channel 6, SFX_Cry09_3_Ch6
+	channel 8, SFX_Cry09_3_Ch8
 
 SFX_Cry0A_3::
-	audio_header SFX_Cry0A_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0A_3_Ch5
+	channel 6, SFX_Cry0A_3_Ch6
+	channel 8, SFX_Cry0A_3_Ch8
 
 SFX_Cry0B_3::
-	audio_header SFX_Cry0B_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0B_3_Ch5
+	channel 6, SFX_Cry0B_3_Ch6
+	channel 8, SFX_Cry0B_3_Ch8
 
 SFX_Cry0C_3::
-	audio_header SFX_Cry0C_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0C_3_Ch5
+	channel 6, SFX_Cry0C_3_Ch6
+	channel 8, SFX_Cry0C_3_Ch8
 
 SFX_Cry0D_3::
-	audio_header SFX_Cry0D_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0D_3_Ch5
+	channel 6, SFX_Cry0D_3_Ch6
+	channel 8, SFX_Cry0D_3_Ch8
 
 SFX_Cry0E_3::
-	audio_header SFX_Cry0E_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0E_3_Ch5
+	channel 6, SFX_Cry0E_3_Ch6
+	channel 8, SFX_Cry0E_3_Ch8
 
 SFX_Cry0F_3::
-	audio_header SFX_Cry0F_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry0F_3_Ch5
+	channel 6, SFX_Cry0F_3_Ch6
+	channel 8, SFX_Cry0F_3_Ch8
 
 SFX_Cry10_3::
-	audio_header SFX_Cry10_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry10_3_Ch5
+	channel 6, SFX_Cry10_3_Ch6
+	channel 8, SFX_Cry10_3_Ch8
 
 SFX_Cry11_3::
-	audio_header SFX_Cry11_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry11_3_Ch5
+	channel 6, SFX_Cry11_3_Ch6
+	channel 8, SFX_Cry11_3_Ch8
 
 SFX_Cry12_3::
-	audio_header SFX_Cry12_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry12_3_Ch5
+	channel 6, SFX_Cry12_3_Ch6
+	channel 8, SFX_Cry12_3_Ch8
 
 SFX_Cry13_3::
-	audio_header SFX_Cry13_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry13_3_Ch5
+	channel 6, SFX_Cry13_3_Ch6
+	channel 8, SFX_Cry13_3_Ch8
 
 SFX_Cry14_3::
-	audio_header SFX_Cry14_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry14_3_Ch5
+	channel 6, SFX_Cry14_3_Ch6
+	channel 8, SFX_Cry14_3_Ch8
 
 SFX_Cry15_3::
-	audio_header SFX_Cry15_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry15_3_Ch5
+	channel 6, SFX_Cry15_3_Ch6
+	channel 8, SFX_Cry15_3_Ch8
 
 SFX_Cry16_3::
-	audio_header SFX_Cry16_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry16_3_Ch5
+	channel 6, SFX_Cry16_3_Ch6
+	channel 8, SFX_Cry16_3_Ch8
 
 SFX_Cry17_3::
-	audio_header SFX_Cry17_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry17_3_Ch5
+	channel 6, SFX_Cry17_3_Ch6
+	channel 8, SFX_Cry17_3_Ch8
 
 SFX_Cry18_3::
-	audio_header SFX_Cry18_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry18_3_Ch5
+	channel 6, SFX_Cry18_3_Ch6
+	channel 8, SFX_Cry18_3_Ch8
 
 SFX_Cry19_3::
-	audio_header SFX_Cry19_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry19_3_Ch5
+	channel 6, SFX_Cry19_3_Ch6
+	channel 8, SFX_Cry19_3_Ch8
 
 SFX_Cry1A_3::
-	audio_header SFX_Cry1A_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1A_3_Ch5
+	channel 6, SFX_Cry1A_3_Ch6
+	channel 8, SFX_Cry1A_3_Ch8
 
 SFX_Cry1B_3::
-	audio_header SFX_Cry1B_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1B_3_Ch5
+	channel 6, SFX_Cry1B_3_Ch6
+	channel 8, SFX_Cry1B_3_Ch8
 
 SFX_Cry1C_3::
-	audio_header SFX_Cry1C_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1C_3_Ch5
+	channel 6, SFX_Cry1C_3_Ch6
+	channel 8, SFX_Cry1C_3_Ch8
 
 SFX_Cry1D_3::
-	audio_header SFX_Cry1D_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1D_3_Ch5
+	channel 6, SFX_Cry1D_3_Ch6
+	channel 8, SFX_Cry1D_3_Ch8
 
 SFX_Cry1E_3::
-	audio_header SFX_Cry1E_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1E_3_Ch5
+	channel 6, SFX_Cry1E_3_Ch6
+	channel 8, SFX_Cry1E_3_Ch8
 
 SFX_Cry1F_3::
-	audio_header SFX_Cry1F_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry1F_3_Ch5
+	channel 6, SFX_Cry1F_3_Ch6
+	channel 8, SFX_Cry1F_3_Ch8
 
 SFX_Cry20_3::
-	audio_header SFX_Cry20_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry20_3_Ch5
+	channel 6, SFX_Cry20_3_Ch6
+	channel 8, SFX_Cry20_3_Ch8
 
 SFX_Cry21_3::
-	audio_header SFX_Cry21_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry21_3_Ch5
+	channel 6, SFX_Cry21_3_Ch6
+	channel 8, SFX_Cry21_3_Ch8
 
 SFX_Cry22_3::
-	audio_header SFX_Cry22_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry22_3_Ch5
+	channel 6, SFX_Cry22_3_Ch6
+	channel 8, SFX_Cry22_3_Ch8
 
 SFX_Cry23_3::
-	audio_header SFX_Cry23_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry23_3_Ch5
+	channel 6, SFX_Cry23_3_Ch6
+	channel 8, SFX_Cry23_3_Ch8
 
 SFX_Cry24_3::
-	audio_header SFX_Cry24_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry24_3_Ch5
+	channel 6, SFX_Cry24_3_Ch6
+	channel 8, SFX_Cry24_3_Ch8
 
 SFX_Cry25_3::
-	audio_header SFX_Cry25_3, Ch5, Ch6, Ch8
+	channel_count 3
+	channel 5, SFX_Cry25_3_Ch5
+	channel 6, SFX_Cry25_3_Ch6
+	channel 8, SFX_Cry25_3_Ch8
 
 SFX_Get_Item1_3::
-	audio_header SFX_Get_Item1_3, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Get_Item1_3_Ch5
+	channel 6, SFX_Get_Item1_3_Ch6
+	channel 7, SFX_Get_Item1_3_Ch7
 
 SFX_Get_Item2_3::
-	audio_header SFX_Get_Item2_3, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Get_Item2_3_Ch5
+	channel 6, SFX_Get_Item2_3_Ch6
+	channel 7, SFX_Get_Item2_3_Ch7
 
 SFX_Tink_3::
-	audio_header SFX_Tink_3, Ch5
+	channel_count 1
+	channel 5, SFX_Tink_3_Ch5
 
 SFX_Heal_HP_3::
-	audio_header SFX_Heal_HP_3, Ch5
+	channel_count 1
+	channel 5, SFX_Heal_HP_3_Ch5
 
 SFX_Heal_Ailment_3::
-	audio_header SFX_Heal_Ailment_3, Ch5
+	channel_count 1
+	channel 5, SFX_Heal_Ailment_3_Ch5
 
 SFX_Start_Menu_3::
-	audio_header SFX_Start_Menu_3, Ch8
+	channel_count 1
+	channel 8, SFX_Start_Menu_3_Ch8
 
 SFX_Press_AB_3::
-	audio_header SFX_Press_AB_3, Ch5
+	channel_count 1
+	channel 5, SFX_Press_AB_3_Ch5
 
 SFX_Pokedex_Rating_3::
-	audio_header SFX_Pokedex_Rating_3, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Pokedex_Rating_3_Ch5
+	channel 6, SFX_Pokedex_Rating_3_Ch6
+	channel 7, SFX_Pokedex_Rating_3_Ch7
 
 SFX_Get_Key_Item_3::
-	audio_header SFX_Get_Key_Item_3, Ch5, Ch6, Ch7
+	channel_count 3
+	channel 5, SFX_Get_Key_Item_3_Ch5
+	channel 6, SFX_Get_Key_Item_3_Ch6
+	channel 7, SFX_Get_Key_Item_3_Ch7
 
 SFX_Poisoned_3::
-	audio_header SFX_Poisoned_3, Ch5
+	channel_count 1
+	channel 5, SFX_Poisoned_3_Ch5
 
 SFX_Trade_Machine_3::
-	audio_header SFX_Trade_Machine_3, Ch5
+	channel_count 1
+	channel 5, SFX_Trade_Machine_3_Ch5
 
 SFX_Turn_On_PC_3::
-	audio_header SFX_Turn_On_PC_3, Ch5
+	channel_count 1
+	channel 5, SFX_Turn_On_PC_3_Ch5
 
 SFX_Turn_Off_PC_3::
-	audio_header SFX_Turn_Off_PC_3, Ch5
+	channel_count 1
+	channel 5, SFX_Turn_Off_PC_3_Ch5
 
 SFX_Enter_PC_3::
-	audio_header SFX_Enter_PC_3, Ch5
+	channel_count 1
+	channel 5, SFX_Enter_PC_3_Ch5
 
 SFX_Shrink_3::
-	audio_header SFX_Shrink_3, Ch5
+	channel_count 1
+	channel 5, SFX_Shrink_3_Ch5
 
 SFX_Switch_3::
-	audio_header SFX_Switch_3, Ch5
+	channel_count 1
+	channel 5, SFX_Switch_3_Ch5
 
 SFX_Healing_Machine_3::
-	audio_header SFX_Healing_Machine_3, Ch5
+	channel_count 1
+	channel 5, SFX_Healing_Machine_3_Ch5
 
 SFX_Teleport_Exit1_3::
-	audio_header SFX_Teleport_Exit1_3, Ch5
+	channel_count 1
+	channel 5, SFX_Teleport_Exit1_3_Ch5
 
 SFX_Teleport_Enter1_3::
-	audio_header SFX_Teleport_Enter1_3, Ch5
+	channel_count 1
+	channel 5, SFX_Teleport_Enter1_3_Ch5
 
 SFX_Teleport_Exit2_3::
-	audio_header SFX_Teleport_Exit2_3, Ch5
+	channel_count 1
+	channel 5, SFX_Teleport_Exit2_3_Ch5
 
 SFX_Ledge_3::
-	audio_header SFX_Ledge_3, Ch5
+	channel_count 1
+	channel 5, SFX_Ledge_3_Ch5
 
 SFX_Teleport_Enter2_3::
-	audio_header SFX_Teleport_Enter2_3, Ch8
+	channel_count 1
+	channel 8, SFX_Teleport_Enter2_3_Ch8
 
 SFX_Fly_3::
-	audio_header SFX_Fly_3, Ch8
+	channel_count 1
+	channel 8, SFX_Fly_3_Ch8
 
 SFX_Denied_3::
-	audio_header SFX_Denied_3, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Denied_3_Ch5
+	channel 6, SFX_Denied_3_Ch6
 
 SFX_Arrow_Tiles_3::
-	audio_header SFX_Arrow_Tiles_3, Ch5
+	channel_count 1
+	channel 5, SFX_Arrow_Tiles_3_Ch5
 
 SFX_Push_Boulder_3::
-	audio_header SFX_Push_Boulder_3, Ch8
+	channel_count 1
+	channel 8, SFX_Push_Boulder_3_Ch8
 
 SFX_SS_Anne_Horn_3::
-	audio_header SFX_SS_Anne_Horn_3, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_SS_Anne_Horn_3_Ch5
+	channel 6, SFX_SS_Anne_Horn_3_Ch6
 
 SFX_Withdraw_Deposit_3::
-	audio_header SFX_Withdraw_Deposit_3, Ch5
+	channel_count 1
+	channel 5, SFX_Withdraw_Deposit_3_Ch5
 
 SFX_Cut_3::
-	audio_header SFX_Cut_3, Ch8
+	channel_count 1
+	channel 8, SFX_Cut_3_Ch8
 
 SFX_Go_Inside_3::
-	audio_header SFX_Go_Inside_3, Ch8
+	channel_count 1
+	channel 8, SFX_Go_Inside_3_Ch8
 
 SFX_Swap_3::
-	audio_header SFX_Swap_3, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Swap_3_Ch5
+	channel 6, SFX_Swap_3_Ch6
 
 SFX_59_3::
-	audio_header SFX_59_3, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_59_3_Ch5
+	channel 6, SFX_59_3_Ch6
 
 SFX_Purchase_3::
-	audio_header SFX_Purchase_3, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Purchase_3_Ch5
+	channel 6, SFX_Purchase_3_Ch6
 
 SFX_Collision_3::
-	audio_header SFX_Collision_3, Ch5
+	channel_count 1
+	channel 5, SFX_Collision_3_Ch5
 
 SFX_Go_Outside_3::
-	audio_header SFX_Go_Outside_3, Ch8
+	channel_count 1
+	channel 8, SFX_Go_Outside_3_Ch8
 
 SFX_Save_3::
-	audio_header SFX_Save_3, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Save_3_Ch5
+	channel 6, SFX_Save_3_Ch6
 
 SFX_Intro_Lunge::
-	audio_header SFX_Intro_Lunge, Ch8
+	channel_count 1
+	channel 8, SFX_Intro_Lunge_Ch8
 
 SFX_Intro_Hip::
-	audio_header SFX_Intro_Hip, Ch5
+	channel_count 1
+	channel 5, SFX_Intro_Hip_Ch5
 
 SFX_Intro_Hop::
-	audio_header SFX_Intro_Hop, Ch5
+	channel_count 1
+	channel 5, SFX_Intro_Hop_Ch5
 
 SFX_Intro_Raise::
-	audio_header SFX_Intro_Raise, Ch8
+	channel_count 1
+	channel 8, SFX_Intro_Raise_Ch8
 
 SFX_Intro_Crash::
-	audio_header SFX_Intro_Crash, Ch8
+	channel_count 1
+	channel 8, SFX_Intro_Crash_Ch8
 
 SFX_Intro_Whoosh::
-	audio_header SFX_Intro_Whoosh, Ch8
+	channel_count 1
+	channel 8, SFX_Intro_Whoosh_Ch8
 
 SFX_Slots_Stop_Wheel::
-	audio_header SFX_Slots_Stop_Wheel, Ch5
+	channel_count 1
+	channel 5, SFX_Slots_Stop_Wheel_Ch5
 
 SFX_Slots_Reward::
-	audio_header SFX_Slots_Reward, Ch5
+	channel_count 1
+	channel 5, SFX_Slots_Reward_Ch5
 
 SFX_Slots_New_Spin::
-	audio_header SFX_Slots_New_Spin, Ch5, Ch6
+	channel_count 2
+	channel 5, SFX_Slots_New_Spin_Ch5
+	channel 6, SFX_Slots_New_Spin_Ch6
 
 SFX_Shooting_Star::
-	audio_header SFX_Shooting_Star, Ch5
+	channel_count 1
+	channel 5, SFX_Shooting_Star_Ch5
--- a/audio/low_health_alarm.asm
+++ b/audio/low_health_alarm.asm
@@ -20,7 +20,7 @@
 
 .noTone
 	ld a, $86
-	ld [wChannelSoundIDs + Ch5], a ;disable sound channel?
+	ld [wChannelSoundIDs + CHAN5], a ;disable sound channel?
 	ld a, [wLowHealthAlarm]
 	and $7f ;decrement alarm timer.
 	dec a
@@ -34,7 +34,7 @@
 .disableAlarm
 	xor a
 	ld [wLowHealthAlarm], a  ;disable alarm
-	ld [wChannelSoundIDs + Ch5], a  ;re-enable sound channel?
+	ld [wChannelSoundIDs + CHAN5], a  ;re-enable sound channel?
 	ld de, .toneDataSilence
 	jr .playTone
 
--- a/audio/poke_flute.asm
+++ b/audio/poke_flute.asm
@@ -3,7 +3,7 @@
 	ld a, SFX_CAUGHT_MON
 	call PlaySoundWaitForCurrent
 	; then immediately overwrite the channel pointers
-	ld hl, wChannelCommandPointers + Ch5 * 2
+	ld hl, wChannelCommandPointers + CHAN5 * 2
 	ld de, SFX_Pokeflute_Ch5
 	call Audio2_OverwriteChannelPointer
 	ld de, SFX_Pokeflute_Ch6
--- a/audio/wave_instruments.asm
+++ /dev/null
@@ -1,33 +1,0 @@
-; This file is INCLUDEd three times, once for each audio engine.
-
-	dw .wave0
-	dw .wave1
-	dw .wave2
-	dw .wave3
-	dw .wave4
-	dw .wave5 ; used in the Lavender Town and Pokemon Tower themes
-	dw .wave5 ; unused
-	dw .wave5 ; unused
-	dw .wave5 ; unused
-
-; these are the definitions for the channel 3 instruments
-; each instrument definition is made up of 32 points (nibbles) that form
-; the graph of the wave
-; the current instrument is copied to rWave_0--rWave_f
-.wave0
-	dn  0,  2,  4,  6,  8, 10, 12, 14, 15, 15, 15, 14, 14, 13, 13, 12, 12, 11, 10,  9,  8,  7,  6,  5,  4,  4,  3,  3,  2,  2,  1,  1
-
-.wave1
-	dn  0,  2,  4,  6,  8, 10, 12, 14, 14, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  2,  1,  1
-
-.wave2
-	dn  1,  3,  6,  9, 11, 13, 14, 14, 14, 14, 15, 15, 15, 15, 14, 13, 13, 14, 15, 15, 15, 15, 14, 14, 14, 14, 13, 11,  9,  6,  3,  1
-
-.wave3
-	dn  0,  2,  4,  6,  8, 10, 12, 13, 14, 15, 15, 14, 13, 14, 15, 15, 14, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0
-
-.wave4
-	dn  0,  1,  2,  3,  4,  5,  6,  7,  8, 10, 12, 13, 14, 14, 15,  7,  7, 15, 14, 14, 13, 12, 10,  8,  7,  6,  5,  4,  3,  2,  1,  0
-
-; duty 5 reads from sfx data
-.wave5
--- /dev/null
+++ b/audio/wave_samples.asm
@@ -1,0 +1,33 @@
+; This file is INCLUDEd three times, once for each audio engine.
+
+	dw .wave0
+	dw .wave1
+	dw .wave2
+	dw .wave3
+	dw .wave4
+	dw .wave5 ; used in the Lavender Town and Pokemon Tower themes
+	dw .wave5 ; unused
+	dw .wave5 ; unused
+	dw .wave5 ; unused
+
+; these are the definitions for the channel 3 instruments
+; each instrument definition is made up of 32 points (nibbles) that form
+; the graph of the wave
+; the current instrument is copied to rWave_0--rWave_f
+.wave0
+	dn  0,  2,  4,  6,  8, 10, 12, 14, 15, 15, 15, 14, 14, 13, 13, 12, 12, 11, 10,  9,  8,  7,  6,  5,  4,  4,  3,  3,  2,  2,  1,  1
+
+.wave1
+	dn  0,  2,  4,  6,  8, 10, 12, 14, 14, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  2,  1,  1
+
+.wave2
+	dn  1,  3,  6,  9, 11, 13, 14, 14, 14, 14, 15, 15, 15, 15, 14, 13, 13, 14, 15, 15, 15, 15, 14, 14, 14, 14, 13, 11,  9,  6,  3,  1
+
+.wave3
+	dn  0,  2,  4,  6,  8, 10, 12, 13, 14, 15, 15, 14, 13, 14, 15, 15, 14, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0
+
+.wave4
+	dn  0,  1,  2,  3,  4,  5,  6,  7,  8, 10, 12, 13, 14, 14, 15,  7,  7, 15, 14, 14, 13, 12, 10,  8,  7,  6,  5,  4,  3,  2,  1,  0
+
+; duty 5 reads from sfx data
+.wave5
--- a/constants/audio_constants.asm
+++ b/constants/audio_constants.asm
@@ -19,15 +19,15 @@
 ; Audio[1|2|3]_HWChannelBaseAddresses, Audio[1|2|3]_HWChannelDisableMasks,
 ; and Audio[1|2|3]_HWChannelEnableMasks indexes (see audio/engine_[1|2|3].asm)
 	const_def
-	const Ch1 ; 0
-	const Ch2 ; 1
-	const Ch3 ; 2
-	const Ch4 ; 3
+	const CHAN1 ; 0
+	const CHAN2 ; 1
+	const CHAN3 ; 2
+	const CHAN4 ; 3
 DEF NUM_MUSIC_CHANS EQU const_value
-	const Ch5 ; 4
-	const Ch6 ; 5
-	const Ch7 ; 6
-	const Ch8 ; 7
+	const CHAN5 ; 4
+	const CHAN6 ; 5
+	const CHAN7 ; 6
+	const CHAN8 ; 7
 DEF NUM_NOISE_CHANS EQU const_value - NUM_MUSIC_CHANS
 DEF NUM_CHANNELS EQU const_value
 
--- a/engine/battle/core.asm
+++ b/engine/battle/core.asm
@@ -782,7 +782,7 @@
 	ld a, SFX_FAINT_FALL
 	call PlaySoundWaitForCurrent
 .sfxwait
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp SFX_FAINT_FALL
 	jr z, .sfxwait
 	ld a, SFX_FAINT_THUD
@@ -866,7 +866,7 @@
 ; the low health alarm and prevents it from reactivating until the next battle.
 	xor a
 	ld [wLowHealthAlarm], a ; turn off low health alarm
-	ld [wChannelSoundIDs + Ch5], a
+	ld [wChannelSoundIDs + CHAN5], a
 	inc a
 	ld [wLowHealthAlarmDisabled], a ; prevent it from reactivating
 	ret
@@ -1864,7 +1864,7 @@
 	ld [hl], $0
 	ret z
 	xor a
-	ld [wChannelSoundIDs + Ch5], a
+	ld [wChannelSoundIDs + CHAN5], a
 	ret
 .setLowHealthAlarm
 	ld hl, wLowHealthAlarm
--- a/engine/battle/end_of_battle.asm
+++ b/engine/battle/end_of_battle.asm
@@ -46,7 +46,7 @@
 .resetVariables
 	xor a
 	ld [wLowHealthAlarm], a ;disable low health alarm
-	ld [wChannelSoundIDs + Ch5], a
+	ld [wChannelSoundIDs + CHAN5], a
 	ld [wIsInBattle], a
 	ld [wBattleType], a
 	ld [wMoveMissed], a
--- a/engine/events/hidden_objects/safari_game.asm
+++ b/engine/events/hidden_objects/safari_game.asm
@@ -37,7 +37,7 @@
 	ld a, SFX_SAFARI_ZONE_PA
 	call PlayMusic
 .waitForMusicToPlay
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp SFX_SAFARI_ZONE_PA
 	jr nz, .waitForMusicToPlay
 	ld a, TEXT_SAFARI_GAME_OVER
--- a/engine/items/item_effects.asm
+++ b/engine/items/item_effects.asm
@@ -991,7 +991,7 @@
 .notFullHP ; if the pokemon's current HP doesn't equal its max HP
 	xor a
 	ld [wLowHealthAlarm], a ;disable low health alarm
-	ld [wChannelSoundIDs + Ch5], a
+	ld [wChannelSoundIDs + CHAN5], a
 	push hl
 	push de
 	ld bc, wPartyMon1MaxHP - (wPartyMon1HP + 1)
@@ -1732,7 +1732,7 @@
 	call WaitForSoundToFinish ; wait for sound to end
 	farcall Music_PokeFluteInBattle ; play in-battle pokeflute music
 .musicWaitLoop ; wait for music to finish playing
-	ld a, [wChannelSoundIDs + Ch7]
+	ld a, [wChannelSoundIDs + CHAN7]
 	and a ; music off?
 	jr nz, .musicWaitLoop
 .skipMusic
@@ -1799,7 +1799,7 @@
 	ld c, BANK(SFX_Pokeflute)
 	call PlayMusic
 .musicWaitLoop ; wait for music to finish playing
-	ld a, [wChannelSoundIDs + Ch3]
+	ld a, [wChannelSoundIDs + CHAN3]
 	cp SFX_POKEFLUTE
 	jr z, .musicWaitLoop
 	call PlayDefaultMusic ; start playing normal music again
--- a/engine/movie/evolution.asm
+++ b/engine/movie/evolution.asm
@@ -8,7 +8,7 @@
 	push af
 	xor a
 	ld [wLowHealthAlarm], a
-	ld [wChannelSoundIDs + Ch5], a
+	ld [wChannelSoundIDs + CHAN5], a
 	dec a ; SFX_STOP_ALL_MUSIC
 	ld [wNewSoundID], a
 	call PlaySound
--- a/engine/overworld/elevator.asm
+++ b/engine/overworld/elevator.asm
@@ -33,7 +33,7 @@
 	ld a, SFX_SAFARI_ZONE_PA
 	call PlayMusic
 .musicLoop
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp SFX_SAFARI_ZONE_PA
 	jr z, .musicLoop
 	call UpdateSprites
--- a/home/audio.asm
+++ b/home/audio.asm
@@ -146,10 +146,10 @@
 	and a
 	jr z, .next
 	xor a
-	ld [wChannelSoundIDs + Ch5], a
-	ld [wChannelSoundIDs + Ch6], a
-	ld [wChannelSoundIDs + Ch7], a
-	ld [wChannelSoundIDs + Ch8], a
+	ld [wChannelSoundIDs + CHAN5], a
+	ld [wChannelSoundIDs + CHAN6], a
+	ld [wChannelSoundIDs + CHAN7], a
+	ld [wChannelSoundIDs + CHAN8], a
 .next
 	ld a, [wAudioFadeOutControl]
 	and a ; has a fade-out length been specified?
--- a/home/delay.asm
+++ b/home/delay.asm
@@ -18,7 +18,7 @@
 	ret nz
 	push hl
 .waitLoop
-	ld hl, wChannelSoundIDs + Ch5
+	ld hl, wChannelSoundIDs + CHAN5
 	xor a
 	or [hl]
 	inc hl
--- a/home/overworld.asm
+++ b/home/overworld.asm
@@ -1244,7 +1244,7 @@
 	call CheckTilePassable
 	jr nc, .noCollision
 .collision
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp SFX_COLLISION ; check if collision sound is already playing
 	jr z, .setCarry
 	ld a, SFX_COLLISION
@@ -1925,7 +1925,7 @@
 	jr z, .stopSurfing ; stop surfing if the tile is passable
 	jr .loop
 .collision
-	ld a, [wChannelSoundIDs + Ch5]
+	ld a, [wChannelSoundIDs + CHAN5]
 	cp SFX_COLLISION ; check if collision sound is already playing
 	jr z, .setCarry
 	ld a, SFX_COLLISION
--- a/macros/scripts/audio.asm
+++ b/macros/scripts/audio.asm
@@ -1,20 +1,17 @@
-MACRO audio_header
-	db (_NARG - 2) << 6 | \2
-	dw \1_\2
-	IF _NARG > 2
-		db \3
-		dw \1_\3
-	ENDC
-	IF _NARG > 3
-		db \4
-		dw \1_\4
-	ENDC
-	IF _NARG > 4
-		db \5
-		dw \1_\5
-	ENDC
+MACRO channel_count
+	ASSERT 0 < (\1) && (\1) <= NUM_MUSIC_CHANS, \
+		"channel_count must be 1-{d:NUM_MUSIC_CHANS}"
+	DEF _num_channels = \1 - 1
 ENDM
 
+MACRO channel
+	ASSERT 0 < (\1) && (\1) <= NUM_CHANNELS, \
+		"channel id must be 1-{d:NUM_CHANNELS}"
+	dn (_num_channels << 2), \1 - 1 ; channel id
+	dw \2 ; address
+	DEF _num_channels = 0
+ENDM
+
 	const_def $10
 
 ; arguments: length [0, 7], pitch change [-7, 7]
@@ -27,9 +24,9 @@
 MACRO pitch_sweep
 	db pitch_sweep_cmd
 	IF \2 < 0
-		db (\1 << 4) | (%1000 | (\2 * -1))
+		dn \1, %1000 | (\2 * -1)
 	ELSE
-		db (\1 << 4) | \2
+		dn \1, \2
 	ENDC
 ENDM
 
@@ -45,9 +42,9 @@
 MACRO square_note
 	db square_note_cmd | \1
 	IF \3 < 0
-		db (\2 << 4) | (%1000 | (\3 * -1))
+		dn \2, %1000 | (\3 * -1)
 	ELSE
-		db (\2 << 4) | \3
+		dn \2, \3
 	ENDC
 	dw \4
 ENDM
@@ -60,9 +57,9 @@
 MACRO noise_note
 	db noise_note_cmd | \1
 	IF \3 < 0
-		db (\2 << 4) | (%1000 | (\3 * -1))
+		dn \2, %1000 | (\3 * -1)
 	ELSE
-		db (\2 << 4) | \3
+		dn \2, \3
 	ENDC
 	db \4
 ENDM
@@ -69,7 +66,7 @@
 
 ; arguments: pitch, length [1, 16]
 MACRO note
-	db (\1 << 4) | (\2 - 1)
+	dn \1, \2 - 1
 ENDM
 
 	const_next $b0
@@ -86,7 +83,7 @@
 ; can only be used with instruments 1-10, excluding 2
 ; unused
 MACRO drum_note_short
-	db (\1 << 4) | (\2 - 1)
+	note \1, \2
 ENDM
 
 	const_next $c0
@@ -107,9 +104,9 @@
 MACRO note_type
 	db note_type_cmd | \1
 	IF \3 < 0
-		db (\2 << 4) | (%1000 | (\3 * -1))
+		dn \2, %1000 | (\3 * -1)
 	ELSE
-		db (\2 << 4) | \3
+		dn \2, \3
 	ENDC
 ENDM
 
@@ -145,7 +142,7 @@
 MACRO vibrato
 	db vibrato_cmd
 	db \1
-	db (\2 << 4) | \3
+	dn \2, \3
 ENDM
 
 ; arguments: length [1, 256], octave [1, 8], pitch
@@ -153,7 +150,7 @@
 MACRO pitch_slide
 	db pitch_slide_cmd
 	db \1 - 1
-	db ((8 - \2) << 4) | \3
+	dn 8 - \2, \3
 ENDM
 
 ; arguments: duty cycle [0, 3] (12.5%, 25%, 50%, 75%)
@@ -179,7 +176,7 @@
 	const stereo_panning_cmd ; $ee
 MACRO stereo_panning
 	db stereo_panning_cmd
-	db (\1 << 4) | \2
+	dn \1, \2
 ENDM
 
 	const unknownmusic0xef_cmd ; $ef
@@ -192,7 +189,7 @@
 	const volume_cmd ; $f0
 MACRO volume
 	db volume_cmd
-	db (\1 << 4) | \2
+	dn \1, \2
 ENDM
 
 	const_next $f8
--- a/scripts/PewterPokecenter.asm
+++ b/scripts/PewterPokecenter.asm
@@ -62,7 +62,7 @@
 	call DelayFrames
 	ld a, [wChannelSoundIDs]
 	ld b, a
-	ld a, [wChannelSoundIDs + Ch2]
+	ld a, [wChannelSoundIDs + CHAN2]
 	or b
 	jr nz, .spinMovementLoop