1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
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.
|