shithub: pokered

Download patch

ref: ed4ac6d55156f7dab8e609f4086db270264ce594
parent: 71d31fee0ec5c9f58963f20d53e5cf7114370a2f
parent: b48435bb260e87bd27cc954eb5f2473c4f80c8f4
author: U-Fish-PC\Daniel <corrnondacqb@yahoo.com>
date: Sat Feb 1 03:46:53 EST 2014

Merge branch 'master' of https://github.com/iimarckus/pokered

Conflicts:
	main.asm

git/query: bad hash d8f4e687ebc49d4b135f0d8b7f10a643114a0d8a diff: cannot open b/audio//null: file does not exist: 'b/audio//null'
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -10,7 +10,7 @@
 	git clone git://github.com/iimarckus/pokered.git
 	cd pokered
 
-	./init.sh
+	sudo ./init.sh
 
 
 Now **pokered.gbc** can be built from source.
--- a/Makefile
+++ b/Makefile
@@ -6,18 +6,26 @@
 
 TEXTQUEUE :=
 
-RED_OBJS  := pokered.o
-BLUE_OBJS := pokeblue.o
+RED_OBJS  := \
+pokered.o \
+audio_red.o \
+wram.o \
+text.o
 
+BLUE_OBJS := \
+pokeblue.o \
+audio_blue.o \
+wram.o \
+text.o
+
 OBJS := $(RED_OBJS) $(BLUE_OBJS)
