Users browsing this thread: 1 Guest(s)
Adding Custom Music with MML Files and RS3ExTool2

#1
Posts: 2,548
Threads: 98
Thanks Received: 147
Thanks Given: 156
Joined: Aug 2009
Reputation: 52
Status
Nattak\'d
Title: Injecting Custom Music into FF6 with RS3ExTool2 MML Tutorial
Author: Gi Nattak
Description: This tutorial's intention is to teach you how to work with and create MML files, which are used to import midi song data into FF6 with the help of RS3ExTool2 in just 9 steps.

Introduction:

First of all, this process is originally intended to be used for the Romancing Saga 3 ROM, since that's what the editor is built for (duh), but since FF6 shares pretty much the same music core as RS3, it can be used here as well, or even Chrono Trigger for that matter. The thing is, is that you will not be able to directly inject the data into FF6 with this program, so you will have to do the process first with the RS3 ROM as intended and then go into the ROM and extract the data and inject it over to your FF6 ROM. It seems pretty tedious, but once you get the technique down it's considerably faster and easier than hacking in music manually the other way.

I still have to add and possibly correct some information here as I have yet to master this stuff. I have completed hundreds of these, though, some of which were really tedious... so hopefully I am a worthy enough teacher!

I'm going to assume that whoever tries this process has some general knowledge on how to work with and navigate through a hex editor, dump & insert binary data, change numbers into hex values, and is familiar with looking at various data. (hopefully song data.) If you're not, I'd strongly recommend learning that first. Getting familiar working with a midi sequencing program in order to edit the midis is pretty much a must for this particular method as well.

Take a look at MetroidQuest's music hacking tutorial here for more general all-around music hacking help, as well as a list of the songs and addresses:

https://www.ff6hacking.com/forums/showth...ic+hacking

OK, let's move on.

---

Basic words to know:

- MML = Music Macro Language. Popular in Japan, MML is a music description language used in sequencing music on a number of computer and video game system platforms.
- Midi = (Musical Instrument Digital Interface) A standard protocol for the interchange of musical information between musical instruments, synthesizers and computers.
- RS3 = Romancing Saga 3.
- Notes, volume, channel panning, octave, echo/re-verb, instrument = musical terms and notation.
- Harmony = The combination of simultaneously sounded musical notes to produce chords and chord progressions with a pleasing effect.
- Chord = Two or more notes playing at the same time to create harmony.
- Track = One part of a songs complete sequence.

---

Before you start, make sure that you have the following:

- RS3 ROM.
- RS3ExTool2 (a Japanese RS3 editor.)
- tinymm (changes midi files into MML format.)
- Octave Manager Tool (used to fix a nasty octave glitch caused by tinymm.)
- A midi sequencer utility. I use Anvil Studio because it's free and user-friendly.
- A midi file that meets the correct requirements as stated below.
- A 100% tested working MML file created by someone else to look at for a reference.
(Check at the bottom of this tutorial for an example.)

Sorry but it's on you to find this stuff, try searching Google, here's a link to the Wiki for the main utility though:
https://www.ff6hacking.com/wiki/doku.php...util:start
^LINK DOWN, can get Xenovant's English version here instead: https://www.ff6hacking.com/forums/thread...RS3ExTool2

---

Midi choice requirements:

- Must have 8 or less channels and each track must be on a separate channel. If there are any cases of 2 or more notes playing at the same time (a chord), the song will still work, but only the highest note of the harmony will be played... So you'll want to move any harmonizing notes onto other tracks that are not currently playing anything else at the moment and use the change instrument command.

- Also I should note that if the midi has any 1/64th notes they will not be recognized, as FF6's sound engine does not use them and only goes up to 1/32nd.
EDIT: I was wrong about this, 64th notes & rests are fine, it's just tinymm that doesn't recognize them... so those will need to be adjusted manually in the MML, or you can try using PetiteMM or MIDI2MML instead.

---

Getting started...

