Solo and Melody Tracks

So far the creation of accompaniment tracks using drum and chord patterns has been discussed. However, there are times when chording (and chord variations such as arpeggios) are not sufficient. Sometimes you might want a real melody line!

While reading this chapter, don't forget that you can easily add HARMONY to your SOLO tracks (see here for details). You can even import (see MIDIINC here) an existing MIDI track (maybe a melody you've plunked out on a keyboard) and have MMA insert that into your song as a SOLO and apply ARTICULATION and HARMONY to it ... imagine how good you may sound!

MMA has two internal track types reserved for melodic lines. They are the SOLO and MELODY tracks. These two track types are identical with two major exceptions:

These differences mean that you can set parameters for a SOLO track in a preamble in your music file and have those settings valid for the entire song. For example, you may want to set an instrument at the top of a song:

Solo Voice TenorSax

On the other hand, MELODY tracks save and restore grooves just like all the other available tracks. If you have the following sequence in a song file:

Melody Voice TenorSax
Groove Blues
...musical data

you should not be surprised to find that the MELODY track is playing with the default voice (Piano) which has been pulled out of the Blues GROOVE.

As a general rule, MELODY tracks have been designed as a “voice” to accompany a predefined form defined in a GROOVE—it is a good idea to define MELODY parameters as part of a GROOVE. SOLO tracks are thought to be specific to a certain song file, with their parameters defined in the song file.

Apart from the exceptions noted above, SOLO and MELODY tracks are identical.

Before you create any SOLO or MELODY tracks you should set the key signature. See here for details on this important setting.

In other available tracks you normally would define a SEQUENCE to play throughout the song. You can do this (see below), but in most cases you specify a series of notes as a RIFF pattern. For example, consider the first two bars of “Bill Bailey” (the details of melody notation will be covered later in this chapter):

Solo Riff 4c;2d;4f;
Solo Riff 4.a;8g#;4a;4c+;

In the above example the melody has been inserted into the song with a series of RIFF lines. Specifying a RIFF for each bar of your song can get tedious, so there is a shortcut ... any data surrounded by curly brackets “{ }” is interpreted as a RIFF for a SOLO or MELODY track. This means that the above example could be rewritten as:

F {4c;2d;4f;}
F {4.a;8g#;4a;4c+;}

By default the note data is inserted into the SOLO track. If more than one set of note data is present, it will be inserted into the next track set by the AUTOSOLOTRACKS command (here).

Another method is to use a number of RIFF commands inside a BEGIN/END section. For example:

Begin Solo Riff

If you look at the sample songs from our website you will see this used in many songs to create short introductions.

Warning: The following example will not work:

Begin Solo Riff     ¡¡Wrong!!

There are no chord lines defined to go along with the solo. If you compile this short segment MMA will alert you with a “no data generated” message. If all you want is the melody, create “empty” lines with the Z rest special chord.

Note Data Format

The notes in a SOLO or MELODY track are specified as a series of “chords”. Each chord can be a single note, or several notes (all with the same duration). Each chord in the bar is delimited with a single semicolon.10.1 Please note the terminology used here! When we refer to a “chord” we are referring to the data a one point in the bar. It might be a single note, a number of notes, or a rest.

Each chord can have several parts. All missing parts will default to the value in the previous chord. The order of the items is important: follow the order below.

The duration of the note. This is specified in the same manner as chord patterns; see here for details on how to specify a note duration. By default, a quarter note duration is used.

The duration can also be set in MIDI ticks (192 ticks equals a quarter note) by appending a “t” or “T” to an integer value. As an example, you could set a quarter note “c” as “4c” or “192tc”. You'll probably never use this option directly, but other parts of MMA can use it to generate solo note data.

Each note or pitch in the chord can be specified in a number of ways:

Firstly, you can use standard musical notation: the lowercase letters “a” to “g” are recognized, as well as “r” to specify a rest.

Secondly, you can specify a note via its MIDI value. A MIDI value of 60 is the same as a “middle c”.

Important: if you specify a note using a MIDI value that note will not be adjusted for the OCTAVE setting in the track or the key signature; however, TRANSPOSE will be applied.

Thirdly, in the case of Drum Solo Tracks, here, you can use MIDI values or mnemonic values like “SnareDrum1”.

For notes in standard notation (“a” to “g”) the following modifiers are permitted directly after the pitch:

A pitch modifier consisting of a single “#” (sharp), “&” (flat) or “n” (natural). Please note that an accidental will override the current KEYSIG for the current bar (just like in real musical notation). Unlike standard musical notation the accidental will apply to similarly named notes in different octaves.

Please note that when you specify a chord in MMA you can use either a “b” or a “&” to represent a flat sign; however, when specifying notes for a SOLO you can only use the “&” character.

Double sharps and flats are not supported.

Without an octave modifier, the current octave specified by the OCTAVE directive is used for the pitch(es). Any number of “-” or “+” signs can be appended to a note. Each “-” drops the note by an octave and each “+” will increase it. The base octave begins with “c” below the treble clef staff. The underlying track OCTAVE setting is applied to the modified pitch.

You can override the default MIDI velocity ( MMA uses a value of 90) by appending a “/” and a value between “0” and “127” after a pitch. This includes pitches in standard notation, drum mnemonics and MIDI values. The velocity setting is applied to one note only. If you have a grouping of notes like “abc/50” the changed velocity will apply to the entire group; however, for groups with space or comma delimiters the modifier will apply to only one note ... in the case of “a,b,c/40” or “a b c/40” only the “c” will have a modified velocity.

The tilde character, ~, can appear as the first or last item in a note sequence. As the last character it signals that the final note duration extends past the end of the bar (note, when we say “last” we mean just that ... if you have a < > modifier in the last chord of a bar place the tilde after that). As the first character it signals to use the duration extending past the end of the previous bar as an initial offset. For details, see below.

To make your note data more readable, you can include any number of space and tab characters (which are ignored by MMA ). Individual notes in a chord can be separated by spaces or commas.

Solo Notation
Lost Image

KeySig 1b
F { 4c a-; 2d a-; 4f d; }
F { 4.a , f; 8g#f; 4a,f; c+f; }
F { 4c , a-; 2d,a-; 4fc; }
F { 1af; }

This example shows a few bars of “Bill Bailey” with the MMA equivalent. We've put in commas and spaces to show where they can be, optionally, used.

Chord Extensions

In order to make SOLOs more versatile, you may extend the notation with options in < > delimiters. Only one set of < >s is permitted for each chord; however, it can be anywhere in the chord (we suggest you place it at the end). If you have more than one pair of commands, separate them with a single comma.

You can set a “ignore” or “do nothing” chord with the simple notation <> (no spaces are permitted here). If this is the only item in the chord then that chord will be ignored This means that no tones will be generated, and the offset into the bar will not be changed. The use of the notation is mainly for tilde notation with notes held over multiple bars.

The keyword GRACE indicates that the following note or chord is to be treated as a grace note. This has several effects:

  1. by default, the note's start time (offset) is moved forward by half the duration of the note. This means that with a default ARTICULATION of 70 the note will, slightly, overlap the following note.

  2. HARMONY is not applied to the grace note (but you are free to specify multiple notes and create your own).

  3. the offset of the note following the grace note(s) is not effected by the duration of the grace note (the grace note duration is completely ignored).

In most cases a short duration is useful for grace notes (16 and 32 seem to work nicely). You can specify a chord or a single note.

The GRACE extension can, optionally, have a “offset modifier”. In most cases you can ignore this (the default is 2). This value is used to calculate the number of MIDI ticks to move the grace note; the duration of the note is divided by the modifier. So, a 16th grace note would be played 24 MIDI ticks early.10.2 If you have multiple grace notes you can use increasing offset modifiers to stretch out the grace notes. For example, to sound three grace notes you could do:

Solo Riff <grace>16f;<grace=3>f#;<grace=4>g;4g#;

In this example the first grace note uses a default modifier of 2. Adjusting the durations of the grace notes will have an effect on the offset as well.

Modifiers must be greater than 0.

Notes/chords following the grace note must be given a duration unless you wish to inherit the duration of the grace note.

For a nice example, see the introduction in the sample song

A volume can be specified. The volume is set as a command=value pair. For example: “Volume=ff” would set the volume of a chord to “very loud”. See the permitted volumes (here). It is probably easier to set accented beats with the ACCENT directive (here) or directly modify the MIDI velocity by appending it to the end of the pitch with a “/” (here). The keyword “Volume” is optional: < VOLUME=FF > and < FF > will generate identical results. This optional setting is in addition to the current VOLUME track setting and is in effect for the duration of the current bar. It is not possible to set different volumes for individual notes in the chord with this option.

In addition to the ARTICULATE setting for the track and the note duration (see above), you can set an articulation value for each chord. This can be useful in creating staccato or tenuto notes without resorting to complicated note/rest values. By default the articulation is set to 100%. It can be changed with an integer value from 1 (creating a very short note) to 200 (a long note). This option is set with the ARTICULATE= command. For example, to set the articulation of a chord to “staccato”, you could use the string < ARTICULATE=50 > in the chord specification. This value is in effect for the duration of the current bar.

For those who “need to know”, here's how the note duration is determined:

  1. The note duration (ie, 4, 8, 16) is parsed and converted to MIDI ticks. A quarter note will receive 192 MIDI ticks, a half note 384, etc.

  2. The duration is adjusted by the articulation setting. Assuming the articulation is 80% the quarter note will be converted from 192 MIDI ticks to 154.

  3. Finally, the duration is adjusted again by the track ARTICULATE setting. Assuming the default setting of 90(%) this will result in the 154 ticks adjusting to 138.

  4. In addition, a RDURATION setting can add or subtract additional ticks to the note.

The following example

F {4c; d<ff>; e<Volume=mp,Articulate=80>; f<Articulate=120>;}

will create a solo line (using an F chord) with the following notes, volumes and articulations:

Note Volume Articulation
c default “mf” default “100”
d set to “ff” continues as “100”
e set to “mp” set to “80”
f continues “mp” set to “120”

When a SOLO line is parsed the notes and rests are placed into the bar at the logical sequence derived from their durations. So, if you have two half note chords the first would be placed at the start of the bar (offset 0) and the second in the middle (offset 384). You can override this with the OFFSET= option. The value used adjusts the pointer, overriding logical placement. You can use this feature to place a note anywhere in a bar, or even to overlap notes. The value used must be within the bar; values less than 0 or past the end of the bar (in the case of 4 beats to the bar this would be 768). As an example:

1 F {2f; 2c <offset=198>; }

would place a half note at beats 1 and 2 of the bar. The second note would overlap the first.


Individual notes or chords can have accents. Unfortunately, in MMA 's text format, we can't use a notation which places the accent over the note, like sheet music does ... so we need a slightly different method. In a SOLO or MELODY line you can have any of the characters “!”, “-”, “ˆ” or “&” between the duration and pitch. All the accents much be in one chunk, without additional characters or spaces.

The following table shows the supported single character accents and their effect:

Staccato: Make the following note's duration shorter.
- or _
Tenuto: Lengthen the following note's duration. This can be an “-” (minus) or a “_” (underscore). If you use a minus sign it must be separated from any preceding duration value by a space character (ie: use “8 -f” or “8_f”.)

Accent: Make the following note louder.
Soft: Make the following note softer.

You can use any number of these accents in a set (however, more than 5 becomes useless). Their effects are cummulative.10.3

And example of the usage might be:

Solo Riff 4a; !ˆ c; !!d; e;

In this example the second note will have a shorter duration and be louder; the third note will have normal volume, but be quite a bit shorter.

An accent effects only the current note/chord.

Long Notes

Notes tied across bar lines can be easily handled in MMA scores. Consider the following:

Lost Image

It can be handled in three different ways in your score:

If you have a very long note, as in this example:

Lost Image

you can have both leading and ending tildes in the same chord; however, to force MMA to ignore the chord you need to include an empty chord marker:

C {4c;d;e;4+2f~;}
C {~<>~;}
C {~2c;}

MMA has some built-in error detection which will signal problems if you use a tilde at the end of a line which doesn't have a note held past the end of the current bar or if you use a tilde to start a bar which doesn't have one at the end of the previous bar.

Using Defaults

The use of default values can be a great time-saver, and lead to confusion! For example, the following all generate four quarter note “f”s:

Solo Riff 4f; 4f; 4f; 4f;
Solo Riff 4f; f; f; f;
Solo Riff 4f; 4; 4; 4;
Solo Riff f; ; ; ;
Solo Riff 4f; ; ; ;

One problem which can turn around and bite you when least expected is the use of a default duration with notes specified as MIDI pitch values. This will not work:

Solo Riff 4 100; 110 ¡¡Wrong!!

The problem is that for the second chord MMA assumes the value 110 to be a duration. Simple fix is to insert either a “4” or a comma before the second pitch:

Solo Riff 4 100; ,110


If you are copying sheet music notation into a MMA song which uses a TIME setting which is different from the time signature of the sheet music you may find yourself needing to change note values. For example, if you have a march written in 6/8 you will have six eight notes (or combination) per bar; however, if the MMA GROOVE is written with a TIME of 6 beats per bar you would need to convert the sheet music eights to quarters.

The STRETCH option lets you use MMA to do the conversion. In the above example, just use a command like:

Solo-Trumpet Stretch 200

and enter the note values directly from the sheet music. MMA will double the duration of each note.

The argument to STRETCH is a percentage value. So, “200” will double the duration of each note; “50” will halve them.

STRETCH permits arguments in the range “1” to “500”. The value is not saved in GROOVES since it's really just intended as something to be used in a short section of song code.

Note: Internally this command sets a value to modify each generated note. This is done late in the generation of the MIDI data, so you can change the stretch value at any time. It gets complicated, so our recommendation is to ensure you only have one STRETCH in a file.

Other Commands

Most of the timing and volume commands available in other tracks also apply to SOLO and MELODY tracks. Important commands to consider include ARTICULATE, VOICE and OCTAVE. Also note that TRANSPOSE is applied to your note data.


When a “{ }” expression is found in a chord line, it is assumed to be note data and is treated as a RIFF. You can have any number of “{ }” expressions in a chord line. They will be assigned to the tracks specified in the AUTOSOLOTRACKS directive.

By default, four tracks are assigned: Solo, Solo-1, Solo-2, and Solo-3. This order can be changed:

AutoSoloTracks Melody-Oboe Melody-Trumpet Melody-Horn

Any number of tracks can be specified in this command, but they must all be SOLO or MELODY tracks. You can reissue this command at any time to change the assignments.

The list set in this command is also used to “fill out” melody lines for tracks set as HARMONYONLY. Again, an example:

AutoSoloTracks Solo-1 Solo-2 Solo-3 Solo-4
Solo-2 HarmonyOnly 3Above
Solo-3 HarmonyOnly 8Above

Of course, some voicing is also set ... and a chord line:

C {4a;b;c;d;}

The note data {4a;b;c;d;} will be set to the Solo-1 track. But, if you've not set any other note data by way of RIFF commands to Solo-2 and Solo-3, the note data will also be copied to these two tracks. Note that the track Solo-4 is unaffected since it is not a HARMONYONLY track. This feature can be very useful in creating harmony lines with the harmonies going to different instruments. The supplied file egs/ shows an example.

To save some typing, you can have empty sets of {} as placeholders. For example, assume you have three SOLO tracks:

AutoSoloTracks Solo-Violin Solo-Viola Solo-Cello

and you don't use the Viola in a section. Doing something like:

C {4a;b;c;d;} {} {1+1g }
G {4g;b;} {} {}

is fine. Note how the Cello has a long note over two bars and the Viola has no notes at all.

Drum Solo Tracks

A solo or melody track can also be used to create drum solos. The first thing to do is to set a track as a drum solo type:

Solo-MyDrums DrumType

This will create a new SOLO track with the name Solo-MyDrums and set its “Drum” flag. If the track already exists and has data in it, the command will fail. The MIDI channel 10 is automatically assigned to all tracks created in this manner. You cannot change a “drum” track back to a normal track.

These is no limit to the number of SOLO or MELODY tracks you can create ... and it probably makes sense to have several different tracks if you are creating anything beyond a simple drum pattern.

Tracks with the “drum” setting ignore TRANSPOSE and HARMONY settings.

The specification for pitches is different in these tracks. Instead of standard notation pitches, you must specify a series of drum tone names or MIDI values. If you want more than one tone to be sounded simultaneously, create a list of tones separated by commas.

Some examples:

Solo-MyDrums Riff 4 SnareDrum1; ; r ; SnareDrum1;

would create a snare hit on beats 1, 2 and 4 of a bar. Note how the second hit uses the default tone set in the first beat.

Solo-MyDrums Riff 8,38;;;;

creates 4 hits, starting on beat 1. Instead of “names” MIDI values have been used (“38” and “SnareDrum1” are identical). Note how “,” is used to separate the initial length from the first tone.

Solo-MyDrums Riff 4 SnareDrum1,53,81; r; 4 SideKick ;

creates a “chord” of 3 tones on beat 1, a rest on beat 2, and a “SideKick” on beat 3.

Using MIDI values instead of names lets you use the full range of note values from 0 to 127. Not all will produce valid tones on all synths.

To make the use of solo drum tracks a bit easier, you can use the the TONE command to set the default drum tone to use (by default this is MIDI value 38 or SnareDrum1). If you do not specify a tone to use in a solo the default will be used.

You can access the default tone by using the special Tone “*”. In the following example:

Begin Solo-Block
  Tone LowWoodBlock
Solo-Block Riff 4r; SnareDrum; * ; ;
Solo-Block Riff 4;;;;

The first solo created will have a rest on beat 1, a SnareDrum on beat 2 and LowWoodBlock on beats 3 and 4. The second will have LowWoodBlock on each beat.

When the DRUMTYPE option is parsed, the VOICE for the track will be set to the default setting. Normally, this is voice “0”. To change the voice you must do so after setting DRUMTYPE since the option resets the voice to the default. Get in the habit of setting the VOICE after setting up a DRUMTYPE track. In most cases you'll not be setting the VOICE and this will not be an issue.


It is fun and simple to arpeggiate notes in a SOLO or MELODY track. For example:

Solo-Guitar Arpeggiate Direction=Up Rate=32 Decay=-4

will take the notes in the SOLO-GUITAR track and arpeggiate them as a series of 32nd notes. Each successive note's velocity will be decremented by 4 Enabling a HARMONY (or the entry of multiple notes by the user) is needed for meaningful effects ... arpeggiating over a single note isn't the nicest sound (but it works). For this to sound musical, you will have to experiment with the various options and the track ARTICULATE setting. For an interesting (weird) effect try a long RATE combined with MALLET.

Each option for this command must be entered in the OPTION=VALUE format.

The duration of each generated note. For example, “16” will use 16th notes; “20t” will use 20 MIDI ticks. If RATE is set to “0” or “None” the arpeggio will be disabled.

A value to decrement each successive note. This is a percentage. To reduce (ie, make quieter) use negative values; positive values will increase the volume. Default is “0”.

The direction of the “strum”. Valid values are “Up”, “Down”, “Both” and “Random”. Default is “Up”.


You can set a SEQUENCE in a MELODY or SOLO track. Sequences work just like they do in other tracks. There are some advantages to this: you can use the mnemonic notation outlined above; and you can easily import existing MIDI tracks to use as sequences (see here). Some examples are included in the directories egs/solo and egs/midi-inc/mid2seq in the distribution.

To set a sequence use the note name format described above. Anything valid in a RIFF is valid in a sequence. For example:

Begin Melody-AltoSax
  Voice AltoSax
  Voicing FollowChord=On FollowKey=Off Root=C
  Articulate 60
  Harmony OpenAbove
  Sequence { 4.c;8;4g;;} {2c;g;} {4c;;g;;} {8c;;;;d;e;4d;}
  Octave 5

will create a simple bass line.

You can create multi-bar sequences using {}s just like in other tracks:

Melody-Bass Sequence {4c;g;c;g;}{2c;}

Note the use of various VOICING options in the above example.


These VOICING commands only apply to MELODY and SOLO tracks.10.4 Each option is set as an OPTION=VALUE pair.

On or Off (default OFF). When this is set each note pitch will be adjusted in accordance with the current chord. For example, the note pitch “c” would be changed to a “f” when an F chord is active, etc.

This option should be enabled when using a sequence pattern. It should be disabled (default) when using a solo riff.

On or Off (default ON). When MMA interprets a string containing solo/melody note data it converts pitches according to the current key signature (see the Note Data Pitch section, above). However, this can be a problem when using a solo/melody line in a sequence.

In most, if not all, cases you should set this to OFF when using SEQUENCE patterns in a SOLO or MELODY track; set it to ON (the default) when using a solo RIFF.

Regardless of the setting, explicit accidentals in the pattern are honoured as detailed earlier in this section. You should specify explicit accidentals in a pattern used as a sequence in a SOLO or MELODY track. Again, as mentioned above, pitches specified as MIDI values are unaffected by the key signature.

Sets the root chord your sequence is based on. Valid settings are letters “a” to “g” and “A” to “G” optionally followed by a single “#” or “b”. This option adjusts the individual pitches in a SEQUENCE or RIFF to the specified root chord. This is done in addition to the FOLLOWCHORD setting, above. The assumption is that you'll probably create your sequence in the key of “C” ... but, with this option, you can create in any key you want.

Please note that all the VOICING options apply equally to a pattern set as a RIFF or a SEQUENCE.

SOLO tracks are not saved as part of a GROOVE. For this reason SEQUENCE is mostly used in a MELODY track; using it in a SOLO track will generate a warning.


... semicolon.10.1
I have borrowed heavily from the notation program MUP for the syntax used here. For notation I highly recommend MUP and use it for most of my notation tasks, including the creation of the score snippets in this manual. MUP is available from Arkkra Enterprises,
... early.10.2
Using MMA 's 192 ticks for a quarter note, a 16th note gets 48 ticks. Divide that by the modifier (default is 2.
... cummulative.10.3
Each accent character changes the note articulation or volume by 20%.
... tracks.10.4
For other voicing options, please see here.