Jump to content

Going from midi to MS2, including tempo changes


Recommended Posts

Finally decided to post my guide here. Doubt its the best and I'm sure someone will make a better one once GMS2 is released, but I haven't seen a video guide that goes over all this information yet. I did make a few mistakes but its good enough.

Somethings I could have explained better were note lengths and character limits.
Note length explanation:
1 = whole note
2 = half note
4 = quarter note
So two half notes equals a whole note, four quarter notes is a whole note, sixteen 32nd notes is a half note. Just a little bit of basic math.

Character limits:
MapleStory 2 has 3 different music sheets, one for 3000 characters, one for 5000, and one for 10,000. The 10k sheet is locked by default, you will need to unlock it (which can be done by just playing music and leveling up your mastery). 3ML will show you the amount of characters used in a track at the bottom.

Midi used in this video can be found here:


I've also posted the final product here:


Edited by Kairos
Link to comment
  • 2 weeks later...

Thank you very much for this video! Thanks to your detailed explanations about tempos I am able to troubleshoot conversions to the MS2 format much more easily.

Though I still think it'd be nice if you'd extract the core points directly to your guide in text format so people don't have to look through the entire video to find the important points. For example, the whole example code you go through meticulously in the video, just provide a quick TL;DR by pasting the before/after code snippet and people already familiar with MML syntax will get the idea. For example, knowing to tie together notes with "&" was all I needed in order to understand how to deal with notes instead of rests. Everything else can be summed up as "remember to correct the tempos in every track". Loved your Snippet Tool trick to keep track of what needed to be done though.

When editing a sample track following your example, I encountered two further difficulties you might want to also discuss: First off, due to the default length setting "l" (lowercase "L") a note doesn't always default to length one, so if the default length has been changed, be wary when you "split" note length numbers. Secondly, I discovered that there is a shortcut prefix "n" that enters a predefined note but without the option to customize its length, which means that if you need to "split" this note, you'll have to convert it to the correct note in context (without messing up the context). Either that, or there is some way to combine "n" with note length which I didn't discover.

Finally, it would be very nice if you went through a bit more of the Import Menu options, as they seem to not be documented anywhere at all (I haven't been able to find any information and have had to guess every time). For example, you enable all the left menu options by default without explaining what they do (except Velocity, so thanks for that one), and I know that the stuff that adds Extension/Hold to notes gets deleted when you Optimize Tracks, which you did in the end, without explaining any of it (I don't have any clue how exactly it works either, but I assume it reads metadata from the .midi file somehow, but no idea where it stores it afterwards. I would also like to know more about how the Extension module even works related to MS2, and what that channel setting means, for instance. In the end, I bypassed the use of the Extension module by ticking the Reduce Rest box that you told never to tick, except that the written description matched exactly what I wanted to do for the import I needed and it fixed the issue with the melody cutting off. So also be wary what you tell users, usually all options are there for a reason.

But you did manage to teach me a lot more and help me with some of my import issues so thanks for that and keep up the good work.

Link to comment

Thanks for the feedback! This was kinda a low effort post on my part though, so that is why I didn't add any text examples, already had the video done, I was just pasting it here. For the default note length, you really shouldn't have to worry about it because 3ML doesn't add it in at all until after you optimize the tracks, and it is much easier to do editing before optimizing. Same deal with "n##" not used until after optimization, and I honestly realized it was a thing like the day after I made the video (MS2 doesn't even mention it in any documentation), lol. For import options, the left options I just leave all on because again optimization removes anything unneeded and I'm too lazy to find out what each of them really do. I say to never use reduce rest because it makes all notes play until the next note in the track, so if a track has a f note then 5 measure of rest until the next note, this option is going to cause that f note to continue to play for those 5 measures instead of having rest in it. Out of nearly 100 songs I have made only once have I purposefully used this option, and it was because a song used excessively small rests between notes (note then r64 then note then r64...) and it was only to save character count. It has uses but the average user will never need it.

Link to comment
  • 1 month later...

3mle will normally only put the tempos into one track, but MS2 requires tempos for every track, otherwise they we desync. So if we have the two tracks below:

/*M 0  */  t145>c+8.<b8.>c+8t120e4.t100&e16.r32
/*M 1  */  t145c8.<b8.a4t100g8a8b8

/*M 0  */  <<a2>>c+2
/*M 1  */  <c2>r2                               

