Chord Voicing

In music, a chord is simply defined as two more notes played simultaneously14.1. Now, this doesn't mean that you can play just any two or three notes and get a chord which sounds nice—but whatever you do get will be a chord of some type. And, to further confuse the unwary, different arrangements of the same notes sound better (or worse) in different musical situations.

As a simple example, consider a C major chord. Built on the first, third and fifth notes of a C major scale it can be manipulated into a variety of sounds:

Lost Image

These are all C major chords ... but they all have a different sound or color. The different forms a chord can take are called “voicings”. Again, this manual is not intended to be a primer on musical theory—that's a subject for which lots of lessons with your favorite music teacher is recommended. You'll need a bit of basic music theory if you want to understand how and why MMA creates its tracks.

The different options in this chapter effect not only the way chords are constructed, but also the way bass lines and other tracks are formed.

There are generally two ways in MMA to take care of voicings.

  1. use MMA 's extensive VOICING options, most likely with the ”Optimal” voicing algorithm,

  2. do everything by yourself with the commands INVERT and COMPRESS.

The commands LIMIT and DUPROOT may be used independently for both variants.


The VOICING command is used to set the voicing mode and several other options relating to the selected mode. The command needs to have a CHORD track specified and a series of Option=Value pairs. For example:

Chord-Piano Voicing Mode=Optimal Rmove=10 Range=9

In the following sections all the options available will be covered.

Voicing Mode

The easiest way to deal with chord voicings is via the VOICING MODE=XX option.

When choosing the inversion of a chord to play an accompanist will take into consideration the style of the piece and the chord sequences. In a general sense, this is referred to as “voicing”.

A large number of the library files have been written to take advantage of the following voicing commands. However, not all styles of music take well to the concept. And, don't forget about the other commands since they are useful in manipulating bass lines, as well as other chord tracks (e.g., sustained strings).

MMA has a variety of sophisticated, intelligent algorithms14.2 to deal with voicing.

As a general rule you should not use the INVERT and COMPRESS commands in conjunction with the VOICING command. If you do, you may create beautiful sounds. But, the results are more likely to be less-than-pleasing. Use of voicing and other combinations will display various warning messages.

The main command to enable voicings is:

Chord Voicing Mode=Type

As mentioned above, this command can only be applied to CHORD tracks. Also note that this effects all bars in the sequence ... you cannot have different voicings for different bars in the sequence (attempting to do this would make no sense, but you could do it by creating duplicate tracks with alternate bars sounding).

The following MODE types are available:

A basic algorithm which automatically chooses the best sounding voicing depending on the voicing played before. Always try this option before anything else. It might work just fine without further work.

The idea behind this algorithm is to keep voicings in a sequence close together. A pianist leaves his or her fingers where they are, if they still fit the next chord. Then, the notes closest to the fingers are selected for the next chord. This way characteristic notes are emphasized.

The following optional setting apply to chords generated with MODE=OPTIMAL:

Voicing Range
To get wider or closer voicings, you may define a range for the voicings. This can be adjusted with the RANGE option:

Chord-Guitar Voicing Mode=Optimal Range=12

In most cases the default value of 12 should work just fine. But, you may want to fine tune ... it's all up to you.

Voicing Center
Just minimizing the Euclidean distance between chords doesn't do the trick as there could be runaway progressions that let the voicings drift up or down infinitely.

When a chord is “voiced” or moved to a new position, a “center point” must be used as a base. By default, the fourth degree of the scale corresponding to the chord is a reasonable choice. However, you can change this with:

Chord-1 Voicing Center=<value>

The value in this command can be any number in the range 0 to 12. Try different values. The color of your whole song might change.

Note that the value is the note in the scale, not a chord-note position.

Voicing Move
To intensify a chord progression you may want to have ascending or descending movement of voicings. This option, in conjunction with the DIR optional (see below) sets the number of bars over which a movement is done.

For the MOVE option to have any effect you must also set the direction to either -1 or 1. Be careful that you don't force the chord too high or low on the scale. Use of this command in a REPEAT section can cause unexpected results. For this reason you should include a SEQ command at the beginning of repeated sections of your songs.

In most cases the use of this command is limited to a section of a song, its use is not recommended in groove files. You might want to do something like this in a song: groove with voicing
chords ...
Chord-Piano Voicing Move=5 Dir=1
more chords...
Chord-Piano Voicing Move=5 Dir=-1
more chords...