Step 1: Download or create the midi file you want to use. There is a program called VGMTrans that can create a flawless basically ready-to-go immaculately laid out for MML midi from an spc file. I sure wish I knew about it sooner! It seems to work much better for the more 'popular' games, like Squaresoft and Nintendo. Anyways, if the midi has more than 8 channels edit it down to 8 with a midi sequencer utility and make sure each track is on a separate channel and that all harmonizing notes are on separate tracks.

Important!: Keep in mind that the last 2 tracks (7 & 8) are reserved for sound effect usage during battle, so it's best to keep these ones free for battle songs or at least plan ahead by putting the least important tracks in there.

It can be difficult to find a suitable midi of a certain song you want to try from a place like vgmusic due to the majority of them having lots of tracks and chords playing at the same time. Remember that other people's midis that you find on-line are not intended for this process, so if you have any experience creating your own midis or at least editing/re-sequencing midis, that would greatly help when keeping the prerequisites in mind.

Step 2: Drag and drop the midi file into tinymm. This will create the MML file from the midi automatically. You'll see it there in the same folder right after you drag and drop it.

Step 3: Open up a notepad document and load the MML file that was created. Make sure to select 'file of type > all' in order to see/open it.

Step 4: The MML file that you created will not be set up correctly by default, and is lacking the proper channel information that's needed for it to work in-game, like tempo, volume, re-verb, instrument, etc. to properly work with the SPC engine.

Here is an example of a correct layout of channel header commands for the first channel:

t90v111p94o3l16%e1$@0x20 = things like tempo, volume, channel panning, octave, echo/re-verb, the jump-back-to command, instrument bank. Take a look at the example down at the bottom to see how it should all look.

These commands should ALWAYS be the first thing in each channel.

You will need to insert channel data into each and every channel, but it will be somewhat different for each channel - for instance the tempo command is usually not needed for any channels other than the first, and you'll probably want different starting volume and panning levels, instrument choices and starting octave etc.

The MML file will also be missing the song dynamics and details that are in the original song/midi, like vibrato, volume slides, pitch bends, tempo changes etc. Adding in these very important details will be explained a bit later on in this tutorial.

Step 5 (Very Important!)*:  tinymm has a bug that causes all the octave commands to be reversed, so you will need to copy/paste the track data into the 'Octave Manager' program and hit the 'swap octaves' tab to switch the octaves back. Then, copy and paste it back into your MML file's channel. Doing this will also get rid of those annoying boxes (spaces) and restructure the data as well.

*UPDATE: Follow the link on this page that Sczar Atmos has provided for a non-bugged version of tinymm.

(Very Important!): There is another terrible bug with tinymm that causes triplet notes to not be converted correctly, which leads to a choppy result with rests that shouldn't be there. There's another midi to mml data converter that's been brought to my attention called PetiteMM which does not have either bug, and while converting a couple things differently seems to work okay with FF6: https://www.smwcentral.net/?p=section&a=...s&id=11713

Step 6: Once you are finished, save the word pad MML file document.

Step 7: Open up the RS3ExTool2 and go to the MML tab. Load your RS3 ROM at the very top where it asks for the SMC. Then, load the MML file into the correct MML section. Now, don't change or check any of the other boxes because we don't need any of this since we will be dumping the data into FF6, not RS3. The default option for where the song will get imported to address 00400000 in the RS3 ROM which would be in the expanded data range for FF6, but you can choose to have it dump wherever you want in the ROM.

Step 8: The bottom two tabs at the lower right are for Export and Import. Go ahead and
click on the right one there, that's 'Import'. If the MML file was done right, you will here a conformation sound and a little window in Japanese will pop up telling you it was successful. ^_^ You will also see the ending offset pop up, showing you where the song starts and ends. If you did it wrong, you will get an error box and a bad sound. =X That means the MML file was not set up right or there's some mistake somewhere - it will usually tell you the problem and at what exact line it is so you can easily find the cause.

Important!:
Just because it was successful does not necessarily mean it will sound great in-game just yet. You may have to go back and re-edit some stuff and then re-import the song and all that until it sounds good and is to your liking. Remember, if a track is off by even a 32nd note, it will mess up your whole song.