So we have 5 tempo changes in track 1, we will need to place those into track 2 (every track in the song if you have more than two). To do this correctly you want to look at the column on the left for track one, it has the time stamps for each event including tempo changes. The 1st, 2nd, and 4th tempo changes are easy, 1st and 4th are at the start of the measure (watch the time stamps! 3ml can't always make the start of measure visible like this, it could be before or after the indicator) so we can just place those in. The 2nd is at time stamp 0.0192, this is exactly half the measure, I recommend playing around placing the tempos until you find the right place, but in this case it is easy because track two has only 1 note that is half the measure long so the tempo can just go after it.

/*M 0  */  t145<<a2>>t120c+2
/*M 1  */  t145<c2>r2

Now we just have the 3rd and 5th, these are a little harder because we are going to have to edit notes or rests to get them right. Lets start with the 5th tempo, editing rest is a little easier than editing notes, I like to split everything into 8th notes(or rests) so the r2 becomes r8r8r8r8. Now play around placing the tempo in at different spots until you find the right time stamp, this time it happens to be after the first r8. Now the second measure of track two is: /*M 1  */  t145<c2>r8t100r8r8r8. Now for tempo 3 we have to do the same thing but we need to edit a note, so to split a note we need to add ties (&), c+2 becomes c+8&c+8&c+8&c+8. The ties make it so each of those notes still sounds like its just a single note. Tempo changes will need to go between the note and the tie that follows it, like this c+8t100&. Again play around find the right time stamp, this time it is after the 3rd split note, c+8&c+8&c+8t100&c+8. Now an 8th note might not always be what you need to split rests/notes into, its possible you will need to split into 16ths or even 32nds. Final product is below. Optimizing the track we condense the extra rests we made but not the notes, you will have to manually optimize that if you are short on character count.

/*M 0  */  t145>c+8.<b8.>c+8t120e4.t100&e16.r32
/*M 1  */  t145c8.<b8.a4t100g8a8b8

/*M 0  */  t145<<a2>>t120c+8&c+8&c+8t100&c+8
/*M 1  */  t145<c2>r8t100r8r8r8


Link to comment
  • 2 months later...
  • 2 weeks later...

Just change "tempo" to "performance speed". By changing any t#s to p#s.

That way you don't have to edit every single track. "performance speed" is MS2's 'tempo for everything' function. It can only be used from the melody tab and has the exact same function as tempo, other than the fact that it sets the speed of the whole performance rather than just the speed of the tab it's in.

Link to comment
17 minutes ago, nulshift said:

Just change "tempo" to "performance speed". By changing any t#s to p#s.

That way you don't have to edit every single track. "performance speed" is MS2's 'tempo for everything' function. It can only be used from the melody tab and has the exact same function as tempo, other than the fact that it sets the speed of the whole performance rather than just the speed of the tab it's in.

Not sure what you mean by this, P only controls the animation speed of the character but does not control the song in any way. I decided to try it out exactly as you explained it just in case I was wrong, but the speed of the song was not affected only the animation speed.



Link to comment
1 minute ago, Yasuno said:

Not sure what you mean by this, P only controls the animation speed of the character but does not control the song in any way. I decided to try it out exactly as you explained it just in case I was wrong, but the speed of the song was not affected only the animation speed.

Ah, nevermind then. Thought I found something that was overlooked. That's a shame.

Link to comment

Hi, thanks for this great guide ! 

I just wanted to share my method for those songs with a lot of tracks and dozens of tempo changes, you can do it faster with the following steps :


1. Import your midi file into 3MLE, save as .mml and export it as .mid (file / export as standard midi file)

2. Open the new midi file in Midieditor (freeware), create a new track on the right that you can call tempo

3. Select all the tempo change events (bottom of the sequencer) and move them to the tempo track you just created (tools / move events to track)


5. Delete all the tracks on the right except the first one and the tempo one, then select all events from first track (edit / select all events from track) and move them to tempo track

6. Delete the emptied track 1 and save the file as .mid (eg. track01.mid)

7. Open the file saved in step 4 and repeat steps 5 and 6 for every track your midi file has

8. Import the first .mid in 3MLE (you may have two tracks per midi file, you just delete the empty one) and copy all the other midis on appended tracks, and voila


Just remember to listen and double check the final result before importing in MS2 in case of any error. Remember that your tempo change events have to happen between 2 notes in every track, you can't have a tempo change while a note is played in one track or you won't be able to merge the notes and the tempo in one track only. I personally had some issue in one of the tracks having overlapping notes (shouldn't happen on 3MLE exports) so if you see that one of the midis you import in 3MLE has data in more than one track check for overlapping notes (included tempo change).


This may sound like a lot of work but in extreme situations it can speed up the work a lot, obviously if you have 5 tempo changes in 5 tracks just do it manually ^^

I just made Interstellar theme (8mn+, 10 tracks, 50+ tempo changes) in less than 15mn with this method.

Hope this helps.

Edited by Svadhis
Link to comment
  • 1 month later...

Great tutorial!

Just a quality of life tip, when you are merging two tracks in 3mle, you can utilize the Export/Import buttons for MML. They are on the top toolbar next to Append/Remove Track.

  1. Export MML from the "secondfile.mml" in 3MLE, the tracks that you want to merge with your main file. You'll only be able to Export 3 tracks at a time.
  2. In your "primaryfile.mml" opened in another 3MLE instance, Import MML.
    1. Click Append tracks (or Create New Document if you are breaking up an already merged piece into parts)
    2. Select the instrument you want those tracks to be
    3. Set the name
    4. Import
  3. Repeat until you have everything together (or apart).

I find this to be very quick and painless, though there is nothing wrong with doing Select All > Copy > Paste since I still do it sometimes, if you got a Violin part with 6+ tracks, it's very handy since you can set the instrument and just a few clicks, you got it merged/parted.


Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Create New...