Voicing Dir
This option is used in conjunction with the MOVE option to set the direction (-1 or 1) of the movement.

Voicing Rmove
As an alternate to movement in a specified direction, random movement can add some color and variety to your songs. The command option is quite useful (and safe to use) in groove files. The argument for this option is a percentage value specifying the frequency to apply a move in a random direction.

For example:

Chord-3 Voicing Mode=Optimal Rmove=20

would cause a movement (randomly up or down) in 20% of the bars. As noted earlier, using explicit movement instructions can move the chord into an undesirable range or even “off the keyboard”; however, the algorithm used in RMOVE has a sanity check to ensure that the chord center position remains, approximately, in a two octave range.

This mode attempts to cluster the notes of a chord around the root note of the key signature (see here). For example, a C major chord has the notes “C”, “E” and “G”. If KEYSIG is set to “C” the “G” will be lowered by an octave. However, if the the key signature were to be set to “E” no changes would be made. The algorithm used is very simplistic, but the results sound satisfactory.

This is the same as the KEY option, but notes such as the 9th, 11th and 13th are not effected. This may give a brighter sound when using these chord types.

In this mode the chord is played in root position with the second note from the top of the chord is lowered by one octave. The alternate DROP2KEY will further cluster the notes around the root note of the key signature.

In this mode the chord is played in root position with the third note of the chord from the top is lowered by one octave. The alternate DROP3KEY clusters notes around the key signature.

In this mode the chord is played in root position with the second and third notes of the chord, from the top, lowered by one octave. The alternate DROP23KEY clusters notes around the key signature.

The various “drop” voicings are standard for jazz piano and guitar players. Normally a player will not apply this option to a chord which has less than 4 notes. Simple triads (three note chords) like major or minor would have the third or root lowered by one full octave with a Drop2/3 ... and this may not be what you are expecting. In addition, note that the Drop2/3 will be applied after any chord inversions (and this is expected by “real” players).

Compress the notes in the chord into a single octave and force all notes to be above the root of the key signature. Assuming a key of “C” a F major chord would be transformed from 'f', 'a', 'c' to 'c', 'f', 'a'. However, if the key is set to “F” the chord would be unaffected.

This Option may for example be used to turn off VOICING within a song. VOICING MODE=ROOT means nothing else than doing nothing, leaving all chords in root position.

This is the same as the ROOT option.

Rather than basing the inversion selection on an analysis of past chords, this method quite stupidly tries to keep chords around the base point of “C” by inverting “G” and “A” chords upward and “D”, “E” and “F” downward. The chords are also compressed. Certainly not an ideal algorithm, but it can be used to add variety in a piece. The chord setting INVERT (here) is a different setting ... don't confuse the two and don't try to use them at the same time.

Does the same as the stand-alone COMPRESS command. Like ROOT, it is only added to be used in some parts of a song where VOICING MODE=OPTIMAL is used.



The actual notes used in a chord are derived from a table which contains the notes for each variation of a “C” chord—this data is converted to the desired chord by adding or subtracting a constant value according to the following table:

G$\flat$ -6
G -5
G$\sharp$ -4
A$\flat$ -4
A -3
A$\sharp$ -2
B$\flat$ -2
B -1
C$\flat$ -1
B$\sharp$ 0
C 0
C$\sharp$ 1
D$\flat$ 1
D 2
D$\sharp$ 3
E$\flat$ 3
E 4
F$\flat$ 4
E$\sharp$ 5
F 5
F$\sharp$ 6

This means that when MMA encounters an “Am” chord it adjusts the notes in the chord table down by 3 MIDI values; a “F” chord is adjusted 5 MIDI values up. This also means that “A” chords will sound lower than “F” chords.

In most cases this works just fine; but, there are times when the “F” chord might sound better lower than the “A”. You can force a single chord by prefacing it with a single “-” or “+” (details here). But, if the entire song needs adjustment you can use CHORDADJUST command to raise or lower selected chord pitches:

ChordAdjust E=-1 F=-1 Bb=1

Each item in the command consists of a pitch (“B$\flat$”, “C”, etc.) an “=” and an octave specifier (-1, 0 or 1). The pitch values are case sensitive and must be in upper case. With enharmonic notes (E$\sharp$ and F, C$\flat$ and B, etc.) you will need to set both pitches.

To set multiple values you can use a comma separated list like:

ChordAdjust E,E#,F,F#=-1

which will lower the listed chords by an octave.

