This tutorial is for how to add a new music song. As an example, we'll add the [Route 47 theme](https://soundcloud.com/mmmmmmmmmmmmmmmmm-1/route-47-gbc-8-bit) demixed from HGSS by [Mmmmmm](https://soundcloud.com/mmmmmmmmmmmmmmmmm-1). ## Contents 1. [Define a music constant](#1-define-a-music-constant) 2. [Create a file for the song](#2-create-a-file-for-the-song) 3. [Update the music pointers](#3-update-the-music-pointers) 4. [Include the new file in the ROM](#4-include-the-new-file-in-the-rom) 5. [Composing your own music](#5-composing-your-own-music) ## 1. Define a music constant Edit [constants/music_constants.asm](../blob/master/constants/music_constants.asm): ```diff ; song ids ; Music indexes (see audio/music_pointers.asm) const_def const MUSIC_NONE ; 00 ... const MUSIC_MOBILE_CENTER ; 66 + const MUSIC_ROUTE_47 ; 67 ``` ## 2. Create a file for the song If you want to write your own music, skip ahead to [step 5](#5-composing-your-own-music), and come back here when you have an ASM file for your song. However, there's already a lot of new music available, demixed and remixed from other games by composers like [FroggestSpirit](https://soundcloud.com/froggestspirit), [Mmmmmm](https://soundcloud.com/mmmmmmmmmmmmmmmmm-1), [ShantyTown](https://soundcloud.com/huderlem), [ShockSlayer](https://soundcloud.com/user-927422935-571023782), and [Pum](https://www.youtube.com/playlist?list=PLQHiVZUO5so0LHdQzx6iu4Ze0zCkbbm7N). For now, download the [source code](https://pastebin.com/raw/aSDuVfDW) for Mmmmmm's Route 47 theme and save it as **audio/music/route47.asm**: ```diff +Music_Route47: + musicheader 4, 1, Music_Route47_Ch1 + musicheader 1, 2, Music_Route47_Ch2 + musicheader 1, 3, Music_Route47_Ch3 + musicheader 1, 4, Music_Route47_Ch4 + +Music_Route47_Ch1: + ... + +Music_Route47_Ch2: + ... + +Music_Route47_Ch3: + ... + +Music_Route47_Ch4: + ... ``` Notice the label `Music_Route47` before the headers. That's used in the table of music pointers to identify the whole song. ## 3. Update the music pointers Edit [audio/music_pointers.asm](../blob/master/audio/music_pointers.asm): ```diff ; See song sections in audio.asm. Music: ; entries correspond to MUSIC_* constants dba Music_Nothing ... dba Music_PostCredits ; Crystal adds the following songs: dba Music_Clair ... dba Music_MobileCenter + dba Music_Route47 ``` ## 4. Include the new file in the ROM Edit [audio.asm](../blob/master/audio.asm): ```diff SECTION "Extra Songs 2", ROMX INCLUDE "audio/music/postcredits.asm" +SECTION "New Songs", ROMX + +INCLUDE "audio/music/route47.asm" ``` That's it! Now you can use `MUSIC_ROUTE_47` like any other music constant—try assigning it to a map in [data/maps/maps.asm](../blob/master/data/maps/maps.asm). There is one thing to be aware of if you plan to add a lot of new songs. Crystal's music IDs go from $00, `MUSIC_NONE`, to $66, `MUSIC_MOBILE_CENTER`. If the IDs reach $80 or above they have their high bit set and start getting interpreted differently by `GetMapMusic`. There's a full explanation and fix in the [design flaws](../blob/master/docs/design_flaws.md#music-ids-64-and-80-or-above-have-special-behavior) documentation. ## 5. Composing your own music In theory, you could write a new song from scratch in a text editor. You'd start by reading [docs/music_commands.md](../blob/master/docs/music_commands.md) and the source code of existing music, then write your own file that defines each of a song's channels note by note. But that would be quite difficult. It's easier to write a song in the standard MIDI format, supported by many digital audio programs and actual instruments, and then convert the MIDI to a pokecrystal ASM script. Here are some materials to get started: - **[Anvil Studio](https://www.anvilstudio.com/):** A free digital audio workstation program for Windows. Includes lots of features for composing your own music. - **[MidiEditor](https://www.midieditor.org/):** A free program to edit, record, and play MIDI files. More limited than Anvil Studio, but easier to learn if you just want to edit an existing MIDI file. - **[VGMusic.com](https://www.vgmusic.com/):** A source for many MIDIs sequenced or demixed from video games, including most of the Pokémon series. - **[MIDI2GSC](http://www.mediafire.com/file/je58y68i7us1ud6/GSCImport+Midi2GSC.rar):** An old tool by FroggestSpirit that converts a set of one to four MIDIs, one for each channel, into a single ASM file. It was made back when ROMs were hacked right in a hex editor, so it comes with the now-obsolete GSCImport tool to patch the music right into a GBC file. [This tutorial](https://hax.iimarckus.org/topic/4457/) describes what that process used to be like. - **[gs2c.py](https://github.com/Rangi42/polishedcrystal/blob/master/utils/gs2c.py):** A Python script by Rangi that converts the output of MIDI2GSC into the up-to-date pokecrystal's music macros. You'll still have to define the headers yourself, and check for any comments of "`WARNING: unconverted`". - **[GB Note](https://hax.iimarckus.org/topic/7113/):** Another tool by FroggestSpirit that can directly open and edit ASM files as well as MIDI files. - **[Midi2ASM Converter](https://github.com/TriteHexagon/Midi2ASM-Converter):** A tool by TriteHexagon to convert MIDI files into up-to-date pokecrystal ASM files. Inspired by GB Note. - **[Muse2pokecrystal](https://github.com/nephitejnf/muse2pokecrystal):** A script by nephitejnf that converts MusicXML into pokecrystal ASM files. MusicXML is exported by programs such as [Musescore](https://musescore.org/en) and [Finale Notepad](https://www.finalemusic.com/products/notepad/). Composing music may be harder to get into than simply editing graphics or text, but it's not at all impossible. Creators like [Pigu](https://pigu-a.bandcamp.com/album/pok-mon-anniversary-crystal-pigus-arranges), [coraldev](https://soundcloud.com/coraldev), [Mmmmmm](https://soundcloud.com/mmmmmmmmmmmmmmmmm-1/), [Monstarules](https://soundcloud.com/monstarules), and [TriteHexagon](https://soundcloud.com/user-930339535) have all made original music for pokecrystal-based games.