Everything must end (or jump to) on the same musical beat of the same measure or the whole thing will be off, and most midis are not set up to loop right more than once or twice and will sometimes even end in the middle of a track or lack the rests after its part is done in the song, which will result in it looping back to soon. Anyways, on to step 9.

Step 9: Open up your RS3 ROM in a hex editor and go to the address where you imported the data and you should see the song data there. I'm not going to explain how to dump (or copy/paste if your hex editor permits) that data over to FF6 because you should know how to do that already, but that's the final step!

Here's a video I made that shows these 9 steps:
http://www.youtube.com/watch?v=OcN2BKYBqn8

Important!:
Make sure that your song data does not exceed $1000 hex bytes (11.0 kb file size). For whatever the technical reason, I found out that if your song data is longer than that it will either mess up the song and create massive lag and/or destroy most if not all sound effects - that explains why there are no sound effects during the massive ending songs. So if the midi you are dumping is massive because it loops more than once, cut it down to a smaller size where each track loops just one time, and try and use loops and nested loops whenever possible to save space (the [ and ] commands).
They are used to loop repeating song data x amount of times before reading whatever is next in the data.

An example of a normal loop: [a+8a+8a+8a+8] will loop this part once.

An example of a nested loop: [[2a+8a+8a+8a+8] will loop this part four times. (2x2 = 4)

So basically, if you have:

a+8a+8a+8a+8
a+8a+8a+8a+8
a+8a+8a+8a+8
a+8a+8a+8a+8

you would want to change it to:

[4a+8a+8a+8a+8] (the '4' there after the [ is what tells it to do it four times)

---

Tips:

- Try and learn the MML commands first and the structure as well as the SPC channel commands and some musical notation before attempting to create a song.

- Some midis have the percussion instruments at a really short length, and that will sound bad here in-game for us. For instance snare and kick/bass drums and toms/timpani should preferably be at least an 8th-16th note in length or it they will not sound good as they will get cut off to short. Cymbals and Hi Hat Open should be at least a half note, preferably a whole note. Try and only use 16th and 32nd notes for drums when you have to in a song, like when it's a fast drum beat of 16th notes, or you just plain have to. I advise removing rests from the drum tracks that use short notes, short enough where there is a rest after it - by removing the rest, you can extend the note length by the amount of the rest. So for instance if it is something like this:
c32r16^32c32r16^32c32r16^32c32r16^32
you would want to change it to this:
c32^16^32c32^16^32c32^16^32c32^16^32

This is the 'poor man's' way to go about this, if you're good with music and creating midis, you'll know how to make that much cleaner, which will help to save bytes/space - I just replaced the 'r' with ^ thus extending the note length. You won't necessarily always want to do this, but when the drums are clearly too short, and there are rests between, then you should.

- (Important!) tinymm has another bug of sorts where it does not do triplet notes correctly, and will instead make a weird tied note. So be sure to change any triplet notes manually to a correct '12' value. Thanks to Jackimus for this info. Triplets are usually used for snare drum tracks.

- You can actually dump whole songs into expanded banks without even having to change the channel pointers and jump commands! There's no logical reason as to why it works, but it does. You will just have to change the song pointer obviously.

- The song pointers are located @: C5/3E96 (no header) and are 3 bytes each.

- There's no need for the F7 xx and F8 xx yy commands at all, they will lag your track and mess up the song. I'm not sure what these really do or what 'SetFirCoeff' means or why they are used in the original FF6 songs, but for hacking any other song into the game these commands need to go. Thanks to JCE3000GT for that info.

(Very Important!)
Thanks to an discovery by @emberling, the F7 command actually DOES do something, and it's rather important when making and/or using custom songs in a hack:

emberling: "All of the songs in FF6 include the F7 and F8 commands at the beginning, usually F7 00 46 F8 00 00. Most of the custom songs posted here avoid these commands because they're prone to causing glitches.

Well, the thing is, avoiding the command isn't good enough to avoid the glitch. Anyone who's done their own music probably has noticed that reverb level (F2) doesn't reset between songs -- if you leave it out, you'll get whatever random reverb level was set in the previous song. F7 is also a reverb control. (I'm not entirely clear on it, but I believe they correspond to controls on a standard delay effect -- F2 as wet/dry, F7 xx as length, and F7 yy as feedback)

So if we go too far afield on our delay effect, we get glitches. The problem is, when you're mixing music from a bunch of different sources, some using F7 and others studiously avoiding it, eventually you'll run into a track that uses high F7 in a safe, controlled fashion (the intro to Phantom Train, for instance) -- and then switch to another song without F7 and everything blows up. It seems like the only ways to be safe are to either not include F7 at all (in something like Gi's total conversion hack) or to include it in every single track."

The F8 command is also needed we've come to learn, it is always set to F8 00 00 and is put right after the F7 command.
ex: F7 00 46 F8 00 00
Note that emberling's mml tools (mfvitools) can insert these commands, as well as do tons of other amazingly helpful things, so you might want to check it out. I put the link at the bottom.

- When listening to your song, you can press the F5-F12 keys on your keyboard (with ZSNES) to turn the sound channels off individually. This makes it much easier to hear a select instruments part in the song and hear things like vibrato, fade out, timing/looping etc. Great for detailing your song and spotting mistakes.

- Sometimes it helps to turn the tempo down when listening to your song in the game, to check for any mistakes or wrong octaves, etc.

- Battle songs are usually going to be the hardest songs to do, as there are lots of drums going on. My best advice for this, is try and fit as many different kinds of drums into one track without going over each other and use the switch instrument command (@) in between them.

ex:
b8r2b8@0x25@0x23b8
b8r2^8@0x25@0x23b8
b8r2o4@0x24@0x23b8
b8r4^8o4@0x26o5@0x23b8
@0x25@0x23b8b8@0x25@0x23b8b8

(A kick drum, a hard snare, and a bass drum sequence.)

Tip 8: When selecting instruments for a track, you can input some instruments below @0x20.
They are FF6's waveform generator instruments and can be used and are used in songs like 'Searching for Friends', and 'Slam Shuffle'. They do not take up any instrument space which is nice. Thanks to JCE3000GT for that info.

They are:
@0x00 = a 'buzzing-bee' kind of synth.
@0x01 = a bassy sort of sawtooth.
@0x02 = a less shrill version of 0x01.
@0x03 = a lower tone sci-fi synth.
@0x04 = a static percussion sound.
@0x05 = a normal sawtooth synth.
@0x06 = a higher-toned brassy sort of sawtooth.
@0x07 = soft static. (Zozo's rain sound)
@0x08 = sounds like a saxophone on crack.

---

Some musical notation:

Instrument - any of various devices or contrivances that can be used to produce musical tones or sounds.

Track - Typically one instrument's 'melody' in a song with many instruments.

Channel - A stereo track has two channels, a mono track has one.

Note - the frequency produced by an instrument for a given amount of time.

Rest - silence in a track for a given amount of time.

Tempo - the speed of the piece of music.

Octaves - A series of eight notes occupying the interval between two notes, one having twice or half the frequency of vibration of the other.

Vibrato - A rapid, slight variation in pitch in singing or playing some musical instruments, producing a stronger or richer tone.

Legato - A style of playing notes in a smooth, flowing manner, without breaks between notes.

Slur - Designates that notes it embraces are to be played without separation.

Portamento - A slide from one note to another, especially in singing or playing a bowed string instrument.

Staccato - With each sound or note sharply detached or separated from the others.

Reverberation - The repetition of a sound resulting from reflection of the sound waves; echo. Reverb is the first reason your voice sounds better in the shower. XD

Panning - The spread of a sound signal into a new stereo or multi-channel sound field.
Moves from one channel to another. (left to right in stereo) In other words, it will help to have the instruments not playing all over each other.

Tremolo - A wavering effect in a musical tone, produced by rapid reiteration of a note, by rapid repeated variation in the pitch of a note.

Pitch - The technical term used to describe how high or low a note is.

Transpose - The process, or operation, of moving a collection of notes (pitches or pitch classes) up or down in pitch by a constant interval.

Chord - a group of (typically three or more) notes sounded together, as a basis of harmony.

Polytonality - the use of more than one key simultaneously.

---

MML commands that correspond to "S-SPC" commands:

a-g = Notes.

r - A rest. The length of the rest is specified in the same manner as the length of a note, for example, r1 produces a whole rest. (B6)

+ - Indicates the note is a 'sharp' note. ex: a+2 = an A sharp half note.

- = Indicates the note is a 'flat' note.

^ - Connects notes and/or rests together. AKA: Sustained note or rest. (ex: d+1^8^16)

, - used to separate commands that are followed by two or three numbers. example: v192,24 for volume slide.

. - each dot adds half the length of the previous note length declaration.

l - Followed by a number, specifies the default length used by notes or rests which do not explicitly define one. For example, l8 g a b g l16 g a b g produces a series of four eighth notes followed by a series of four sixteenth notes. 

v - Followed by a number, sets the volume of the instrument. The range of values allowed is dependent upon the specific sound hardware being used. Some implementations also allow an ADSR envelope to be applied to the amplitude of each note. (C4)

v - Followed by two numbers is volume slide..- (C5 ss xx) Fade volume to xx at speed ss.

m - Followed by a number, Pans song left->right as xx (00-7F) increases (C6)

p - Followed by a number - PanSlide (C7 tt xx) Pans volume from left to right or visa versa.

m - Followed by two numbers - portamento effect aka: pitch slide (C8 ss dd) ss = speed dd = depth

m - Followed by three numbers - Vibrato. (C9 ss tt dd) Ss is the speed of the vibrato. Tt is the time until the vibrato appears. Dd is the depth.

m - Turn Vibrato off (CA)

v - Followed by three numbers - Tremolo - (CB ss tt dd) Ss is the speed of the tremolo. Tt is the time until the tremolo appears. Dd is the depth.

v - Tremolo off (CC)

p - Followed by two numbers - Enable Pansweep (xx: delay in ticks, yy: cycle duration) (CD) 

p - Pansweep off (CE)

%c - Set Noise Clock (CF xx)

%n1 = Enable Noise (D0)

%n = Disable Noise (D1)

%p1 - Enable Pitch Modulation (D2)

%p - Disable Pitch Modulation (D3)

%e1 - EchoOn (D4)

%e0 - EchoOff (D5)

o - Followed by a number, o selects the octave the instrument will play in. (D6 xx)

> < - Used to step up or down one octave. (D7, D8)

%k - Tranpose (D9 xx)

%K - followed by a number, adds to Transpose. (DA xx)

k - followed by a number Set Detune (DB xx) (example k-1 = -1 to detune, I guess)

@ - SetInstrument (DC) (ex. @0x20)

%A - followed by a number, sets ADSR Attack Value (0-15) (DD xx)

%D - followed by a number, sets ADSR Decay Value (0-7) (DE xx)

%S - followed by a number, sets ADSR Sustain Value (0-7) (DF xx)

%R - followed by a number, sets ADSR Release Value (0-31) (E0 xx)

%A - Reset ADSR Default Values (E1)

[ - Loop start. xx is number of times to loop. There can be up to 4 nested loops. (E2 xx)

] - loop end (E3)

%l1 - gives a smooth transition between the following notes instead of ending the sample between them (slur). (E4)

%l0 - end the smooth transition between notes (E5)

; - the end channel command (EB)

t - Followed by a number, sets the tempo in beats per minute. (F0 xx)

%v - Echo volume/Reverberation (F2 xx)

%x - Master volume (F4 xx) - used to adjust the overall song volume as a whole.

| - Jumps to yyyy when loop count reaches xx (F5 xx yyyy) (needs to be placed inside a [] loop)

$ - The jump command. Put this anywhere in the channel data where you want the track to loop (return to) at. (F6 xx yy)

%b - SetEchoFB (F7 xx xx) - is used as a sort of reverb control between songs. *only seems to put one values instead of two...

%f - SetFirCoeff (F8 xx xx) - not too sure... *only seems to put one values instead of two...

%d1 - Ignore Song Volume (FB)

%d - Conditional Jump to xxxx (FC xxxx)

---

Important!
* The F7 and F8 commands are supposed to be 3 byte commands, but the RS3ExTool will only put them as two byte commands because RS3 sound engine only has them as two bytes... So, you'll need to put in some other command or a note as a placeholder/buffer of sorts, and then manually change them to F7 00 46 and F8 00 00 or what have you.

Commands that remain unknown to me that may or may not be implemented with RS3ExTool:

E6:          $15DE Enable Drum Roll (no key off at end of note unless the next note is a rest)
E7:          $0FD3 Disable Drum Roll
E8: xx       $174B Add to Note Duration (xx = duration in ticks)
E9: xx       $1602 Play Game Sound Effect (voice A)
EA: xx       $1606 Play Game Sound Effect (voice B)
F3: xx yy    $1212 Set Song Echo Volume w/ Envelope
F9:          $1752 Increment Output Code
FA:          $1755 Clear Output Code

There's a real possibility some or all of these were never implemented for RS3exTool.

---

Examples of how some of the commands work. You can put these either before a note is played, or in the middle of a sustained note:

Panslide:
p48,64 = C7, 30, 40

Vibrato:
m16,16,201a8m = C9 10 10 C9 85 C6 CA [m, or CA turns the vibrato off after the note]

Pitch slide:
m168,4f+2.. = a pitch slide going up (C8 A8 04 55 AC AF)
m168,-4f+2.. = a pitch slide going down (-) (- = FC) (C8 A8 FC 55 AC AF)
m168,4f+2 = C8 A8 04 55 - goes up shorter with length cause missing the A9 AC at end
[b4m96,2^1..] = E2 01 9E C8 60 02 A8 A9 AC E3 - a pitch slide that goes up twice cause of the []'s

Volume slide:
v192,24a8 = fades an A 8th note to volume 36 pretty fast. Make sure and set the volume back after the fade out if need be, or you can fade the volume back in as well.

Here's an example of how to do a pitch slide note with a volume slide also:
v192,22m168,1d1v192,123m168,-4^2^4^8^16^32

Tremolo: v16,16,32d+2d2v

Nested Loop: [[9d8e8a8] = the first [ is the nested loop, the second [ tells it to loop 9 times, so it will loop a total of 18 times, I think that's how it works. (9x2=18)

ADSR:
attack rate = quickness of getting to set volume
decay rate = quickness of going from set volume to sustain volume
sustain level = sustain volume
release = quickness of going from (usually sustain volume, sometimes not there yet) to zero after a rest.

---

Here is a really basic and straight forward example of an MML song. It uses 6 out of the possible 8 channels. Believe me when I say that they can only get more complex.

Sample/Reference MML:

#TITLE Rising Sun;
#COMPOSER Gi Nattak;
#ORIGINAL Kenji Ito;
#COPYRIGHT Square Enix;

{--------------- Instruments ---------------}
#WAVE 0x20, 0x0D; {Strings}
#WAVE 0x20, 0x0D; {Strings}
#WAVE 0x20, 0x0D; {Strings}
#WAVE 0x20, 0x0D; {Strings}
#WAVE 0x21, 0x07; {Flute}
#WAVE 0x22, 0x1B; {Harp}

{--------------- Track 1 ---------------}
t76%v32l16%e1v50p30@0x20o5
e8d8c+8d8g8f8e8f8
b8a8g+8a8 f2^4e4
d2c1^2
$o6
r1^1^1^1^1^1^1^1
c4>g4^8 >g1
g4e4^8b8 >e1
e8r8g8f8g8a8b8 d4e4d4^8c8
c2^4>d8c8
c1
;

{--------------- Track 2 ---------------}
l16%e1v90p65@0x20o5
r1^1
a8f8g8a8b8a8b4
e2^4f4
e2^4f4
$o5e2^8c8d8g8
e2d2
c2^8e8d8g8
e2d2
c2^4e4
f+2e4f+4
a4f4^8d8e8f8
g4d4f4g4
g4
e2^4g4
a2^4e4
c2>b2
a4^8f8
g4g4f4
d8g8e2^4
;

{--------------- Track 3 ---------------}
l16%e1v90p70@0x20o5
>a2 >a2a4
>g2^4a4
g2^4a4
$o4
g1^1
e1^1
g4f4g4a8g8
a2g4a4
f4a4^8f8g8a8
b4g4a4b4
c1^2
>b2
a1^2
g2
f1
g2
g4
;

{--------------- Track 4 ---------------}
l16%e1v90p84@0x20o5
>f1
d1
f1
c1^1
r1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1
;

{--------------- Track 5 ---------------}
l16%e1v90p44@0x21
r1^1^1^1^1
$o5d8g8
m16,16,201e1m
r8e8f8e8d8c8
d8g8
m16,16,201e1m
r8c8>b8b8g8
a2^8a8b8 d4>a4b4^8 m16,16,201d1m
r4>b4 d8g8
m16,16,201e1m
r8e8f8e8d8c8
d8g8
m16,16,201e1m
r8c8>b8b8g8
a2^8a8b8 d4e4d4^8c8
c1m16,16,201^1m
;

{--------------- Track 6 ---------------}
l16%e1v90p54@0x22o5
r1^1^1
>c8g8g8
t81
c8g8g8
$o4c8g8g8
c8g8g8
a8b8a8e8
>a8b8g8 o4f8a8 >d8a8a8d8a8
f8 >g4b16 >c8g8g8
c8g8g8
a8b8a8e8
>a8b8g8 o4f8f8 d32f16a32a8f8d8>g8
c8g8g8
c8g8g8
;

And here is the template MML that I use when starting a new song, keep in mind the important commands for reverb resetting between songs (F7xxyy) and (F8xxyy) are left out here, because RS3ExTool is not programmed to add those, so you'll want to be sure to add them either manually or with mfvitools before all is done. Also, the %e1 command (set echo on) is included in every track here, but you may want to remove it for certain tracks such as bass and percussion:

#TITLE ;
#COMPOSER ;
#ORIGINAL ;
#COPYRIGHT ;


{--------------- Instruments ---------------}
#WAVE 0x20, 0x00; {}
#WAVE 0x21, 0x00; {}
#WAVE 0x22, 0x00; {}
#WAVE 0x23, 0x00; {}
#WAVE 0x24, 0x00; {}
#WAVE 0x25, 0x00; {}
#WAVE 0x26, 0x00; {}
#WAVE 0x27, 0x00; {}

{--------------- Track 1 ---------------}
t120%v32l16%e1$v100p64@0x20o5

{--------------- Track 2 ---------------}
l16%e1$v100p64@0x20o5

{--------------- Track 3 ---------------}
l16%e1$v100p64@0x20o5

{--------------- Track 4 ---------------}
l16%e1$v100p64@0x20o5

{--------------- Track 5 ---------------}
l16%e1$v100p64@0x20o5

{--------------- Track 6 ---------------}
l16%e1$v100p64@0x20o5

{--------------- Track 7 ---------------}
l16%e1$v100p64@0x20o5

{--------------- Track 8 ---------------}
l16%e1$v100p64@0x20o5

---

Credits:
vehek for his basic tutorial on Slickproductions.
The Japanese folks that made RS3ExTool2.
The Japanese folks' MMLs that I learned from.
JCE3000GT for teaching me the fundamentals about injecting music and some really helpful tips, as well as getting me interested in music hacking in the first place.
MetroidQuest for his music hacking tutorial.
Madsiur for helping out with trying to understand the MML files when I first started and alerting me to the octave bug in tinymm.
emberling for helping to further advance this tutorial and teaching me lotsa neat stuff.

Links/references:
http://en.wikipedia.org/wiki/Music_Macro_Language
http://wiki.mabinogiworld.com/view/MML


We are born, live, die and then do the same thing over again.
Quote  
[-] The following 7 users say Thank You to Gi Nattak for this post:
  • cdizzle (04-02-2013), Cyprus (05-01-2016), emberling (07-20-2018), h.carrell (05-11-2022), madsiur (01-02-2013), manakaiser (01-01-2013), SSJ Rick (01-02-2013)

#2
Posts: 98
Threads: 11
Thanks Received: 0
Thanks Given: 1
Joined: Oct 2012
Status
None
yes yes yes! thanks a million.. million. Amazingly helpful and extensive tutorial (I havent fully read it yet but I assume it contains what the title states and i can make good use of that) =DDDD
  Find
Quote  

#3
Posts: 3,966
Threads: 279
Thanks Received: 234
Thanks Given: 56
Joined: Oct 2011
Reputation: 65
Status
Tissue-aware
Good one Mike!
  Find
Quote  

#4
Posts: 2,768
Threads: 88
Thanks Received: 24
Thanks Given: 87
Joined: Jun 2009
Reputation: 25
Status
None
awesomeness


"Sometimes ninjas do wrong to each other, and in dat way the force of tha earf' comes around da moon - and at that presence, da dirt, it overshadows the grass, so you're like, I can't cut dis grass, there's no sun comin' through. So in order to enable each other the two fruits have to look each other in da eye and understand we can only be right, as da ripe is wrong, you know what I mean?"

-HNIC
Quote  

#5
Posts: 19
Threads: 5
Thanks Received: 0
Thanks Given: 2
Joined: Aug 2012
Reputation: 0
Status
None
Hooooly cow. This is probably going to make starting up with this a lot easier.
I've been doing music hacking stuff with EarthBound recently, and it's given me a feel for what goes into covering songs in MML codes, etc.
Once I get more free time (college essays and speeches, ugh), I hope to learn how to do this as well.
  Find
Quote  

#6
Posts: 43
Threads: 9
Thanks Received: 0
Thanks Given: 4
Joined: Apr 2013
Reputation: 0
Status
None
  Find
Quote  

#7
Posts: 2,548
Threads: 98
Thanks Received: 147
Thanks Given: 156
Joined: Aug 2009
Reputation: 52
Status
Nattak\'d
Ah yes indeed, good find. =)


We are born, live, die and then do the same thing over again.
Quote  

#8
Posts: 43
Threads: 9
Thanks Received: 0
Thanks Given: 4
Joined: Apr 2013
Reputation: 0
Status
None
Smile yes! i somehow contributed! lol


[Image: xyx.png]
  Find
Quote  

#9
Posts: 2,548
Threads: 98
Thanks Received: 147
Thanks Given: 156
Joined: Aug 2009
Reputation: 52
Status
Nattak\'d
I made a basic (crappy quality) video that may help some better with this whole process: http://www.youtube.com/watch?v=OcN2BKYBqn8


We are born, live, die and then do the same thing over again.
Quote  
[-] The following 1 user says Thank You to Gi Nattak for this post:
  • JCE3000GT (02-23-2014)

#10
Posts: 91
Threads: 1
Thanks Received: 13
Thanks Given: 1
Joined: Apr 2014
Reputation: 2
Status
None
I feel stupid right now >_<', I don't know why I didn't try to make a song on my own before, it's ridiculously easy to import a song using this method. You only need to know how to edit a midi file (something I already knew) and use a little of common sense for making the loops xD


I'll get used to the commands and the FF6 instruments, and this weekend I'll try to use the other method, writing a song from scratch, I want to import a song but I can't find a midi file of it Laugh


[Image: SvEf6Yh.png]
  Find
Quote  



Forum Jump:

Users browsing this thread: 1 Guest(s)


Theme by Madsiur2017Custom Graphics by JamesWhite