To a large extent the need for octave adjustments depends on the chord range of a song. For example, the supplied song “A Day In The Life Of A Fool” needs all “E” and “F” chords to be adjusted down an octave.

The value “0” will reset the adjustment to the original value.

You can reset all the values to their original values using the RESET option:

ChordAdjust Reset

To view the current values in the chord adjustment table you can use the $_CHORDADJUST builtin variable.


When MMA grabs the notes for a chord, the notes are spread out from the root position. This means that if you specify a “C13” you will have an “A” nearly 2 octaves above the root note as part of the chord. Depending on your instrumentation, pattern, and the chord structure of your piece, notes outside of the “normal” single octave range for a chord may sound strange.

Chord Compress 1

Forces MMA to put all chord notes in a single octave range.

This command is only effective in CHORD and ARPEGGIO tracks. A warning message is printed if it is used in other contexts.

Instead of the values 0 and 1 you can use “On”, “True”, “Off” and “False” to make your code a bit more readable.

You can specify a different COMPRESS for each bar in a sequence. Repeated values can be represented with a “/”:

Chord Compress True / False /

To restore to its default (off) setting, use a “0” or “False” as the argument.

For a similar command, with different results, see the LIMIT command (here).


To add a bit of fullness to chords, it is quite common for keyboard players to duplicate the root tone of a chord into a lower (or higher) octave. This is accomplished in MMA with the command:

Chord DupRoot -1 -2 1 2

In the above example, the value of -1 adds a note one octave lower than the root note, -2 adds the tone 2 octaves lower, etc. Similarly, the value of 1 will add a note one octave higher than the root tone, etc.

Only the values -9 to 9 are permitted.

You can have multiple notes generated by setting multiple duplicates as comma separated lists:

Chord DupRoot -1,-2

will add notes 1 and 2 octaves below the root of the chord and

Chord DupRoot -1,1,2

will add notes 1 below, and 1 and 2 above.14.3 Note: no spaces are in the comma separated list (spaces indicate the next bar in the sequence).

The volume used for the generated note(s) is the average of the non-zero notes in the chord adjusted by the HARMONYVOLUME setting for the current track.14.4

Different values can be used in each bar of the sequence.

The option is reset to 0 after all SEQUENCE or SEQCLEAR commands. To turn off this setting just use a value of 0:

Chord DupRoot 0

The DUPROOT command is only valid in CHORD tracks.

DUPROOT can only duplicate only the root tone of a chord. If you want to duplicate other pitches in the chord, create a BASS track with the appropriate pattern. For example, if you want to duplicate the fifths in your chord, try this:

Begin Chord
  Voice Piano1
  Octave 6
  Sequence 1 1 90 * 4
Begin Bass-dupchord
  ChShare Chord
  Octave 5
  Sequence 1 1 1- 90 * 4; 1 1 5- 90 * 4

The above, very simple, example will play the third and fifth notes of the chord an octave lower using the same pattern as the basic chords.


By default MMA uses chords in the root position. By example, the notes of a C major chord are C, E and G. Chords can be inverted (something musicians do all the time). Sticking with the C major chord, the first inversion shifts the root note up an octave and the chord becomes E, G and C. The second inversion is G, C and E.

MMA extends the concept of inversion a bit by permitting the shift to be to the left or right, and the number of shifts is not limited. So, you could shift a chord up several octaves by using large invert values.14.5

Inversions can be different in each bar of a sequence. For example example:

SeqSize 4
Chord-1 Sequence STR1
Chord-1 Invert 0 1 0 1

Here the sequence pattern size is set to 4 bars and the pattern for each bar in the Chord-1 track is set to “STR1”. Without the next line, this would result in a rather boring, repeating pattern. But, the Invert command forces the chord to be in the root position for the first bar, the first inversion for the second, etc.

You can use a negative Invert value:

Chord-1 Invert -1

In this case the C major chord becomes G, C and E.

Note that using fewer Invert arguments than the current sequence size is permitted. MMA simply expands the number of arguments to the current sequence size. You may use a “/” for a repeated value.

A SEQUENCE or CLEARSEQ command resets INVERT to 0.

This command on has an effect in CHORD and ARPEGGIO tracks. And, frankly, ARPEGGIOs sound a bit odd with inversions.

If you use a large value for INVERT you can force the notes out of the normal MIDI range. In this case the lowest or highest possible MIDI note value will be used.