+OBJS := $(sort $(OBJS))
 
 ROMS := pokered.gbc pokeblue.gbc
 
 # generate dependencies for each object
 $(shell $(foreach obj, $(OBJS), \
-	$(eval $(obj:.o=)_DEPENDENCIES := $(shell $(PYTHON) extras/pokemontools/scan_includes.py $(obj:.o=.asm) | sed s/globals.asm//g)) \
-))
-$(shell $(foreach obj, $(OBJS), \
+	$(eval $(obj:.o=)_DEPENDENCIES := $(shell $(PYTHON) extras/pokemontools/scan_includes.py $(obj:.o=.asm))) \
 	$(eval ALL_DEPENDENCIES += $($(obj:.o=)_DEPENDENCIES)) \
 ))
 
@@ -33,33 +41,28 @@
 clean:
 	rm -f $(ROMS)
 	rm -f $(OBJS)
-	rm -f globals.asm
-	@echo "removing *.tx" && find . -iname '*.tx' -exec rm {} +
+	find . -iname '*.tx' -exec rm {} +
 	rm -f redrle
 
 
 baserom.gbc: ;
-	@echo "Wait! Need baserom.gbc first. Check README and INSTALL for details." && false
+	@echo "Wait! Need baserom.gbc first. Check README for details." && false
 
 %.asm: ;
 .asm.tx:
-	$(eval TEXTQUEUE := $(TEXTQUEUE) $<)
+	$(eval TEXTQUEUE += $<)
 	@rm -f $@
 
-globals.asm: $(ALL_DEPENDENCIES:.asm=.tx) $(OBJS:.o=.tx)
-	@touch $@
-	@$(PYTHON) prequeue.py $(TEXTQUEUE)
-globals.tx: globals.asm
-	@cp $< $@
-
 $(OBJS): $$*.tx $$(patsubst %.asm, %.tx, $$($$*_DEPENDENCIES))
+	@$(PYTHON) prequeue.py $(TEXTQUEUE)
+	@$(eval TEXTQUEUE :=)
 	rgbasm -o $@ $*.tx
 
-pokered.gbc: globals.tx $(RED_OBJS)
-	rgblink -n $*.sym -m $*.map -o $@ $(RED_OBJS)
+pokered.gbc: $(RED_OBJS)
+	rgblink -n $*.sym -m $*.map -o $@ $^
 	rgbfix -jsv -k 01 -l 0x33 -m 0x13 -p 0 -r 03 -t "POKEMON RED" $@
 
-pokeblue.gbc: globals.tx $(BLUE_OBJS)
-	rgblink -n $*.sym -m $*.map -o $@ $(BLUE_OBJS)
+pokeblue.gbc: $(BLUE_OBJS)
+	rgblink -n $*.sym -m $*.map -o $@ $^
 	rgbfix -jsv -k 01 -l 0x33 -m 0x13 -p 0 -r 03 -t "POKEMON BLUE" $@
 
--- /dev/null
+++ b/audio.asm
@@ -1,0 +1,668 @@
+
+AUDIO_1 EQU $2
+AUDIO_2 EQU $8
+AUDIO_3 EQU $1f
+
+INCLUDE "macros.asm"
+INCLUDE "constants/music_constants.asm"
+INCLUDE "constants/trainer_constants.asm"
+
+; PC
+INCLUDE "hram.asm"
+INCLUDE "constants/move_constants.asm"
+
+
+
+SECTION "Sound Effect Headers 1", ROMX, BANK[AUDIO_1]
+INCLUDE "music/headers/sfxheaders02.asm"
+
+SECTION "Sound Effect Headers 2", ROMX, BANK[AUDIO_2]
+INCLUDE "music/headers/sfxheaders08.asm"
+
+SECTION "Sound Effect Headers 3", ROMX, BANK[AUDIO_3]
+INCLUDE "music/headers/sfxheaders1f.asm"
+
+
+
+SECTION "Music Headers 1", ROMX, BANK[AUDIO_1]
+INCLUDE "music/headers/musicheaders02.asm"
+
+SECTION "Music Headers 2", ROMX, BANK[AUDIO_2]
+INCLUDE "music/headers/musicheaders08.asm"
+
+SECTION "Music Headers 3", ROMX, BANK[AUDIO_3]
+INCLUDE "music/headers/musicheaders1f.asm"
+
+
+
+SECTION "Sound Effects 1", ROMX, BANK[AUDIO_1]
+
+INCLUDE "music/sfx/sfx_02_01.asm"
+INCLUDE "music/sfx/sfx_02_02.asm"
+INCLUDE "music/sfx/sfx_02_03.asm"
+INCLUDE "music/sfx/sfx_02_04.asm"
+INCLUDE "music/sfx/sfx_02_05.asm"
+INCLUDE "music/sfx/sfx_02_06.asm"
+INCLUDE "music/sfx/sfx_02_07.asm"
+INCLUDE "music/sfx/sfx_02_08.asm"
+INCLUDE "music/sfx/sfx_02_09.asm"
+INCLUDE "music/sfx/sfx_02_0a.asm"
+INCLUDE "music/sfx/sfx_02_0b.asm"
+INCLUDE "music/sfx/sfx_02_0c.asm"
+INCLUDE "music/sfx/sfx_02_0d.asm"
+INCLUDE "music/sfx/sfx_02_0e.asm"
+INCLUDE "music/sfx/sfx_02_0f.asm"
+INCLUDE "music/sfx/sfx_02_10.asm"
+INCLUDE "music/sfx/sfx_02_11.asm"
+INCLUDE "music/sfx/sfx_02_12.asm"
+INCLUDE "music/sfx/sfx_02_13.asm"
+
+INCLUDE "audio/duty_1.asm"
+
+INCLUDE "music/sfx/sfx_02_3f.asm"
+INCLUDE "music/sfx/sfx_02_5e.asm"
+INCLUDE "music/sfx/sfx_02_56.asm"
+INCLUDE "music/sfx/sfx_02_57.asm"
+INCLUDE "music/sfx/sfx_02_58.asm"
+INCLUDE "music/sfx/sfx_02_3c.asm"
+INCLUDE "music/sfx/sfx_02_59.asm"
+INCLUDE "music/sfx/sfx_02_5a.asm"
+INCLUDE "music/sfx/sfx_02_5b.asm"
+INCLUDE "music/sfx/sfx_02_5c.asm"
+INCLUDE "music/sfx/sfx_02_40.asm"
+INCLUDE "music/sfx/sfx_02_5d.asm"
+INCLUDE "music/sfx/sfx_02_3d.asm"
+INCLUDE "music/sfx/sfx_02_43.asm"
+INCLUDE "music/sfx/sfx_02_3e.asm"
+INCLUDE "music/sfx/sfx_02_44.asm"
+INCLUDE "music/sfx/sfx_02_45.asm"
+INCLUDE "music/sfx/sfx_02_46.asm"
+INCLUDE "music/sfx/sfx_02_47.asm"
+INCLUDE "music/sfx/sfx_02_48.asm"
+INCLUDE "music/sfx/sfx_02_49.asm"
+INCLUDE "music/sfx/sfx_02_4a.asm"
+INCLUDE "music/sfx/sfx_02_4b.asm"
+INCLUDE "music/sfx/sfx_02_4c.asm"
+INCLUDE "music/sfx/sfx_02_4d.asm"
+INCLUDE "music/sfx/sfx_02_4e.asm"
+INCLUDE "music/sfx/sfx_02_4f.asm"
+INCLUDE "music/sfx/sfx_02_50.asm"
+INCLUDE "music/sfx/sfx_02_51.asm"
+INCLUDE "music/sfx/sfx_02_52.asm"
+INCLUDE "music/sfx/sfx_02_53.asm"
+INCLUDE "music/sfx/sfx_02_54.asm"
+INCLUDE "music/sfx/sfx_02_55.asm"
+INCLUDE "music/sfx/sfx_02_5f.asm"
+INCLUDE "music/sfx/sfx_02_unused.asm"
+INCLUDE "music/sfx/sfx_02_1d.asm"
+INCLUDE "music/sfx/sfx_02_37.asm"
+INCLUDE "music/sfx/sfx_02_38.asm"
+INCLUDE "music/sfx/sfx_02_25.asm"
+INCLUDE "music/sfx/sfx_02_39.asm"
+INCLUDE "music/sfx/sfx_02_17.asm"
+INCLUDE "music/sfx/sfx_02_23.asm"
+INCLUDE "music/sfx/sfx_02_24.asm"
+INCLUDE "music/sfx/sfx_02_14.asm"
+INCLUDE "music/sfx/sfx_02_22.asm"
+INCLUDE "music/sfx/sfx_02_1a.asm"
+INCLUDE "music/sfx/sfx_02_1b.asm"
+INCLUDE "music/sfx/sfx_02_19.asm"
+INCLUDE "music/sfx/sfx_02_1f.asm"
+INCLUDE "music/sfx/sfx_02_20.asm"
+INCLUDE "music/sfx/sfx_02_16.asm"
+INCLUDE "music/sfx/sfx_02_21.asm"
+INCLUDE "music/sfx/sfx_02_15.asm"
+INCLUDE "music/sfx/sfx_02_1e.asm"
+INCLUDE "music/sfx/sfx_02_1c.asm"
+INCLUDE "music/sfx/sfx_02_18.asm"
+INCLUDE "music/sfx/sfx_02_2d.asm"
+INCLUDE "music/sfx/sfx_02_2a.asm"
+INCLUDE "music/sfx/sfx_02_2f.asm"
+INCLUDE "music/sfx/sfx_02_26.asm"
+INCLUDE "music/sfx/sfx_02_27.asm"
+INCLUDE "music/sfx/sfx_02_28.asm"
+INCLUDE "music/sfx/sfx_02_32.asm"
+INCLUDE "music/sfx/sfx_02_29.asm"
+INCLUDE "music/sfx/sfx_02_2b.asm"
+INCLUDE "music/sfx/sfx_02_30.asm"
+INCLUDE "music/sfx/sfx_02_2e.asm"
+INCLUDE "music/sfx/sfx_02_31.asm"
+INCLUDE "music/sfx/sfx_02_2c.asm"
+INCLUDE "music/sfx/sfx_02_33.asm"
+INCLUDE "music/sfx/sfx_02_34.asm"
+INCLUDE "music/sfx/sfx_02_35.asm"
+INCLUDE "music/sfx/sfx_02_36.asm"
+
+
+SECTION "Sound Effects 2", ROMX, BANK[AUDIO_2]
+
+INCLUDE "music/sfx/sfx_08_01.asm"
+INCLUDE "music/sfx/sfx_08_02.asm"
+INCLUDE "music/sfx/sfx_08_03.asm"
+INCLUDE "music/sfx/sfx_08_04.asm"
+INCLUDE "music/sfx/sfx_08_05.asm"
+INCLUDE "music/sfx/sfx_08_06.asm"
+INCLUDE "music/sfx/sfx_08_07.asm"
+INCLUDE "music/sfx/sfx_08_08.asm"
+INCLUDE "music/sfx/sfx_08_09.asm"
+INCLUDE "music/sfx/sfx_08_0a.asm"
+INCLUDE "music/sfx/sfx_08_0b.asm"
+INCLUDE "music/sfx/sfx_08_0c.asm"
+INCLUDE "music/sfx/sfx_08_0d.asm"
+INCLUDE "music/sfx/sfx_08_0e.asm"
+INCLUDE "music/sfx/sfx_08_0f.asm"
+INCLUDE "music/sfx/sfx_08_10.asm"
+INCLUDE "music/sfx/sfx_08_11.asm"
+INCLUDE "music/sfx/sfx_08_12.asm"
+INCLUDE "music/sfx/sfx_08_13.asm"
+
+INCLUDE "audio/duty_2.asm"
+
+INCLUDE "music/sfx/sfx_08_40.asm"
+INCLUDE "music/sfx/sfx_08_3f.asm"
+INCLUDE "music/sfx/sfx_08_3c.asm"
+INCLUDE "music/sfx/sfx_08_3d.asm"
+INCLUDE "music/sfx/sfx_08_3e.asm"
+INCLUDE "music/sfx/sfx_08_77.asm"
+INCLUDE "music/sfx/sfx_08_41.asm"
+INCLUDE "music/sfx/sfx_08_42.asm"
+INCLUDE "music/sfx/sfx_08_43.asm"
+INCLUDE "music/sfx/sfx_08_44.asm"
+INCLUDE "music/sfx/sfx_08_45.asm"
+INCLUDE "music/sfx/sfx_08_pokeflute_ch3.asm"
+INCLUDE "music/sfx/sfx_08_47.asm"
+INCLUDE "music/sfx/sfx_08_48.asm"
+INCLUDE "music/sfx/sfx_08_49.asm"
+INCLUDE "music/sfx/sfx_08_4a.asm"
+INCLUDE "music/sfx/sfx_08_4b.asm"
+INCLUDE "music/sfx/sfx_08_4c.asm"
+INCLUDE "music/sfx/sfx_08_4d.asm"
+INCLUDE "music/sfx/sfx_08_4e.asm"
+INCLUDE "music/sfx/sfx_08_4f.asm"
+INCLUDE "music/sfx/sfx_08_50.asm"
+INCLUDE "music/sfx/sfx_08_51.asm"
+INCLUDE "music/sfx/sfx_08_52.asm"
+INCLUDE "music/sfx/sfx_08_53.asm"
+INCLUDE "music/sfx/sfx_08_54.asm"
+INCLUDE "music/sfx/sfx_08_55.asm"
+INCLUDE "music/sfx/sfx_08_56.asm"
+INCLUDE "music/sfx/sfx_08_57.asm"
+INCLUDE "music/sfx/sfx_08_58.asm"
+INCLUDE "music/sfx/sfx_08_59.asm"
+INCLUDE "music/sfx/sfx_08_5a.asm"
+INCLUDE "music/sfx/sfx_08_5b.asm"
+INCLUDE "music/sfx/sfx_08_5c.asm"
+INCLUDE "music/sfx/sfx_08_5d.asm"
+INCLUDE "music/sfx/sfx_08_5e.asm"
+INCLUDE "music/sfx/sfx_08_5f.asm"
+INCLUDE "music/sfx/sfx_08_60.asm"
+INCLUDE "music/sfx/sfx_08_61.asm"
+INCLUDE "music/sfx/sfx_08_62.asm"
+INCLUDE "music/sfx/sfx_08_63.asm"
+INCLUDE "music/sfx/sfx_08_64.asm"
+INCLUDE "music/sfx/sfx_08_65.asm"
+INCLUDE "music/sfx/sfx_08_66.asm"
+INCLUDE "music/sfx/sfx_08_67.asm"
+INCLUDE "music/sfx/sfx_08_68.asm"
+INCLUDE "music/sfx/sfx_08_69.asm"
+INCLUDE "music/sfx/sfx_08_6a.asm"
+INCLUDE "music/sfx/sfx_08_6b.asm"
+INCLUDE "music/sfx/sfx_08_6c.asm"
+INCLUDE "music/sfx/sfx_08_6d.asm"
+INCLUDE "music/sfx/sfx_08_6e.asm"
+INCLUDE "music/sfx/sfx_08_6f.asm"
+INCLUDE "music/sfx/sfx_08_70.asm"
+INCLUDE "music/sfx/sfx_08_71.asm"
+INCLUDE "music/sfx/sfx_08_72.asm"
+INCLUDE "music/sfx/sfx_08_73.asm"
+INCLUDE "music/sfx/sfx_08_74.asm"
+INCLUDE "music/sfx/sfx_08_75.asm"
+INCLUDE "music/sfx/sfx_08_76.asm"
+INCLUDE "music/sfx/sfx_08_unused.asm"
+INCLUDE "music/sfx/sfx_08_1d.asm"
+INCLUDE "music/sfx/sfx_08_37.asm"
+INCLUDE "music/sfx/sfx_08_38.asm"
+INCLUDE "music/sfx/sfx_08_25.asm"
+INCLUDE "music/sfx/sfx_08_39.asm"
+INCLUDE "music/sfx/sfx_08_17.asm"
+INCLUDE "music/sfx/sfx_08_23.asm"
+INCLUDE "music/sfx/sfx_08_24.asm"
+INCLUDE "music/sfx/sfx_08_14.asm"
+INCLUDE "music/sfx/sfx_08_22.asm"
+INCLUDE "music/sfx/sfx_08_1a.asm"
+INCLUDE "music/sfx/sfx_08_1b.asm"
+INCLUDE "music/sfx/sfx_08_19.asm"
+INCLUDE "music/sfx/sfx_08_1f.asm"
+INCLUDE "music/sfx/sfx_08_20.asm"
+INCLUDE "music/sfx/sfx_08_16.asm"
+INCLUDE "music/sfx/sfx_08_21.asm"
+INCLUDE "music/sfx/sfx_08_15.asm"
+INCLUDE "music/sfx/sfx_08_1e.asm"
+INCLUDE "music/sfx/sfx_08_1c.asm"
+INCLUDE "music/sfx/sfx_08_18.asm"
+INCLUDE "music/sfx/sfx_08_2d.asm"
+INCLUDE "music/sfx/sfx_08_2a.asm"
+INCLUDE "music/sfx/sfx_08_2f.asm"
+INCLUDE "music/sfx/sfx_08_26.asm"
+INCLUDE "music/sfx/sfx_08_27.asm"
+INCLUDE "music/sfx/sfx_08_28.asm"
+INCLUDE "music/sfx/sfx_08_32.asm"
+INCLUDE "music/sfx/sfx_08_29.asm"
+INCLUDE "music/sfx/sfx_08_2b.asm"
+INCLUDE "music/sfx/sfx_08_30.asm"
+INCLUDE "music/sfx/sfx_08_2e.asm"
+INCLUDE "music/sfx/sfx_08_31.asm"
+INCLUDE "music/sfx/sfx_08_2c.asm"
+INCLUDE "music/sfx/sfx_08_33.asm"
+INCLUDE "music/sfx/sfx_08_34.asm"
+INCLUDE "music/sfx/sfx_08_35.asm"
+INCLUDE "music/sfx/sfx_08_36.asm"
+
+
+SECTION "Sound Effects 3", ROMX, BANK[AUDIO_3]
+
+INCLUDE "music/sfx/sfx_1f_01.asm"
+INCLUDE "music/sfx/sfx_1f_02.asm"
+INCLUDE "music/sfx/sfx_1f_03.asm"
+INCLUDE "music/sfx/sfx_1f_04.asm"
+INCLUDE "music/sfx/sfx_1f_05.asm"
+INCLUDE "music/sfx/sfx_1f_06.asm"
+INCLUDE "music/sfx/sfx_1f_07.asm"
+INCLUDE "music/sfx/sfx_1f_08.asm"
+INCLUDE "music/sfx/sfx_1f_09.asm"
+INCLUDE "music/sfx/sfx_1f_0a.asm"
+INCLUDE "music/sfx/sfx_1f_0b.asm"
+INCLUDE "music/sfx/sfx_1f_0c.asm"
+INCLUDE "music/sfx/sfx_1f_0d.asm"
+INCLUDE "music/sfx/sfx_1f_0e.asm"
+INCLUDE "music/sfx/sfx_1f_0f.asm"
+INCLUDE "music/sfx/sfx_1f_10.asm"
+INCLUDE "music/sfx/sfx_1f_11.asm"
+INCLUDE "music/sfx/sfx_1f_12.asm"
+INCLUDE "music/sfx/sfx_1f_13.asm"
+
+INCLUDE "audio/duty_3.asm"
+
+INCLUDE "music/sfx/sfx_1f_3f.asm"
+INCLUDE "music/sfx/sfx_1f_56.asm"
+INCLUDE "music/sfx/sfx_1f_57.asm"
+INCLUDE "music/sfx/sfx_1f_58.asm"
+INCLUDE "music/sfx/sfx_1f_3c.asm"
+INCLUDE "music/sfx/sfx_1f_59.asm"
+INCLUDE "music/sfx/sfx_1f_5a.asm"
+INCLUDE "music/sfx/sfx_1f_5b.asm"
+INCLUDE "music/sfx/sfx_1f_5c.asm"
+INCLUDE "music/sfx/sfx_1f_40.asm"
+INCLUDE "music/sfx/sfx_1f_5d.asm"
+INCLUDE "music/sfx/sfx_1f_3d.asm"
+INCLUDE "music/sfx/sfx_1f_43.asm"
+INCLUDE "music/sfx/sfx_1f_3e.asm"
+INCLUDE "music/sfx/sfx_1f_44.asm"
+INCLUDE "music/sfx/sfx_1f_45.asm"
+INCLUDE "music/sfx/sfx_1f_46.asm"
+INCLUDE "music/sfx/sfx_1f_47.asm"
+INCLUDE "music/sfx/sfx_1f_48.asm"
+INCLUDE "music/sfx/sfx_1f_49.asm"
+INCLUDE "music/sfx/sfx_1f_4a.asm"
+INCLUDE "music/sfx/sfx_1f_4b.asm"
+INCLUDE "music/sfx/sfx_1f_4c.asm"
+INCLUDE "music/sfx/sfx_1f_4d.asm"
+INCLUDE "music/sfx/sfx_1f_4e.asm"
+INCLUDE "music/sfx/sfx_1f_4f.asm"
+INCLUDE "music/sfx/sfx_1f_50.asm"
+INCLUDE "music/sfx/sfx_1f_51.asm"
+INCLUDE "music/sfx/sfx_1f_52.asm"
+INCLUDE "music/sfx/sfx_1f_53.asm"
+INCLUDE "music/sfx/sfx_1f_54.asm"
+INCLUDE "music/sfx/sfx_1f_55.asm"
+INCLUDE "music/sfx/sfx_1f_5e.asm"
+INCLUDE "music/sfx/sfx_1f_5f.asm"
+INCLUDE "music/sfx/sfx_1f_60.asm"
+INCLUDE "music/sfx/sfx_1f_61.asm"
+INCLUDE "music/sfx/sfx_1f_62.asm"
+INCLUDE "music/sfx/sfx_1f_63.asm"
+INCLUDE "music/sfx/sfx_1f_64.asm"
+INCLUDE "music/sfx/sfx_1f_65.asm"
+INCLUDE "music/sfx/sfx_1f_66.asm"
+INCLUDE "music/sfx/sfx_1f_67.asm"
+INCLUDE "music/sfx/sfx_1f_unused.asm"
+INCLUDE "music/sfx/sfx_1f_1d.asm"
+INCLUDE "music/sfx/sfx_1f_37.asm"
+INCLUDE "music/sfx/sfx_1f_38.asm"
+INCLUDE "music/sfx/sfx_1f_25.asm"
+INCLUDE "music/sfx/sfx_1f_39.asm"
+INCLUDE "music/sfx/sfx_1f_17.asm"
+INCLUDE "music/sfx/sfx_1f_23.asm"
+INCLUDE "music/sfx/sfx_1f_24.asm"
+INCLUDE "music/sfx/sfx_1f_14.asm"
+INCLUDE "music/sfx/sfx_1f_22.asm"
+INCLUDE "music/sfx/sfx_1f_1a.asm"
+INCLUDE "music/sfx/sfx_1f_1b.asm"
+INCLUDE "music/sfx/sfx_1f_19.asm"
+INCLUDE "music/sfx/sfx_1f_1f.asm"
+INCLUDE "music/sfx/sfx_1f_20.asm"
+INCLUDE "music/sfx/sfx_1f_16.asm"
+INCLUDE "music/sfx/sfx_1f_21.asm"
+INCLUDE "music/sfx/sfx_1f_15.asm"
+INCLUDE "music/sfx/sfx_1f_1e.asm"
+INCLUDE "music/sfx/sfx_1f_1c.asm"
+INCLUDE "music/sfx/sfx_1f_18.asm"
+INCLUDE "music/sfx/sfx_1f_2d.asm"
+INCLUDE "music/sfx/sfx_1f_2a.asm"
+INCLUDE "music/sfx/sfx_1f_2f.asm"
+INCLUDE "music/sfx/sfx_1f_26.asm"
+INCLUDE "music/sfx/sfx_1f_27.asm"
+INCLUDE "music/sfx/sfx_1f_28.asm"
+INCLUDE "music/sfx/sfx_1f_32.asm"
+INCLUDE "music/sfx/sfx_1f_29.asm"
+INCLUDE "music/sfx/sfx_1f_2b.asm"
+INCLUDE "music/sfx/sfx_1f_30.asm"
+INCLUDE "music/sfx/sfx_1f_2e.asm"
+INCLUDE "music/sfx/sfx_1f_31.asm"
+INCLUDE "music/sfx/sfx_1f_2c.asm"
+INCLUDE "music/sfx/sfx_1f_33.asm"
+INCLUDE "music/sfx/sfx_1f_34.asm"
+INCLUDE "music/sfx/sfx_1f_35.asm"
+INCLUDE "music/sfx/sfx_1f_36.asm"
+
+
+
+SECTION "Audio Engine 1", ROMX, BANK[AUDIO_1]
+
+PlayBattleMusic:: ; 0x90c6
+	xor a
+	ld [wMusicHeaderPointer], a
+	ld [$d083], a
+	dec a
+	ld [$c0ee], a
+	call PlaySound ; stop music
+	call DelayFrame
+	ld c, BANK(Music_GymLeaderBattle)
+	ld a, [W_GYMLEADERNO]
+	and a
+	jr z, .notGymLeaderBattle
+	ld a, MUSIC_GYM_LEADER_BATTLE
+	jr .playSong
+.notGymLeaderBattle
+	ld a, [W_CUROPPONENT]
+	cp $c8
+	jr c, .wildBattle
+	cp SONY3 + $c8
+	jr z, .finalBattle
+	cp LANCE + $c8
+	jr nz, .normalTrainerBattle
+	ld a, MUSIC_GYM_LEADER_BATTLE ; lance also plays gym leader theme
+	jr .playSong
+.normalTrainerBattle
+	ld a, MUSIC_TRAINER_BATTLE
+	jr .playSong
+.finalBattle
+	ld a, MUSIC_FINAL_BATTLE
+	jr .playSong
+.wildBattle
+	ld a, MUSIC_WILD_BATTLE
+.playSong
+	jp PlayMusic
+
+
+INCLUDE "audio/engine_1.asm"
+
+
+; an alternate start for MeetRival which has a different first measure
+Music_RivalAlternateStart:: ; 0x9b47
+	ld c, BANK(Music_MeetRival)
+	ld a, MUSIC_MEET_RIVAL
+	call PlayMusic
+	ld hl, $c006
+	ld de, Music_MeetRival_branch_b1a2
+	call Music2_OverwriteChannelPointer
+	ld de, Music_MeetRival_branch_b21d
+	call Music2_OverwriteChannelPointer
+	ld de, Music_MeetRival_branch_b2b5
+
+Music2_OverwriteChannelPointer: ; 0x9b60
+	ld a, e
+	ld [hli], a
+	ld a, d
+	ld [hli], a
+	ret
+
+; an alternate tempo for MeetRival which is slightly slower
+Music_RivalAlternateTempo:: ; 0x9b65
+	ld c, BANK(Music_MeetRival)
+	ld a, MUSIC_MEET_RIVAL
+	call PlayMusic
+	ld hl, $c006
+	ld de, Music_MeetRival_branch_b119
+	jp Music2_OverwriteChannelPointer
+
+; applies both the alternate start and alternate tempo
+Music_RivalAlternateStartAndTempo:: ; 0x9b75
+	call Music_RivalAlternateStart
+	ld hl, $c006
+	ld de, Music_MeetRival_branch_b19b
+	jp Music2_OverwriteChannelPointer
+
+; an alternate tempo for Cities1 which is used for the Hall of Fame room
+Music_Cities1AlternateTempo:: ; 0x9b81
+	ld a, $a
+	ld [$cfc8], a
+	ld [$cfc9], a
+	ld a, $ff
+	ld [wMusicHeaderPointer], a
+	ld c, $64
+	call DelayFrames
+	ld c, BANK(Music_Cities1)
+	ld a, MUSIC_CITIES1
+	call PlayMusic
+	ld hl, $c006
+	ld de, Music_Cities1_branch_aa6f
+	jp Music2_OverwriteChannelPointer
+
+
+SECTION "Audio Engine 2", ROMX, BANK[AUDIO_2]
+
+Func_2136e:: ; 2136e (8:536e)
+	ld a, [$d083]
+	cp $ff
+	jr z, .asm_2139b
+	bit 7, a
+	ret z
+	and $7f
+	jr nz, .asm_21383
+	call Func_213a7
+	ld a, $1e
+	jr .asm_21395
+.asm_21383
+	cp $14
+	jr nz, .asm_2138a
+	call Func_213ac
+.asm_2138a
+	ld a, $86
+	ld [$c02a], a
+	ld a, [$d083]
+	and $7f
+	dec a
+.asm_21395
+	set 7, a
+	ld [$d083], a
+	ret
+.asm_2139b
+	xor a
+	ld [$d083], a
+	ld [$c02a], a
+	ld de, Unknown_213c4 ; $53c4
+	jr asm_213af
+
+Func_213a7: ; 213a7 (8:53a7)
+	ld de, Unknown_213bc ; $53bc
+	jr asm_213af
+
+Func_213ac: ; 213ac (8:53ac)
+	ld de, Unknown_213c0 ; $53c0
+asm_213af: ; 213af (8:53af)
+	ld hl, $ff10
+	ld c, $5
+	xor a
+.asm_213b5
+	ld [hli], a
+	ld a, [de]
+	inc de
+	dec c
+	jr nz, .asm_213b5
+	ret
+
+Unknown_213bc: ; 213bc (8:53bc)
+	db $A0,$E2,$50,$87
+
+Unknown_213c0: ; 213c0 (8:53c0)
+	db $B0,$E2,$EE,$86
+
+Unknown_213c4: ; 213c4 (8:53c4)
+	db $00,$00,$00,$80
+
+
+INCLUDE "menu/pc.asm"
+
+INCLUDE "audio/engine_2.asm"
+
+
+Music_PokeFluteInBattle:: ; 22306 (8:6306)
+	ld a, (SFX_08_46 - $4000) / 3 ; PokeFlute outside of battle
+	call PlaySoundWaitForCurrent
+	ld hl, $c00e
+	ld de, SFX_08_PokeFlute_Ch1
+	call Music8_OverwriteChannelPointer
+	ld de, SFX_08_PokeFlute_Ch2
+	call Music8_OverwriteChannelPointer
+	ld de, SFX_08_PokeFlute_Ch3
+
+Music8_OverwriteChannelPointer: ; 2231d (8:631d)
+	ld a, e
+	ld [hli], a
+	ld a, d
+	ld [hli], a
+	ret
+
+
+SECTION "Audio Engine 3", ROMX, BANK[AUDIO_3]
+
+Func_7d13b:: ; 7d13b (1f:513b)
+	ld a, [$FF00+$dc]
+	ld c, $0
+	ld hl, OwnedMonValues
+.getSfxPointer
+	cp [hl]
+	jr c, .gotSfxPointer
+	inc c
+	inc hl
+	jr .getSfxPointer
+.gotSfxPointer
+	push bc
+	ld a, $ff
+	ld [$c0ee], a
+	call PlaySoundWaitForCurrent
+	pop bc
+	ld b, $0
+	ld hl, PokedexRatingSfxPointers
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld c, [hl]
+	call PlayMusic
+	jp Func_2307
+
+PokedexRatingSfxPointers: ; 7d162 (1f:5162)
+	db (SFX_1f_51 - $4000) / 3
+	db BANK(SFX_1f_51)
+	db (SFX_02_41 - $4000) / 3
+	db BANK(SFX_02_41)
+	db (SFX_02_3a - $4000) / 3
+	db BANK(SFX_02_3a)
+	db (SFX_08_46 - $4000) / 3
+	db BANK(SFX_08_46)
+	db (SFX_08_3a - $4000) / 3
+	db BANK(SFX_08_3a)
+	db (SFX_02_42 - $4000) / 3
+	db BANK(SFX_02_42)
+	db (SFX_02_3b - $4000) / 3
+	db BANK(SFX_02_3b)
+
+OwnedMonValues: ; 7d170 (1f:5170)
+	db 10, 40, 60, 90, 120, 150, $ff
+
+
+INCLUDE "audio/engine_3.asm"
+
+
+
+SECTION "Music 1", ROMX, BANK[AUDIO_1]
+
+INCLUDE "music/pkmnhealed.asm"
+INCLUDE "music/routes1.asm"
+INCLUDE "music/routes2.asm"
+INCLUDE "music/routes3.asm"
+INCLUDE "music/routes4.asm"
+INCLUDE "music/indigoplateau.asm"
+INCLUDE "music/pallettown.asm"
+INCLUDE "music/unusedsong.asm"
+INCLUDE "music/cities1.asm"
+INCLUDE "music/sfx/sfx_02_3a.asm"
+INCLUDE "music/museumguy.asm"
+INCLUDE "music/meetprofoak.asm"
+INCLUDE "music/meetrival.asm"
+INCLUDE "music/sfx/sfx_02_41.asm"
+INCLUDE "music/sfx/sfx_02_3b.asm"
+INCLUDE "music/sfx/sfx_02_42.asm"
+INCLUDE "music/ssanne.asm"
+INCLUDE "music/cities2.asm"
+INCLUDE "music/celadon.asm"
+INCLUDE "music/cinnabar.asm"
+INCLUDE "music/vermilion.asm"
+INCLUDE "music/lavender.asm"
+INCLUDE "music/safarizone.asm"
+INCLUDE "music/gym.asm"
+INCLUDE "music/pokecenter.asm"
+
+
+SECTION "Music 2", ROMX, BANK[AUDIO_2]
+
+INCLUDE "music/sfx/sfx_08_pokeflute.asm"
+INCLUDE "music/sfx/sfx_08_unused2.asm"
+INCLUDE "music/gymleaderbattle.asm"
+INCLUDE "music/trainerbattle.asm"
+INCLUDE "music/wildbattle.asm"
+INCLUDE "music/finalbattle.asm"
+INCLUDE "music/sfx/sfx_08_3a.asm"
+INCLUDE "music/sfx/sfx_08_3b.asm"
+INCLUDE "music/sfx/sfx_08_46.asm"
+INCLUDE "music/defeatedtrainer.asm"
+INCLUDE "music/defeatedwildmon.asm"
+INCLUDE "music/defeatedgymleader.asm"
+
+
+SECTION "Music 3", ROMX, BANK[AUDIO_3]
+
+INCLUDE "music/bikeriding.asm"
+INCLUDE "music/dungeon1.asm"
+INCLUDE "music/gamecorner.asm"
+INCLUDE "music/titlescreen.asm"
+INCLUDE "music/sfx/sfx_1f_3a.asm"
+INCLUDE "music/dungeon2.asm"
+INCLUDE "music/dungeon3.asm"
+INCLUDE "music/cinnabarmansion.asm"
+INCLUDE "music/sfx/sfx_1f_41.asm"
+INCLUDE "music/sfx/sfx_1f_3b.asm"
+INCLUDE "music/sfx/sfx_1f_42.asm"
+INCLUDE "music/oakslab.asm"
+INCLUDE "music/pokemontower.asm"
+INCLUDE "music/silphco.asm"
+INCLUDE "music/meeteviltrainer.asm"
+INCLUDE "music/meetfemaletrainer.asm"
+INCLUDE "music/meetmaletrainer.asm"
+INCLUDE "music/introbattle.asm"
+INCLUDE "music/surfing.asm"
+INCLUDE "music/jigglypuffsong.asm"
+INCLUDE "music/halloffame.asm"
+INCLUDE "music/credits.asm"
+
--- /dev/null
+++ b/audio/duty_1.asm
@@ -1,0 +1,33 @@
+Music2_Channel3DutyPointers: ; 0x8361
+	dw Music2_Channel3Duty0
+	dw Music2_Channel3Duty1
+	dw Music2_Channel3Duty2
+	dw Music2_Channel3Duty3
+	dw Music2_Channel3Duty4
+	dw Music2_Channel3Duty5 ; used in the Lavender Town theme
+	dw Music2_Channel3Duty5 ; unused
+	dw Music2_Channel3Duty5 ; unused
+	dw Music2_Channel3Duty5 ; 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 $FF30
+Music2_Channel3Duty0: ; 0x8373
+	db $02,$46,$8A,$CE,$FF,$FE,$ED,$DC,$CB,$A9,$87,$65,$44,$33,$22,$11
+
+Music2_Channel3Duty1: ; 0x8383
+	db $02,$46,$8A,$CE,$EF,$FF,$FE,$EE,$DD,$CB,$A9,$87,$65,$43,$22,$11
+
+Music2_Channel3Duty2: ; 0x8393
+	db $13,$69,$BD,$EE,$EE,$FF,$FF,$ED,$DE,$FF,$FF,$EE,$EE,$DB,$96,$31
+
+Music2_Channel3Duty3: ; 0x83a3
+	db $02,$46,$8A,$CD,$EF,$FE,$DE,$FF,$EE,$DC,$BA,$98,$76,$54,$32,$10
+
+Music2_Channel3Duty4: ; 0x83b3
+	db $01,$23,$45,$67,$8A,$CD,$EE,$F7,$7F,$EE,$DC,$A8,$76,$54,$32,$10
+
+; duty 5 reads from sfx data
+Music2_Channel3Duty5: ; 0x83c3
+
--- /dev/null
+++ b/audio/duty_2.asm
@@ -1,0 +1,32 @@
+Music8_Channel3DutyPointers: ; 20361 (8:4361)
+	dw Music8_Channel3Duty0
+	dw Music8_Channel3Duty1
+	dw Music8_Channel3Duty2
+	dw Music8_Channel3Duty3
+	dw Music8_Channel3Duty4
+	dw Music8_Channel3Duty5 ; unused
+	dw Music8_Channel3Duty5 ; unused
+	dw Music8_Channel3Duty5 ; unused
+	dw Music8_Channel3Duty5 ; 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 $FF30
+Music8_Channel3Duty0: ; 20373 (8:4373)
+	db $02,$46,$8A,$CE,$FF,$FE,$ED,$DC,$CB,$A9,$87,$65,$44,$33,$22,$11
+
+Music8_Channel3Duty1: ; 20383 (8:4383)
+	db $02,$46,$8A,$CE,$EF,$FF,$FE,$EE,$DD,$CB,$A9,$87,$65,$43,$22,$11
+
+Music8_Channel3Duty2: ; 20393 (8:4393)
+	db $13,$69,$BD,$EE,$EE,$FF,$FF,$ED,$DE,$FF,$FF,$EE,$EE,$DB,$96,$31
+
+Music8_Channel3Duty3: ; 203a3 (8:43a3)
+	db $02,$46,$8A,$CD,$EF,$FE,$DE,$FF,$EE,$DC,$BA,$98,$76,$54,$32,$10
+
+Music8_Channel3Duty4: ; 203b3 (8:43b3)
+	db $01,$23,$45,$67,$8A,$CD,$EE,$F7,$7F,$EE,$DC,$A8,$76,$54,$32,$10
+
+Music8_Channel3Duty5:
+
--- /dev/null
+++ b/audio/duty_3.asm
@@ -1,0 +1,33 @@
+Music1f_Channel3DutyPointers: ; 7c361 (1f:4361)
+	dw Music1f_Channel3Duty0
+	dw Music1f_Channel3Duty1
+	dw Music1f_Channel3Duty2
+	dw Music1f_Channel3Duty3
+	dw Music1f_Channel3Duty4
+	dw Music1f_Channel3Duty5 ; used in the Pokemon Tower theme
+	dw Music1f_Channel3Duty5 ; unused
+	dw Music1f_Channel3Duty5 ; unused
+	dw Music1f_Channel3Duty5 ; 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 $FF30
+Music1f_Channel3Duty0: ; 7c373 (1f:4373)
+	db $02,$46,$8A,$CE,$FF,$FE,$ED,$DC,$CB,$A9,$87,$65,$44,$33,$22,$11
+
+Music1f_Channel3Duty1: ; 7c383 (1f:4383)
+	db $02,$46,$8A,$CE,$EF,$FF,$FE,$EE,$DD,$CB,$A9,$87,$65,$43,$22,$11
+
+Music1f_Channel3Duty2: ; 7c393 (1f:4393)
+	db $13,$69,$BD,$EE,$EE,$FF,$FF,$ED,$DE,$FF,$FF,$EE,$EE,$DB,$96,$31
+
+Music1f_Channel3Duty3: ; 7c3a3 (1f:43a3)
+	db $02,$46,$8A,$CD,$EF,$FE,$DE,$FF,$EE,$DC,$BA,$98,$76,$54,$32,$10
+
+Music1f_Channel3Duty4: ; 7c3b3 (1f:43b3)
+	db $01,$23,$45,$67,$8A,$CD,$EE,$F7,$7F,$EE,$DC,$A8,$76,$54,$32,$10
+
+; duty 5 reads from sfx data
+Music1f_Channel3Duty5: ; 7c3c3 (1f:43c3)
+
--- /dev/null
+++ b/audio/engine_1.asm
@@ -1,0 +1,1682 @@
+; The first of three duplicated sound engines.
+
+Func_9103:: ; 0x9103
+	ld c, CH0
+.loop
+	ld b, $0
+	ld hl, $c026
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .nextChannel
+	ld a, c
+	cp CH4
+	jr nc, .asm_912e ; if sfx channel
+	ld a, [$c002]
+	and a
+	jr z, .asm_912e
+	bit 7, a
+	jr nz, .nextChannel
+	set 7, a
+	ld [$c002], a
+	xor a
+	ld [$ff00+$25], a
+	ld [$ff00+$1a], a
+	ld a, $80
+	ld [$ff00+$1a], a
+	jr .nextChannel
+.asm_912e
+	call Music2_ApplyMusicAffects
+.nextChannel
+	ld a, c
+	inc c ; inc channel number
+	cp CH7
+	jr nz, .loop 
+	ret
+
+; this routine checks flags for music effects currently applied
+; to the channel and calls certain functions based on flags.
+; known flags for $c02e:
+;	1: call has been used
+;	3: a toggle used only by this routine for vibrato
+;	4: pitchbend flag
+;	6: dutycycle flag
+Music2_ApplyMusicAffects: ; 0x9138
+	ld b, $0
+	ld hl, $c0b6 ; delay unitl next note
+	add hl, bc
+	ld a, [hl]
+	cp $1 ; if the delay is 1, play next note
+	jp z, Music2_PlayNextNote
+	dec a ; otherwise, decrease the delay timer
+	ld [hl], a
+	ld a, c
+	cp CH4
+	jr nc, .startChecks ; if a sfx channel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .startChecks
+	ret
+.startChecks
+	ld hl, $c02e
+	add hl, bc
+	bit 6, [hl] ; dutycycle
+	jr z, .checkForExecuteMusic
+	call Music2_ApplyDutyCycle
+.checkForExecuteMusic
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, .checkForPitchBend
+	ld hl, $c02e
+	add hl, bc
+	bit 2, [hl]
+	jr nz, .disablePitchBendVibrato
+.checkForPitchBend
+	ld hl, $c02e
+	add hl, bc
+	bit 4, [hl] ; pitchbend
+	jr z, .checkVibratoDelay
+	jp Music2_ApplyPitchBend
+.checkVibratoDelay
+	ld hl, $c04e ; vibrato delay
+	add hl, bc
+	ld a, [hl]
+	and a ; check if delay is over
+	jr z, .checkForVibrato
+	dec [hl] ; otherwise, dec delay
+.disablePitchBendVibrato
+	ret
+.checkForVibrato
+	ld hl, $c056 ; vibrato rate
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .vibrato
+	ret ; no vibrato
+.vibrato
+	ld d, a
+	ld hl, $c05e
+	add hl, bc
+	ld a, [hl]
+	and $f
+	and a
+	jr z, .vibratoAlreadyDone
+	dec [hl] ; apply vibrato pitch change
+	ret
+.vibratoAlreadyDone
+	ld a, [hl]
+	swap [hl]
+	or [hl]
+	ld [hl], a ; reset the vibrato value and start again
+	ld hl, $c066
+	add hl, bc
+	ld e, [hl] ; get note pitch
+	ld hl, $c02e
+	add hl, bc
+	bit 3, [hl] ; this is the only code that sets/resets bit three so
+	jr z, .unset ; it continuously alternates which path it takes
+	res 3, [hl]
+	ld a, d
+	and $f
+	ld d, a
+	ld a, e
+	sub d
+	jr nc, .noCarry
+	ld a, $0
+.noCarry
+	jr .done
+.unset
+	set 3, [hl]
+	ld a, d
+	and $f0
+	swap a
+	add e
+	jr nc, .done
+	ld a, $ff
+.done
+	ld d, a
+	ld b, $3
+	call Func_9838
+	ld [hl], d
+	ret
+
+; this routine executes all music commands that take up no time,
+; like tempo changes, duty changes etc. and doesn't return
+; until the first note is reached
+Music2_PlayNextNote ; 0x91d0
+	ld hl, $c06e
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c04e
+	add hl, bc
+	ld [hl], a
+	ld hl, $c02e
+	add hl, bc
+	res 4, [hl]
+	res 5, [hl]
+	call Music2_endchannel
+	ret
+
+Music2_endchannel: ; 0x91e6
+	call Music2_GetNextMusicByte
+	ld d, a
+	cp $ff ; is this command an endchannel?
+	jp nz, Music2_callchannel ; no
+	ld b, $0 ; yes
+	ld hl, $c02e
+	add hl, bc
+	bit 1, [hl]
+	jr nz, .returnFromCall
+	ld a, c
+	cp CH3
+	jr nc, .noiseOrSfxChannel
+	jr .asm_923f
+.noiseOrSfxChannel
+	res 2, [hl]
+	ld hl, $c036
+	add hl, bc
+	res 0, [hl]
+	cp CH6
+	jr nz, .notSfxChannel3
+	ld a, $0
+	ld [$ff00+$1a], a
+	ld a, $80
+	ld [$ff00+$1a], a
+.notSfxChannel3
+	jr nz, .asm_9222
+	ld a, [$c003]
+	and a
+	jr z, .asm_9222
+	xor a
+	ld [$c003], a
+	jr .asm_923f
+.asm_9222
+	jr .asm_9248
+.returnFromCall
+	res 1, [hl]
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	push hl ; store current channel address
+	ld hl, $c016
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	ld a, [de]
+	ld [hli], a
+	inc de
+	ld a, [de]
+	ld [hl], a ; loads channel address to return to
+	jp Music2_endchannel
+.asm_923f
+	ld hl, Unknown_9b1f
+	add hl, bc
+	ld a, [$ff00+$25]
+	and [hl]
+	ld [$ff00+$25], a
+.asm_9248
+	ld a, [$c02a]
+	cp $14
+	jr nc, .asm_9251
+	jr .asm_926e
+.asm_9251
+	ld a, [$c02a]
+	cp $86
+	jr z, .asm_926e
+	jr c, .asm_925c
+	jr .asm_926e
+.asm_925c
+	ld a, c
+	cp CH4
+	jr z, .asm_9265
+	call Func_96c7
+	ret c
+.asm_9265
+	ld a, [$c005]
+	ld [$ff00+$24], a
+	xor a
+	ld [$c005], a
+.asm_926e
+	ld hl, $c026
+	add hl, bc
+	ld [hl], b
+	ret
+
+Music2_callchannel: ; 0x9274
+	cp $fd ; is this command a callchannel?
+	jp nz, Music2_loopchannel ; no
+	call Music2_GetNextMusicByte ; yes
+	push af
+	call Music2_GetNextMusicByte
+	ld d, a
+	pop af
+	ld e, a
+	push de ; store pointer
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	push hl
+	ld hl, $c016
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hld]
+	ld [de], a ; copy current channel address
+	pop de
+	ld [hl], e
+	inc hl
+	ld [hl], d ; overwrite current address with pointer
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 1, [hl] ; set the call flag
+	jp Music2_endchannel
+
+Music2_loopchannel: ; 0x92a9
+	cp $fe ; is this command a loopchannel?
+	jp nz, Music2_notetype ; no
+	call Music2_GetNextMusicByte ; yes
+	ld e, a
+	and a
+	jr z, .infiniteLoop
+	ld b, $0
+	ld hl, $c0be
+	add hl, bc
+	ld a, [hl]
+	cp e
+	jr nz, .loopAgain
+	ld a, $1 ; if no more loops to make,
+	ld [hl], a
+	call Music2_GetNextMusicByte ; skip pointer
+	call Music2_GetNextMusicByte
+	jp Music2_endchannel
+.loopAgain ; inc loop count
+	inc a
+	ld [hl], a
+	; fall through
+.infiniteLoop ; overwrite current address with pointer
+	call Music2_GetNextMusicByte
+	push af
+	call Music2_GetNextMusicByte
+	ld b, a
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	pop af
+	ld [hli], a
+	ld [hl], b
+	jp Music2_endchannel
+
+Music2_notetype: ; 0x92e4
+	and $f0
+	cp $d0 ; is this command a notetype?
+	jp nz, Music2_togglecall ; no
+	ld a, d ; yes
+	and $f
+	ld b, $0
+	ld hl, $c0c6
+	add hl, bc
+	ld [hl], a ; store low nibble as speed
+	ld a, c
+	cp CH3
+	jr z, .noiseChannel ; noise channel has 0 params
+	call Music2_GetNextMusicByte
+	ld d, a
+	ld a, c
+	cp CH2
+	jr z, .musicChannel3
+	cp CH6
+	jr nz, .notChannel3
+	ld hl, $c0e7
+	jr .sfxChannel3
+.musicChannel3
+	ld hl, $c0e6
+.sfxChannel3
+	ld a, d
+	and $f
+	ld [hl], a ; store low nibble of param as duty
+	ld a, d
+	and $30
+	sla a
+	ld d, a
+	; fall through
+
+	; if channel 3, store high nibble as volume
+	; else, store volume (high nibble) and fade (low nibble)
+.notChannel3
+	ld b, $0
+	ld hl, $c0de
+	add hl, bc
+	ld [hl], d
+.noiseChannel
+	jp Music2_endchannel
+
+Music2_togglecall: ; 0x9323
+	ld a, d
+	cp $e8 ; is this command an togglecall?
+	jr nz, Music2_vibrato ; no
+	ld b, $0 ; yes
+	ld hl, $c02e
+	add hl, bc
+	ld a, [hl]
+	xor $1
+	ld [hl], a ; flip bit 0 of $c02e (toggle returning from call)
+	jp Music2_endchannel
+
+Music2_vibrato: ; 0x9335
+	cp $ea ; is this command a vibrato?
+	jr nz, Music2_pitchbend ; no
+	call Music2_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c04e
+	add hl, bc
+	ld [hl], a ; store delay 
+	ld hl, $c06e
+	add hl, bc
+	ld [hl], a ; store delay
+	call Music2_GetNextMusicByte
+	ld d, a
+	and $f0
+	swap a
+	ld b, $0
+	ld hl, $c056
+	add hl, bc
+	srl a
+	ld e, a
+	adc b
+	swap a
+	or e
+	ld [hl], a ; store rate as both high and low nibbles
+	ld a, d
+	and $f
+	ld d, a
+	ld hl, $c05e
+	add hl, bc
+	swap a
+	or d
+	ld [hl], a ; store depth as both high and low nibbles
+	jp Music2_endchannel
+
+Music2_pitchbend: ; 0x936d
+	cp $eb ; is this command a pitchbend?
+	jr nz, Music2_duty ; no
+	call Music2_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c076
+	add hl, bc
+	ld [hl], a ; store first param
+	call Music2_GetNextMusicByte
+	ld d, a
+	and $f0
+	swap a
+	ld b, a
+	ld a, d
+	and $f
+	call Func_9858
+	ld b, $0
+	ld hl, $c0a6
+	add hl, bc
+	ld [hl], d ; store unknown part of second param
+	ld hl, $c0ae
+	add hl, bc
+	ld [hl], e ; store unknown part of second param
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 4, [hl] ; set pitchbend flag
+	call Music2_GetNextMusicByte
+	ld d, a
+	jp Music2_notelength
+
+Music2_duty: ; 0x93a5
+	cp $ec ; is this command a duty?
+	jr nz, Music2_tempo ; no
+	call Music2_GetNextMusicByte ; yes
+	rrca
+	rrca
+	and $c0
+	ld b, $0
+	ld hl, $c03e
+	add hl, bc
+	ld [hl], a ; store duty
+	jp Music2_endchannel
+
+Music2_tempo: ; 0x93ba
+	cp $ed ; is this command a tempo?
+	jr nz, Music2_unknownmusic0xee ; no
+	ld a, c ; yes
+	cp CH4
+	jr nc, .sfxChannel
+	call Music2_GetNextMusicByte
+	ld [$c0e8], a ; store first param
+	call Music2_GetNextMusicByte
+	ld [$c0e9], a ; store second param
+	xor a
+	ld [$c0ce], a ; clear RAM
+	ld [$c0cf], a
+	ld [$c0d0], a
+	ld [$c0d1], a
+	jr .musicChannelDone
+.sfxChannel
+	call Music2_GetNextMusicByte
+	ld [$c0ea], a ; store first param
+	call Music2_GetNextMusicByte
+	ld [$c0eb], a ; store second param
+	xor a
+	ld [$c0d2], a ; clear RAM
+	ld [$c0d3], a
+	ld [$c0d4], a
+	ld [$c0d5], a
+.musicChannelDone
+	jp Music2_endchannel
+
+Music2_unknownmusic0xee: ; 0x93fa
+	cp $ee ; is this command an unknownmusic0xee?
+	jr nz, Music2_unknownmusic0xef ; no
+	call Music2_GetNextMusicByte ; yes
+	ld [$c004], a ; store first param
+	jp Music2_endchannel
+
+; this appears to never be used
+Music2_unknownmusic0xef ; 0x9407
+	cp $ef ; is this command an unknownmusic0xef?
+	jr nz, Music2_dutycycle ; no
+	call Music2_GetNextMusicByte ; yes
+	push bc
+	call Func_9876
+	pop bc
+	ld a, [$c003]
+	and a
+	jr nz, .skip
+	ld a, [$c02d]
+	ld [$c003], a
+	xor a
+	ld [$c02d], a
+.skip
+	jp Music2_endchannel
+
+Music2_dutycycle: ; 0x9426
+	cp $fc ; is this command a dutycycle?
+	jr nz, Music2_stereopanning ; no
+	call Music2_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c046
+	add hl, bc
+	ld [hl], a ; store full cycle
+	and $c0
+	ld hl, $c03e
+	add hl, bc
+	ld [hl], a ; store first duty
+	ld hl, $c02e
+	add hl, bc
+	set 6, [hl] ; set dutycycle flag
+	jp Music2_endchannel
+
+Music2_stereopanning: ; 0x9444
+	cp $f0 ; is this command a stereopanning?
+	jr nz, Music2_executemusic ; no
+	call Music2_GetNextMusicByte ; yes
+	ld [$ff00+$24], a ; store stereopanning
+	jp Music2_endchannel
+
+Music2_executemusic: ; 0x9450
+	cp $f8 ; is this command an executemusic?
+	jr nz, Music2_octave ; no
+	ld b, $0 ; yes
+	ld hl, $c036
+	add hl, bc
+	set 0, [hl]
+	jp Music2_endchannel
+
+Music2_octave: ; 0x945f
+	and $f0
+	cp $e0 ; is this command an octave?
+	jr nz, Music2_unknownsfx0x20 ; no
+	ld hl, $c0d6 ; yes
+	ld b, $0
+	add hl, bc
+	ld a, d
+	and $f
+	ld [hl], a ; store low nibble as octave
+	jp Music2_endchannel
+
+Music2_unknownsfx0x20: ; 0x9472
+	cp $20 ; is this command an unknownsfx0x20?
+	jr nz, Music2_unknownsfx0x10 ; no
+	ld a, c
+	cp CH3 ; is this a noise or sfx channel?
+	jr c, Music2_unknownsfx0x10 ; no
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music2_unknownsfx0x10 ; no
+	call Music2_notelength ; yes
+	ld d, a
+	ld b, $0
+	ld hl, $c03e
+	add hl, bc
+	ld a, [hl]
+	or d
+	ld d, a
+	ld b, $1
+	call Func_9838
+	ld [hl], d
+	call Music2_GetNextMusicByte
+	ld d, a
+	ld b, $2
+	call Func_9838
+	ld [hl], d
+	call Music2_GetNextMusicByte
+	ld e, a
+	ld a, c
+	cp CH7
+	ld a, $0
+	jr z, .sfxNoiseChannel ; only two params for noise channel
+	push de
+	call Music2_GetNextMusicByte
+	pop de
+.sfxNoiseChannel
+	ld d, a
+	push de
+	call Func_9629
+	call Func_95f8
+	pop de
+	call Func_964b
+	ret
+
+Music2_unknownsfx0x10:
+	ld a, c
+	cp CH4
+	jr c, Music2_note ; if not a sfx
+	ld a, d
+	cp $10 ; is this command a unknownsfx0x10?
+	jr nz, Music2_note ; no
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music2_note ; no
+	call Music2_GetNextMusicByte ; yes
+	ld [$ff00+$10], a
+	jp Music2_endchannel
+
+Music2_note:
+	ld a, c
+	cp CH3
+	jr nz, Music2_notelength ; if not noise channel
+	ld a, d
+	and $f0
+	cp $b0 ; is this command a dnote?
+	jr z, Music2_dnote ; yes
+	jr nc, Music2_notelength ; no
+	swap a
+	ld b, a
+	ld a, d
+	and $f
+	ld d, a
+	ld a, b
+	push de
+	push bc
+	jr asm_94fd
+
+Music2_dnote:
+	ld a, d
+	and $f
+	push af
+	push bc
+	call Music2_GetNextMusicByte ; get dnote instrument
+asm_94fd
+	ld d, a
+	ld a, [$c003]
+	and a
+	jr nz, .asm_9508
+	ld a, d
+	call Func_9876
+.asm_9508
+	pop bc
+	pop de
+
+Music2_notelength: ; 0x950a
+	ld a, d
+	push af
+	and $f
+	inc a
+	ld b, $0
+	ld e, a  ; store note length (in 16ths)
+	ld d, b
+	ld hl, $c0c6
+	add hl, bc
+	ld a, [hl]
+	ld l, b
+	call Func_9847
+	ld a, c
+	cp CH4
+	jr nc, .sfxChannel
+	ld a, [$c0e8]
+	ld d, a
+	ld a, [$c0e9]
+	ld e, a
+	jr .skip
+.sfxChannel
+	ld d, $1
+	ld e, $0
+	cp CH7
+	jr z, .skip ; if noise channel
+	call Func_9693
+	ld a, [$c0ea]
+	ld d, a
+	ld a, [$c0eb]
+	ld e, a
+.skip
+	ld a, l
+	ld b, $0
+	ld hl, $c0ce
+	add hl, bc
+	ld l, [hl]
+	call Func_9847
+	ld e, l
+	ld d, h
+	ld hl, $c0ce
+	add hl, bc
+	ld [hl], e
+	ld a, d
+	ld hl, $c0b6
+	add hl, bc
+	ld [hl], a
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music2_notepitch
+	ld hl, $c02e
+	add hl, bc
+	bit 2, [hl]
+	jr z, Music2_notepitch
+	pop hl
+	ret
+
+Music2_notepitch: ; 0x9568
+	pop af
+	and $f0
+	cp $c0 ; compare to rest
+	jr nz, .notRest
+	ld a, c
+	cp CH4
+	jr nc, .sfxChannel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .done
+	; fall through
+.sfxChannel
+	ld a, c
+	cp CH2
+	jr z, .musicChannel3
+	cp CH6
+	jr nz, .notSfxChannel3
+.musicChannel3
+	ld b, $0
+	ld hl, Unknown_9b1f
+	add hl, bc
+	ld a, [$ff00+$25]
+	and [hl]
+	ld [$ff00+$25], a
+	jr .done
+.notSfxChannel3
+	ld b, $2
+	call Func_9838
+	ld a, $8
+	ld [hli], a
+	inc hl
+	ld a, $80
+	ld [hl], a
+.done
+	ret
+.notRest
+	swap a
+	ld b, $0
+	ld hl, $c0d6
+	add hl, bc
+	ld b, [hl]
+	call Func_9858
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	bit 4, [hl]
+	jr z, .asm_95b8
+	call Func_978f
+.asm_95b8
+	push de
+	ld a, c
+	cp CH4
+	jr nc, .skip ; if sfx channel
+	ld hl, $c02a
+	ld d, $0
+	ld e, a
+	add hl, de
+	ld a, [hl]
+	and a
+	jr nz, .asm_95cb
+	jr .skip
+.asm_95cb
+	pop de
+	ret
+.skip
+	ld b, $0
+	ld hl, $c0de
+	add hl, bc
+	ld d, [hl]
+	ld b, $2
+	call Func_9838
+	ld [hl], d
+	call Func_9629
+	call Func_95f8
+	pop de
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	bit 0, [hl]
+	jr z, .asm_95ef
+	inc e
+	jr nc, .asm_95ef
+	inc d
+.asm_95ef
+	ld hl, $c066
+	add hl, bc
+	ld [hl], e
+	call Func_964b
+	ret
+
+Func_95f8: ; 0x95f8
+	ld b, $0
+	ld hl, Unknown_9b27
+	add hl, bc
+	ld a, [$ff00+$25]
+	or [hl]
+	ld d, a
+	ld a, c
+	cp CH7
+	jr z, .sfxNoiseChannel
+	cp CH4
+	jr nc, .skip ; if sfx channel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .skip
+.sfxNoiseChannel
+	ld a, [$c004]
+	ld hl, Unknown_9b27
+	add hl, bc
+	and [hl]
+	ld d, a
+	ld a, [$ff00+$25]
+	ld hl, Unknown_9b1f
+	add hl, bc
+	and [hl]
+	or d
+	ld d, a
+.skip
+	ld a, d
+	ld [$ff00+$25], a
+	ret
+
+Func_9629: ; 0x9629
+	ld b, $0
+	ld hl, $c0b6
+	add hl, bc
+	ld d, [hl]
+	ld a, c
+	cp CH2
+	jr z, .channel3 ; if music channel 3
+	cp CH6
+	jr z, .channel3 ; if sfx channel 3
+	ld a, d
+	and $3f
+	ld d, a
+	ld hl, $c03e
+	add hl, bc
+	ld a, [hl]
+	or d
+	ld d, a
+.channel3
+	ld b, $1
+	call Func_9838
+	ld [hl], d
+	ret
+
+Func_964b: ; 0x964b
+	ld a, c
+	cp CH2
+	jr z, .channel3
+	cp CH6
+	jr nz, .notSfxChannel3
+	; fall through
+.channel3
+	push de
+	ld de, $c0e6
+	cp CH2
+	jr z, .musicChannel3
+	ld de, $c0e7
+.musicChannel3
+	ld a, [de]
+	add a
+	ld d, $0
+	ld e, a
+	ld hl, Music2_Channel3DutyPointers
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, $ff30
+	ld b, $f
+	ld a, $0
+	ld [$ff00+$1a], a
+.loop
+	ld a, [de]
+	inc de
+	ld [hli], a
+	ld a, b
+	dec b
+	and a
+	jr nz, .loop
+	ld a, $80
+	ld [$ff00+$1a], a
+	pop de
+.notSfxChannel3
+	ld a, d
+	or $80
+	and $c7
+	ld d, a
+	ld b, $3
+	call Func_9838
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	call Func_96b5
+	ret
+
+Func_9693: ; 0x9693
+	call Func_96e5
+	jr nc, .asm_96ab
+	ld d, $0
+	ld a, [$c0f2]
+	add $80
+	jr nc, .asm_96a2
+	inc d
+.asm_96a2
+	ld [$c0eb], a
+	ld a, d
+	ld [$c0ea], a
+	jr .asm_96b4
+.asm_96ab
+	xor a
+	ld [$c0eb], a
+	ld a, $1
+	ld [$c0ea], a
+.asm_96b4
+	ret
+
+Func_96b5: ; 0x96b5
+	call Func_96e5
+	jr nc, .asm_96c6
+	ld a, [$c0f1]
+	add e
+	jr nc, .asm_96c1
+	inc d
+.asm_96c1
+	dec hl
+	ld e, a
+	ld [hl], e
+	inc hl
+	ld [hl], d
+.asm_96c6
+	ret
+
+Func_96c7: ; 0x96c7
+	call Func_96e5
+	jr nc, .asm_96e2
+	ld hl, $c006
+	ld e, c
+	ld d, $0
+	sla e
+	rl d
+	add hl, de
+	ld a, [hl]
+	sub $1
+	ld [hl], a
+	inc hl
+	ld a, [hl]
+	sbc $0
+	ld [hl], a
+	scf
+	ret
+.asm_96e2
+	scf
+	ccf
+	ret
+
+Func_96e5: ; 0x96e5
+	ld a, [$c02a]
+	cp $14
+	jr nc, .asm_96ee
+	jr .asm_96f4
+.asm_96ee
+	cp $86
+	jr z, .asm_96f4
+	jr c, .asm_96f7
+.asm_96f4
+	scf
+	ccf
+	ret
+.asm_96f7
+	scf
+	ret
+
+Music2_ApplyPitchBend: ; 0x96f9
+	ld hl, $c02e
+	add hl, bc
+	bit 5, [hl]
+	jp nz, .asm_9740
+	ld hl, $c09e
+	add hl, bc
+	ld e, [hl]
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c07e
+	add hl, bc
+	ld l, [hl]
+	ld h, b
+	add hl, de
+	ld d, h
+	ld e, l
+	ld hl, $c08e
+	add hl, bc
+	push hl
+	ld hl, $c086
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	add [hl]
+	ld [hl], a
+	ld a, $0
+	adc e
+	ld e, a
+	ld a, $0
+	adc d
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, [hl]
+	cp d
+	jp c, .asm_9786
+	jr nz, .asm_9773
+	ld hl, $c0ae
+	add hl, bc
+	ld a, [hl]
+	cp e
+	jp c, .asm_9786
+	jr .asm_9773
+.asm_9740
+	ld hl, $c09e
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c07e
+	add hl, bc
+	ld e, [hl]
+	sub e
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c086
+	add hl, bc
+	ld a, [hl]
+	add a
+	ld [hl], a
+	ld a, e
+	sbc b
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, d
+	cp [hl]
+	jr c, .asm_9786
+	jr nz, .asm_9773
+	ld hl, $c0ae
+	add hl, bc
+	ld a, e
+	cp [hl]
+	jr c, .asm_9786
+.asm_9773
+	ld hl, $c09e
+	add hl, bc
+	ld [hl], e
+	ld hl, $c096
+	add hl, bc
+	ld [hl], d
+	ld b, $3
+	call Func_9838
+	ld a, e
+	ld [hli], a
+	ld [hl], d
+	ret
+.asm_9786
+	ld hl, $c02e
+	add hl, bc
+	res 4, [hl]
+	res 5, [hl]
+	ret
+
+Func_978f: ; 0x978f
+	ld hl, $c096
+	add hl, bc
+	ld [hl], d
+	ld hl, $c09e
+	add hl, bc
+	ld [hl], e
+	ld hl, $c0b6
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c076
+	add hl, bc
+	sub [hl]
+	jr nc, .asm_97a7
+	ld a, $1
+.asm_97a7
+	ld [hl], a
+	ld hl, $c0ae
+	add hl, bc
+	ld a, e
+	sub [hl]
+	ld e, a
+	ld a, d
+	sbc b
+	ld hl, $c0a6
+	add hl, bc
+	sub [hl]
+	jr c, .asm_97c3
+	ld d, a
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 5, [hl]
+	jr .asm_97e6
+.asm_97c3
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c09e
+	add hl, bc
+	ld e, [hl]
+	ld hl, $c0ae
+	add hl, bc
+	ld a, [hl]
+	sub e
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, [hl]
+	sub d
+	ld d, a
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	res 5, [hl]
+.asm_97e6
+	ld hl, $c076
+	add hl, bc
+.asm_97ea
+	inc b
+	ld a, e
+	sub [hl]
+	ld e, a
+	jr nc, .asm_97ea
+	ld a, d
+	and a
+	jr z, .asm_97f8
+	dec a
+	ld d, a
+	jr .asm_97ea
+.asm_97f8
+	ld a, e
+	add [hl]
+	ld d, b
+	ld b, $0
+	ld hl, $c07e
+	add hl, bc
+	ld [hl], d
+	ld hl, $c086
+	add hl, bc
+	ld [hl], a
+	ld hl, $c08e
+	add hl, bc
+	ld [hl], a
+	ret
+
+Music2_ApplyDutyCycle: ; 0x980d
+	ld b, $0
+	ld hl, $c046
+	add hl, bc
+	ld a, [hl]
+	rlca
+	rlca
+	ld [hl], a
+	and $c0
+	ld d, a
+	ld b, $1
+	call Func_9838
+	ld a, [hl]
+	and $3f
+	or d
+	ld [hl], a
+	ret
+
+Music2_GetNextMusicByte: ; 0x9825
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	ld a, [hli]
+	ld e, a
+	ld a, [hld]
+	ld d, a
+	ld a, [de] ; get next music command
+	inc de
+	ld [hl], e ; store address of next command
+	inc hl
+	ld [hl], d
+	ret
+
+Func_9838: ; 0x9838
+	ld a, c
+	ld hl, Unknown_9b17
+	add l
+	jr nc, .noCarry
+	inc h
+.noCarry
+	ld l, a
+	ld a, [hl]
+	add b
+	ld l, a
+	ld h, $ff
+	ret
+
+Func_9847: ; 0x9847
+	ld h, $0
+.loop
+	srl a
+	jr nc, .noCarry
+	add hl, de
+.noCarry
+	sla e
+	rl d
+	and a
+	jr z, .done
+	jr .loop
+.done
+	ret
+
+Func_9858: ; 0x9858
+	ld h, $0
+	ld l, a
+	add hl, hl
+	ld d, h
+	ld e, l
+	ld hl, Unknown_9b2f
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld a, b
+.loop
+	cp $7
+	jr z, .done
+	sra d
+	rr e
+	inc a
+	jr .loop
+.done
+	ld a, $8
+	add d
+	ld d, a
+	ret
+
+Func_9876:: ; 0x9876
+	ld [$c001], a
+	cp $ff
+	jp z, Func_9a34
+	cp $b9
+	jp z, Func_994e
+	jp c, Func_994e
+	cp $fe
+	jr z, .asm_988d
+	jp nc, Func_994e
+.asm_988d
+	xor a
+	ld [$c000], a
+	ld [$c003], a
+	ld [$c0e9], a
+	ld [$c0e6], a
+	ld [$c0e7], a
+	ld d, $8
+	ld hl, $c016
+	call FillMusicRAM2
+	ld hl, $c006
+	call FillMusicRAM2
+	ld d, $4
+	ld hl, $c026
+	call FillMusicRAM2
+	ld hl, $c02e
+	call FillMusicRAM2
+	ld hl, $c03e
+	call FillMusicRAM2
+	ld hl, $c046
+	call FillMusicRAM2
+	ld hl, $c04e
+	call FillMusicRAM2
+	ld hl, $c056
+	call FillMusicRAM2
+	ld hl, $c05e
+	call FillMusicRAM2
+	ld hl, $c066
+	call FillMusicRAM2
+	ld hl, $c06e
+	call FillMusicRAM2
+	ld hl, $c036
+	call FillMusicRAM2
+	ld hl, $c076
+	call FillMusicRAM2
+	ld hl, $c07e
+	call FillMusicRAM2
+	ld hl, $c086
+	call FillMusicRAM2
+	ld hl, $c08e
+	call FillMusicRAM2
+	ld hl, $c096
+	call FillMusicRAM2
+	ld hl, $c09e
+	call FillMusicRAM2
+	ld hl, $c0a6
+	call FillMusicRAM2
+	ld hl, $c0ae
+	call FillMusicRAM2
+	ld a, $1
+	ld hl, $c0be
+	call FillMusicRAM2
+	ld hl, $c0b6
+	call FillMusicRAM2
+	ld hl, $c0c6
+	call FillMusicRAM2
+	ld [$c0e8], a
+	ld a, $ff
+	ld [$c004], a
+	xor a
+	ld [$ff00+$24], a
+	ld a, $8
+	ld [$ff00+$10], a
+	ld a, $0
+	ld [$ff00+$25], a
+	xor a
+	ld [$ff00+$1a], a
+	ld a, $80
+	ld [$ff00+$1a], a
+	ld a, $77
+	ld [$ff00+$24], a
+	jp Func_9a8f
+
+Func_994e: ; 0x994e
+	ld l, a
+	ld e, a
+	ld h, $0
+	ld d, h
+	add hl, hl
+	add hl, de
+	ld de, SFX_Headers_02
+	add hl, de
+	ld a, h
+	ld [$c0ec], a
+	ld a, l
+	ld [$c0ed], a
+	ld a, [hl]
+	and $c0
+	rlca
+	rlca
+	ld c, a
+.asm_9967
+	ld d, c
+	ld a, c
+	add a
+	add c
+	ld c, a
+	ld b, $0
+	ld a, [$c0ec]
+	ld h, a
+	ld a, [$c0ed]
+	ld l, a
+	add hl, bc
+	ld c, d
+	ld a, [hl]
+	and $f
+	ld e, a
+	ld d, $0
+	ld hl, $c026
+	add hl, de
+	ld a, [hl]
+	and a
+	jr z, .asm_99a3
+	ld a, e
+	cp $7
+	jr nz, .asm_999a
+	ld a, [$c001]
+	cp $14
+	jr nc, .asm_9993
+	ret
+.asm_9993
+	ld a, [hl]
+	cp $14
+	jr z, .asm_99a3
+	jr c, .asm_99a3
+.asm_999a
+	ld a, [$c001]
+	cp [hl]
+	jr z, .asm_99a3
+	jr c, .asm_99a3
+	ret
+.asm_99a3
+	xor a
+	push de
+	ld h, d
+	ld l, e
+	add hl, hl
+	ld d, h
+	ld e, l
+	ld hl, $c016
+	add hl, de
+	ld [hli], a
+	ld [hl], a
+	ld hl, $c006
+	add hl, de
+	ld [hli], a
+	ld [hl], a
+	pop de
+	ld hl, $c026
+	add hl, de
+	ld [hl], a
+	ld hl, $c02e
+	add hl, de
+	ld [hl], a
+	ld hl, $c03e
+	add hl, de
+	ld [hl], a
+	ld hl, $c046
+	add hl, de
+	ld [hl], a
+	ld hl, $c04e
+	add hl, de
+	ld [hl], a
+	ld hl, $c056
+	add hl, de
+	ld [hl], a
+	ld hl, $c05e
+	add hl, de
+	ld [hl], a
+	ld hl, $c066
+	add hl, de
+	ld [hl], a
+	ld hl, $c06e
+	add hl, de
+	ld [hl], a
+	ld hl, $c076
+	add hl, de
+	ld [hl], a
+	ld hl, $c07e
+	add hl, de
+	ld [hl], a
+	ld hl, $c086
+	add hl, de
+	ld [hl], a
+	ld hl, $c08e
+	add hl, de
+	ld [hl], a
+	ld hl, $c096
+	add hl, de
+	ld [hl], a
+	ld hl, $c09e
+	add hl, de
+	ld [hl], a
+	ld hl, $c0a6
+	add hl, de
+	ld [hl], a
+	ld hl, $c0ae
+	add hl, de
+	ld [hl], a
+	ld hl, $c036
+	add hl, de
+	ld [hl], a
+	ld a, $1
+	ld hl, $c0be
+	add hl, de
+	ld [hl], a
+	ld hl, $c0b6
+	add hl, de
+	ld [hl], a
+	ld hl, $c0c6
+	add hl, de
+	ld [hl], a
+	ld a, e
+	cp $4
+	jr nz, .asm_9a2b
+	ld a, $8
+	ld [$ff00+$10], a
+.asm_9a2b
+	ld a, c
+	and a
+	jp z, Func_9a8f
+	dec c
+	jp .asm_9967
+
+Func_9a34: ; 0x9a34
+	ld a, $80
+	ld [$ff00+$26], a
+	ld [$ff00+$1a], a
+	xor a
+	ld [$ff00+$25], a
+	ld [$ff00+$1c], a
+	ld a, $8
+	ld [$ff00+$10], a
+	ld [$ff00+$12], a
+	ld [$ff00+$17], a
+	ld [$ff00+$21], a
+	ld a, $40
+	ld [$ff00+$14], a
+	ld [$ff00+$19], a
+	ld [$ff00+$23], a
+	ld a, $77
+	ld [$ff00+$24], a
+	xor a
+	ld [$c000], a
+	ld [$c003], a
+	ld [$c002], a
+	ld [$c0e9], a
+	ld [$c0eb], a
+	ld [$c0e6], a
+	ld [$c0e7], a
+	ld d, $a0
+	ld hl, $c006
+	call FillMusicRAM2
+	ld a, $1
+	ld d, $18
+	ld hl, $c0b6
+	call FillMusicRAM2
+	ld [$c0e8], a
+	ld [$c0ea], a
+	ld a, $ff
+	ld [$c004], a
+	ret
+
+; fills d bytes at hl with a
+FillMusicRAM2: ; 0x9a89
+	ld b, d
+.loop
+	ld [hli], a
+	dec b
+	jr nz, .loop
+	ret
+
+Func_9a8f: ; 0x9a8f
+	ld a, [$c001]
+	ld l, a
+	ld e, a
+	ld h, $0
+	ld d, h
+	add hl, hl
+	add hl, de
+	ld de, SFX_Headers_02
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, $c006
+	ld a, [de] ; get channel number
+	ld b, a
+	rlca
+	rlca
+	and $3
+	ld c, a
+	ld a, b
+	and $f
+	ld b, c
+	inc b
+	inc de
+	ld c, $0
+.asm_9ab1
+	cp c
+	jr z, .asm_9ab9
+	inc c
+	inc hl
+	inc hl
+	jr .asm_9ab1
+.asm_9ab9
+	push hl
+	push bc
+	push af
+	ld b, $0
+	ld c, a
+	ld hl, $c026
+	add hl, bc
+	ld a, [$c001]
+	ld [hl], a
+	pop af
+	cp $3
+	jr c, .asm_9ad2
+	ld hl, $c02e
+	add hl, bc
+	set 2, [hl]
+.asm_9ad2
+	pop bc
+	pop hl
+	ld a, [de] ; get channel pointer
+	ld [hli], a
+	inc de
+	ld a, [de]
+	ld [hli], a
+	inc de
+	inc c
+	dec b
+	ld a, b
+	and a
+	ld a, [de]
+	inc de
+	jr nz, .asm_9ab1
+	ld a, [$c001]
+	cp $14
+	jr nc, .asm_9aeb
+	jr .asm_9b15
+.asm_9aeb
+	ld a, [$c001]
+	cp $86
+	jr z, .asm_9b15
+	jr c, .asm_9af6
+	jr .asm_9b15
+.asm_9af6
+	ld hl, $c02a
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	ld hl, $c012 ; sfx noise channel pointer
+	ld de, Noise2_endchannel
+	ld [hl], e
+	inc hl
+	ld [hl], d ; overwrite pointer to point to endchannel
+	ld a, [$c005]
+	and a
+	jr nz, .asm_9b15
+	ld a, [$ff00+$24]
+	ld [$c005], a
+	ld a, $77
+	ld [$ff00+$24], a
+.asm_9b15
+	ret
+
+Noise2_endchannel: ; 0x9b16
+	endchannel
+
+Unknown_9b17: ; 0x9b17
+	db $10, $15, $1A, $1F ; channels 0-3
+	db $10, $15, $1A, $1F ; channels 4-7
+
+Unknown_9b1f: ; 0x9b1f
+	db $EE, $DD, $BB, $77 ; channels 0-3
+	db $EE, $DD, $BB, $77 ; channels 4-7
+
+Unknown_9b27: ; 0x9b27
+	db $11, $22, $44, $88 ; channels 0-3
+	db $11, $22, $44, $88 ; channels 4-7
+
+Unknown_9b2f: ; 0x9b2f
+	dw $F82C
+	dw $F89D
+	dw $F907
+	dw $F96B
+	dw $F9CA
+	dw $FA23
+	dw $FA77
+	dw $FAC7
+	dw $FB12
+	dw $FB58
+	dw $FB9B
+	dw $FBDA
+
+
--- /dev/null
+++ b/audio/engine_2.asm
@@ -1,0 +1,1733 @@
+; The second of three duplicated sound engines.
+
+Func_21879:: ; 21879 (8:5879)
+	ld c, CH0
+.loop
+	ld b, $0
+	ld hl, $c026
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .nextChannel
+	ld a, c
+	cp CH4
+	jr nc, .applyAffects ; if sfx channel
+	ld a, [$c002]
+	and a
+	jr z, .applyAffects
+	bit 7, a
+	jr nz, .nextChannel
+	set 7, a
+	ld [$c002], a
+	xor a
+	ld [$FF00+$25], a
+	ld [$FF00+$1a], a
+	ld a, $80
+	ld [$FF00+$1a], a
+	jr .nextChannel
+.applyAffects
+	call Music8_ApplyMusicAffects
+.nextChannel
+	ld a, c
+	inc c
+	cp CH7
+	jr nz, .loop
+	ret
+
+; this routine checks flags for music effects currently applied
+; to the channel and calls certain functions based on flags.
+; known flags for $c02e:
+;	1: call has been used
+;	3: a toggle used only by this routine for vibrato
+;	4: pitchbend flag
+;	6: dutycycle flag
+Music8_ApplyMusicAffects: ; 218ae (8:58ae)
+	ld b, $0
+	ld hl, $c0b6 ; delay unitl next note
+	add hl, bc
+	ld a, [hl]
+	cp $1 ; if the delay is 1, play next note
+	jp z, Music8_PlayNextNote
+	dec a ; otherwise, decrease the delay timer
+	ld [hl], a
+	ld a, c
+	cp CH4
+	jr nc, .startChecks ; if a sfx channel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .startChecks
+	ret
+.startChecks
+	ld hl, $c02e
+	add hl, bc
+	bit 6, [hl] ; dutycycle
+	jr z, .checkForExecuteMusic
+	call Music8_ApplyDutyCycle
+.checkForExecuteMusic
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, .checkForPitchBend
+	ld hl, $c02e
+	add hl, bc
+	bit 2, [hl]
+	jr nz, .disablePitchBendVibrato
+.checkForPitchBend
+	ld hl, $c02e
+	add hl, bc
+	bit 4, [hl] ; pitchbend
+	jr z, .checkVibratoDelay
+	jp Music8_ApplyPitchBend
+.checkVibratoDelay
+	ld hl, $c04e ; vibrato delay
+	add hl, bc
+	ld a, [hl]
+	and a ; check if delay is over
+	jr z, .checkForVibrato
+	dec [hl] ; otherwise, dec delay
+.disablePitchBendVibrato
+	ret
+.checkForVibrato
+	ld hl, $c056 ; vibrato rate
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .vibrato
+	ret ; no vibrato
+.vibrato
+	ld d, a
+	ld hl, $c05e
+	add hl, bc
+	ld a, [hl]
+	and $f
+	and a
+	jr z, .vibratoAlreadyDone
+	dec [hl] ; apply vibrato pitch change
+	ret
+.vibratoAlreadyDone
+	ld a, [hl]
+	swap [hl]
+	or [hl]
+	ld [hl], a ; reset the vibrato value and start again
+	ld hl, $c066
+	add hl, bc
+	ld e, [hl] ; get note pitch
+	ld hl, $c02e
+	add hl, bc
+	bit 3, [hl] ; this is the only code that sets/resets bit three so
+	jr z, .unset ; it continuously alternates which path it takes
+	res 3, [hl]
+	ld a, d
+	and $f
+	ld d, a
+	ld a, e
+	sub d
+	jr nc, .noCarry
+	ld a, $0
+.noCarry
+	jr .done
+.unset
+	set 3, [hl]
+	ld a, d
+	and $f0
+	swap a
+	add e
+	jr nc, .done
+	ld a, $ff
+.done
+	ld d, a
+	ld b, $3
+	call Func_21ff7
+	ld [hl], d
+	ret
+
+; this routine executes all music commands that take up no time,
+; like tempo changes, duty changes etc. and doesn't return
+; until the first note is reached
+Music8_PlayNextNote: ; 21946 (8:5946)
+	ld hl, $c06e
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c04e
+	add hl, bc
+	ld [hl], a
+	ld hl, $c02e
+	add hl, bc
+	res 4, [hl]
+	res 5, [hl]
+	ld a, c
+	cp CH4
+	jr nz, .beginChecks
+	ld a, [$d083]
+	bit 7, a
+	ret nz
+.beginChecks
+	call Music8_endchannel
+	ret
+
+Music8_endchannel: ; 21967 (8:5967)
+	call Music8_GetNextMusicByte
+	ld d, a
+	cp $ff ; is this command an endchannel?
+	jp nz, Music8_callchannel ; no
+	ld b, $0 ; yes
+	ld hl, $c02e
+	add hl, bc
+	bit 1, [hl]
+	jr nz, .returnFromCall
+	ld a, c
+	cp CH3
+	jr nc, .noiseOrSfxChannel
+	jr .asm_219c0
+.noiseOrSfxChannel
+	res 2, [hl]
+	ld hl, $c036
+	add hl, bc
+	res 0, [hl]
+	cp CH6
+	jr nz, .notSfxChannel3
+	ld a, $0
+	ld [$FF00+$1a], a
+	ld a, $80
+	ld [$FF00+$1a], a
+.notSfxChannel3
+	jr nz, .asm_219a3
+	ld a, [$c003]
+	and a
+	jr z, .asm_219a3
+	xor a
+	ld [$c003], a
+	jr .asm_219c0
+.asm_219a3
+	jr .asm_219c9
+.returnFromCall
+	res 1, [hl]
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	push hl ; store current channel address
+	ld hl, $c016
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	ld a, [de]
+	ld [hli], a
+	inc de
+	ld a, [de]
+	ld [hl], a ; loads channel address to return to
+	jp Music8_endchannel
+.asm_219c0
+	ld hl, Unknown_222de
+	add hl, bc
+	ld a, [$FF00+$25]
+	and [hl]
+	ld [$FF00+$25], a
+.asm_219c9
+	ld a, [$c02a]
+	cp $14
+	jr nc, .asm_219d2
+	jr .asm_219ef
+.asm_219d2
+	ld a, [$c02a]
+	cp $86
+	jr z, .asm_219ef
+	jr c, .asm_219dd
+	jr .asm_219ef
+.asm_219dd
+	ld a, c
+	cp CH4
+	jr z, .asm_219e6
+	call Func_21e6d
+	ret c
+.asm_219e6
+	ld a, [$c005]
+	ld [$FF00+$24], a
+	xor a
+	ld [$c005], a
+.asm_219ef
+	ld hl, $c026
+	add hl, bc
+	ld [hl], b
+	ret
+
+Music8_callchannel: ; 219f5 (8:59f5)
+	cp $fd ; is this command a callchannel?
+	jp nz, Music8_loopchannel ; no
+	call Music8_GetNextMusicByte ; yes
+	push af
+	call Music8_GetNextMusicByte
+	ld d, a
+	pop af
+	ld e, a
+	push de ; store pointer
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	push hl
+	ld hl, $c016
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hld]
+	ld [de], a ; copy current channel address
+	pop de
+	ld [hl], e
+	inc hl
+	ld [hl], d ; overwrite current address with pointer
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 1, [hl] ; set the call flag
+	jp Music8_endchannel
+
+Music8_loopchannel: ; 21a2a (8:5a2a)
+	cp $fe ; is this command a loopchannel?
+	jp nz, Music8_notetype ; no
+	call Music8_GetNextMusicByte ; yes
+	ld e, a
+	and a
+	jr z, .infiniteLoop
+	ld b, $0
+	ld hl, $c0be
+	add hl, bc
+	ld a, [hl]
+	cp e
+	jr nz, .loopAgain
+	ld a, $1 ; if no more loops to make,
+	ld [hl], a
+	call Music8_GetNextMusicByte ; skip pointer
+	call Music8_GetNextMusicByte
+	jp Music8_endchannel
+.loopAgain ; inc loop count
+	inc a
+	ld [hl], a
+	; fall through
+.infiniteLoop ; overwrite current address with pointer
+	call Music8_GetNextMusicByte
+	push af
+	call Music8_GetNextMusicByte
+	ld b, a
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	pop af
+	ld [hli], a
+	ld [hl], b
+	jp Music8_endchannel
+
+Music8_notetype: ; 21a65 (8:5a65)
+	and $f0
+	cp $d0 ; is this command a notetype?
+	jp nz, Music8_togglecall ; no
+	ld a, d ; yes
+	and $f
+	ld b, $0
+	ld hl, $c0c6
+	add hl, bc
+	ld [hl], a ; store low nibble as speed
+	ld a, c
+	cp CH3
+	jr z, .noiseChannel ; noise channel has 0 params
+	call Music8_GetNextMusicByte
+	ld d, a
+	ld a, c
+	cp CH2
+	jr z, .musicChannel3
+	cp CH6
+	jr nz, .notChannel3
+	ld hl, $c0e7
+	jr .sfxChannel3
+.musicChannel3
+	ld hl, $c0e6
+.sfxChannel3
+	ld a, d
+	and $f
+	ld [hl], a ; store low nibble of param as duty
+	ld a, d
+	and $30
+	sla a
+	ld d, a
+	; fall through
+
+	; if channel 3, store high nibble as volume
+	; else, store volume (high nibble) and fade (low nibble)
+.notChannel3
+	ld b, $0
+	ld hl, $c0de
+	add hl, bc
+	ld [hl], d
+.noiseChannel
+	jp Music8_endchannel
+
+Music8_togglecall: ; 21aa4 (8:5aa4)
+	ld a, d
+	cp $e8 ; is this command an togglecall?
+	jr nz, Music8_vibrato ; no
+	ld b, $0 ; yes
+	ld hl, $c02e
+	add hl, bc
+	ld a, [hl]
+	xor $1
+	ld [hl], a ; flip bit 0 of $c02e (toggle returning from call)
+	jp Music8_endchannel
+
+Music8_vibrato: ; 21ab6 (8:5ab6)
+	cp $ea ; is this command a vibrato?
+	jr nz, Music8_pitchbend ; no
+	call Music8_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c04e
+	add hl, bc
+	ld [hl], a ; store delay 
+	ld hl, $c06e
+	add hl, bc
+	ld [hl], a ; store delay 
+	call Music8_GetNextMusicByte
+	ld d, a
+	and $f0
+	swap a
+	ld b, $0
+	ld hl, $c056
+	add hl, bc
+	srl a
+	ld e, a
+	adc b
+	swap a
+	or e
+	ld [hl], a ; store rate as both high and low nibbles
+	ld a, d
+	and $f
+	ld d, a
+	ld hl, $c05e
+	add hl, bc
+	swap a
+	or d
+	ld [hl], a ; store depth as both high and low nibbles
+	jp Music8_endchannel
+
+Music8_pitchbend: ; 21aee (8:5aee)
+	cp $eb ; is this command a pitchbend?
+	jr nz, Music8_duty ; no
+	call Music8_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c076
+	add hl, bc
+	ld [hl], a ; store first param
+	call Music8_GetNextMusicByte
+	ld d, a
+	and $f0
+	swap a
+	ld b, a
+	ld a, d
+	and $f
+	call Func_22017
+	ld b, $0
+	ld hl, $c0a6
+	add hl, bc
+	ld [hl], d ; store unknown part of second param
+	ld hl, $c0ae
+	add hl, bc
+	ld [hl], e ; store unknown part of second param
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 4, [hl] ; set pitchbend flag
+	call Music8_GetNextMusicByte
+	ld d, a
+	jp Music8_notelength
+
+Music8_duty: ; 21b26 (8:5b26)
+	cp $ec ; is this command a duty?
+	jr nz, Music8_tempo ; no
+	call Music8_GetNextMusicByte ; yes
+	rrca
+	rrca
+	and $c0
+	ld b, $0
+	ld hl, $c03e
+	add hl, bc
+	ld [hl], a ; store duty
+	jp Music8_endchannel
+
+Music8_tempo: ; 21b3b (8:5b3b)
+	cp $ed ; is this command a tempo?
+	jr nz, Music8_unknownmusic0xee ; no
+	ld a, c ; yes
+	cp CH4
+	jr nc, .sfxChannel
+	call Music8_GetNextMusicByte
+	ld [$c0e8], a ; store first param
+	call Music8_GetNextMusicByte
+	ld [$c0e9], a ; store second param
+	xor a
+	ld [$c0ce], a ; clear RAM
+	ld [$c0cf], a
+	ld [$c0d0], a
+	ld [$c0d1], a
+	jr .musicChannelDone
+.sfxChannel
+	call Music8_GetNextMusicByte
+	ld [$c0ea], a ; store first param
+	call Music8_GetNextMusicByte
+	ld [$c0eb], a ; store second param
+	xor a
+	ld [$c0d2], a ; clear RAM
+	ld [$c0d3], a
+	ld [$c0d4], a
+	ld [$c0d5], a
+.musicChannelDone
+	jp Music8_endchannel
+
+Music8_unknownmusic0xee: ; 21b7b (8:5b7b)
+	cp $ee ; is this command an unknownmusic0xee?
+	jr nz, Music8_unknownmusic0xef ; no
+	call Music8_GetNextMusicByte ; yes
+	ld [$c004], a ; store first param
+	jp Music8_endchannel
+
+; this appears to never be used
+Music8_unknownmusic0xef: ; 21b88 (8:5b88)
+	cp $ef ; is this command an unknownmusic0xef?
+	jr nz, Music8_dutycycle ; no
+	call Music8_GetNextMusicByte ; yes
+	push bc
+	call Func_22035
+	pop bc
+	ld a, [$c003]
+	and a
+	jr nz, .skip
+	ld a, [$c02d]
+	ld [$c003], a
+	xor a
+	ld [$c02d], a
+.skip
+	jp Music8_endchannel
+
+Music8_dutycycle: ; 21ba7 (8:5ba7)
+	cp $fc ; is this command a dutycycle?
+	jr nz, Music8_stereopanning ; no
+	call Music8_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c046
+	add hl, bc
+	ld [hl], a ; store full cycle
+	and $c0
+	ld hl, $c03e
+	add hl, bc
+	ld [hl], a ; store first duty
+	ld hl, $c02e
+	add hl, bc
+	set 6, [hl] ; set dutycycle flag
+	jp Music8_endchannel
+
+Music8_stereopanning: ; 21bc5 (8:5bc5)
+	cp $f0 ; is this command a stereopanning?
+	jr nz, Music8_executemusic ; no
+	call Music8_GetNextMusicByte ; yes
+	ld [$FF00+$24], a
+	jp Music8_endchannel
+
+Music8_executemusic: ; 21bd1 (8:5bd1)
+	cp $f8 ; is this command an executemusic?
+	jr nz, Music8_octave ; no
+	ld b, $0 ; yes
+	ld hl, $c036
+	add hl, bc
+	set 0, [hl]
+	jp Music8_endchannel
+
+Music8_octave: ; 21be0 (8:5be0)
+	and $f0
+	cp $e0 ; is this command an octave?
+	jr nz, Music8_unknownsfx0x20 ; no
+	ld hl, $c0d6 ; yes
+	ld b, $0
+	add hl, bc
+	ld a, d
+	and $f
+	ld [hl], a ; store low nibble as octave
+	jp Music8_endchannel
+
+Music8_unknownsfx0x20: ; 21bf3
+	cp $20 ; is this command an unknownsfx0x20?
+	jr nz, Music8_unknownsfx0x10 ; no
+	ld a, c
+	cp CH3 ; is this a noise or sfx channel?
+	jr c, Music8_unknownsfx0x10 ; no
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music8_unknownsfx0x10 ; no
+	call Music8_notelength
+	ld d, a
+	ld b, $0
+	ld hl, $c03e
+	add hl, bc
+	ld a, [hl]
+	or d
+	ld d, a
+	ld b, $1
+	call Func_21ff7
+	ld [hl], d
+	call Music8_GetNextMusicByte
+	ld d, a
+	ld b, $2
+	call Func_21ff7
+	ld [hl], d
+	call Music8_GetNextMusicByte
+	ld e, a
+	ld a, c
+	cp CH7
+	ld a, $0
+	jr z, .sfxNoiseChannel ; only two params for noise channel
+	push de
+	call Music8_GetNextMusicByte
+	pop de
+.sfxNoiseChannel
+	ld d, a
+	push de
+	call Func_21daa
+	call Func_21d79
+	pop de
+	call Func_21dcc
+	ret
+
+Music8_unknownsfx0x10: ; 21c40 (8:5c40)
+	ld a, c
+	cp CH4
+	jr c, Music8_note ; if not a sfx
+	ld a, d
+	cp $10 ; is this command a unknownsfx0x10?
+	jr nz, Music8_note ; no
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music8_note ; no
+	call Music8_GetNextMusicByte ; yes
+	ld [$FF00+$10], a
+	jp Music8_endchannel
+
+Music8_note: ; 21c5c (8:5c5c)
+	ld a, c
+	cp CH3
+	jr nz, Music8_notelength ; if not noise channel
+	ld a, d
+	and $f0
+	cp $b0 ; is this command a dnote?
+	jr z, Music8_dnote ; yes
+	jr nc, Music8_notelength ; no
+	swap a
+	ld b, a
+	ld a, d
+	and $f
+	ld d, a
+	ld a, b
+	push de
+	push bc
+	jr asm_21c7e
+
+Music8_dnote: ; 21c76 (8:5c76)
+	ld a, d
+	and $f
+	push af
+	push bc
+	call Music8_GetNextMusicByte ; get dnote instrument
+asm_21c7e
+	ld d, a
+	ld a, [$c003]
+	and a
+	jr nz, .asm_21c89
+	ld a, d
+	call Func_22035
+.asm_21c89
+	pop bc
+	pop de
+
+Music8_notelength: ; 21c8b (8:5c8b)
+	ld a, d
+	push af
+	and $f
+	inc a
+	ld b, $0
+	ld e, a ; store note length (in 16ths)
+	ld d, b
+	ld hl, $c0c6
+	add hl, bc
+	ld a, [hl]
+	ld l, b
+	call Func_22006
+	ld a, c
+	cp CH4
+	jr nc, .sfxChannel
+	ld a, [$c0e8]
+	ld d, a
+	ld a, [$c0e9]
+	ld e, a
+	jr .skip
+.sfxChannel
+	ld d, $1
+	ld e, $0
+	cp CH7
+	jr z, .skip ; if noise channel
+	call Func_21e2f
+	ld a, [$c0ea]
+	ld d, a
+	ld a, [$c0eb]
+	ld e, a
+.skip
+	ld a, l
+	ld b, $0
+	ld hl, $c0ce
+	add hl, bc
+	ld l, [hl]
+	call Func_22006
+	ld e, l
+	ld d, h
+	ld hl, $c0ce
+	add hl, bc
+	ld [hl], e
+	ld a, d
+	ld hl, $c0b6
+	add hl, bc
+	ld [hl], a
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music8_notepitch
+	ld hl, $c02e
+	add hl, bc
+	bit 2, [hl]
+	jr z, Music8_notepitch
+	pop hl
+	ret
+
+Music8_notepitch: ; 21ce9 (8:5ce9)
+	pop af
+	and $f0
+	cp $c0 ; compare to rest
+	jr nz, .notRest
+	ld a, c
+	cp CH4
+	jr nc, .sfxChannel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .done
+	; fall through
+.sfxChannel
+	ld a, c
+	cp CH2
+	jr z, .musicChannel3
+	cp CH6
+	jr nz, .notSfxChannel3
+.musicChannel3
+	ld b, $0
+	ld hl, Unknown_222de
+	add hl, bc
+	ld a, [$FF00+$25]
+	and [hl]
+	ld [$FF00+$25], a
+	jr .done
+.notSfxChannel3
+	ld b, $2
+	call Func_21ff7
+	ld a, $8
+	ld [hli], a
+	inc hl
+	ld a, $80
+	ld [hl], a
+.done
+	ret
+.notRest
+	swap a
+	ld b, $0
+	ld hl, $c0d6
+	add hl, bc
+	ld b, [hl]
+	call Func_22017
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	bit 4, [hl]
+	jr z, .asm_21d39
+	call Func_21f4e
+.asm_21d39
+	push de
+	ld a, c
+	cp CH4
+	jr nc, .skip ; if sfx channel
+	ld hl, $c02a
+	ld d, $0
+	ld e, a
+	add hl, de
+	ld a, [hl]
+	and a
+	jr nz, .asm_21d4c
+	jr .skip
+.asm_21d4c
+	pop de
+	ret
+.skip
+	ld b, $0
+	ld hl, $c0de
+	add hl, bc
+	ld d, [hl]
+	ld b, $2
+	call Func_21ff7
+	ld [hl], d
+	call Func_21daa
+	call Func_21d79
+	pop de
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	bit 0, [hl]
+	jr z, .asm_21d70
+	inc e
+	jr nc, .asm_21d70
+	inc d
+.asm_21d70
+	ld hl, $c066
+	add hl, bc
+	ld [hl], e
+	call Func_21dcc
+	ret
+
+Func_21d79: ; 21d79 (8:5d79)
+	ld b, $0
+	ld hl, Unknown_222e6
+	add hl, bc
+	ld a, [$FF00+$25]
+	or [hl]
+	ld d, a
+	ld a, c
+	cp CH7
+	jr z, .sfxNoiseChannel
+	cp CH4
+	jr nc, .skip ; if sfx channel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .skip
+.sfxNoiseChannel
+	ld a, [$c004]
+	ld hl, Unknown_222e6
+	add hl, bc
+	and [hl]
+	ld d, a
+	ld a, [$FF00+$25]
+	ld hl, Unknown_222de
+	add hl, bc
+	and [hl]
+	or d
+	ld d, a
+.skip
+	ld a, d
+	ld [$FF00+$25], a
+	ret
+
+Func_21daa: ; 21daa (8:5daa)
+	ld b, $0
+	ld hl, $c0b6
+	add hl, bc
+	ld d, [hl]
+	ld a, c
+	cp CH2
+	jr z, .channel3 ; if music channel 3
+	cp CH6
+	jr z, .channel3 ; if sfx channel 3
+	ld a, d
+	and $3f
+	ld d, a
+	ld hl, $c03e
+	add hl, bc
+	ld a, [hl]
+	or d
+	ld d, a
+.channel3
+	ld b, $1
+	call Func_21ff7
+	ld [hl], d
+	ret
+
+Func_21dcc: ; 21dcc (8:5dcc)
+	ld a, c
+	cp CH2
+	jr z, .channel3
+	cp CH6
+	jr nz, .notSfxChannel3
+	; fall through
+.channel3
+	push de
+	ld de, $c0e6
+	cp CH2
+	jr z, .musicChannel3
+	ld de, $c0e7
+.musicChannel3
+	ld a, [de]
+	add a
+	ld d, $0
+	ld e, a
+	ld hl, Music8_Channel3DutyPointers
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, $ff30
+	ld b, $f
+	ld a, $0
+	ld [$FF00+$1a], a
+.loop
+	ld a, [de]
+	inc de
+	ld [hli], a
+	ld a, b
+	dec b
+	and a
+	jr nz, .loop
+	ld a, $80
+	ld [$FF00+$1a], a
+	pop de
+.notSfxChannel3
+	ld a, d
+	or $80
+	and $c7
+	ld d, a
+	ld b, $3
+	call Func_21ff7
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ld a, c
+	cp CH4
+	jr c, .musicChannel
+	call Func_21e56
+.musicChannel
+	ret
+
+Func_21e19: ; 21e19 (8:5e19)
+	ld a, c
+	cp CH4
+	jr nz, .asm_21e2e
+	ld a, [$d083]
+	bit 7, a
+	jr z, .asm_21e2e
+	xor a
+	ld [$c0f1], a
+	ld a, $80
+	ld [$c0f2], a
+.asm_21e2e
+	ret
+
+Func_21e2f: ; 21e2f (8:5e2f)
+	call Func_21e8b
+	jr c, .asm_21e39
+	call Func_21e9f
+	jr nc, .asm_21e4c
+.asm_21e39
+	ld d, $0
+	ld a, [$c0f2]
+	add $80
+	jr nc, .asm_21e43
+	inc d
+.asm_21e43
+	ld [$c0eb], a
+	ld a, d
+	ld [$c0ea], a
+	jr .asm_21e55
+.asm_21e4c
+	xor a
+	ld [$c0eb], a
+	ld a, $1
+	ld [$c0ea], a
+.asm_21e55
+	ret
+
+Func_21e56: ; 21e56 (8:5e56)
+	call Func_21e8b
+	jr c, .asm_21e60
+	call Func_21e9f
+	jr nc, .asm_21e6c
+.asm_21e60
+	ld a, [$c0f1]
+	add e
+	jr nc, .asm_21e67
+	inc d
+.asm_21e67
+	dec hl
+	ld e, a
+	ld [hl], e
+	inc hl
+	ld [hl], d
+.asm_21e6c
+	ret
+
+Func_21e6d: ; 21e6d (8:5e6d)
+	call Func_21e8b
+	jr nc, .asm_21e88
+	ld hl, $c006
+	ld e, c
+	ld d, $0
+	sla e
+	rl d
+	add hl, de
+	ld a, [hl]
+	sub $1
+	ld [hl], a
+	inc hl
+	ld a, [hl]
+	sbc $0
+	ld [hl], a
+	scf
+	ret
+.asm_21e88
+	scf
+	ccf
+	ret
+
+Func_21e8b: ; 21e8b (8:5e8b)
+	ld a, [$c02a]
+	cp $14
+	jr nc, .asm_21e94
+	jr .asm_21e9a
+.asm_21e94
+	cp $86
+	jr z, .asm_21e9a
+	jr c, .asm_21e9d
+.asm_21e9a
+	scf
+	ccf
+	ret
+.asm_21e9d
+	scf
+	ret
+
+Func_21e9f: ; 21e9f (8:5e9f)
+	ld a, [$c02d]
+	ld b, a
+	ld a, [$c02a]
+	or b
+	cp $9d
+	jr nc, .asm_21ead
+	jr .asm_21eb3
+.asm_21ead
+	cp $ea
+	jr z, .asm_21eb3
+	jr c, .asm_21eb6
+.asm_21eb3
+	scf
+	ccf
+	ret
+.asm_21eb6
+	scf
+	ret
+
+Music8_ApplyPitchBend: ; 21eb8 (8:5eb8)
+	ld hl, $c02e
+	add hl, bc
+	bit 5, [hl]
+	jp nz, .asm_21eff
+	ld hl, $c09e
+	add hl, bc
+	ld e, [hl]
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c07e
+	add hl, bc
+	ld l, [hl]
+	ld h, b
+	add hl, de
+	ld d, h
+	ld e, l
+	ld hl, $c08e
+	add hl, bc
+	push hl
+	ld hl, $c086
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	add [hl]
+	ld [hl], a
+	ld a, $0
+	adc e
+	ld e, a
+	ld a, $0
+	adc d
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, [hl]
+	cp d
+	jp c, .asm_21f45
+	jr nz, .asm_21f32
+	ld hl, $c0ae
+	add hl, bc
+	ld a, [hl]
+	cp e
+	jp c, .asm_21f45
+	jr .asm_21f32
+.asm_21eff
+	ld hl, $c09e
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c07e
+	add hl, bc
+	ld e, [hl]
+	sub e
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c086
+	add hl, bc
+	ld a, [hl]
+	add a
+	ld [hl], a
+	ld a, e
+	sbc b
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, d
+	cp [hl]
+	jr c, .asm_21f45
+	jr nz, .asm_21f32
+	ld hl, $c0ae
+	add hl, bc
+	ld a, e
+	cp [hl]
+	jr c, .asm_21f45
+.asm_21f32
+	ld hl, $c09e
+	add hl, bc
+	ld [hl], e
+	ld hl, $c096
+	add hl, bc
+	ld [hl], d
+	ld b, $3
+	call Func_21ff7
+	ld a, e
+	ld [hli], a
+	ld [hl], d
+	ret
+.asm_21f45
+	ld hl, $c02e
+	add hl, bc
+	res 4, [hl]
+	res 5, [hl]
+	ret
+
+Func_21f4e: ; 21f4e (8:5f4e)
+	ld hl, $c096
+	add hl, bc
+	ld [hl], d
+	ld hl, $c09e
+	add hl, bc
+	ld [hl], e
+	ld hl, $c0b6
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c076
+	add hl, bc
+	sub [hl]
+	jr nc, .asm_21f66
+	ld a, $1
+.asm_21f66
+	ld [hl], a
+	ld hl, $c0ae
+	add hl, bc
+	ld a, e
+	sub [hl]
+	ld e, a
+	ld a, d
+	sbc b
+	ld hl, $c0a6
+	add hl, bc
+	sub [hl]
+	jr c, .asm_21f82
+	ld d, a
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 5, [hl]
+	jr .asm_21fa5
+.asm_21f82
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c09e
+	add hl, bc
+	ld e, [hl]
+	ld hl, $c0ae
+	add hl, bc
+	ld a, [hl]
+	sub e
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, [hl]
+	sub d
+	ld d, a
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	res 5, [hl]
+.asm_21fa5
+	ld hl, $c076
+	add hl, bc
+.asm_21fa9
+	inc b
+	ld a, e
+	sub [hl]
+	ld e, a
+	jr nc, .asm_21fa9
+	ld a, d
+	and a
+	jr z, .asm_21fb7
+	dec a
+	ld d, a
+	jr .asm_21fa9
+.asm_21fb7
+	ld a, e
+	add [hl]
+	ld d, b
+	ld b, $0
+	ld hl, $c07e
+	add hl, bc
+	ld [hl], d
+	ld hl, $c086
+	add hl, bc
+	ld [hl], a
+	ld hl, $c08e
+	add hl, bc
+	ld [hl], a
+	ret
+
+Music8_ApplyDutyCycle: ; 21fcc (8:5fcc)
+	ld b, $0
+	ld hl, $c046
+	add hl, bc
+	ld a, [hl]
+	rlca
+	rlca
+	ld [hl], a
+	and $c0
+	ld d, a
+	ld b, $1
+	call Func_21ff7
+	ld a, [hl]
+	and $3f
+	or d
+	ld [hl], a
+	ret
+
+Music8_GetNextMusicByte: ; 21fe4 (8:5fe4)
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	ld a, [hli]
+	ld e, a
+	ld a, [hld]
+	ld d, a
+	ld a, [de] ; get next music command
+	inc de
+	ld [hl], e ; store address of next command
+	inc hl
+	ld [hl], d
+	ret
+
+Func_21ff7: ; 21ff7 (8:5ff7)
+	ld a, c
+	ld hl, Unknown_222d6
+	add l
+	jr nc, .noCarry
+	inc h
+.noCarry
+	ld l, a
+	ld a, [hl]
+	add b
+	ld l, a
+	ld h, $ff
+	ret
+
+Func_22006: ; 22006 (8:6006)
+	ld h, $0
+.loop
+	srl a
+	jr nc, .noCarry
+	add hl, de
+.noCarry
+	sla e
+	rl d
+	and a
+	jr z, .done
+	jr .loop
+.done
+	ret
+
+Func_22017: ; 22017 (8:6017)
+	ld h, $0
+	ld l, a
+	add hl, hl
+	ld d, h
+	ld e, l
+	ld hl, Unknown_222ee
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld a, b
+.loop
+	cp CH7
+	jr z, .done
+	sra d
+	rr e
+	inc a
+	jr .loop
+.done
+	ld a, $8
+	add d
+	ld d, a
+	ret
+
+Func_22035:: ; 22035 (8:6035)
+	ld [$c001], a
+	cp $ff
+	jp z, Func_221f3
+	cp $e9
+	jp z, Func_2210d
+	jp c, Func_2210d
+	cp $fe
+	jr z, .asm_2204c
+	jp nc, Func_2210d
+.asm_2204c
+	xor a
+	ld [$c000], a
+	ld [$c003], a
+	ld [$c0e9], a
+	ld [$c0e6], a
+	ld [$c0e7], a
+	ld d, $8
+	ld hl, $c016
+	call FillMusicRAM8
+	ld hl, $c006
+	call FillMusicRAM8
+	ld d, $4
+	ld hl, $c026
+	call FillMusicRAM8
+	ld hl, $c02e
+	call FillMusicRAM8
+	ld hl, $c03e
+	call FillMusicRAM8
+	ld hl, $c046
+	call FillMusicRAM8
+	ld hl, $c04e
+	call FillMusicRAM8
+	ld hl, $c056
+	call FillMusicRAM8
+	ld hl, $c05e
+	call FillMusicRAM8
+	ld hl, $c066
+	call FillMusicRAM8
+	ld hl, $c06e
+	call FillMusicRAM8
+	ld hl, $c036
+	call FillMusicRAM8
+	ld hl, $c076
+	call FillMusicRAM8
+	ld hl, $c07e
+	call FillMusicRAM8
+	ld hl, $c086
+	call FillMusicRAM8
+	ld hl, $c08e
+	call FillMusicRAM8
+	ld hl, $c096
+	call FillMusicRAM8
+	ld hl, $c09e
+	call FillMusicRAM8
+	ld hl, $c0a6
+	call FillMusicRAM8
+	ld hl, $c0ae
+	call FillMusicRAM8
+	ld a, $1
+	ld hl, $c0be
+	call FillMusicRAM8
+	ld hl, $c0b6
+	call FillMusicRAM8
+	ld hl, $c0c6
+	call FillMusicRAM8
+	ld [$c0e8], a
+	ld a, $ff
+	ld [$c004], a
+	xor a
+	ld [$FF00+$24], a
+	ld a, $8
+	ld [$FF00+$10], a
+	ld a, $0
+	ld [$FF00+$25], a
+	xor a
+	ld [$FF00+$1a], a
+	ld a, $80
+	ld [$FF00+$1a], a
+	ld a, $77
+	ld [$FF00+$24], a
+	jp Func_2224e
+
+Func_2210d: ; 2210d (8:610d)
+	ld l, a
+	ld e, a
+	ld h, $0
+	ld d, h
+	add hl, hl
+	add hl, de
+	ld de, SFX_Headers_08
+	add hl, de
+	ld a, h
+	ld [$c0ec], a
+	ld a, l
+	ld [$c0ed], a
+	ld a, [hl]
+	and $c0
+	rlca
+	rlca
+	ld c, a
+.asm_22126
+	ld d, c
+	ld a, c
+	add a
+	add c
+	ld c, a
+	ld b, $0
+	ld a, [$c0ec]
+	ld h, a
+	ld a, [$c0ed]
+	ld l, a
+	add hl, bc
+	ld c, d
+	ld a, [hl]
+	and $f
+	ld e, a
+	ld d, $0
+	ld hl, $c026
+	add hl, de
+	ld a, [hl]
+	and a
+	jr z, .asm_22162
+	ld a, e
+	cp $7
+	jr nz, .asm_22159
+	ld a, [$c001]
+	cp $14
+	jr nc, .asm_22152
+	ret
+.asm_22152
+	ld a, [hl]
+	cp $14
+	jr z, .asm_22162
+	jr c, .asm_22162
+.asm_22159
+	ld a, [$c001]
+	cp [hl]
+	jr z, .asm_22162
+	jr c, .asm_22162
+	ret
+.asm_22162
+	xor a
+	push de
+	ld h, d
+	ld l, e
+	add hl, hl
+	ld d, h
+	ld e, l
+	ld hl, $c016
+	add hl, de
+	ld [hli], a
+	ld [hl], a
+	ld hl, $c006
+	add hl, de
+	ld [hli], a
+	ld [hl], a
+	pop de
+	ld hl, $c026
+	add hl, de
+	ld [hl], a
+	ld hl, $c02e
+	add hl, de
+	ld [hl], a
+	ld hl, $c03e
+	add hl, de
+	ld [hl], a
+	ld hl, $c046
+	add hl, de
+	ld [hl], a
+	ld hl, $c04e
+	add hl, de
+	ld [hl], a
+	ld hl, $c056
+	add hl, de
+	ld [hl], a
+	ld hl, $c05e
+	add hl, de
+	ld [hl], a
+	ld hl, $c066
+	add hl, de
+	ld [hl], a
+	ld hl, $c06e
+	add hl, de
+	ld [hl], a
+	ld hl, $c076
+	add hl, de
+	ld [hl], a
+	ld hl, $c07e
+	add hl, de
+	ld [hl], a
+	ld hl, $c086
+	add hl, de
+	ld [hl], a
+	ld hl, $c08e
+	add hl, de
+	ld [hl], a
+	ld hl, $c096
+	add hl, de
+	ld [hl], a
+	ld hl, $c09e
+	add hl, de
+	ld [hl], a
+	ld hl, $c0a6
+	add hl, de
+	ld [hl], a
+	ld hl, $c0ae
+	add hl, de
+	ld [hl], a
+	ld hl, $c036
+	add hl, de
+	ld [hl], a
+	ld a, $1
+	ld hl, $c0be
+	add hl, de
+	ld [hl], a
+	ld hl, $c0b6
+	add hl, de
+	ld [hl], a
+	ld hl, $c0c6
+	add hl, de
+	ld [hl], a
+	ld a, e
+	cp $4
+	jr nz, .asm_221ea
+	ld a, $8
+	ld [$FF00+$10], a
+.asm_221ea
+	ld a, c
+	and a
+	jp z, Func_2224e
+	dec c
+	jp .asm_22126
+
+Func_221f3: ; 221f3 (8:61f3)
+	ld a, $80
+	ld [$FF00+$26], a
+	ld [$FF00+$1a], a
+	xor a
+	ld [$FF00+$25], a
+	ld [$FF00+$1c], a
+	ld a, $8
+	ld [$FF00+$10], a
+	ld [$FF00+$12], a
+	ld [$FF00+$17], a
+	ld [$FF00+$21], a
+	ld a, $40
+	ld [$FF00+$14], a
+	ld [$FF00+$19], a
+	ld [$FF00+$23], a
+	ld a, $77
+	ld [$FF00+$24], a
+	xor a
+	ld [$c000], a
+	ld [$c003], a
+	ld [$c002], a
+	ld [$c0e9], a
+	ld [$c0eb], a
+	ld [$c0e6], a
+	ld [$c0e7], a
+	ld d, $a0
+	ld hl, $c006
+	call FillMusicRAM8
+	ld a, $1
+	ld d, $18
+	ld hl, $c0b6
+	call FillMusicRAM8
+	ld [$c0e8], a
+	ld [$c0ea], a
+	ld a, $ff
+	ld [$c004], a
+	ret
+
+; fills d bytes at hl with a
+FillMusicRAM8: ; 22248 (8:6248)
+	ld b, d
+.loop
+	ld [hli], a
+	dec b
+	jr nz, .loop
+	ret
+
+Func_2224e: ; 2224e (8:624e)
+	ld a, [$c001]
+	ld l, a
+	ld e, a
+	ld h, $0
+	ld d, h
+	add hl, hl
+	add hl, de
+	ld de, SFX_Headers_08
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, $c006
+	ld a, [de] ; get channel number
+	ld b, a
+	rlca
+	rlca
+	and $3
+	ld c, a
+	ld a, b
+	and $f
+	ld b, c
+	inc b
+	inc de
+	ld c, $0
+.asm_22270
+	cp c
+	jr z, .asm_22278
+	inc c
+	inc hl
+	inc hl
+	jr .asm_22270
+.asm_22278
+	push hl
+	push bc
+	push af
+	ld b, $0
+	ld c, a
+	ld hl, $c026
+	add hl, bc
+	ld a, [$c001]
+	ld [hl], a
+	pop af
+	cp $3
+	jr c, .asm_22291
+	ld hl, $c02e
+	add hl, bc
+	set 2, [hl]
+.asm_22291
+	pop bc
+	pop hl
+	ld a, [de] ; get channel pointer
+	ld [hli], a
+	inc de
+	ld a, [de]
+	ld [hli], a
+	inc de
+	inc c
+	dec b
+	ld a, b
+	and a
+	ld a, [de]
+	inc de
+	jr nz, .asm_22270
+	ld a, [$c001]
+	cp $14
+	jr nc, .asm_222aa
+	jr .asm_222d4
+.asm_222aa
+	ld a, [$c001]
+	cp $86
+	jr z, .asm_222d4
+	jr c, .asm_222b5
+	jr .asm_222d4
+.asm_222b5
+	ld hl, $c02a
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	ld hl, $c012 ; sfx noise channel pointer
+	ld de, Noise8_endchannel
+	ld [hl], e
+	inc hl
+	ld [hl], d ; overwrite pointer to point to endchannel
+	ld a, [$c005]
+	and a
+	jr nz, .asm_222d4
+	ld a, [$FF00+$24]
+	ld [$c005], a
+	ld a, $77
+	ld [$FF00+$24], a
+.asm_222d4
+	ret
+
+Noise8_endchannel: ; 222d5 (8:62d5)
+	endchannel
+
+Unknown_222d6: ; 222d6 (8:62d6)
+	db $10, $15, $1A, $1F ; channels 0-3
+	db $10, $15, $1A, $1F ; channels 4-7
+
+Unknown_222de: ; 222de (8:62de)
+	db $EE, $DD, $BB, $77 ; channels 0-3
+	db $EE, $DD, $BB, $77 ; channels 4-7
+
+Unknown_222e6: ; 222e6 (8:62e6)
+	db $11, $22, $44, $88 ; channels 0-3
+	db $11, $22, $44, $88 ; channels 4-7
+
+Unknown_222ee: ; 222ee (8:62ee)
+	dw $F82C
+	dw $F89D
+	dw $F907
+	dw $F96B
+	dw $F9CA
+	dw $FA23
+	dw $FA77
+	dw $FAC7
+	dw $FB12
+	dw $FB58
+	dw $FB9B
+	dw $FBDA
+
+
--- /dev/null
+++ b/audio/engine_3.asm
@@ -1,0 +1,1682 @@
+; The third of three duplicated sound engines.
+
+Func_7d177:: ; 7d177 (1f:5177)
+	ld c, CH0
+.loop
+	ld b, $0
+	ld hl, $c026
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .nextChannel
+	ld a, c
+	cp CH4
+	jr nc, .applyAffects ; if sfx channel
+	ld a, [$c002]
+	and a
+	jr z, .applyAffects
+	bit 7, a
+	jr nz, .nextChannel
+	set 7, a
+	ld [$c002], a
+	xor a
+	ld [$FF00+$25], a
+	ld [$FF00+$1a], a
+	ld a, $80
+	ld [$FF00+$1a], a
+	jr .nextChannel
+.applyAffects
+	call Music1f_Music2_ApplyMusicAffects
+.nextChannel
+	ld a, c
+	inc c ; inc channel number
+	cp CH7
+	jr nz, .loop
+	ret
+
+; this routine checks flags for music effects currently applied
+; to the channel and calls certain functions based on flags.
+; known flags for $c02e:
+;	1: call has been used
+;	3: a toggle used only by this routine for vibrato
+;	4: pitchbend flag
+;	6: dutycycle flag
+Music1f_Music2_ApplyMusicAffects: ; 7d1ac (1f:51ac)
+	ld b, $0
+	ld hl, $c0b6 ; delay until next note
+	add hl, bc
+	ld a, [hl]
+	cp $1 ; if delay is 1, play next note
+	jp z, Music1f_Music2_PlayNextNote
+	dec a ; otherwise, decrease the delay timer
+	ld [hl], a
+	ld a, c
+	cp CH4
+	jr nc, .startChecks ; if a sfx channel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .startChecks
+	ret
+.startChecks
+	ld hl, $c02e
+	add hl, bc
+	bit 6, [hl] ; dutycycle
+	jr z, .checkForExecuteMusic
+	call Music1f_ApplyDutyCycle
+.checkForExecuteMusic
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, .checkForPitchBend
+	ld hl, $c02e
+	add hl, bc
+	bit 2, [hl]
+	jr nz, .disablePitchBendVibrato
+.checkForPitchBend
+	ld hl, $c02e
+	add hl, bc
+	bit 4, [hl] ; pitchbend
+	jr z, .checkVibratoDelay
+	jp Music1f_ApplyPitchBend
+.checkVibratoDelay
+	ld hl, $c04e ; vibrato delay
+	add hl, bc
+	ld a, [hl]
+	and a ; check if delay is over
+	jr z, .checkForVibrato
+	dec [hl] ; otherwise, dec delay
+.disablePitchBendVibrato
+	ret
+.checkForVibrato
+	ld hl, $c056 ; vibrato rate
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .vibrato
+	ret ; no vibrato
+.vibrato
+	ld d, a
+	ld hl, $c05e
+	add hl, bc
+	ld a, [hl]
+	and $f
+	and a
+	jr z, .vibratoAlreadyDone
+	dec [hl] ; apply vibrato pitch change
+	ret
+.vibratoAlreadyDone
+	ld a, [hl]
+	swap [hl]
+	or [hl]
+	ld [hl], a ; reset the vibrato value and start again
+	ld hl, $c066
+	add hl, bc
+	ld e, [hl] ; get note pitch
+	ld hl, $c02e
+	add hl, bc
+	bit 3, [hl] ; this is the only code that sets/resets bit three so
+	jr z, .unset ; it continuously alternates which path it takes
+	res 3, [hl]
+	ld a, d
+	and $f
+	ld d, a
+	ld a, e
+	sub d
+	jr nc, .noCarry
+	ld a, $0
+.noCarry
+	jr .done
+.unset
+	set 3, [hl]
+	ld a, d
+	and $f0
+	swap a
+	add e
+	jr nc, .done
+	ld a, $ff
+.done
+	ld d, a
+	ld b, $3
+	call Func_7d8ac
+	ld [hl], d
+	ret
+
+; this routine executes all music commands that take up no time,
+; like tempo changes, duty changes etc. and doesn't return
+; until the first note is reached
+Music1f_Music2_PlayNextNote: ; 7d244 (1f:5244)
+	ld hl, $c06e
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c04e
+	add hl, bc
+	ld [hl], a
+	ld hl, $c02e
+	add hl, bc
+	res 4, [hl]
+	res 5, [hl]
+	call Music1f_endchannel
+	ret
+
+Music1f_endchannel: ; 7d25a (1f:525a)
+	call Music1f_GetNextMusicByte
+	ld d, a
+	cp $ff ; is this command an endchannel?
+	jp nz, Music1f_callchannel ; no
+	ld b, $0 ; yes
+	ld hl, $c02e
+	add hl, bc
+	bit 1, [hl]
+	jr nz, .returnFromCall
+	ld a, c
+	cp CH3
+	jr nc, .noiseOrSfxChannel
+	jr .asm_7d2b3
+.noiseOrSfxChannel
+	res 2, [hl]
+	ld hl, $c036
+	add hl, bc
+	res 0, [hl]
+	cp CH6
+	jr nz, .notSfxChannel3
+	ld a, $0
+	ld [$FF00+$1a], a
+	ld a, $80
+	ld [$FF00+$1a], a
+.notSfxChannel3
+	jr nz, .asm_7d296
+	ld a, [$c003]
+	and a
+	jr z, .asm_7d296
+	xor a
+	ld [$c003], a
+	jr .asm_7d2b3
+.asm_7d296
+	jr .asm_7d2bc
+.returnFromCall
+	res 1, [hl]
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	push hl ; store current channel address
+	ld hl, $c016
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	ld a, [de]
+	ld [hli], a
+	inc de
+	ld a, [de]
+	ld [hl], a ; loads channel address to return to
+	jp Music1f_endchannel
+.asm_7d2b3
+	ld hl, Unknown_7db93
+	add hl, bc
+	ld a, [$FF00+$25]
+	and [hl]
+	ld [$FF00+$25], a
+.asm_7d2bc
+	ld a, [$c02a]
+	cp $14
+	jr nc, .asm_7d2c5
+	jr .asm_7d2e2
+.asm_7d2c5
+	ld a, [$c02a]
+	cp $86
+	jr z, .asm_7d2e2
+	jr c, .asm_7d2d0
+	jr .asm_7d2e2
+.asm_7d2d0
+	ld a, c
+	cp CH4
+	jr z, .asm_7d2d9
+	call Func_7d73b
+	ret c
+.asm_7d2d9
+	ld a, [$c005]
+	ld [$FF00+$24], a
+	xor a
+	ld [$c005], a
+.asm_7d2e2
+	ld hl, $c026
+	add hl, bc
+	ld [hl], b
+	ret
+
+Music1f_callchannel: ; 7d2e8 (1f:52e8)
+	cp $fd ; is this command a callchannel?
+	jp nz, Music1f_loopchannel ; no
+	call Music1f_GetNextMusicByte ; yes
+	push af
+	call Music1f_GetNextMusicByte
+	ld d, a
+	pop af
+	ld e, a
+	push de ; store pointer
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	push hl
+	ld hl, $c016
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hld]
+	ld [de], a ; copy current channel address
+	pop de
+	ld [hl], e
+	inc hl
+	ld [hl], d ; overwrite current address with pointer
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 1, [hl] ; set the call flag
+	jp Music1f_endchannel
+
+Music1f_loopchannel: ; 7d31d (1f:531d)
+	cp $fe ; is this command a loopchannel?
+	jp nz, Music1f_notetype ; no
+	call Music1f_GetNextMusicByte ; yes
+	ld e, a
+	and a
+	jr z, .infiniteLoop
+	ld b, $0
+	ld hl, $c0be
+	add hl, bc
+	ld a, [hl]
+	cp e
+	jr nz, .loopAgain
+	ld a, $1 ; if no more loops to make
+	ld [hl], a
+	call Music1f_GetNextMusicByte ; skip pointer
+	call Music1f_GetNextMusicByte
+	jp Music1f_endchannel
+.loopAgain ; inc loop count
+	inc a
+	ld [hl], a
+	; fall through
+.infiniteLoop ; overwrite current address with pointer
+	call Music1f_GetNextMusicByte
+	push af
+	call Music1f_GetNextMusicByte
+	ld b, a
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	pop af
+	ld [hli], a
+	ld [hl], b
+	jp Music1f_endchannel
+
+Music1f_notetype: ; 7d358 (1f:5358)
+	and $f0
+	cp $d0 ; is this command a notetype?
+	jp nz, Music1f_togglecall ; no
+	ld a, d ; yes
+	and $f
+	ld b, $0
+	ld hl, $c0c6
+	add hl, bc
+	ld [hl], a ; store low nibble as speed
+	ld a, c
+	cp CH3
+	jr z, .noiseChannel ; noise channel has 0 params
+	call Music1f_GetNextMusicByte
+	ld d, a
+	ld a, c
+	cp CH2
+	jr z, .musicChannel3
+	cp CH6
+	jr nz, .notChannel3
+	ld hl, $c0e7
+	jr .sfxChannel3
+.musicChannel3
+	ld hl, $c0e6
+.sfxChannel3
+	ld a, d
+	and $f
+	ld [hl], a ; store low nibble of param as duty
+	ld a, d
+	and $30
+	sla a
+	ld d, a
+	; fall through
+
+	; if channel 3, store high nibble as volume
+	; else, store volume (high nibble) and fade (low nibble)
+.notChannel3
+	ld b, $0
+	ld hl, $c0de
+	add hl, bc
+	ld [hl], d
+.noiseChannel
+	jp Music1f_endchannel
+
+Music1f_togglecall: ; 7d397 (1f:5397)
+	ld a, d
+	cp $e8 ; is this command an togglecall?
+	jr nz, Music1f_vibrato ; no
+	ld b, $0 ; yes
+	ld hl, $c02e
+	add hl, bc
+	ld a, [hl]
+	xor $1
+	ld [hl], a ; flip bit 0 of $c02e (toggle returning from call)
+	jp Music1f_endchannel
+
+Music1f_vibrato: ; 7d3a9 (1f:53a9)
+	cp $ea ; is this command a vibrato?
+	jr nz, Music1f_pitchbend ; no
+	call Music1f_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c04e
+	add hl, bc
+	ld [hl], a ; store delay
+	ld hl, $c06e
+	add hl, bc
+	ld [hl], a ; store delay
+	call Music1f_GetNextMusicByte
+	ld d, a
+	and $f0
+	swap a
+	ld b, $0
+	ld hl, $c056
+	add hl, bc
+	srl a
+	ld e, a
+	adc b
+	swap a
+	or e
+	ld [hl], a ; store rate as both high and low nibbles
+	ld a, d
+	and $f
+	ld d, a
+	ld hl, $c05e
+	add hl, bc
+	swap a
+	or d
+	ld [hl], a ; store depth as both high and low nibbles
+	jp Music1f_endchannel
+
+Music1f_pitchbend: ; 7d3e1 (1f:53e1)
+	cp $eb ; is this command a pitchbend?
+	jr nz, Music1f_duty ; no
+	call Music1f_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c076
+	add hl, bc
+	ld [hl], a ; store first param
+	call Music1f_GetNextMusicByte
+	ld d, a
+	and $f0
+	swap a
+	ld b, a
+	ld a, d
+	and $f
+	call Func_7d8cc
+	ld b, $0
+	ld hl, $c0a6
+	add hl, bc
+	ld [hl], d ; store unknown part of second param
+	ld hl, $c0ae
+	add hl, bc
+	ld [hl], e ; store unknown part of second param
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 4, [hl] ; set pitchbend flag
+	call Music1f_GetNextMusicByte
+	ld d, a
+	jp Music1f_notelength
+
+Music1f_duty: ; 7d419 (1f:5419)
+	cp $ec ; is this command a duty?
+	jr nz, Music1f_tempo ; no
+	call Music1f_GetNextMusicByte ; yes
+	rrca
+	rrca
+	and $c0
+	ld b, $0
+	ld hl, $c03e
+	add hl, bc
+	ld [hl], a ; store duty
+	jp Music1f_endchannel
+
+Music1f_tempo: ; 7d42e (1f:542e)
+	cp $ed ; is this command a tempo?
+	jr nz, Music1f_unknownmusic0xee ; no
+	ld a, c ; yes
+	cp CH4
+	jr nc, .sfxChannel
+	call Music1f_GetNextMusicByte
+	ld [$c0e8], a ; store first param
+	call Music1f_GetNextMusicByte
+	ld [$c0e9], a ; store second param
+	xor a
+	ld [$c0ce], a ; clear RAM
+	ld [$c0cf], a
+	ld [$c0d0], a
+	ld [$c0d1], a
+	jr .musicChannelDone
+.sfxChannel
+	call Music1f_GetNextMusicByte
+	ld [$c0ea], a ; store first param
+	call Music1f_GetNextMusicByte
+	ld [$c0eb], a ; store second param
+	xor a
+	ld [$c0d2], a ; clear RAM
+	ld [$c0d3], a
+	ld [$c0d4], a
+	ld [$c0d5], a
+.musicChannelDone
+	jp Music1f_endchannel
+
+Music1f_unknownmusic0xee: ; 7d46e (1f:546e)
+	cp $ee ; is this command an unknownmusic0xee?
+	jr nz, Music1f_unknownmusic0xef ; no
+	call Music1f_GetNextMusicByte ; yes
+	ld [$c004], a ; store first param
+	jp Music1f_endchannel
+
+; this appears to never be used
+Music1f_unknownmusic0xef: ; 7d47b (1f:547b)
+	cp $ef ; is this command an unknownmusic0xef?
+	jr nz, Music1f_dutycycle ; no
+	call Music1f_GetNextMusicByte ; yes
+	push bc
+	call Func_7d8ea
+	pop bc
+	ld a, [$c003]
+	and a
+	jr nz, .skip
+	ld a, [$c02d]
+	ld [$c003], a
+	xor a
+	ld [$c02d], a
+.skip
+	jp Music1f_endchannel
+
+Music1f_dutycycle: ; 7d49a (1f:549a)
+	cp $fc ; is this command a dutycycle?
+	jr nz, Music1f_stereopanning ; no
+	call Music1f_GetNextMusicByte ; yes
+	ld b, $0
+	ld hl, $c046
+	add hl, bc
+	ld [hl], a ; store full cycle
+	and $c0
+	ld hl, $c03e
+	add hl, bc
+	ld [hl], a ; store first duty
+	ld hl, $c02e
+	add hl, bc
+	set 6, [hl] ; set duty flag
+	jp Music1f_endchannel
+
+Music1f_stereopanning: ; 7d4b8 (1f:54b8)
+	cp $f0 ; is this command a stereopanning?
+	jr nz, Music1f_executemusic ; no
+	call Music1f_GetNextMusicByte ; yes
+	ld [$FF00+$24], a ; store stereopanning
+	jp Music1f_endchannel
+
+Music1f_executemusic: ; 7d4c4 (1f:54c4)
+	cp $f8 ; is this command an executemusic?
+	jr nz, Music1f_octave ; no
+	ld b, $0 ; yes
+	ld hl, $c036
+	add hl, bc
+	set 0, [hl]
+	jp Music1f_endchannel
+
+Music1f_octave: ; 7d4d3 (1f:54d3)
+	and $f0
+	cp $e0 ; is this command an octave?
+	jr nz, Music1f_unknownsfx0x20 ; no
+	ld hl, $c0d6 ; yes
+	ld b, $0
+	add hl, bc
+	ld a, d
+	and $f
+	ld [hl], a ; store low nibble as octave
+	jp Music1f_endchannel
+
+Music1f_unknownsfx0x20: ; 7d4e6 (1f:54e6)
+	cp $20 ; is this command an unknownsfx0x20?
+	jr nz, Music1f_unknownsfx0x10 ; no
+	ld a, c
+	cp CH3 ; is this a noise or sfx channel?
+	jr c, Music1f_unknownsfx0x10 ; no
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music1f_unknownsfx0x10 ; no
+	call Music1f_notelength ; yes
+	ld d, a
+	ld b, $0
+	ld hl, $c03e
+	add hl, bc
+	ld a, [hl]
+	or d
+	ld d, a
+	ld b, $1
+	call Func_7d8ac
+	ld [hl], d
+	call Music1f_GetNextMusicByte
+	ld d, a
+	ld b, $2
+	call Func_7d8ac
+	ld [hl], d
+	call Music1f_GetNextMusicByte
+	ld e, a
+	ld a, c
+	cp CH7
+	ld a, $0
+	jr z, .sfxNoiseChannel ; only two params for noise channel
+	push de
+	call Music1f_GetNextMusicByte
+	pop de
+.sfxNoiseChannel
+	ld d, a
+	push de
+	call Func_7d69d
+	call Func_7d66c
+	pop de
+	call Func_7d6bf
+	ret
+
+Music1f_unknownsfx0x10 ; 7d533 (1f:5533)
+	ld a, c
+	cp CH4
+	jr c, Music1f_note ; if not a sfx
+	ld a, d
+	cp $10 ; is this command an unknownsfx0x10?
+	jr nz, Music1f_note ; no
+	ld b, $0
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music1f_note ; no
+	call Music1f_GetNextMusicByte ; yes
+	ld [$FF00+$10], a
+	jp Music1f_endchannel
+
+Music1f_note: ; 7d54f (1f:554f)
+	ld a, c
+	cp CH3
+	jr nz, Music1f_notelength ; if not noise channel
+	ld a, d
+	and $f0
+	cp $b0 ; is this command a dnote?
+	jr z, Music1f_dnote ; yes
+	jr nc, Music1f_notelength ; no
+	swap a
+	ld b, a
+	ld a, d
+	and $f
+	ld d, a
+	ld a, b
+	push de
+	push bc
+	jr asm_7d571
+
+Music1f_dnote: ; 7d569 (1f:5569)
+	ld a, d
+	and $f
+	push af
+	push bc
+	call Music1f_GetNextMusicByte ; get dnote instrument
+asm_7d571
+	ld d, a
+	ld a, [$c003]
+	and a
+	jr nz, .asm_7d57c
+	ld a, d
+	call Func_7d8ea
+.asm_7d57c
+	pop bc
+	pop de
+
+Music1f_notelength: ; 7d57e (1f:557e)
+	ld a, d
+	push af
+	and $f
+	inc a
+	ld b, $0
+	ld e, a  ; store note length (in 16ths)
+	ld d, b
+	ld hl, $c0c6
+	add hl, bc
+	ld a, [hl]
+	ld l, b
+	call Func_7d8bb
+	ld a, c
+	cp CH4
+	jr nc, .sfxChannel
+	ld a, [$c0e8]
+	ld d, a
+	ld a, [$c0e9]
+	ld e, a
+	jr .skip
+.sfxChannel
+	ld d, $1
+	ld e, $0
+	cp CH7
+	jr z, .skip ; if noise channel
+	call Func_7d707
+	ld a, [$c0ea]
+	ld d, a
+	ld a, [$c0eb]
+	ld e, a
+.skip
+	ld a, l
+	ld b, $0
+	ld hl, $c0ce
+	add hl, bc
+	ld l, [hl]
+	call Func_7d8bb
+	ld e, l
+	ld d, h
+	ld hl, $c0ce
+	add hl, bc
+	ld [hl], e
+	ld a, d
+	ld hl, $c0b6
+	add hl, bc
+	ld [hl], a
+	ld hl, $c036
+	add hl, bc
+	bit 0, [hl]
+	jr nz, Music1f_notepitch
+	ld hl, $c02e
+	add hl, bc
+	bit 2, [hl]
+	jr z, Music1f_notepitch
+	pop hl
+	ret
+
+Music1f_notepitch: ; 7d5dc (1f:55dc)
+	pop af
+	and $f0
+	cp $c0 ; compare to rest
+	jr nz, .notRest
+	ld a, c
+	cp CH4
+	jr nc, .sfxChannel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .quit
+	; fall through
+.sfxChannel
+	ld a, c
+	cp CH2
+	jr z, .musicChannel3
+	cp CH6
+	jr nz, .notSfxChannel3
+.musicChannel3
+	ld b, $0
+	ld hl, Unknown_7db93
+	add hl, bc
+	ld a, [$FF00+$25]
+	and [hl]
+	ld [$FF00+$25], a
+	jr .quit
+.notSfxChannel3
+	ld b, $2
+	call Func_7d8ac
+	ld a, $8
+	ld [hli], a
+	inc hl
+	ld a, $80
+	ld [hl], a
+.quit
+	ret
+.notRest
+	swap a
+	ld b, $0
+	ld hl, $c0d6
+	add hl, bc
+	ld b, [hl]
+	call Func_7d8cc
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	bit 4, [hl]
+	jr z, .asm_7d62c
+	call Func_7d803
+.asm_7d62c
+	push de
+	ld a, c
+	cp CH4
+	jr nc, .skip ; if sfx Channel
+	ld hl, $c02a
+	ld d, $0
+	ld e, a
+	add hl, de
+	ld a, [hl]
+	and a
+	jr nz, .done
+	jr .skip
+.done
+	pop de
+	ret
+.skip
+	ld b, $0
+	ld hl, $c0de
+	add hl, bc
+	ld d, [hl]
+	ld b, $2
+	call Func_7d8ac
+	ld [hl], d
+	call Func_7d69d
+	call Func_7d66c
+	pop de
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	bit 0, [hl]
+	jr z, .asm_7d663
+	inc e
+	jr nc, .asm_7d663
+	inc d
+.asm_7d663
+	ld hl, $c066
+	add hl, bc
+	ld [hl], e
+	call Func_7d6bf
+	ret
+
+Func_7d66c: ; 7d66c (1f:566c)
+	ld b, $0
+	ld hl, Unknown_7db9b
+	add hl, bc
+	ld a, [$FF00+$25]
+	or [hl]
+	ld d, a
+	ld a, c
+	cp CH7
+	jr z, .sfxNoiseChannel
+	cp CH4
+	jr nc, .skip ; if sfx channel
+	ld hl, $c02a
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .skip
+.sfxNoiseChannel
+	ld a, [$c004]
+	ld hl, Unknown_7db9b
+	add hl, bc
+	and [hl]
+	ld d, a
+	ld a, [$FF00+$25]
+	ld hl, Unknown_7db93
+	add hl, bc
+	and [hl]
+	or d
+	ld d, a
+.skip
+	ld a, d
+	ld [$FF00+$25], a
+	ret
+
+Func_7d69d: ; 7d69d (1f:569d)
+	ld b, $0
+	ld hl, $c0b6
+	add hl, bc
+	ld d, [hl]
+	ld a, c
+	cp CH2
+	jr z, .channel3 ; if music channel 3
+	cp CH6
+	jr z, .channel3 ; if sfx channel 3
+	ld a, d
+	and $3f
+	ld d, a
+	ld hl, $c03e
+	add hl, bc
+	ld a, [hl]
+	or d
+	ld d, a
+.channel3
+	ld b, $1
+	call Func_7d8ac
+	ld [hl], d
+	ret
+
+Func_7d6bf: ; 7d6bf (1f:56bf)
+	ld a, c
+	cp CH2
+	jr z, .channel3
+	cp CH6
+	jr nz, .notSfxChannel3
+	; fall through
+.channel3
+	push de
+	ld de, $c0e6
+	cp CH2
+	jr z, .musicChannel3
+	ld de, $c0e7
+.musicChannel3
+	ld a, [de]
+	add a
+	ld d, $0
+	ld e, a
+	ld hl, Music1f_Channel3DutyPointers
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, $ff30
+	ld b, $f
+	ld a, $0
+	ld [$FF00+$1a], a
+.loop
+	ld a, [de]
+	inc de
+	ld [hli], a
+	ld a, b
+	dec b
+	and a
+	jr nz, .loop
+	ld a, $80
+	ld [$FF00+$1a], a
+	pop de
+.notSfxChannel3
+	ld a, d
+	or $80
+	and $c7
+	ld d, a
+	ld b, $3
+	call Func_7d8ac
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	call Func_7d729
+	ret
+
+Func_7d707: ; 7d707 (1f:5707)
+	call Func_7d759
+	jr nc, .asm_7d71f
+	ld d, $0
+	ld a, [$c0f2]
+	add $80
+	jr nc, .asm_7d716
+	inc d
+.asm_7d716
+	ld [$c0eb], a
+	ld a, d
+	ld [$c0ea], a
+	jr .asm_7d728
+.asm_7d71f
+	xor a
+	ld [$c0eb], a
+	ld a, $1
+	ld [$c0ea], a
+.asm_7d728
+	ret
+
+Func_7d729: ; 7d729 (1f:5729)
+	call Func_7d759
+	jr nc, .asm_7d73a
+	ld a, [$c0f1]
+	add e
+	jr nc, .asm_7d735
+	inc d
+.asm_7d735
+	dec hl
+	ld e, a
+	ld [hl], e
+	inc hl
+	ld [hl], d
+.asm_7d73a
+	ret
+
+Func_7d73b: ; 7d73b (1f:573b)
+	call Func_7d759
+	jr nc, .asm_7d756
+	ld hl, $c006
+	ld e, c
+	ld d, $0
+	sla e
+	rl d
+	add hl, de
+	ld a, [hl]
+	sub $1
+	ld [hl], a
+	inc hl
+	ld a, [hl]
+	sbc $0
+	ld [hl], a
+	scf
+	ret
+.asm_7d756
+	scf
+	ccf
+	ret
+
+Func_7d759: ; 7d759 (1f:5759)
+	ld a, [$c02a]
+	cp $14
+	jr nc, .asm_7d762
+	jr .asm_7d768
+.asm_7d762
+	cp $86
+	jr z, .asm_7d768
+	jr c, .asm_7d76b
+.asm_7d768
+	scf
+	ccf
+	ret
+.asm_7d76b
+	scf
+	ret
+
+Music1f_ApplyPitchBend: ; 7d76d (1f:576d)
+	ld hl, $c02e
+	add hl, bc
+	bit 5, [hl]
+	jp nz, .asm_7d7b4
+	ld hl, $c09e
+	add hl, bc
+	ld e, [hl]
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c07e
+	add hl, bc
+	ld l, [hl]
+	ld h, b
+	add hl, de
+	ld d, h
+	ld e, l
+	ld hl, $c08e
+	add hl, bc
+	push hl
+	ld hl, $c086
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	add [hl]
+	ld [hl], a
+	ld a, $0
+	adc e
+	ld e, a
+	ld a, $0
+	adc d
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, [hl]
+	cp d
+	jp c, .asm_7d7fa
+	jr nz, .asm_7d7e7
+	ld hl, $c0ae
+	add hl, bc
+	ld a, [hl]
+	cp e
+	jp c, .asm_7d7fa
+	jr .asm_7d7e7
+.asm_7d7b4
+	ld hl, $c09e
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c07e
+	add hl, bc
+	ld e, [hl]
+	sub e
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c086
+	add hl, bc
+	ld a, [hl]
+	add a
+	ld [hl], a
+	ld a, e
+	sbc b
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, d
+	cp [hl]
+	jr c, .asm_7d7fa
+	jr nz, .asm_7d7e7
+	ld hl, $c0ae
+	add hl, bc
+	ld a, e
+	cp [hl]
+	jr c, .asm_7d7fa
+.asm_7d7e7
+	ld hl, $c09e
+	add hl, bc
+	ld [hl], e
+	ld hl, $c096
+	add hl, bc
+	ld [hl], d
+	ld b, $3
+	call Func_7d8ac
+	ld a, e
+	ld [hli], a
+	ld [hl], d
+	ret
+.asm_7d7fa
+	ld hl, $c02e
+	add hl, bc
+	res 4, [hl]
+	res 5, [hl]
+	ret
+
+Func_7d803: ; 7d803 (1f:5803)
+	ld hl, $c096
+	add hl, bc
+	ld [hl], d
+	ld hl, $c09e
+	add hl, bc
+	ld [hl], e
+	ld hl, $c0b6
+	add hl, bc
+	ld a, [hl]
+	ld hl, $c076
+	add hl, bc
+	sub [hl]
+	jr nc, .asm_7d81b
+	ld a, $1
+.asm_7d81b
+	ld [hl], a
+	ld hl, $c0ae
+	add hl, bc
+	ld a, e
+	sub [hl]
+	ld e, a
+	ld a, d
+	sbc b
+	ld hl, $c0a6
+	add hl, bc
+	sub [hl]
+	jr c, .asm_7d837
+	ld d, a
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	set 5, [hl]
+	jr .asm_7d85a
+.asm_7d837
+	ld hl, $c096
+	add hl, bc
+	ld d, [hl]
+	ld hl, $c09e
+	add hl, bc
+	ld e, [hl]
+	ld hl, $c0ae
+	add hl, bc
+	ld a, [hl]
+	sub e
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	ld hl, $c0a6
+	add hl, bc
+	ld a, [hl]
+	sub d
+	ld d, a
+	ld b, $0
+	ld hl, $c02e
+	add hl, bc
+	res 5, [hl]
+.asm_7d85a
+	ld hl, $c076
+	add hl, bc
+.asm_7d85e
+	inc b
+	ld a, e
+	sub [hl]
+	ld e, a
+	jr nc, .asm_7d85e
+	ld a, d
+	and a
+	jr z, .asm_7d86c
+	dec a
+	ld d, a
+	jr .asm_7d85e
+.asm_7d86c
+	ld a, e
+	add [hl]
+	ld d, b
+	ld b, $0
+	ld hl, $c07e
+	add hl, bc
+	ld [hl], d
+	ld hl, $c086
+	add hl, bc
+	ld [hl], a
+	ld hl, $c08e
+	add hl, bc
+	ld [hl], a
+	ret
+
+Music1f_ApplyDutyCycle: ; 7d881 (1f:5881)
+	ld b, $0
+	ld hl, $c046
+	add hl, bc
+	ld a, [hl]
+	rlca
+	rlca
+	ld [hl], a
+	and $c0
+	ld d, a
+	ld b, $1
+	call Func_7d8ac
+	ld a, [hl]
+	and $3f
+	or d
+	ld [hl], a
+	ret
+
+Music1f_GetNextMusicByte: ; 7d899 (1f:5899)
+	ld d, $0
+	ld a, c
+	add a
+	ld e, a
+	ld hl, $c006
+	add hl, de
+	ld a, [hli]
+	ld e, a
+	ld a, [hld]
+	ld d, a
+	ld a, [de] ; get next music command
+	inc de
+	ld [hl], e ; store address of next command
+	inc hl
+	ld [hl], d
+	ret
+
+Func_7d8ac: ; 7d8ac (1f:58ac)
+	ld a, c
+	ld hl, Unknown_7db8b
+	add l
+	jr nc, .noCarry
+	inc h
+.noCarry
+	ld l, a
+	ld a, [hl]
+	add b
+	ld l, a
+	ld h, $ff
+	ret
+
+Func_7d8bb: ; 7d8bb (1f:58bb)
+	ld h, $0
+.loop
+	srl a
+	jr nc, .noCarry
+	add hl, de
+.noCarry
+	sla e
+	rl d
+	and a
+	jr z, .done
+	jr .loop
+.done
+	ret
+
+Func_7d8cc: ; 7d8cc (1f:58cc)
+	ld h, $0
+	ld l, a
+	add hl, hl
+	ld d, h
+	ld e, l
+	ld hl, Unknown_7dba3
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld a, b
+.loop
+	cp $7
+	jr z, .done
+	sra d
+	rr e
+	inc a
+	jr .loop
+.done
+	ld a, $8
+	add d
+	ld d, a
+	ret
+
+Func_7d8ea:: ; 7d8ea (1f:58ea)
+	ld [$c001], a
+	cp $ff
+	jp z, Func_7daa8
+	cp $c2
+	jp z, Func_7d9c2
+	jp c, Func_7d9c2
+	cp $fe
+	jr z, .asm_7d901
+	jp nc, Func_7d9c2
+.asm_7d901
+	xor a
+	ld [$c000], a
+	ld [$c003], a
+	ld [$c0e9], a
+	ld [$c0e6], a
+	ld [$c0e7], a
+	ld d, $8
+	ld hl, $c016
+	call FillMusicRAM1f
+	ld hl, $c006
+	call FillMusicRAM1f
+	ld d, $4
+	ld hl, $c026
+	call FillMusicRAM1f
+	ld hl, $c02e
+	call FillMusicRAM1f
+	ld hl, $c03e
+	call FillMusicRAM1f
+	ld hl, $c046
+	call FillMusicRAM1f
+	ld hl, $c04e
+	call FillMusicRAM1f
+	ld hl, $c056
+	call FillMusicRAM1f
+	ld hl, $c05e
+	call FillMusicRAM1f
+	ld hl, $c066
+	call FillMusicRAM1f
+	ld hl, $c06e
+	call FillMusicRAM1f
+	ld hl, $c036
+	call FillMusicRAM1f
+	ld hl, $c076
+	call FillMusicRAM1f
+	ld hl, $c07e
+	call FillMusicRAM1f
+	ld hl, $c086
+	call FillMusicRAM1f
+	ld hl, $c08e
+	call FillMusicRAM1f
+	ld hl, $c096
+	call FillMusicRAM1f
+	ld hl, $c09e
+	call FillMusicRAM1f
+	ld hl, $c0a6
+	call FillMusicRAM1f
+	ld hl, $c0ae
+	call FillMusicRAM1f
+	ld a, $1
+	ld hl, $c0be
+	call FillMusicRAM1f
+	ld hl, $c0b6
+	call FillMusicRAM1f
+	ld hl, $c0c6
+	call FillMusicRAM1f
+	ld [$c0e8], a
+	ld a, $ff
+	ld [$c004], a
+	xor a
+	ld [$FF00+$24], a
+	ld a, $8
+	ld [$FF00+$10], a
+	ld a, $0
+	ld [$FF00+$25], a
+	xor a
+	ld [$FF00+$1a], a
+	ld a, $80
+	ld [$FF00+$1a], a
+	ld a, $77
+	ld [$FF00+$24], a
+	jp Func_7db03
+
+Func_7d9c2: ; 7d9c2 (1f:59c2)
+	ld l, a
+	ld e, a
+	ld h, $0
+	ld d, h
+	add hl, hl
+	add hl, de
+	ld de, SFX_Headers_1f
+	add hl, de
+	ld a, h
+	ld [$c0ec], a
+	ld a, l
+	ld [$c0ed], a
+	ld a, [hl]
+	and $c0
+	rlca
+	rlca
+	ld c, a
+.asm_7d9db
+	ld d, c
+	ld a, c
+	add a
+	add c
+	ld c, a
+	ld b, $0
+	ld a, [$c0ec]
+	ld h, a
+	ld a, [$c0ed]
+	ld l, a
+	add hl, bc
+	ld c, d
+	ld a, [hl]
+	and $f
+	ld e, a
+	ld d, $0
+	ld hl, $c026
+	add hl, de
+	ld a, [hl]
+	and a
+	jr z, .asm_7da17
+	ld a, e
+	cp $7
+	jr nz, .asm_7da0e
+	ld a, [$c001]
+	cp $14
+	jr nc, .asm_7da07
+	ret
+.asm_7da07
+	ld a, [hl]
+	cp $14
+	jr z, .asm_7da17
+	jr c, .asm_7da17
+.asm_7da0e
+	ld a, [$c001]
+	cp [hl]
+	jr z, .asm_7da17
+	jr c, .asm_7da17
+	ret
+.asm_7da17
+	xor a
+	push de
+	ld h, d
+	ld l, e
+	add hl, hl
+	ld d, h
+	ld e, l
+	ld hl, $c016
+	add hl, de
+	ld [hli], a
+	ld [hl], a
+	ld hl, $c006
+	add hl, de
+	ld [hli], a
+	ld [hl], a
+	pop de
+	ld hl, $c026
+	add hl, de
+	ld [hl], a
+	ld hl, $c02e
+	add hl, de
+	ld [hl], a
+	ld hl, $c03e
+	add hl, de
+	ld [hl], a
+	ld hl, $c046
+	add hl, de
+	ld [hl], a
+	ld hl, $c04e
+	add hl, de
+	ld [hl], a
+	ld hl, $c056
+	add hl, de
+	ld [hl], a
+	ld hl, $c05e
+	add hl, de
+	ld [hl], a
+	ld hl, $c066
+	add hl, de
+	ld [hl], a
+	ld hl, $c06e
+	add hl, de
+	ld [hl], a
+	ld hl, $c076
+	add hl, de
+	ld [hl], a
+	ld hl, $c07e
+	add hl, de
+	ld [hl], a
+	ld hl, $c086
+	add hl, de
+	ld [hl], a
+	ld hl, $c08e
+	add hl, de
+	ld [hl], a
+	ld hl, $c096
+	add hl, de
+	ld [hl], a
+	ld hl, $c09e
+	add hl, de
+	ld [hl], a
+	ld hl, $c0a6
+	add hl, de
+	ld [hl], a
+	ld hl, $c0ae
+	add hl, de
+	ld [hl], a
+	ld hl, $c036
+	add hl, de
+	ld [hl], a
+	ld a, $1
+	ld hl, $c0be
+	add hl, de
+	ld [hl], a
+	ld hl, $c0b6
+	add hl, de
+	ld [hl], a
+	ld hl, $c0c6
+	add hl, de
+	ld [hl], a
+	ld a, e
+	cp $4
+	jr nz, .asm_7da9f
+	ld a, $8
+	ld [$FF00+$10], a
+.asm_7da9f
+	ld a, c
+	and a
+	jp z, Func_7db03
+	dec c
+	jp .asm_7d9db
+
+Func_7daa8: ; 7daa8 (1f:5aa8)
+	ld a, $80
+	ld [$FF00+$26], a
+	ld [$FF00+$1a], a
+	xor a
+	ld [$FF00+$25], a
+	ld [$FF00+$1c], a
+	ld a, $8
+	ld [$FF00+$10], a
+	ld [$FF00+$12], a
+	ld [$FF00+$17], a
+	ld [$FF00+$21], a
+	ld a, $40
+	ld [$FF00+$14], a
+	ld [$FF00+$19], a
+	ld [$FF00+$23], a
+	ld a, $77
+	ld [$FF00+$24], a
+	xor a
+	ld [$c000], a
+	ld [$c003], a
+	ld [$c002], a
+	ld [$c0e9], a
+	ld [$c0eb], a
+	ld [$c0e6], a
+	ld [$c0e7], a
+	ld d, $a0
+	ld hl, $c006
+	call FillMusicRAM1f
+	ld a, $1
+	ld d, $18
+	ld hl, $c0b6
+	call FillMusicRAM1f
+	ld [$c0e8], a
+	ld [$c0ea], a
+	ld a, $ff
+	ld [$c004], a
+	ret
+
+; fills d bytes at hl with a
+FillMusicRAM1f: ; 7dafd (1f:5afd)
+	ld b, d
+.loop
+	ld [hli], a
+	dec b
+	jr nz, .loop
+	ret
+
+Func_7db03: ; 7db03 (1f:5b03)
+	ld a, [$c001]
+	ld l, a
+	ld e, a
+	ld h, $0
+	ld d, h
+	add hl, hl
+	add hl, de
+	ld de, SFX_Headers_1f
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, $c006
+	ld a, [de] ; get channel number
+	ld b, a
+	rlca
+	rlca
+	and $3
+	ld c, a
+	ld a, b
+	and $f
+	ld b, c
+	inc b
+	inc de
+	ld c, $0
+.asm_7db25
+	cp c
+	jr z, .asm_7db2d
+	inc c
+	inc hl
+	inc hl
+	jr .asm_7db25
+.asm_7db2d
+	push hl
+	push bc
+	push af
+	ld b, $0
+	ld c, a
+	ld hl, $c026
+	add hl, bc
+	ld a, [$c001]
+	ld [hl], a
+	pop af
+	cp $3
+	jr c, .asm_7db46
+	ld hl, $c02e
+	add hl, bc
+	set 2, [hl]
+.asm_7db46
+	pop bc
+	pop hl
+	ld a, [de] ; get channel pointer
+	ld [hli], a
+	inc de
+	ld a, [de]
+	ld [hli], a
+	inc de
+	inc c
+	dec b
+	ld a, b
+	and a
+	ld a, [de]
+	inc de
+	jr nz, .asm_7db25
+	ld a, [$c001]
+	cp $14
+	jr nc, .asm_7db5f
+	jr .asm_7db89
+.asm_7db5f
+	ld a, [$c001]
+	cp $86
+	jr z, .asm_7db89
+	jr c, .asm_7db6a
+	jr .asm_7db89
+.asm_7db6a
+	ld hl, $c02a
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	ld hl, $c012 ; sfx noise channel pointer
+	ld de, Noise1f_endchannel
+	ld [hl], e
+	inc hl
+	ld [hl], d ; overwrite pointer to point to endchannel
+	ld a, [$c005]
+	and a
+	jr nz, .asm_7db89
+	ld a, [$FF00+$24]
+	ld [$c005], a
+	ld a, $77
+	ld [$FF00+$24], a
+.asm_7db89
+	ret
+
+Noise1f_endchannel: ; 7db8a (1f:5b8a)
+	endchannel
+
+Unknown_7db8b: ; 7db8b (1f:5b8b)
+	db $10, $15, $1A, $1F ; channels 0-3
+	db $10, $15, $1A, $1F ; channels 4-7
+
+Unknown_7db93: ; 7db93 (1f:5b93)
+	db $EE, $DD, $BB, $77 ; channels 0-3
+	db $EE, $DD, $BB, $77 ; channels 4-7
+
+Unknown_7db9b: ; 7db9b (1f:5b9b)
+	db $11, $22, $44, $88 ; channels 0-3
+	db $11, $22, $44, $88 ; channels 4-7
+
+Unknown_7dba3: ; 7dba3 (1f:5ba3)
+	dw $F82C
+	dw $F89D
+	dw $F907
+	dw $F96B
+	dw $F9CA
+	dw $FA23
+	dw $FA77
+	dw $FAC7
+	dw $FB12
+	dw $FB58
+	dw $FB9B
+	dw $FBDA
+
+
--- /dev/null
+++ b/audio_blue.asm
@@ -1,0 +1,2 @@
+INCLUDE "blue.asm"
+INCLUDE "audio.asm"
--- /dev/null
+++ b/audio_red.asm
@@ -1,0 +1,2 @@
+INCLUDE "red.asm"
+INCLUDE "audio.asm"
--- /dev/null
+++ b/blue.asm
@@ -1,0 +1,2 @@
+_BLUE EQU 1
+_RED  EQU 0
--- a/constants.asm
+++ b/constants.asm
@@ -9,6 +9,8 @@
 INCLUDE "constants/hardware_constants.asm"
 INCLUDE "constants/oam_constants.asm"
 
