diff --git a/CMakeLists.txt b/CMakeLists.txt index a102841..3c7a634 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,7 @@ set(SOURCE_FILES common/challenge.c common/polyfit.c common/base32.c + common/flute_music.c common/credit_music.c) if (ALPHA) diff --git a/common/dwr.c b/common/dwr.c index ad330d7..00f6928 100644 --- a/common/dwr.c +++ b/common/dwr.c @@ -1,4 +1,3 @@ - #include #include #include @@ -23,6 +22,7 @@ #include "sprites.h" #include "expansion.h" #include "credit_music.h" +#include "flute_music.h" /* The [ and ] are actually opening/closing quotes. The / is .'. = is .. */ const char alphabet[] = "0123456789abcdefghijklmnopqrstuvwxyz" @@ -32,7 +32,7 @@ const char title_alphabet[] = "0123456789__________________________" "ABCDEFGHIJKLMNOPQRSTUVWXYZ__________________________________!.c- "; /** - * Returns the version number. Mosltly for use with emscripten. + * Returns the version number. Mostly for use with emscripten. * * @return The version number */ @@ -263,17 +263,17 @@ uint16_t set_text(dw_rom *rom, const size_t address, char *text) // int len; // uint8_t *start, *end; // char dw_text[256], dw_repl[256]; -// +// // len = strlen(text); // if (!len) // return NULL; // end = &rom->content[ROM_SIZE - len - 0x10]; -// +// // strncpy(dw_text, text, 256); // strncpy(dw_repl, replacement, 256); // ascii2dw((unsigned char *)dw_text); // ascii2dw((unsigned char *)dw_repl); -// +// // for (start = rom->content; start < end; start++) { // if (!memcmp(start, dw_text, len)) { // memcpy(start, dw_repl, len); @@ -282,7 +282,7 @@ uint16_t set_text(dw_rom *rom, const size_t address, char *text) // } // return NULL; // } -// +// /** * Patches the game to allow the use of torches and fairy water in battle * @@ -1197,7 +1197,7 @@ static void death_counter(dw_rom *rom) } /** - * Modifies the level up routine to display the spells learned rather than + * Modifies the level up routine to display the spells learned rather than * just indicating that you have learned a spell * * @param rom The rom struct @@ -1418,7 +1418,7 @@ static void dwr_menu_wrap(dw_rom *rom) } /** - * Rewrites the forced encounter routines to read from a table rather than + * Rewrites the forced encounter routines to read from a table rather than * being hard-coded. This clears enough space to allow for 8 "spikes" rather * than the normal 3. * @@ -1692,18 +1692,7 @@ static void dwr_speed_hacks(dw_rom *rom) vpatch(rom, 0x471c, 1, 1); vpatch(rom, 0x471e, 1, 1); /* speed up the fairy flute */ - vpatch(rom, 0x4ca1, 1, 1); - vpatch(rom, 0x4ca3, 1, 1); - vpatch(rom, 0x4cb5, 1, 1); - vpatch(rom, 0x4cb7, 1, 1); - vpatch(rom, 0x4cb9, 1, 1); - vpatch(rom, 0x4cbd, 1, 1); - vpatch(rom, 0x4cd2, 1, 1); - vpatch(rom, 0x4cd4, 1, 1); - vpatch(rom, 0x4cd6, 1, 1); - vpatch(rom, 0x4cd8, 1, 1); - vpatch(rom, 0x4cda, 1, 1); - vpatch(rom, 0x4cdc, 1, 1); + speed_up_flute_song(rom); /* speed up the inn music */ vpatch(rom, 0x46d4, 1, 1); vpatch(rom, 0x46d6, 1, 1); @@ -1904,8 +1893,8 @@ static void begin_quest_checksum(dw_rom *rom, uint64_t crc) vpatch(rom, 0x6f8e, 2, 0xec, 0xc7); //our brand new "begin new quest" window - vpatch(rom, 0xc7ec, 7, - 0x81, //Window Options. Selection window. + vpatch(rom, 0xc7ec, 7, + 0x81, //Window Options. Selection window. 0x02, //Window Height. 2 blocks. 0x18, //Window Width. 24 tiles. 0x12, //Window Position. Y = 1 blocks, X = 2 blocks. @@ -2093,6 +2082,7 @@ uint64_t dwr_randomize(const char* input_file, uint64_t seed, char *flags, dwr_fighters_ring(&rom); dwr_death_necklace(&rom); dwr_menu_wrap(&rom); + randomize_flute_song(&rom); dwr_speed_hacks(&rom); open_charlock(&rom); chaos_mode(&rom); diff --git a/common/dwr.h b/common/dwr.h index 805e8dc..7e87959 100644 --- a/common/dwr.h +++ b/common/dwr.h @@ -77,6 +77,7 @@ #define MODERN_SPELLS(x) (x->flags[11] & 0xc0) #define NOIR_MODE(x) (x->flags[11] & 0x30) #define RANDOMIZE_MUSIC(x) (x->flags[14] & 0x80) +#define RANDOMIZE_FLUTE_MUSIC(x) (1 > 0) #define DISABLE_MUSIC(x) (x->flags[14] & 0x40) #define NO_SCREEN_FLASH(x) (x->flags[14] & 0x20) #define DEATH_COUNTER(x) (x->flags[14] & 0x10) @@ -105,4 +106,3 @@ uint16_t set_text(dw_rom *rom, const size_t address, char *text); } #endif #endif - diff --git a/common/flute_music.c b/common/flute_music.c new file mode 100644 index 0000000..8ef37b0 --- /dev/null +++ b/common/flute_music.c @@ -0,0 +1,303 @@ + +#include +#include "patch.h" +#include "mt64.h" +#include "dwr.h" +#include "flute_music.h" + +/** + * Randomizes the Fairy Flute's music + * + * @param rom The rom struct + */ +void randomize_flute_song(dw_rom *rom) +{ + uint32_t i; + uint64_t choice; + + if (!RANDOMIZE_FLUTE_MUSIC(rom)) + return; + + printf("Randomizing flute music...\n"); + + // The original flute song is 71 bytes, of which the first 3 are unlikely to be changed. + // Every song below still includes those in case a future change requires them. + + // [Number of tracks][Bytes for the music] + uint8_t songs[69][71] = { + // 0: Original + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0x9f, 0x18, 0xf7, 0x03, 0xa1, 0xa3, 0xa4, 0xa6, 0xa8, 0xa9, 0xab, 0xad, 0xaf, 0xb0, 0xb2, 0xb4, 0xb5, 0xf6, 0xfb, 0x20, 0xb7, 0x11, 0xb7, 0x10, 0xb7, 0x10, 0xfb, 0xff, 0xf7, 0x02, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xf6, 0xb7, 0x0d, 0xb5, 0x0d, 0xb2, 0x08, 0xaf, 0x08, 0xad, 0x08, 0xab, 0x30, 0xfb, 0x00, 0x00, 0xfc}, + + // Megalovania v2 + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xf7, 0x05, 0xa6, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xa6, 0xf7, 0x04, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xb2, 0xfb, 0x00, 0x0b, 0xfb, 0xff, 0xad, 0xf7, 0x06, 0xfb, 0x00, 0x10, 0xfb, 0xff, 0xac, 0xfb, 0x00, 0x07, 0xfb, 0xff, 0xab, 0xfb, 0x00, 0x07, 0xfb, 0xff, 0xf7, 0x02, 0xa9, 0xaa, 0xa9, 0xaa, 0xa9, 0xaa, 0xa9, 0xaa, 0xa9, 0xaa, 0xa9, 0xf7, 0x07, 0xa6, 0xa9, 0xab, 0xf6, 0xfb, 0x00, 0x00, 0xfc}, + + // Imperial March v2 + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xab, 0x12, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xab, 0x12, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xab, 0x12, 0xa7, 0x0d, 0xae, 0x07, 0xab, 0x12, 0xa7, 0x0d, 0xae, 0x07, 0xab, 0x1b, 0xfb, 0x00, 0x0b, 0xfb, 0xff, 0xb2, 0x12, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xb2, 0x12, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xb2, 0x12, 0xb3, 0x0d, 0xae, 0x07, 0xaa, 0x12, 0xa7, 0x0d, 0xae, 0x07, 0xab, 0x1b, 0xfb, 0x00, 0x00, 0xfc}, + + // Song of Storms v2 + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xa6, 0x09, 0xa9, 0x09, 0xb2, 0x20, 0xa6, 0x09, 0xa9, 0x09, 0xb2, 0x20, 0xf7, 0x03, 0xb4, 0xb5, 0xb4, 0xb5, 0xb4, 0xb5, 0xb4, 0xb5, 0xb4, 0xf6, 0xb5, 0x09, 0xb4, 0x09, 0xb5, 0x09, 0xb4, 0x09, 0xb0, 0x09, 0xad, 0x24, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xad, 0x12, 0xa6, 0x12, 0xa9, 0x08, 0xab, 0x08, 0xad, 0x20, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xad, 0x12, 0xa6, 0x20, 0xfb, 0x00, 0x00, 0xfc}, + + // Flight of the bumblebee (long version) + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xf7, 0x04, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa9, 0xa8, 0xa7, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa7, 0xa6, 0xa5, 0xa6, 0xa5, 0xa4, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xaa, 0xab, 0xac, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xae, 0xad, 0xac, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xae, 0xad, 0xac, 0xad, 0xac, 0xab, 0xfb, 0x00, 0x00, 0xfc}, + + // 5: Flight of the bumblebee + {0xf9, 0x0c, 0xff, 0x18, 0xfb, 0xff, 0xb4, 0x01, 0xb3, 0x01, 0xb2, 0x01, 0xb1, 0x01, 0xb0, 0x01, 0xb5, 0x01, 0xb4, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb3, 0x01, 0xb2, 0x01, 0xb1, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb3, 0x01, 0xb2, 0x01, 0xb1, 0x01, 0xb0, 0x01, 0xb5, 0x01, 0xb4, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb3, 0x01, 0xb2, 0x01, 0xb1, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xfb, 0x00, 0x00, 0xfc}, + + // Au clair de la lune + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xb0, 0x12, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb0, 0x12, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb0, 0x12, 0xb2, 0x12, 0xb4, 0x04, 0xb2, 0x03, 0xb4, 0x04, 0xb2, 0x03, 0xb4, 0x04, 0xb2, 0x03, 0xb4, 0x04, 0xb2, 0x03, 0xb4, 0x04, 0xb2, 0x03, 0xb4, 0x04, 0xb2, 0x24, 0xb0, 0x12, 0xb4, 0x12, 0xb2, 0x12, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb2, 0x12, 0xb0, 0x24, 0xfb, 0x00, 0x00, 0xfc}, + + // Fur Elise + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xad, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x12, 0xb3, 0x12, 0xb4, 0x12, 0xb3, 0x12, 0xb4, 0x12, 0xaf, 0x12, 0xb2, 0x12, 0xb0, 0x12, 0xad, 0x03, 0xb0, 0x03, 0xad, 0x03, 0xb0, 0x03, 0xad, 0x03, 0xb0, 0x03, 0xad, 0x03, 0xb0, 0x03, 0xad, 0x03, 0xb0, 0x03, 0xad, 0x03, 0xb0, 0x03, 0xad, 0x03, 0xb0, 0x03, 0xad, 0x03, 0xb0, 0x03, 0xad, 0x07, 0xfb, 0x00, 0x00, 0xfc}, + + // Sweet Child O' Mine + {0xf9, 0x0c, 0xff, 0x5a, 0xfb, 0xff, 0xa5, 0x08, 0xb1, 0x08, 0xac, 0x08, 0xaa, 0x08, 0xb6, 0x08, 0xac, 0x08, 0xb5, 0x08, 0xac, 0x08, 0xa5, 0x08, 0xb1, 0x08, 0xac, 0x08, 0xaa, 0x08, 0xb6, 0x08, 0xac, 0x08, 0xb5, 0x08, 0xac, 0x08, 0xa7, 0x03, 0xa5, 0x03, 0xa7, 0x03, 0xa5, 0x03, 0xa7, 0x03, 0xa5, 0x03, 0xa7, 0x03, 0xa5, 0x03, 0xa7, 0x03, 0xa5, 0x03, 0xa7, 0x03, 0xa5, 0x03, 0xa7, 0x03, 0xa5, 0x07, 0xfb, 0x00, 0x00, 0xfc}, + + // Tetris + {0xf9, 0x0c, 0xff, 0x3a, 0xfb, 0xff, 0xb0, 0x08, 0xab, 0x04, 0xac, 0x04, 0xae, 0x08, 0xac, 0x04, 0xab, 0x04, 0xa9, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0x04, 0xac, 0x04, 0xb0, 0x08, 0xae, 0x04, 0xac, 0x04, 0xab, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x04, 0xac, 0x04, 0xae, 0x08, 0xb0, 0x08, 0xac, 0x08, 0xa9, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0x08, 0xfb, 0x00, 0x00, 0xfc}, + + // 10: Brahms' Lullaby + {0xf9, 0x0c, 0xff, 0x68, 0xfb, 0xff, 0xad, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x07, 0xb0, 0x1c, 0xad, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x07, 0xb0, 0x1c, 0xad, 0x07, 0xb0, 0x07, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb4, 0x0f, 0xb2, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb2, 0x0d, 0xb0, 0x11, 0xfb, 0x00, 0x00, 0xfc}, + + // Flute of Echoing + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa9, 0x02, 0xaa, 0x02, 0xa9, 0x1e, 0xac, 0x03, 0xaf, 0x02, 0xb4, 0x03, 0xb5, 0x02, 0xb4, 0x03, 0xaf, 0x02, 0xac, 0x03, 0xa9, 0x1e, 0xb4, 0x03, 0xa9, 0x1e, 0x9e, 0x03, 0xa1, 0x03, 0xa4, 0x03, 0xa9, 0x1e, 0xfb, 0x00, 0x00, 0xfc}, + + // Gens du pays + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa8, 0x07, 0xa6, 0x07, 0xa4, 0x07, 0xab, 0x15, 0xa8, 0x07, 0xa6, 0x07, 0xa4, 0x07, 0xad, 0x15, 0xa6, 0x07, 0xa9, 0x07, 0xad, 0x07, 0xab, 0x0e, 0xa4, 0x07, 0xa8, 0x0e, 0xa6, 0x07, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x07, 0xfb, 0x00, 0x00, 0xfc}, + + // Histoire sans paroles + {0xf9, 0x0c, 0xff, 0x88, 0xfb, 0xff, 0xaf, 0x20, 0xb6, 0x10, 0xb2, 0x10, 0xb1, 0x08, 0xb2, 0x08, 0xb1, 0x10, 0xaf, 0x10, 0xaa, 0x04, 0xab, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xaa, 0x08, 0xb6, 0x10, 0xb2, 0x10, 0xb1, 0x08, 0xb2, 0x08, 0xb1, 0x10, 0xaf, 0x20, 0xfb, 0x00, 0x00, 0xfc}, + + // I Was Made For Loving You + {0xf9, 0x0c, 0xff, 0x38, 0xfb, 0xff, 0xa6, 0x07, 0xa8, 0x07, 0xa9, 0x07, 0xab, 0x03, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x01, 0xad, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x03, 0xab, 0x07, 0xa9, 0x07, 0xa8, 0x07, 0xa6, 0x07, 0xa8, 0x07, 0xa9, 0x07, 0xab, 0x03, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x01, 0xad, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x03, 0xab, 0x0e, 0xfb, 0x00, 0x00, 0xfc}, + + // 15: My Heart Will Go On + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xa8, 0x12, 0xaa, 0x11, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaa, 0x12, 0xac, 0x2a, 0xaa, 0x08, 0xac, 0x02, 0xaa, 0x02, 0xac, 0x02, 0xaa, 0x02, 0xa8, 0x12, 0xaa, 0x12, 0xaf, 0x2a, 0xb0, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xad, 0x10, 0xac, 0x12, 0xa8, 0x24, 0xa5, 0x36, 0xa1, 0x12, 0xa3, 0x36, 0xfb, 0x00, 0x00, 0xfc}, + + // Still Alive v2 + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xa1, 0x09, 0xa2, 0x09, 0xf7, 0x12, 0xa4, 0xa9, 0xa8, 0xf7, 0x09, 0xa6, 0xa4, 0xa6, 0xa4, 0xf6, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa4, 0x11, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa4, 0x12, 0xa1, 0x09, 0xa2, 0x09, 0xa4, 0x12, 0xa9, 0x12, 0xf7, 0x09, 0xab, 0xa9, 0xa8, 0xa6, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0xa8, 0xf6, 0xa9, 0x12, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0x12, 0xfb, 0x00, 0x00, 0xfc}, + + // YMCA + {0xf9, 0x0c, 0xff, 0x68, 0xfb, 0xff, 0xae, 0x09, 0xb0, 0x09, 0xae, 0x09, 0xb0, 0x09, 0xae, 0x09, 0xb0, 0x09, 0xfb, 0x00, 0x09, 0xfb, 0xff, 0xb0, 0x02, 0xb2, 0x02, 0xb0, 0x02, 0xb2, 0x02, 0xb0, 0x02, 0xb2, 0x02, 0xb0, 0x02, 0xb2, 0x02, 0xb0, 0x02, 0xb2, 0x02, 0xb0, 0x02, 0xb2, 0x02, 0xb0, 0x02, 0xb2, 0x02, 0xfb, 0x00, 0x05, 0xfb, 0xff, 0xb0, 0x0e, 0xfb, 0x00, 0x05, 0xfb, 0xff, 0xb2, 0x0a, 0xb0, 0x0d, 0xfb, 0x00, 0x00, 0xfc}, + + // Final Fantasy Prelude + {0xf9, 0x0c, 0xff, 0x38, 0xfb, 0xff, 0x96, 0x03, 0x8c, 0x03, 0x8e, 0x03, 0x91, 0x03, 0x96, 0x03, 0x98, 0x03, 0x9a, 0x03, 0x9d, 0x03, 0xa2, 0x03, 0xa4, 0x03, 0xa6, 0x03, 0xa9, 0x03, 0xae, 0x03, 0xb0, 0x03, 0xb2, 0x03, 0xb5, 0x03, 0xba, 0x03, 0xb5, 0x03, 0xb2, 0x03, 0xb0, 0x03, 0xae, 0x03, 0xa9, 0x03, 0xa6, 0x03, 0xa4, 0x03, 0xa2, 0x03, 0x9d, 0x03, 0x9a, 0x03, 0x98, 0x03, 0x96, 0x0c, 0xfb, 0x00, 0x00, 0xfc}, + + // Final Fantasy Prelude (long version) + {0xf9, 0x0c, 0xff, 0x38, 0xfb, 0xff, 0xf7, 0x03, 0x8c, 0x8e, 0x91, 0x96, 0x98, 0x9a, 0x9d, 0xa2, 0xa4, 0xa6, 0xa9, 0xae, 0xb0, 0xb2, 0xb5, 0xba, 0xb5, 0xb2, 0xb0, 0xae, 0xa9, 0xa6, 0xa4, 0xa2, 0x9d, 0x9a, 0x98, 0x96, 0x91, 0x8e, 0x8c, 0x93, 0x95, 0x96, 0x8e, 0x93, 0x95, 0x96, 0x9a, 0x9f, 0xa1, 0xa2, 0xa6, 0xab, 0xad, 0xae, 0xb2, 0xb7, 0xb2, 0xae, 0xad, 0xab, 0xa6, 0xa2, 0xa1, 0xf6, 0x9f, 0x09, 0xfb, 0x00, 0x00, 0xfc}, + + // 20: Inspector Gadget + {0xf9, 0x0c, 0xff, 0x68, 0xfb, 0xff, 0xa4, 0x08, 0xa6, 0x04, 0xa7, 0x08, 0xa9, 0x04, 0xab, 0x0c, 0xa7, 0x0c, 0xaa, 0x0c, 0xa6, 0x0c, 0xa9, 0x0c, 0xa7, 0x0c, 0xa4, 0x08, 0xa6, 0x04, 0xa7, 0x08, 0xa9, 0x04, 0xab, 0x0c, 0xb0, 0x0c, 0xaf, 0x02, 0xb0, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xaf, 0x04, 0xfb, 0x00, 0x00, 0xfc}, + + // Morning Mood + {0xf9, 0x0c, 0xff, 0x68, 0xfb, 0xff, 0xaf, 0x0e, 0xac, 0x0e, 0xaa, 0x0e, 0xa8, 0x0e, 0xaa, 0x07, 0xac, 0x07, 0xaa, 0x07, 0xac, 0x07, 0xaf, 0x0e, 0xac, 0x0e, 0xaf, 0x0e, 0xb1, 0x0e, 0xac, 0x0e, 0xb1, 0x0e, 0xaf, 0x0e, 0xac, 0x0e, 0xaa, 0x0e, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x04, 0xfb, 0x00, 0x00, 0xfc}, + + // Call to the Cows + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xab, 0x15, 0xad, 0x06, 0xa6, 0x06, 0xab, 0x06, 0xaf, 0x06, 0xa6, 0x06, 0xab, 0x15, 0xaf, 0x06, 0xb4, 0x06, 0xb2, 0x06, 0xa6, 0x06, 0xaf, 0x06, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xac, 0x03, 0xad, 0x03, 0xb2, 0x0c, 0xfb, 0x00, 0x00, 0xfc}, + + // O Canada + {0xf9, 0x0c, 0xff, 0x38, 0xfb, 0xff, 0xac, 0x10, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaf, 0x0a, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaf, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa8, 0x15, 0xaa, 0x08, 0xac, 0x08, 0xad, 0x08, 0xaf, 0x08, 0xb1, 0x08, 0xaa, 0x11, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x02, 0xa8, 0x02, 0xaa, 0x04, 0xfb, 0x00, 0x00, 0xfc}, + + // Star-Spangled Banner + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xa8, 0x10, 0xa5, 0x08, 0xa1, 0x18, 0xa5, 0x18, 0xa8, 0x18, 0xad, 0x03, 0xac, 0x02, 0xad, 0x03, 0xac, 0x03, 0xad, 0x02, 0xac, 0x03, 0xad, 0x03, 0xac, 0x02, 0xad, 0x1b, 0xb1, 0x10, 0xaf, 0x08, 0xad, 0x18, 0xa5, 0x18, 0xa7, 0x18, 0xa8, 0x02, 0xa7, 0x03, 0xa8, 0x03, 0xa7, 0x02, 0xa8, 0x03, 0xa7, 0x03, 0xa8, 0x02, 0xa7, 0x03, 0xa8, 0x03, 0xa7, 0x02, 0xa8, 0x06, 0xfb, 0x00, 0x00, 0xfc}, + + // 25: A Nightmare on Elm Street Intro + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xa7, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaa, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xae, 0x30, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xae, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0x08, 0xaa, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xae, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaf, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0x20, 0xfb, 0x00, 0x00, 0xfc}, + + // Final Fantasy Fanfare + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa7, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0x0c, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa3, 0x0c, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa5, 0x0c, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa5, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0x22, 0xfb, 0x00, 0x00, 0xfc}, + + // Mega Man 2 Wily Map v2 + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x08, 0xac, 0xb2, 0xb1, 0xaf, 0xac, 0xfb, 0x00, 0x06, 0xfb, 0xff, 0xaf, 0xaa, 0xfb, 0x00, 0x06, 0xfb, 0xff, 0xab, 0xfb, 0x00, 0x06, 0xfb, 0xff, 0xac, 0xfb, 0x00, 0x06, 0xfb, 0xff, 0xf7, 0x08, 0xaf, 0xae, 0xad, 0xac, 0xb2, 0xb1, 0xaf, 0xac, 0xaf, 0xb2, 0xf6, 0xb5, 0x28, 0xb1, 0x0a, 0xfb, 0x00, 0x05, 0xfb, 0xff, 0xb3, 0x0a, 0xfb, 0x00, 0x00, 0xfc}, + + // Protoman’s Whistle + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xab, 0x08, 0xae, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xae, 0x02, 0xaf, 0x02, 0xb0, 0x24, 0xae, 0x06, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x18, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x08, 0xae, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xae, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x0c, 0xb0, 0x0f, 0xae, 0x08, 0xa9, 0x08, 0xab, 0x1b, 0xfb, 0x00, 0x00, 0xfc}, + + // Monopoly Intro + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xaf, 0x02, 0xb0, 0x0c, 0xab, 0x0e, 0xfb, 0x00, 0x06, 0xfb, 0xff, 0xa8, 0x06, 0xab, 0x06, 0xaa, 0x0a, 0xfb, 0x00, 0x04, 0xfb, 0xff, 0xa9, 0x14, 0xa6, 0x0e, 0xfb, 0x00, 0x0e, 0xfb, 0xff, 0xaf, 0x02, 0xb0, 0x08, 0xfb, 0x00, 0x04, 0xfb, 0xff, 0xab, 0x14, 0xa8, 0x06, 0xab, 0x08, 0xad, 0x04, 0xab, 0x08, 0xa9, 0x12, 0xa6, 0x0e, 0xfb, 0x00, 0x00, 0xfc}, + + // 30: Zelda 2 Flute + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xb4, 0x06, 0xb2, 0x06, 0xb1, 0x06, 0xb2, 0x06, 0xb4, 0x0c, 0xb9, 0x0c, 0xb4, 0x01, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x01, 0xb4, 0x01, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x01, 0xb4, 0x01, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x01, 0xb4, 0x01, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x01, 0xb4, 0x01, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x01, 0xb4, 0x01, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x01, 0xfb, 0x00, 0x00, 0xfc}, + + // Rygar + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xad, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb1, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb4, 0x20, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb4, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb4, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb6, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb4, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb2, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb4, 0x2c, 0xfb, 0x00, 0x00, 0xfc}, + + // Ace Attorney + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xa1, 0x08, 0xa3, 0x08, 0xaa, 0x08, 0xa3, 0x07, 0xa7, 0x01, 0xa8, 0x01, 0xaa, 0x28, 0xa3, 0x08, 0xaa, 0x10, 0xa8, 0x18, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa3, 0x08, 0xaa, 0x08, 0xa3, 0x08, 0xaa, 0x08, 0xa8, 0x10, 0xa6, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0x08, 0xa5, 0x08, 0xa6, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0x20, 0xfb, 0x00, 0x00, 0xfc}, + + // Cave Story + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa7, 0x07, 0xac, 0x07, 0xa7, 0x07, 0xac, 0x07, 0xa6, 0x07, 0xac, 0x07, 0xa6, 0x07, 0xac, 0x07, 0xa5, 0x07, 0xac, 0x07, 0xa5, 0x07, 0xac, 0x07, 0xa4, 0x07, 0xac, 0x07, 0xa4, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa4, 0x03, 0xa5, 0x05, 0xa6, 0x03, 0xa7, 0x03, 0xa6, 0x02, 0xa7, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa6, 0x02, 0xa7, 0x05, 0xfb, 0x00, 0x00, 0xfc}, + + // Cave Story (long version) + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xf7, 0x07, 0xa7, 0xac, 0xa7, 0xac, 0xa6, 0xac, 0xa6, 0xac, 0xa5, 0xac, 0xa5, 0xac, 0xa4, 0xac, 0xa4, 0xf6, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa4, 0x03, 0xa5, 0x05, 0xa6, 0x03, 0xf7, 0x07, 0xa7, 0xac, 0xa7, 0xac, 0xa6, 0xac, 0xa6, 0xac, 0xa5, 0xac, 0xa5, 0xac, 0xaf, 0xf7, 0x01, 0xae, 0xaf, 0xae, 0xaf, 0xae, 0xaf, 0xae, 0xaf, 0xf6, 0xac, 0x07, 0xfb, 0x00, 0x00, 0xfc}, + + // 35: Chrono Trigger + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa3, 0x04, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xa8, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaa, 0x09, 0xab, 0x06, 0xa3, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaa, 0x09, 0xa6, 0x1e, 0xfb, 0x00, 0x06, 0xfb, 0xff, 0xa1, 0x03, 0xa3, 0x03, 0xa8, 0x03, 0xad, 0x09, 0xaf, 0x07, 0xfb, 0x00, 0x02, 0xfb, 0xff, 0xaf, 0x09, 0xad, 0x03, 0xac, 0x03, 0xa8, 0x15, 0xfb, 0x00, 0x00, 0xfc}, + + // Frère Jacques + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa4, 0x06, 0xa6, 0x06, 0xa8, 0x06, 0xa4, 0x05, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa4, 0x06, 0xa6, 0x06, 0xa8, 0x06, 0xa4, 0x06, 0xa8, 0x06, 0xa9, 0x06, 0xab, 0x0c, 0xa8, 0x06, 0xa9, 0x06, 0xab, 0x0c, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x03, 0xad, 0x03, 0xab, 0x03, 0xa9, 0x03, 0xa8, 0x06, 0xa4, 0x03, 0xa3, 0x02, 0xa4, 0x02, 0xa3, 0x02, 0xa4, 0x03, 0xfb, 0x00, 0x00, 0xfc}, + + // Indiana Jones + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa8, 0x09, 0xa9, 0x02, 0xab, 0x06, 0xb0, 0x1a, 0xfb, 0x00, 0x03, 0xfb, 0xff, 0xa6, 0x09, 0xa8, 0x03, 0xa9, 0x1e, 0xfb, 0x00, 0x06, 0xfb, 0xff, 0xab, 0x09, 0xad, 0x03, 0xaf, 0x06, 0xb5, 0x1a, 0xfb, 0x00, 0x06, 0xfb, 0xff, 0xad, 0x09, 0xaf, 0x03, 0xb0, 0x0c, 0xb2, 0x0c, 0xb4, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xfb, 0x00, 0x00, 0xfc}, + + // La p’tite vie + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xad, 0x07, 0xaf, 0x07, 0xb0, 0x0e, 0xb4, 0x0e, 0xb2, 0x09, 0xb0, 0x03, 0xaf, 0x07, 0xad, 0x07, 0xaf, 0x07, 0xad, 0x07, 0xab, 0x0e, 0xad, 0x02, 0xab, 0x02, 0xad, 0x02, 0xab, 0x02, 0xad, 0x02, 0xab, 0x02, 0xad, 0x02, 0xab, 0x02, 0xa8, 0x07, 0xab, 0x07, 0xa9, 0x0e, 0xad, 0x0e, 0xac, 0x09, 0xa9, 0x03, 0xa8, 0x07, 0xa6, 0x07, 0xa8, 0x07, 0xa6, 0x07, 0xa4, 0x17, 0xfb, 0x00, 0x00, 0xfc}, + + // Sea of Stars – Mountain Trail + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa9, 0x07, 0xfb, 0x00, 0x07, 0xfb, 0xff, 0xa4, 0x07, 0xfb, 0x00, 0x07, 0xfb, 0xff, 0xa9, 0x0e, 0xfb, 0x00, 0x0e, 0xfb, 0xff, 0xa9, 0x03, 0xa7, 0x03, 0xa4, 0x03, 0xa7, 0x03, 0xac, 0x05, 0xfb, 0x00, 0x04, 0xfb, 0xff, 0xab, 0x03, 0xa9, 0x03, 0xa7, 0x02, 0xa9, 0x02, 0xa7, 0x02, 0xa9, 0x02, 0xa7, 0x02, 0xa9, 0x02, 0xa7, 0x02, 0xa9, 0x02, 0xa7, 0x02, 0xa9, 0x06, 0xfb, 0x00, 0x00, 0xfc}, + + // 40: Shadow’s Theme + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xa6, 0x0c, 0xad, 0x30, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x0c, 0xab, 0x0c, 0xa9, 0x0c, 0xa8, 0x0c, 0xa6, 0x0c, 0xa8, 0x0c, 0xa9, 0x0c, 0xa4, 0x0c, 0xa6, 0x21, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xa4, 0x02, 0xa6, 0x02, 0xfb, 0x00, 0x00, 0xfc}, + + // To Be With You + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xac, 0x06, 0xad, 0x06, 0xaf, 0x06, 0xb4, 0x06, 0xb1, 0x0c, 0xaf, 0x0c, 0xaa, 0x0c, 0xac, 0x05, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xac, 0x0c, 0xaa, 0x03, 0xa8, 0x03, 0xfb, 0x00, 0x0c, 0xfb, 0xff, 0xac, 0x06, 0xad, 0x06, 0xaf, 0x06, 0xb4, 0x06, 0xb1, 0x0c, 0xb8, 0x0c, 0xb6, 0x0c, 0xb4, 0x06, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb4, 0x12, 0xfb, 0x00, 0x00, 0xfc}, + + // Twinkle Twinkle Little Star + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa4, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa4, 0x09, 0xab, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x09, 0xad, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x09, 0xab, 0x12, 0xa9, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0x09, 0xa8, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa8, 0x09, 0xa6, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0x09, 0xa4, 0x14, 0xfb, 0x00, 0x00, 0xfc}, + + // Waverace 64 + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa3, 0x0a, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x05, 0xac, 0x05, 0xa8, 0x05, 0xaa, 0x0a, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xac, 0x05, 0xad, 0x05, 0xac, 0x0a, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0x01, 0xa8, 0x01, 0xaa, 0x05, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa8, 0x12, 0xa7, 0x02, 0xa8, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xfb, 0x00, 0x00, 0xfc}, + + // We Will Rock You + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xa3, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0x04, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x14, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaa, 0x14, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa8, 0x14, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0x14, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa8, 0x07, 0xfb, 0x00, 0x03, 0xfb, 0xff, 0xa8, 0x0a, 0xfb, 0x00, 0x00, 0xfc}, + + // 45: Zelda 1 Flute + {0xf9, 0x0c, 0xff, 0x38, 0xfb, 0xff, 0x9a, 0x0a, 0x9c, 0x0a, 0xa6, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa5, 0x02, 0xa6, 0x05, 0xa5, 0x04, 0xa4, 0x04, 0xa3, 0x02, 0xa4, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa3, 0x05, 0xfb, 0x00, 0x00, 0xfc}, + + // Barbie Girl + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xf7, 0x06, 0xab, 0xa7, 0xab, 0xb0, 0xf6, 0xac, 0x18, 0xf7, 0x06, 0xa9, 0xa6, 0xa9, 0xae, 0xf6, 0xab, 0x0c, 0xa9, 0x06, 0xa7, 0x09, 0xfb, 0x00, 0x09, 0xfb, 0xff, 0xa7, 0x06, 0xa4, 0x06, 0xa9, 0x0c, 0xa4, 0x0c, 0xfb, 0x00, 0x0c, 0xfb, 0xff, 0xa9, 0x06, 0xa6, 0x06, 0xf7, 0x02, 0xa9, 0xab, 0xa9, 0xab, 0xa9, 0xab, 0xa9, 0xab, 0xf6, 0xa9, 0x06, 0xa7, 0x06, 0xfb, 0x00, 0x00, 0xfc}, + + // Blue Danube + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xf7, 0x0a, 0xa6, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0xaa, 0xad, 0xf6, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x0f, 0xfb, 0x00, 0x05, 0xfb, 0xff, 0xad, 0x0a, 0xf7, 0x02, 0xaa, 0xad, 0xaa, 0xad, 0xaa, 0xad, 0xaa, 0xad, 0xaa, 0xad, 0xaa, 0xad, 0xf6, 0xfb, 0x00, 0x03, 0xfb, 0xff, 0xaa, 0x0a, 0xf7, 0x02, 0xa6, 0xaa, 0xa6, 0xaa, 0xa6, 0xaa, 0xa6, 0xaa, 0xa6, 0xaa, 0xfb, 0x00, 0x00, 0xfc}, + + // Careless Whisper + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xf7, 0x02, 0xab, 0xad, 0xaf, 0xb0, 0xb2, 0xb3, 0xb4, 0xb5, 0xf6, 0xb6, 0x0a, 0xb4, 0x05, 0xaf, 0x0a, 0xab, 0x0a, 0xb5, 0x02, 0xb6, 0x0e, 0xb4, 0x05, 0xaf, 0x0a, 0xab, 0x0a, 0xb0, 0x02, 0xb2, 0x09, 0xb0, 0x05, 0xab, 0x0a, 0xa8, 0x0a, 0xb0, 0x02, 0xb2, 0x09, 0xb0, 0x05, 0xf7, 0x02, 0xab, 0xad, 0xab, 0xad, 0xab, 0xad, 0xab, 0xad, 0xab, 0xad, 0xab, 0xad, 0xab, 0xfb, 0x00, 0x00, 0xfc}, + + // Chip N’ Dale + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x05, 0xaf, 0xfb, 0x00, 0x01, 0xfb, 0xfb, 0xaf, 0xfb, 0x00, 0x01, 0xfb, 0xfb, 0xaf, 0xfb, 0x00, 0x01, 0xfb, 0xfb, 0xaf, 0xfb, 0x00, 0x01, 0xfb, 0xfb, 0xf6, 0xaf, 0x08, 0xfb, 0x00, 0x03, 0xfb, 0xff, 0xae, 0x0b, 0xf7, 0x01, 0xad, 0xac, 0xad, 0xae, 0xaf, 0xae, 0xad, 0xac, 0xad, 0xae, 0xaf, 0xf6, 0xfb, 0x00, 0x04, 0xfb, 0xff, 0xae, 0x0a, 0xaa, 0x08, 0xac, 0x0d, 0xfb, 0x00, 0x00, 0xfc}, + + // 50: Duck Tales Intro + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x09, 0xa8, 0xac, 0xaf, 0xb1, 0xf6, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb2, 0x06, 0xb1, 0x03, 0xfb, 0x00, 0x07, 0xfb, 0xff, 0xaf, 0x03, 0xad, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0x09, 0xfb, 0x00, 0x07, 0xfb, 0xff, 0xac, 0x0b, 0xfb, 0x00, 0x0a, 0xfb, 0xff, 0xad, 0x09, 0xfb, 0x00, 0x07, 0xfb, 0xff, 0xac, 0x0b, 0xfb, 0x00, 0x00, 0xfc}, + + // Duck Tales Moon Level + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xf7, 0x05, 0x9e, 0xa5, 0xaa, 0xac, 0xa5, 0xaa, 0xac, 0xaf, 0xa5, 0xaf, 0xae, 0xa5, 0xae, 0xac, 0xaa, 0x9e, 0xa5, 0xaa, 0xac, 0xa5, 0xaa, 0xac, 0xaf, 0xa5, 0xaf, 0xae, 0xa5, 0xae, 0xac, 0xaa, 0xf7, 0x02, 0x9e, 0xa0, 0x9e, 0xa0, 0x9e, 0xa0, 0x9e, 0xa0, 0x9e, 0xa0, 0x9e, 0xa0, 0x9e, 0xf6, 0xfb, 0x00, 0x00, 0xfc}, + + // El Bimbo + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xa9, 0x07, 0xae, 0x01, 0xb0, 0x02, 0xf7, 0x07, 0xb1, 0xb0, 0xae, 0xa9, 0xf6, 0xa5, 0x15, 0xf7, 0x02, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xf6, 0xa9, 0x07, 0xae, 0x01, 0xb0, 0x02, 0xf7, 0x07, 0xb1, 0xb0, 0xae, 0xa9, 0xf6, 0xaa, 0x01, 0xac, 0x14, 0xaa, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaa, 0x15, 0xf7, 0x02, 0xac, 0xaa, 0xac, 0xaa, 0xac, 0xaa, 0xac, 0xaa, 0xfb, 0x00, 0x00, 0xfc}, + + // Super Mario RPG Forest Maze + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x05, 0xa4, 0xa6, 0xa7, 0xa9, 0xf6, 0xab, 0x0a, 0xae, 0x01, 0xf7, 0x0a, 0xb0, 0xae, 0xab, 0xf7, 0x02, 0xad, 0xae, 0xad, 0xae, 0xad, 0xae, 0xad, 0xae, 0xad, 0xae, 0xad, 0xf6, 0xae, 0x0a, 0xab, 0x05, 0xad, 0x05, 0xae, 0x0a, 0xad, 0x05, 0xa9, 0x05, 0xa6, 0x0a, 0xa7, 0x0a, 0xf7, 0x02, 0xa6, 0xa7, 0xa6, 0xa7, 0xa6, 0xa7, 0xa6, 0xa7, 0xa6, 0xa7, 0xa6, 0xfb, 0x00, 0x00, 0xfc}, + + // Frosty The Snowman + {0xf9, 0x0c, 0xff, 0x68, 0xfb, 0xff, 0xab, 0x14, 0xa8, 0x0f, 0xa9, 0x05, 0xab, 0x0a, 0xb0, 0x14, 0xaf, 0x08, 0xb0, 0x04, 0xf7, 0x0a, 0xb2, 0xb0, 0xaf, 0xad, 0xf6, 0xab, 0x1e, 0xaf, 0x08, 0xb0, 0x04, 0xf7, 0x0a, 0xb2, 0xb0, 0xaf, 0xad, 0xab, 0xb0, 0xa8, 0xf6, 0xab, 0x06, 0xad, 0x05, 0xab, 0x0a, 0xa9, 0x0a, 0xa8, 0x0a, 0xa6, 0x0a, 0xf7, 0x02, 0xa4, 0xa6, 0xa4, 0xa6, 0xa4, 0xa6, 0xa4, 0xa6, 0xa4, 0xfb, 0x00, 0x00, 0xfc}, + + // 55: Happy Birthday (short version) + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xab, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x03, 0xf7, 0x0b, 0xad, 0xab, 0xb0, 0xf7, 0x02, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xf6, 0xab, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x03, 0xf7, 0x0b, 0xad, 0xab, 0xb2, 0xf7, 0x02, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xfb, 0x00, 0x00, 0xfc}, + + // Happy Birthday + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xab, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x03, 0xf7, 0x0a, 0xad, 0xab, 0xb0, 0xf6, 0xaf, 0x12, 0xab, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0x03, 0xf7, 0x0a, 0xad, 0xab, 0xb2, 0xf6, 0xb0, 0x12, 0xf7, 0x0a, 0xab, 0xb7, 0xb4, 0xb0, 0xaf, 0xf6, 0xad, 0x12, 0xb5, 0x07, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb5, 0x03, 0xf7, 0x0a, 0xb4, 0xb0, 0xb2, 0xf6, 0xb0, 0x0f, 0xfb, 0x00, 0x00, 0xfc}, + + // Journey To Silius Intro + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x05, 0xa4, 0xa7, 0xa4, 0xf7, 0x02, 0xa9, 0xaa, 0xf6, 0xab, 0x09, 0xa9, 0x05, 0xa7, 0x0a, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa2, 0x0f, 0xa4, 0x11, 0xfb, 0x00, 0x04, 0xfb, 0xff, 0xf7, 0x05, 0xa4, 0xa7, 0xa4, 0xf7, 0x02, 0xa9, 0xaa, 0xf6, 0xab, 0x09, 0xa9, 0x05, 0xa7, 0x0a, 0xae, 0x0f, 0xf7, 0x02, 0xad, 0xae, 0xad, 0xae, 0xad, 0xae, 0xad, 0xae, 0xad, 0xae, 0xad, 0xfb, 0x00, 0x00, 0xfc}, + + // La Marseillaise + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xa6, 0x03, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa6, 0x03, 0xf7, 0x0c, 0xab, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0xad, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xad, 0xf6, 0xb2, 0x12, 0xaf, 0x06, 0xab, 0x06, 0xfb, 0x00, 0x03, 0xfb, 0xff, 0xab, 0x03, 0xaf, 0x09, 0xab, 0x03, 0xa8, 0x0c, 0xb0, 0x18, 0xad, 0x09, 0xaa, 0x03, 0xab, 0x15, 0xfb, 0x00, 0x00, 0xfc}, + + // Marche Funèbre + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xb0, 0x0c, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb0, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb0, 0x03, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb0, 0x0c, 0xb3, 0x09, 0xb2, 0x03, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb2, 0x09, 0xb0, 0x03, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb0, 0x09, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xaf, 0x04, 0xf7, 0x02, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xaf, 0xb0, 0xfb, 0x00, 0x00, 0xfc}, + + // 60: Neverending Story + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x06, 0xa7, 0xa9, 0xf7, 0x0c, 0xab, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0xac, 0xa9, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0xa7, 0xa6, 0xf6, 0xa4, 0x12, 0xab, 0x1b, 0xfb, 0x00, 0x03, 0xfb, 0xff, 0xf7, 0x06, 0xa9, 0xa7, 0xa9, 0xa9, 0xa7, 0xa6, 0xa7, 0xa7, 0xa6, 0xa4, 0xf7, 0x02, 0xa6, 0xa4, 0xa6, 0xa4, 0xa6, 0xa4, 0xa6, 0xfb, 0x00, 0x00, 0xfc}, + + // Pachelbel’s Canon + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x05, 0xad, 0xad, 0xaa, 0xab, 0xad, 0xad, 0xaa, 0xab, 0xad, 0xa1, 0xa3, 0xa5, 0xa6, 0xa8, 0xaa, 0xab, 0xaa, 0xaa, 0xa6, 0xa8, 0xaa, 0xaa, 0x9e, 0x9f, 0xa1, 0xa3, 0xa1, 0x9f, 0xa1, 0x9e, 0x9f, 0xa1, 0x9f, 0x9f, 0xa3, 0xa1, 0x9f, 0x9f, 0x9e, 0x9c, 0xf7, 0x02, 0x9a, 0x9c, 0x9a, 0x9c, 0x9a, 0x9c, 0x9a, 0x9c, 0x9a, 0x9c, 0x9a, 0x9c, 0x9a, 0x9c, 0x9a, 0xfb, 0x00, 0x00, 0xfc}, + + // Rudolph the red-nosed reindeer + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x05, 0xa8, 0xaa, 0xaa, 0xa8, 0xa5, 0xa5, 0xad, 0xad, 0xaa, 0xaa, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa8, 0xaa, 0xa8, 0xaa, 0xa8, 0xa8, 0xad, 0xad, 0xf6, 0xac, 0x11, 0xf7, 0x02, 0xad, 0xac, 0xad, 0xac, 0xad, 0xac, 0xad, 0xac, 0xad, 0xac, 0xfb, 0x00, 0x00, 0xfc}, + + // FF6 Searching for Friends + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xac, 0x1b, 0xad, 0x02, 0xae, 0x02, 0xaf, 0x1b, 0xae, 0x0e, 0xac, 0x0e, 0xaa, 0x0e, 0xa3, 0x07, 0xa5, 0x07, 0xa6, 0x02, 0xa7, 0x14, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0x07, 0xa5, 0x0e, 0xa3, 0x07, 0xa5, 0x07, 0xf7, 0x02, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xa5, 0xa7, 0xfb, 0x00, 0x00, 0xfc}, + + // When The Saints Come Marching In + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xa9, 0x04, 0xad, 0x04, 0xae, 0x04, 0xb0, 0x10, 0xa9, 0x04, 0xad, 0x04, 0xae, 0x04, 0xf7, 0x08, 0xb0, 0xad, 0xa9, 0xad, 0xf6, 0xab, 0x10, 0xad, 0x07, 0xab, 0x04, 0xa9, 0x0c, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0x04, 0xad, 0x08, 0xb0, 0x08, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xb0, 0x05, 0xae, 0x0f, 0xad, 0x04, 0xae, 0x04, 0xf7, 0x08, 0xb0, 0xad, 0xa9, 0xab, 0xa9, 0xa9, 0xfb, 0x00, 0x00, 0xfc}, + + // 65: Yankee Doodle + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x06, 0xa6, 0xab, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0xad, 0xaf, 0xab, 0xaf, 0xad, 0xa6, 0xab, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0xad, 0xaf, 0xab, 0xab, 0xaa, 0xa6, 0xab, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xab, 0xad, 0xaf, 0xb0, 0xaf, 0xad, 0xab, 0xaa, 0xa6, 0xa8, 0xaa, 0xf7, 0x02, 0xab, 0xaa, 0xab, 0xaa, 0xab, 0xaa, 0xab, 0xaa, 0xab, 0xaa, 0xab, 0xaa, 0xab, 0xfb, 0x00, 0x00, 0xfc}, + + // Life Force + {0xf9, 0x0c, 0xff, 0x48, 0xfb, 0xff, 0xf7, 0x04, 0xa6, 0xa9, 0xad, 0xb0, 0xad, 0xa9, 0xb0, 0xad, 0xa9, 0xa6, 0xa9, 0xb0, 0xa6, 0xa9, 0xac, 0xaf, 0xac, 0xa9, 0xaf, 0xac, 0xa9, 0xa6, 0xa9, 0xaf, 0xb1, 0xb4, 0xb8, 0xbb, 0xb8, 0xb4, 0xf6, 0xb1, 0x18, 0xf7, 0x04, 0xb0, 0xb3, 0xb7, 0xba, 0xb7, 0xb3, 0xb9, 0xb9, 0xf7, 0x02, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xb9, 0xb7, 0xfb, 0x00, 0x00, 0xfc}, + + // Never Gonna Give You Up + {0xf9, 0x0c, 0xff, 0x58, 0xfb, 0xff, 0xf7, 0x04, 0xa0, 0xa2, 0xa5, 0xa2, 0xf7, 0x0c, 0xa9, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0xa7, 0xa7, 0xf7, 0x04, 0xa0, 0xa2, 0xa5, 0xa2, 0xf7, 0x0c, 0xa7, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa7, 0xa5, 0xf7, 0x04, 0xa4, 0xa2, 0xa2, 0xa0, 0xa2, 0xa5, 0xa2, 0xf6, 0xa5, 0x10, 0xa7, 0x08, 0xa4, 0x0c, 0xa2, 0x04, 0xa0, 0x18, 0xa7, 0x10, 0xa5, 0x10, 0xfb, 0x00, 0x00, 0xfc}, + + // Fort Boyard + {0xf9, 0x0c, 0xff, 0x78, 0xfb, 0xff, 0xa9, 0x30, 0xfb, 0x00, 0x01, 0xfb, 0xff, 0xa9, 0x0f, 0xac, 0x18, 0xab, 0x18, 0xa7, 0x0f, 0xa9, 0x0c, 0xfb, 0x00, 0x03, 0xfb, 0xff, 0xf7, 0x09, 0xa9, 0xac, 0xb0, 0xac, 0xf6, 0xae, 0x18, 0xf7, 0x03, 0xac, 0xae, 0xac, 0xae, 0xac, 0xae, 0xac, 0xae, 0xac, 0xae, 0xfb, 0x00, 0x00, 0xfc} + + }; + + choice = mt_rand(0, sizeof(songs)/71 - 1); + for(i = 0; icontent[address]; + //printf("%04x, %02x\n", address, i); + switch(i) + { + case(0xf6): + skip = 2; // might be "note + length" bytes from now on + address++; + break; + case(0xf7): // sets fixed note length until disabled + skip = 1; // single notes until otherwise noted + address++; // skip this instruction + vpatch(rom, address, 1, 1); // set said fixed length to the minimum + address++; + break; + case(0xfb): + if(rom->content[address+1] == 0 && rom->content[address+2] == 0) + { + song_ended = TRUE; + } + else if(rom->content[address+1] == 0 && rom->content[address+2] != 0) // rest + { + vpatch(rom, address+2, 1, 1); // set rest length to the minimum + address += 5; + } + else // just adjusting duty cycle, volume and such + { + address += 2; + } + break; + case(0xfc): + case(0x00): + song_ended = TRUE; + break; + default: // just a note + if(skip == 2) + { + vpatch(rom, address+1, 1, 1); + } + address += skip; + break; + } + } + return; +} diff --git a/common/flute_music.h b/common/flute_music.h new file mode 100644 index 0000000..8e806a9 --- /dev/null +++ b/common/flute_music.h @@ -0,0 +1,12 @@ + +#ifndef _FLUTE_MUSIC_H_ +#define _FLUTE_MUSIC_H_ + +#include "dwr_types.h" + +#define FLUTE_MUSIC_ADDRESS 0x4c9a + +void randomize_flute_song(dw_rom *rom); +void speed_up_flute_song(dw_rom *rom); + +#endif