A further option is to randomize the inversion process. If you specify a range of values (two values joined with a comma) MMA will select a random value from that range and apply that to the invert. For example:

Chord Invert -2,2

will cause a random invert of -2, -1, 0, 1 or 2 each time a chord is generated. The results can be quite jarring and unexpected.

The values used to set this option must be in the range -10 to 10.


If you use so-called “jazz” chords in your piece, some people might not like the results. To some folks, chords like 11th, 13th, and variations have a dissonant sound. And, sometimes they are in a chart, but don't really make sense. The LIMIT command can be used to set the number of notes of a chord used.

For example:

Chord Limit 4

will limit any chords used in the CHORD track to the first 4 notes of a chord. So, if you have a C11 chord which is C, E, G, B$\flat$, D, and F, the chord will be truncated to C, E, G and B$\flat$.

This command only applies to CHORD and ARPEGGIO tracks. It can be set for other tracks, but the setting will have no effect (no warning will be displayed).

To further refine the pruning of chords you can also set a DROP value as an option, for example:

Chord-Accordion Limit 3 Drop=5

In this case MMA will remove the fifth scale note from the chords with a length greater than three and prune any remaining notes from large chords (ie, a “13”) and force the total number of notes to three.14.6

The DROP argument must be in the range of 1 to 7 and represents a single note in the corresponding scale for that chord. For example, to drop all root notes for a sequence:

Chord-NoRoot Limit 8 Drop=1

Assuming a C7 chord (C, E, G, B$\flat$) the C would be removed (the scale for the chord is C, D, E, F, G, A, B$\flat$). Applying the same to a C5 (a power chord) would eliminate the first C note (a C5 chord has the scale C, D, E, F, G, A, B and the note C, C, G, G ... in this case it ends up effectively doing nothing).

The FORCE option is set with a “True” or “False” argument (You can use “On”, “1”, etc. as well.“False” is included only for completeness since it is the default.)

Use of this will force the DROP option to be executed not matter how many notes are in the chord. Some simple examples:

No effect on any chords since they will all be less than length eight.

All chords will have the root note removed. This will result in three note chords (major and minor triads) only having two notes.

Chords with more than three notes will have the root note removed. No chords will be shorter than three notes, unless they were created that way in a chord table.

All chords will have the root note dropped. Three note chords will be shortened to two.

For a similar command, with different results, see the COMPRESS command (here).


Many instruments have a limited range. For example, the bass section of an accordion is limited to a single octave.14.7 To emulate these sounds it is a simple matter of limiting MMA 's output to match the instrument. For example, in the “frenchwaltz” file you will find the directive:

Chord NoteSpan 48 59

which forces all CHORD tones to the single octave represented by the MIDI values 48 though 59.

This command is applied over other voicing commands like OCTAVE and RANGE and even TRANSPOSE. Notes will still be calculated with respect to these settings, but then they'll be forced into the limited NOTESPAN.

NOTESPAN expects two arguments: The first is the range start, the second the range end (first and last notes to use). The values are MIDI tones and must be in the range 0 to 127. The first value must be less than the second, and the range must represent at least one full octave (12 notes). It can be applied to all tracks except DRUM.


For ARPEGGIO and SCALE tracks you can specify the number of octaves used. The effects of the RANGE command is slightly different between the two.

SCALE: Scale tracks, by default, create three octave scales. The RANGE value will modify this to the number of octaves specified. For example:

Scale Range 1

will force the scales to one octave. A value of 4 would create 4 octave scales, etc.

You can use fractional values when specifying RANGE. For example:

Scale Range .3

will create a scale of 2 notes.14.8 And,

Scale Range 1.5

will create a scale of 10 notes. Now, this gets a bit more confusing for you if you have set SCALETYPE CHROMATIC. In this case a RANGE 1 would generate 12 notes, and RANGE 1.5 18.

Partial scales are useful in generating special effects.

ARPEGGIO: Normally, arpeggios use a single octave.14.9 The RANGE command specifies the number of octaves14.10 to use. A fractional value can be used; the exact result depends on the number of notes in the current chord.

In all cases the values of “0” and ”1” have the same effect.

For both SCALE and ARPEGGIO there will always be a minimum of two notes in the sequence. In all other tracks this option is ignored.


MMA comes with a large number of chord types already defined. In most cases, the supplied set (see this list) is sufficient for all the “modern” or “pop” charts normally encountered. However, there are those times when you want to do something else, or something different.