+INCLUDE "constants/wram_constants.asm"
+
 INCLUDE "constants/pokemon_constants.asm"
 INCLUDE "constants/pokedex_constants.asm"
 INCLUDE "constants/trainer_constants.asm"
@@ -26,3 +28,4 @@
 INCLUDE "constants/map_dimensions.asm"
 INCLUDE "constants/connection_constants.asm"
 INCLUDE "constants/credits_constants.asm"
+INCLUDE "constants/music_constants.asm"
--- a/constants/move_constants.asm
+++ b/constants/move_constants.asm
@@ -165,7 +165,9 @@
 STRUGGLE     EQU $A5
 ; these do double duty as animation identifiers
 SHOWPIC_ANIM EQU $A6 ; redraw monster pic
+STATUS_AFFECTED_ANIM EQU $A7 ; effect when monster receives a status aliment
 XSTATITEM_ANIM EQU $AE ; use X Attack/Defense/Speed/Special
+BURN_PSN_ANIM EQU $BA ; Plays when a monster is burned or poisoned
 SLP_ANIM     EQU $BD ; sleeping monster
 CONF_ANIM    EQU $BF ; confused monster
 TOSS_ANIM    EQU $C1 ; toss Poké Ball
--- /dev/null
+++ b/constants/music_constants.asm
@@ -1,0 +1,54 @@
+; Song ids are calculated by address to save space.
+
+music_const: MACRO
+\1 EQUS "((\2 - $4000) / 3)"
+ENDM
+
+	music_const MUSIC_PALLET_TOWN,         Music_PalletTown
+	music_const MUSIC_POKECENTER,          Music_Pokecenter
+	music_const MUSIC_GYM,                 Music_Gym
+	music_const MUSIC_CITIES1,             Music_Cities1
+	music_const MUSIC_CITIES2,             Music_Cities2
+	music_const MUSIC_CELADON,             Music_Celadon
+	music_const MUSIC_CINNABAR,            Music_Cinnabar
+	music_const MUSIC_VERMILION,           Music_Vermilion
+	music_const MUSIC_LAVENDER,            Music_Lavender
+	music_const MUSIC_SS_ANNE,             Music_SSAnne
+	music_const MUSIC_MEET_PROF_OAK,       Music_MeetProfOak
+	music_const MUSIC_MEET_RIVAL,          Music_MeetRival
+	music_const MUSIC_MUSEUM_GUY,          Music_MuseumGuy
+	music_const MUSIC_SAFARI_ZONE,         Music_SafariZone
+	music_const MUSIC_PKMN_HEALED,         Music_PkmnHealed
+	music_const MUSIC_ROUTES1,             Music_Routes1
+	music_const MUSIC_ROUTES2,             Music_Routes2
+	music_const MUSIC_ROUTES3,             Music_Routes3
+	music_const MUSIC_ROUTES4,             Music_Routes4
+	music_const MUSIC_INDIGO_PLATEAU,      Music_IndigoPlateau
+
+	music_const MUSIC_GYM_LEADER_BATTLE,   Music_GymLeaderBattle
+	music_const MUSIC_TRAINER_BATTLE,      Music_TrainerBattle
+	music_const MUSIC_WILD_BATTLE,         Music_WildBattle
+	music_const MUSIC_FINAL_BATTLE,        Music_FinalBattle
+	music_const MUSIC_DEFEATED_TRAINER,    Music_DefeatedTrainer
+	music_const MUSIC_DEFEATED_WILD_MON,   Music_DefeatedWildMon
+	music_const MUSIC_DEFEATED_GYM_LEADER, Music_DefeatedGymLeader
+
+	music_const MUSIC_TITLE_SCREEN,        Music_TitleScreen
+	music_const MUSIC_CREDITS,             Music_Credits
+	music_const MUSIC_HALL_OF_FAME,        Music_HallOfFame
+	music_const MUSIC_OAKS_LAB,            Music_OaksLab
+	music_const MUSIC_JIGGLYPUFF_SONG,     Music_JigglypuffSong
+	music_const MUSIC_BIKE_RIDING,         Music_BikeRiding
+	music_const MUSIC_SURFING,             Music_Surfing
+	music_const MUSIC_GAME_CORNER,         Music_GameCorner
+	music_const MUSIC_INTRO_BATTLE,        Music_IntroBattle
+	music_const MUSIC_DUNGEON1,            Music_Dungeon1
+	music_const MUSIC_DUNGEON2,            Music_Dungeon2
+	music_const MUSIC_DUNGEON3,            Music_Dungeon3
+	music_const MUSIC_CINNABAR_MANSION,    Music_CinnabarMansion
+	music_const MUSIC_POKEMON_TOWER,       Music_PokemonTower
+	music_const MUSIC_SILPH_CO,            Music_SilphCo
+	music_const MUSIC_MEET_EVIL_TRAINER,   Music_MeetEvilTrainer
+	music_const MUSIC_MEET_FEMALE_TRAINER, Music_MeetFemaleTrainer
+	music_const MUSIC_MEET_MALE_TRAINER,   Music_MeetMaleTrainer
+
--- /dev/null
+++ b/constants/wram_constants.asm
@@ -1,0 +1,7 @@
+
+SPRITEBUFFERSIZE EQU 7*7 * 8 ; 7 * 7 (tiles) * 8 (bytes per tile)
+
+; Overload enemy party data
+W_WATERRATE EQU $d8a4
+W_WATERMONS EQU $d8a5
+