Editing Creating cave music
Jump to navigation
Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 3: | Line 3: | ||
The BMS file type is a sequenced music format used in many games. For the cave music in Pikmin 2 however, it is specially-formatted. It mainly contains many short snippets of musical information to be randomized. | The BMS file type is a sequenced music format used in many games. For the cave music in Pikmin 2 however, it is specially-formatted. It mainly contains many short snippets of musical information to be randomized. | ||
− | The CND files are the actual "songs"; they take specific groups of snippets from a BMS file, and endlessly puzzle-piece them together to form a coherent piece of music. | + | The CND files are the actual "songs"; they take specific groups of snippets from a BMS file, and endlessly puzzle-piece them together to form a coherent piece of music. |
− | This guide will function as a walkthrough for creating your own randomly sequencing cave song. | + | This guide will function as a walkthrough for creating your own randomly sequencing cave song. All of the editing will be done in hexadecimal. |
''Requirements:'' | ''Requirements:'' | ||
Line 11: | Line 11: | ||
* A MIDI to BMS converter, like [[Pikmin 2 custom music|flaaffy]]. You will be generating a lot of tiny BMS files, to turn them into "gestures". | * A MIDI to BMS converter, like [[Pikmin 2 custom music|flaaffy]]. You will be generating a lot of tiny BMS files, to turn them into "gestures". | ||
* A basic understanding of hexadecimal, and a hex editor. An editor that can dynamically resize the window is ideal (HxD on Windows, or Hex Fiend on MacOS are fantastic examples). | * A basic understanding of hexadecimal, and a hex editor. An editor that can dynamically resize the window is ideal (HxD on Windows, or Hex Fiend on MacOS are fantastic examples). | ||
− | |||
− | |||
== Overview of file functions == | == Overview of file functions == | ||
Line 27: | Line 25: | ||
AC1000 00AC11 016ECC 0210CC 0311AC 100000 AC1101 8FCC04 10CC05 11E703 00A000 03A401 00A300 01C801 00003C B1C180 010000 7FA501 01C800 000025 FE0078 C40000 0058C6 00E70E 00DF07 00006A E72E00 CF03C8 000000 4EE70E 00DF07 00006A E72E00 CF03C8 000000 60E71E 00E3E7 0000E7 0F00DF 070000 7BC600 E71F00 E3C400 00006E C40000 0155E7 0600CF 03E708 00CF03 CB0306 E70900 A00003 A70002 C80100 0096A7 0001C8 010000 8EA700 03C401 0000BE C40000 00C2C8 000000 96DA00 C600E7 0A00E7 0C00A0 0003A7 0000C8 010000 F0A700 01C801 000104 A70002 C80100 00FAA7 0003C8 010001 0EC800 000109 C40000 0118C8 000001 09C400 000118 C80000 00C5C4 000001 42E70B 00C600 C40000 0142C8 000000 C5CB06 10CB07 11CB08 04A005 04A93C 058000 A70500 C40100 014EA9 3C047F FFCF04 E70D00 C40100 00BEC6 00CB08 04A93C 047FFF CF04C6 00B1C1 400028 C600DB 04EF61 6161C6 00DB00 A40801 A40900 A40A01 EF3421 34C600 | AC1000 00AC11 016ECC 0210CC 0311AC 100000 AC1101 8FCC04 10CC05 11E703 00A000 03A401 00A300 01C801 00003C B1C180 010000 7FA501 01C800 000025 FE0078 C40000 0058C6 00E70E 00DF07 00006A E72E00 CF03C8 000000 4EE70E 00DF07 00006A E72E00 CF03C8 000000 60E71E 00E3E7 0000E7 0F00DF 070000 7BC600 E71F00 E3C400 00006E C40000 0155E7 0600CF 03E708 00CF03 CB0306 E70900 A00003 A70002 C80100 0096A7 0001C8 010000 8EA700 03C401 0000BE C40000 00C2C8 000000 96DA00 C600E7 0A00E7 0C00A0 0003A7 0000C8 010000 F0A700 01C801 000104 A70002 C80100 00FAA7 0003C8 010001 0EC800 000109 C40000 0118C8 000001 09C400 000118 C80000 00C5C4 000001 42E70B 00C600 C40000 0142C8 000000 C5CB06 10CB07 11CB08 04A005 04A93C 058000 A70500 C40100 014EA9 3C047F FFCF04 E70D00 C40100 00BEC6 00CB08 04A93C 047FFF CF04C6 00B1C1 400028 C600DB 04EF61 6161C6 00DB00 A40801 A40900 A40A01 EF3421 34C600 | ||
</source> | </source> | ||
− | Every cave music BMS begins with this same information | + | Every cave music BMS begins with this same information. |
<br> | <br> | ||
<br> | <br> | ||
− | |||
== Gesture set list == | == Gesture set list == | ||
Exactly right after <code>34C600</code> will be a list of every gesture set's location in the BMS. Each entry is the gesture set's hexadecimal location (offset), and each entry in the sequence begins with "<code>00</code>". <code>FFFFFF</code> indicates the end of this list.<br><br> | Exactly right after <code>34C600</code> will be a list of every gesture set's location in the BMS. Each entry is the gesture set's hexadecimal location (offset), and each entry in the sequence begins with "<code>00</code>". <code>FFFFFF</code> indicates the end of this list.<br><br> | ||
Line 59: | Line 56: | ||
== Gesture set contents == | == Gesture set contents == | ||
A ''gesture set'' is a group of many gestures.<br> | A ''gesture set'' is a group of many gestures.<br> | ||
− | Here, we list each gesture set's contents (which | + | Here, we list each gesture set's contents (which are... the locations of gestures!). Each gesture set begins before the <code>00</code> and ends with <code>FFFFFF</code>.<br><br> |
Here is an example of how the gesture set list should be formatted:<br> | Here is an example of how the gesture set list should be formatted:<br> | ||
<code>000210 00022A 000258 000281 FFFFFF 0002B4 0002D9 000303 000331 FFFFFF 000355 FFFFFF 000361 FFFFFF 0003A8 0003C2 0003F0 000419 FFFFFF 00044C 000471 00049B 0004C9 FFFFFF 0004ED FFFFFF 000543 FFFFFF 000580 FFFFFF 00059E FFFFFF</code><br> | <code>000210 00022A 000258 000281 FFFFFF 0002B4 0002D9 000303 000331 FFFFFF 000355 FFFFFF 000361 FFFFFF 0003A8 0003C2 0003F0 000419 FFFFFF 00044C 000471 00049B 0004C9 FFFFFF 0004ED FFFFFF 000543 FFFFFF 000580 FFFFFF 00059E FFFFFF</code><br> | ||
Line 72: | Line 69: | ||
If you have been copy-pasting everything correctly, your BMS will look something like this: | If you have been copy-pasting everything correctly, your BMS will look something like this: | ||
<gallery mode="packed-hover" widths=300px heights=300px> | <gallery mode="packed-hover" widths=300px heights=300px> | ||
− | File:BMS_file_progress_1.png|Orange is "gesture set list", | + | File:BMS_file_progress_1.png|Orange is "gesture set list", green is "timing ruleset list", and blue is "gesture set contents" |
</gallery> | </gallery> | ||
Once again, you can add as much padding between each section as you want, it will work fine. | Once again, you can add as much padding between each section as you want, it will work fine. | ||
− | |||
== Creating gestures == | == Creating gestures == | ||
First, you should sketch out your song idea in your DAW, and then cut your song into tiny blocks. These blocks will be your song's individual gestures. You should also consider dragging these blocks around in various arrangements to make sure they sound good in any order.<br><br> | First, you should sketch out your song idea in your DAW, and then cut your song into tiny blocks. These blocks will be your song's individual gestures. You should also consider dragging these blocks around in various arrangements to make sure they sound good in any order.<br><br> | ||
Line 92: | Line 88: | ||
Gestures use same the note/music information as standard BMS songs.<br> | Gestures use same the note/music information as standard BMS songs.<br> | ||
− | You should have converted all your MIDIs into BMS files. Open up one of your converted BMS files, and look for the first note/pitch value. If you used [[Pikmin 2 custom music|flaaffy]], this will most likely be somewhere after <code>0x1B</code>, <code>0x1C</code>, or <code>0x1D</code>. The note's pitch value will | + | You should have converted all your MIDIs into BMS files. Open up one of your converted BMS files, and look for the first note/pitch value. If you used [[Pikmin 2 custom music|flaaffy]], this will most likely be somewhere after <code>0x1B</code>, <code>0x1C</code>, or <code>0x1D</code>. The note's pitch value will be followed by a <code>01</code>. Copy this note, all the way to the end of the sequence, which should be <code>FF</code>. |
<gallery mode="packed-hover" widths=600px> | <gallery mode="packed-hover" widths=600px> | ||
File:Copy_pasting_BMS_info.png|The value "2D" here is the hex value of a certain pitch, and the very first note of the sequence. Copy this, all the way to "FF". | File:Copy_pasting_BMS_info.png|The value "2D" here is the hex value of a certain pitch, and the very first note of the sequence. Copy this, all the way to "FF". | ||
Line 104: | Line 100: | ||
So, how do we choose how often gestures will play? Will a gesture play every beat? Every 1/2 a beat? You will need to add a timetable for that! | So, how do we choose how often gestures will play? Will a gesture play every beat? Every 1/2 a beat? You will need to add a timetable for that! | ||
A timetable is a sequence that dictates when gestures should play. A timetable ends with <code>FFFF</code>. You can make a timetable as complex as you like.<br> Some examples of timetables you can use are:<br> | A timetable is a sequence that dictates when gestures should play. A timetable ends with <code>FFFF</code>. You can make a timetable as complex as you like.<br> Some examples of timetables you can use are:<br> | ||
− | * <code> | + | * <code>0780FFFF</code> Play a gesture every 16 beats.<br> |
− | * <code> | + | * <code>03C0FFFF</code> Play a gesture every 8 beats.<br> |
− | * <code> | + | * <code>01E0FFFF</code> Play a gesture every 4 beats.<br> |
− | * <code> | + | * <code>03C003C003C001E001E001E001E003C0FFFF</code> This sequence will play a gesture every 8 beats (3x), play a gesture every 4 beats (4x), then play a gesture for 8 beats (1x), in that order.<br> |
− | * <code> | + | * <code>00F0FFFF</code> Play a gesture every 1/2 note (every 2 beats).<br> |
− | * <code> | + | * <code>0078FFFF</code> Play a gesture every 1/4 note (every beat).<br> |
− | * <code> | + | * <code>003CFFFF</code> Play a gesture every 1/8th note.<br> |
− | * <code> | + | * <code>001EFFFF</code> Play a gesture every 1/16th note.<br> |
− | * <code> | + | * <code>003C0078001EFFFF</code> This sequence will play a gesture for an 1/8th note, play a gesture for a 1/4 note, then play a gesture for a 1/16th note, in that order.<br> |
Considering that <code>001E</code> (30 in decimal) is a 1/16th note, you can create any specific timing you want. Just add another 30 to the value for each additional sixteenth note in length.<br> | Considering that <code>001E</code> (30 in decimal) is a 1/16th note, you can create any specific timing you want. Just add another 30 to the value for each additional sixteenth note in length.<br> | ||
− | For example, Soil 1's enemy mix piano plays a | + | For example, Soil 1's enemy mix piano plays very rapidly; its timetable uses a value of 90, which looks like <code>005AFFFF</code>. The gestures last for three sixteenth notes.<br> |
You can insert your timetables anywhere at the end of your BMS. | You can insert your timetables anywhere at the end of your BMS. | ||
<gallery mode="packed-hover" widths=250px heights=250px> | <gallery mode="packed-hover" widths=250px heights=250px> | ||
Line 159: | Line 155: | ||
* P: Stereo panning. | * P: Stereo panning. | ||
<br> | <br> | ||
− | Some | + | Some considerations: |
* You can use the on/off cycle feature (column K and L) to make your melodic instrument "take a break" every once in a while. You can have it play 4 gestures, but then be silent for 2. | * You can use the on/off cycle feature (column K and L) to make your melodic instrument "take a break" every once in a while. You can have it play 4 gestures, but then be silent for 2. | ||
* If your timing ruleset is strict (as in, the timings for when gestures occur is always consistent), something fun to try is to have the melody be a back-and-forth between two different instruments. Set the initial delay for the second instrument to be longer than the first one, and then cleverly use the on/off cycle to have the instruments take turns sounding a gesture. This is done for the melody in the Bulblax Kingdom and Frontier Cavern for example. | * If your timing ruleset is strict (as in, the timings for when gestures occur is always consistent), something fun to try is to have the melody be a back-and-forth between two different instruments. Set the initial delay for the second instrument to be longer than the first one, and then cleverly use the on/off cycle to have the instruments take turns sounding a gesture. This is done for the melody in the Bulblax Kingdom and Frontier Cavern for example. | ||
* If you are using the "track copy" feature (column D), you can have the primary instrument play a melody, and have this instrument always play chords that perfectly match that melody. | * If you are using the "track copy" feature (column D), you can have the primary instrument play a melody, and have this instrument always play chords that perfectly match that melody. | ||
+ | * The 1/8th note delay achieved with column Q and the "track copy" feature can be used to create a stereo echo effect; make the copying track quieter and panned to a different speaker! It works better the faster your song is. | ||
== Mapping the tracks == | == Mapping the tracks == | ||
Line 175: | Line 172: | ||
* "new_09_4.cnd", "new_09_4000.cnd", and "new_09_portal_PotaTOS.cnd" will load new_09.bms.<br> | * "new_09_4.cnd", "new_09_4000.cnd", and "new_09_portal_PotaTOS.cnd" will load new_09.bms.<br> | ||
− | For cavesoil, caveconc, and cavemetal only, the game | + | For cavesoil, caveconc, and cavemetal only, the game checks for an additional "_00", "_05", and "_10" right after the prefix, so you must include this if you want the right wScene to load. For example, caveconc_05 loads wScene 31, so if you want your custom song to load wScene 31, acceptable names include "caveconc_05_WAFFLES.cnd", "caveconc_05_52_46356.cnd", or "caveconc_05_super_boss.cnd".<br> |
After adding your new CND file, be sure to add it to its respective trackMap file. | After adding your new CND file, be sure to add it to its respective trackMap file. | ||
Line 181: | Line 178: | ||
== Bonus: Adding new content to a vanilla BMS file == | == Bonus: Adding new content to a vanilla BMS file == | ||
Adding new hex data in the middle of a file will shift all the offsets that come after it, causing your BMS to jump to the wrong locations, and likely cause a crash if vanilla songs are loaded.<br> | Adding new hex data in the middle of a file will shift all the offsets that come after it, causing your BMS to jump to the wrong locations, and likely cause a crash if vanilla songs are loaded.<br> | ||
− | In order to add new content in addition to what's already in the BMS: | + | In order to add new content in addition to what's already in the BMS, you can copy and put a brand new gesture set list and timing ruleset list at the bottom: |
* Find and copy the gesture set list and the timing ruleset list, and paste them at the end of the file. (Separate them with lots of zeros so you have lots more space to add content to these lists) | * Find and copy the gesture set list and the timing ruleset list, and paste them at the end of the file. (Separate them with lots of zeros so you have lots more space to add content to these lists) | ||
* Change <code>0x6</code> and <code>0x14</code> to point to your new gesture set list and timing ruleset list. These two values tell the game where the lists are. | * Change <code>0x6</code> and <code>0x14</code> to point to your new gesture set list and timing ruleset list. These two values tell the game where the lists are. | ||
Line 188: | Line 185: | ||
File:Editing_vanilla_BMS_file.png|The new gesture set list and timing ruleset list we want to use will be at the bottom. | File:Editing_vanilla_BMS_file.png|The new gesture set list and timing ruleset list we want to use will be at the bottom. | ||
</gallery> | </gallery> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[Category:Pikmin 2]] | [[Category:Pikmin 2]] |