**Credits:**
Lars Hamre, Norman Lin, Kurt Kennett, Mark Cox, Peter Hanning,
Steinar Midtskogen, Marc Espie, and Thomas Meyer

(All numbers below are given in decimal)

Module Format: # Bytes Description ------- ----------- 20 The module's title, padded with null (\0) bytes. Original Protracker wrote letters only in uppercase. (Data repeated for each sample 1-15 or 1-31) 22 Sample's name, padded with null bytes. If a name begins with a '#', it is assumed not to be an instrument name, and is probably a message. 2 Sample length in words (1 word = 2 bytes). The first word of the sample is overwritten by the tracker, so a length of 1 still means an empty sample. See below for sample format. 1 Lowest four bits represent a signed nibble (-8..7) which is the finetune value for the sample. Each finetune step changes the note 1/8th of a semitone. Implemented by switching to a different table of period-values for each finetune value. 1 Volume of sample. Legal values are 0..64. Volume is the linear difference between sound intensities. 64 is full volume, and the change in decibels can be calculated with 20*log10(Vol/64) 2 Start of sample repeat offset in words. Once the sample has been played all of the way through, it will loop if the repeat length is greater than one. It repeats by jumping to this position in the sample and playing for the repeat length, then jumping back to this position, and playing for the repeat length, etc. 2 Length of sample repeat in words. Only loop if greater than 1. (End of this sample's data.. each sample uses the same format and they are stored sequentially) N.B. All 2 byte lengths are stored with the Hi-byte first, as is usual on the Amiga (big-endian format). 1 Number of song positions (ie. number of patterns played throughout the song). Legal values are 1..128. 1 Historically set to 127, but can be safely ignored. Noisetracker uses this byte to indicate restart position - this has been made redundant by the 'Position Jump' effect. 128 Pattern table: patterns to play in each song position (0..127) Each byte has a legal value of 0..63 (note the Protracker exception below). The highest value in this table is the highest pattern stored, no patterns above this value are stored. (4) The four letters "M.K." These are the initials of Unknown/D.O.C. who changed the format so it could handle 31 samples (sorry.. they were not inserted by Mahoney & Kaktus). Startrekker puts "FLT4" or "FLT8" here to indicate the # of channels. If there are more than 64 patterns, Protracker will put "M!K!" here. You might also find: "4CHN", "6CHN" or "8CHN" which indicates 4, 6 or 8 channels respectively. If no letters are here, then this is the start of the pattern data, and only 15 samples were present. (Data repeated for each pattern:) 1024 Pattern data for each pattern (starting at 0). (Each pattern has same format and is stored in numerical order. See below for pattern format) (Data repeated for each sample:) xxxxxx The maximum size of a sample is 65535 words. Each sample is stored as a collection of bytes (length of a sample was given previously in the module). Each byte is a signed value (-128 ..127) which is the channel data. When a sample is played at a pitch of C2 (see below for pitches), about 8287 bytes of sample data are sent to the channel per second. Multiply the rate by the twelfth root of 2 (=1.0595) for each semitone increase in pitch eg. moving the pitch up 1 octave doubles the rate. The data is stored in the order it is played (eg. first byte is first byte played). The first word of the sample data is used to hold repeat information, and will overwrite any sample data that is there (but it is probably safer to set it to 0). The rate given above (8287) conveys an inaccurate picture of the module-format - in reality it is different for different Amigas. As the routines for playing were written to run off certain interrupts, for different Amiga computers the rate to send data to the channel will be different. For PAL machines the clock rate is 7093789.2 Hz and for NTSC machines it is 7159090.5 Hz. When the clock rate is divided by twice the period number for the pitch it will give the rate to send the data to the channel, eg. for a PAL machine sending a note at C2 (period 428), the rate is 7093789.2/856 ~= 8287.1369 (Each sample is stored sequentially) Pattern Format: Each pattern is divided into 64 divisions. By allocating different tempos for each pattern and spacing the notes across different amounts of divisions, different bar sizes can be accommodated. Each division contains the data for each channel (1..4) stored after each other. Channels 1 and 4 are on the left, and channels 2 and 3 are on the right. In the case of more channels: channels 5 and 8 are on the left, and channels 6 and 7 are on the right, etc. Each channel's data in the division has an identical format which consists of 2 words (4 bytes). Divisions are numbered 0..63. Each division may be divided into a number of ticks (see 'set speed' effect below). Channel Data: (the four bytes of channel data in a pattern division) 7654-3210 7654-3210 7654-3210 7654-3210 wwww xxxxxxxxxxxxxx yyyy zzzzzzzzzzzzzz wwwwyyyy (8 bits) is the sample for this channel/division xxxxxxxxxxxx (12 bits) is the sample's period (or effect parameter) zzzzzzzzzzzz (12 bits) is the effect for this channel/division If there is to be no new sample to be played at this division on this channel, then the old sample on this channel will continue, or at least be "remembered" for any effects. If the sample is 0, then the previous sample on that channel is used. Only one sample may play on a channel at a time, so playing a new sample will cancel an old one - even if there has been no data supplied for the new sample. Though, if you are using a "silence" sample (ie. no data, only used to turn off other samples) it is polite to set its default volume to 0. To determine what pitch the sample is to be played on, look up the period in a table, such as the one below (for finetune 0). If the period is 0, then the previous period on that channel is used. Unfortunately, some modules do not use these exact values. It is best to do a binary- search (unless you use the period as the offset of an array of notes.. expensive), especially if you plan to use periods outside the "standard" range. Periods are the internal representation of the pitch, so effects that alter pitch (eg. sliding) alter the period value (see "effects" below). C C# D D# E F F# G G# A A# B Octave 1: 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453 Octave 2: 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226 Octave 3: 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113 Octave 0:1712,1616,1525,1440,1357,1281,1209,1141,1077,1017, 961, 907 Octave 4: 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60, 57 Octaves 0 and 4 are NOT standard, so don't rely on every tracker being able to play them, or even not crashing if being given them - it's just nice that if you can code it, to allow them to be read. Effects: Effects are written as groups of 4 bits, eg. 1871 = 7 * 256 + 4 * 16 + 15 = [7][4][15]. The high nibble (4 bits) usually determines the effect, but if it is [14], then the second nibble is used as well. [0]: Arpeggio Where [0][x][y] means "play note, note+x semitones, note+y semitones, then return to original note". The fluctuations are carried out evenly spaced in one pattern division. They are usually used to simulate chords, but this doesn't work too well. They are also used to produce heavy vibrato. A major chord is when x=4, y=7. A minor chord is when x=3, y=7. [1]: Slide up Where [1][x][y] means "smoothly decrease the period of current sample by x*16+y after each tick in the division". The ticks/division are set with the 'set speed' effect (see below). If the period of the note being played is z, then the final period will be z - (x*16 + y)*(ticks - 1). As the slide rate depends on the speed, changing the speed will change the slide. You cannot slide beyond the note B3 (period 113). [2]: Slide down Where [2][x][y] means "smoothly increase the period of current sample by x*16+y after each tick in the division". Similar to [1], but lowers the pitch. You cannot slide beyond the note C1 (period 856). [3]: Slide to note Where [3][x][y] means "smoothly change the period of current sample by x*16+y after each tick in the division, never sliding beyond current period". Any note in this channel's division is not played, but changes the "remembered" note - it can be thought of as a parameter to this effect. Sliding to a note is similar to effects [1] and [2], but the slide will not go beyond the given period, and the direction is implied by that period. If x and y are both 0, then the old slide will continue. [4]: Vibrato Where [4][x][y] means "oscillate the sample pitch using a particular waveform with amplitude y/16 semitones, such that (x * ticks)/64 cycles occur in the division". The waveform is set using effect [14][4]. By placing vibrato effects on consecutive divisions, the vibrato effect can be maintained. If either x or y are 0, then the old vibrato values will be used. [5]: Continue 'Slide to note', but also do Volume slide Where [5][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1), at the same time as continuing the last 'Slide to note'". It is illegal for both x and y to be non-zero. You cannot slide outside the volume range 0..64. The period-length in this channel's division is a parameter to this effect, and hence is not played. [6]: Continue 'Vibrato', but also do Volume slide Where [6][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1), at the same time as continuing the last 'Vibrato'". It is illegal for both x and y to be non-zero. You cannot slide outside the volume range 0..64. [7]: Tremolo Where [7][x][y] means "oscillate the sample volume using a particular waveform with amplitude y*(ticks - 1), such that (x * ticks)/64 cycles occur in the division". If either x or y are 0, then the old tremolo values will be used. The waveform is set using effect [14][7]. Similar to [4]. [8]: (Set panning position) This command is unused by the vast majority of trackers, but one tracker for the PC (called DMP) uses this for setting the panning state of the channel. As this is very useful, I am documenting it here. The effect [8][x][y] means "set channel to panning position x*16 + y". Position 0 is left, 64 is centre, 128 is right. Interestingly, position 164 is defined as "surround". [9]: Set sample offset Where [9][x][y] means "play the sample from offset x*4096 + y*256". The offset is measured in words. If no sample is given, yet one is still playing on this channel, it should be retriggered to the new offset using the current volume. [10]: Volume slide Where [10][x][y] means "either slide the volume up x*(ticks - 1) or slide the volume down y*(ticks - 1)". If both x and y are non-zero, then the y value is ignored (assumed to be 0). You cannot slide outside the volume range 0..64. [11]: Position Jump Where [11][x][y] means "stop the pattern after this division, and continue the song at song-position x*16+y". This shifts the 'pattern-cursor' in the pattern table (see above). Legal values for x*16+y are from 0 to 127. [12]: Set volume Where [12][x][y] means "set current sample's volume to x*16+y". Legal volumes are 0..64. [13]: Pattern Break Where [13][x][y] means "stop the pattern after this division, and continue the song at the next pattern at division x*10+y" (the 10 is not a typo). Legal divisions are from 0 to 63. [14][0]: Set filter on/off Where [14][0][x] means "set sound filter ON if x is 0, and OFF is x is 1". This is a hardware command for some Amigas, so if you don't understand it, it is better not to use it. [14][1]: Fineslide up Where [14][1][x] means "decrement the period of the current sample by x". The incrementing takes place at the beginning of the division, and hence there is no actual sliding. This type of sliding cannot be continued with effect [5]. You cannot slide beyond the note B3 (period 113). [14][2]: Fineslide down Where [14][2][x] means "increment the period of the current sample by x". Similar to [14][1] but shifts the pitch down. You cannot slide beyond the note C1 (period 856). [14][3]: Set glissando on/off Where [14][3][x] means "set glissando ON if x is 1, OFF if x is 0". Used in conjunction with [3] ('Slide to note'). If glissando is on, then 'Slide to note' will slide in semitones, otherwise will perform the default smooth slide. [14][4]: Set vibrato waveform Where [14][4][x] means "set the waveform of succeeding 'vibrato' effects to wave #x". [4] is the 'vibrato' effect. Possible values for x are: 0 - sine (default) /\ /\ (2 cycles shown) 4 (without retrigger) \/ \/ 1 - ramp down | \ | \ 5 (without retrigger) \ | \ | 2 - square ,--, ,--, 6 (without retrigger) '--' '--' 3 - random: a random choice of one of the above. 7 (without retrigger) If the waveform is selected "without retrigger", then it will not be retriggered from the beginning at the start of each new note. [14][5]: Set finetune value Where [14][5][x] means "sets the finetune value of the current sample to the signed nibble x". x has legal values of 0..15, corresponding to signed nibbles 0..7,-8..-1 (see start of text for more info on finetune values). [14][6]: Loop pattern Where [14][6][x] means "set the start of a loop to this division if x is 0, otherwise after this division, jump back to the start of a loop and play it another x times before continuing". If the start of the loop was not set, it will default to the start of the current pattern. Hence 'loop pattern' cannot be performed across multiple patterns. Note that loops do not support nesting, and you may generate an infinite loop if you try to nest 'loop pattern's. [14][7]: Set tremolo waveform Where [14][7][x] means "set the waveform of succeeding 'tremolo' effects to wave #x". Similar to [14][4], but alters effect [7] - the 'tremolo' effect. [14][8]: -- Unused -- [14][9]: Retrigger sample Where [14][9][x] means "trigger current sample every x ticks in this division". If x is 0, then no retriggering is done (acts as if no effect was chosen), otherwise the retriggering begins on the first tick and then x ticks after that, etc. [14][10]: Fine volume slide up Where [14][10][x] means "increment the volume of the current sample by x". The incrementing takes place at the beginning of the division, and hence there is no sliding. You cannot slide beyond volume 64. [14][11]: Fine volume slide down Where [14][11][x] means "decrement the volume of the current sample by x". Similar to [14][10] but lowers volume. You cannot slide beyond volume 0. [14][12]: Cut sample Where [14][12][x] means "after the current sample has been played for x ticks in this division, its volume will be set to 0". This implies that if x is 0, then you will not hear any of the sample. If you wish to insert "silence" in a pattern, it is better to use a "silence"-sample (see above) due to the lack of proper support for this effect. [14][13]: Delay sample Where [14][13][x] means "do not start this division's sample for the first x ticks in this division, play the sample after this". This implies that if x is 0, then you will hear no delay, but actually there will be a VERY small delay. Note that this effect only influences a sample if it was started in this division. [14][14]: Delay pattern Where [14][14][x] means "after this division there will be a delay equivalent to the time taken to play x divisions after which the pattern will be resumed". The delay only relates to the interpreting of new divisions, and all effects and previous notes continue during delay. [14][15]: Invert loop Where [14][15][x] means "if x is greater than 0, then play the current sample's loop upside down at speed x". Each byte in the sample's loop will have its sign changed (negated). It will only work if the sample's loop (defined previously) is not too big. The speed is based on an internal table. [15]: Set speed Where [15][x][y] means "set speed to x*16+y". Though it is nowhere near that simple. Let z = x*16+y. Depending on what values z takes, different units of speed are set, there being two: ticks/division and beats/minute (though this one is only a label and not strictly true). If z=0, then what should technically happen is that the module stops, but in practice it is treated as if z=1, because there is already a method for stopping the module (running out of patterns). If z<=32, then it means "set ticks/division to z" otherwise it means "set beats/minute to z" (convention says that this should read "If z<32.." but there are some composers out there that defy conventions). Default values are 6 ticks/division, and 125 beats/minute (4 divisions = 1 beat). The beats/minute tag is only meaningful for 6 ticks/division. To get a more accurate view of how things work, use the following formula: 24 * beats/minute divisions/minute = ----------------- ticks/division Hence divisions/minute range from 24.75 to 6120, eg. to get a value of 2000 divisions/minute use 3 ticks/division and 250 beats/minute. If multiple "set speed" effects are performed in a single division, the ones on higher-numbered channels take precedence over the ones on lower-numbered channels. This effect has a large number of different implementations, but the one described here has the widest usage. N.B. This document should be fairly accurate now, but as the module format is more of an observation than a standard, a couple of effects cannot be relied upon to act exactly the same from tracker to tracker (especially if the tracker is not for the Amiga). It is probably better to use this document as a guide rather than as a hard-and-fast definition of the module format. Oh.. and yes, I would normally give bytes as hex values, but it is easier to understand a consistent notation.

Andrew Scott Author of MIDIMOD (MOD to MIDI converter), PTMID (MIDI to MOD converter)