You can define additional chord types at any time, or redefine existing chord types. The DEFCHORD command makes no distinction between a new chord type or a redefinition, with the exception that a warning message is printed for the later.

The syntax of the command is quite strict:

DefChord NAME (NoteList) (ScaleList)


Some examples might clarify. First, assume that you have a section of your piece which has a major chord, but you only want the root and fifth to sound for the chords and you want the arpeggios and bass notes to only use the root. You could create new patterns, but it's just as easy to create a new chord type.

DefChord 15 (0,4) (0, 0, 0, 0, 0, 0, 0)
1 C / G /
2 C15 / G15

In this case a normal Major chord will be used in line 1. In line 2 the new “15” will be used. Note the trick in the scale: by setting all the offsets to “0” only the root note is available to the WALK and BASS tracks.

Sometimes you'll see a new chord type that MMA doesn't know. You could write the author and ask him to add this new type, but if it is something quite odd or rare, it might be easier to define it in your song. Let's pretend that you've encountered a “Cmaj12” A reasonable guess is that this is a major 7 with an added 12th (just the 5th up an octave). You could change the “maj12” part of the chord to a “M7” or “maj7” and it should sound fine. But:

DefChord maj12 (0, 4, 7, 11, 19) (0, 2, 4, 5, 7, 9, 11)

is much more fun. Note a few details:

The final example handles a minor problem in MMA and “diminished” chords. In most of the music the author of MMA encounters, the marking “dim” on a chord usually means a “diminished 7th”. So, when MMA initializes it creates a copy of the “dim7” and calls it “dim”. But, some people think that “dim” should reference a “diminished triad”. It's pretty easy to change this by creating a new definition for “dim”:

DefChord dim (0, 3, 6) (0, 2, 3, 5, 6, 8, 9 )

In this example the scale notes use the same notes as those in a “dim7”. You might want to change the B $\flat$$\flat$ (9) to B$\flat$ (10) or B (11). If you really disagree with the choice to make a dim7 the default you could even put this in a mmarc file.

It is even easier to use the non-standard notation “dim3” to specify a diminished triad. Better yet: use the author's preferred and unambiguous “m$\flat$5” for a triad and “dim7” for a four note chord.


This command can be used to make the creation of custom chords a bit simpler. Simply pass one or more chord types after the command and they will be displayed on your terminal. Example:

PrintChord m M7 dim

in a file should display:

m : (0, 3, 7) (0, 2, 3, 5, 7, 9, 11) Minor triad.
M7 : (0, 4, 7, 11) (0, 2, 4, 5, 7, 9, 11) Major 7th.
dim : (0, 3, 6, 9) (0, 2, 3, 5, 6, 8, 9) Diminished. MMA assumes a diminished 7th.

From this you can cut and paste, change the chord or scale and insert the data into a DEFCHORD command.


MMA makes other adjustments on-the-fly to your chords. This is done to make the resulting sounds “more musical” ... to keep life interesting, the definition of “more musical” is quite elusive. The following notes will try to list some of the more common adjustments made “behind your back”.


... simultaneously14.1
Some will argue that two notes do not make a chord and three or more are needed. Okay. That's what the internet is for: mindless, needless arguments about trivial details.
... algorithms14.2
Great thanks are due to Alain Brenzikofer who not only pressured me into including the VOICING options, but wrote a great deal of the actual code.
... above.14.3
Adding too many root tones in varying octaves can create harmonic overtone problems (in other words, it can sound crappy).
... track.14.4
By default the HARMONYVOLUME is 80%. You probably do not want the added note(s) to be louder, but experiment!
... values.14.5
The term “shift” is used here, but that's not quite what MMA does. The order of the notes in the internal buffer stays the same, just the octave for the notes is changed. So, if the chord notes are “C E G” with the MIDI values “0, 4, 7” an invert of 1 would change the notes to “C2 E G” and the MIDI values to “12, 4, 7”.
... three.14.6
Most accordions with a Stradella bass play three note chords and drop the fifth for seventh and diminished chords.
... octave.14.7
Some accordions have “freebass” switches which overcomes this, but that is the exception.
... notes.14.8
Simple math here: take the number of notes in a scale (7) and multiply by .3. Take the integer result as the number of notes.
... octave.14.9
Not quite true: they use whatever notes are in the chord, which might exceed an octave span.
... octaves14.10
Again, not quite true: the command just duplicates the arpeggio notes the number of times specified in the RANGE setting.