The XM module format description for XM files version $0104. By Mr.H of Triton in 1994. ============================================================================ Some additions and a few corrections were made by ByteRaver & Wodan from TNT / NO-ID. Reach me at erlandvo@hotmail.com for further questions. ============================================================================ When you have to implement the XM file format in your loader, keep in mind that Triton's philosophy goes a bit like this: "If it's zero or empty, don't store it" General layout of the XM file: - General header (ID text, Module Name, $1a, Tracker name, see below) - header of 1st pattern - data (packed, see below) of 1st pattern - header of 2nd pattern - data (packed, see below) of 2nd pattern ..... - header of last pattern - data (packed, see below) of last pattern - 1st part of 1st instrumentheader - if nr_of_samples>0 then this data follows: - 2nd part of 1st instrumentheader - 1st sampleheader - 2nd sampleheader follows (if any) ..... - last sampleheader (if any) - if the sample_size>0 (1st sample header) then sampledata of 1st sample follows - if the sample_size>0 (2nd sample header) then sampledata of 2nd sample follows ..... - if the sample_size>0 (last sample header) then sampledata of last sample follows - 1st part of 2nd instrumentheader ... same layout as 1st instrument. - 1st part of last instrumentheader. ... same layout as 1st instrument. ****************************** * The XM file structure: * ****************************** The string at offset 38 should read "FastTracker II" but some trackers (e.g. DigiTracker) use this field for other purposes (DigiTracker stores the Composer's name here). This field being trashed doesn't necessarily mean that the XM file is corrupt. Offset Length Type 0 17 (char) ID text: 'Extended module: ' 17 20 (char) Module name, padded with spaces 37 1 (char) $1a 38 20 (char) Tracker name 58 2 (word) Version number, hi-byte major and low-byte minor The current format is version $0103 60 4 (dword) Header size +4 2 (word) Song length (in patten order table) +6 2 (word) Restart position +8 2 (word) Number of channels (2,4,6,8,10,...,32) +10 2 (word) Number of patterns (max 256) +12 2 (word) Number of instruments (max 128) +14 2 (word) Flags: bit 0: 0 = Amiga frequency table (see below); 1 = Linear frequency table +16 2 (word) Default tempo +18 2 (word) Default BPM +20 256 (byte) Pattern order table Patterns: --------- ? 4 (dword) Pattern header length +4 1 (byte) Packing type (always 0) +5 2 (word) Number of rows in pattern (1..256) +7 2 (word) Packed patterndata size ? ? Packed pattern data Note that if the Module uses a totally empty pattern, this pattern is *NOT* stored in the XM; in other words, you need to create an empty pattern if the module needs one. In fact, to be save, you'll always have to create a "standard" empty pattern: allocate 64*(nr of channels) bytes and set them to value $80 (128 dec). Initialise the header of this pattern with the standard values: pattern header length = 9 Packing type = 0 Number of rows in pattern = 64 Packed patterndata size = 64*(nr of channels) If the field "Packed patterndata size" is set to 0, the pattern is NOT stored in the file but it MAY be used by the song. Also note that whenever a pattern nr in the pattern sequence table is higher than the nr of patterns (common for converted S3M's), you should play the standard empty pattern. Instruments: ------------ ? 4 (dword) Instrument size +4 22 (char) Instrument name +26 1 (byte) Instrument type (always 0) +27 2 (word) Number of samples in instrument If the number of samples > 0, then the this will follow: +29 4 (dword) Sample header size +33 96 (byte) Sample number for all notes +129 48 (word) Points for volume envelope +177 48 (word) Points for panning envelope Envelope points: x,y...x,y.... in couples (2 words/point => a maximum of 12 points). +225 1 (byte) Number of volume points +226 1 (byte) Number of panning points +227 1 (byte) Volume sustain point +228 1 (byte) Volume loop start point +229 1 (byte) Volume loop end point +230 1 (byte) Panning sustain point +231 1 (byte) Panning loop start point +232 1 (byte) Panning loop end point +233 1 (byte) Volume type: bit 0: On; 1: Sustain; 2: Loop +234 1 (byte) Panning type: bit 0: On; 1: Sustain; 2: Loop +235 1 (byte) Vibrato type +236 1 (byte) Vibrato sweep +237 1 (byte) Vibrato depth +238 1 (byte) Vibrato rate +239 2 (word) Volume fadeout +241 11 (word) Reserved You should use the "sample header size" (first field of second part of instrumentheader) to compute the total size of the 2 headers as stored in the file. Sample headers: --------------- ? 4 (dword) Sample length +4 4 (dword) Sample loop start +8 4 (dword) Sample loop length Note: If the sample Loop length (precedent field) is 0, the sample is *NOT* a looping one, even if the "Forward loop" bit is set in the "TYPE" field. +12 1 (byte) Volume +13 1 (byte) Finetune (signed byte -128..+127) +14 1 (byte) Type: Bit 0-1: 0 = No loop, 1 = Forward loop, 2 = Ping-pong loop; 4: 16-bit sampledata +15 1 (byte) Panning (0-255) +16 1 (byte) Relative note number (signed byte) +17 1 (byte) Reserved +18 22 (char) Sample name Sample data: ------------ ? ? Sample data (signed): The samples are stored as delta values. To convert to real data: old=0; for i=1 to len new=sample[i]+old; sample[i]=new; old=new; Even 16-bit data is stored as delta values. (It only makes really sens to store every other byte as delta value, but this is as easy. Oh, well.) *********************** * Pattern format: * *********************** The patterns are stored as ordinary MOD patterns, except that each note is stored as 5 bytes: ? 1 (byte) Note (1-96, 1 = C-0) +1 1 (byte) Instrument (1-128) +2 1 (byte) Volume column byte (see below) +3 1 (byte) Effect type +4 1 (byte) Effect parameter (When Note = 97, a "key off" command occurs). A simple packing scheme is also adopted, so that the patterns not become TOO large: Since the MSB in the note value is never used, if is used for the compression. If the bit is set, then the other bits are interpreted as follows: bit 0 set: Note follows 1 set: Instrument follows 2 set: Volume column byte follows 3 set: Effect type follows 4 set: Guess what! It is very simple, but far from optimal. If you want a better, you can always repack the patterns in your loader. XM patterns are stored as following: - A pattern is a sequence of lines. - A line is a sequence of notes. - a note is stored as described above. ****************************** * Volumes and envelopes: * ****************************** The volume formula: FinalVol=(FadeOutVol/65536)*(EnvelopeVol/64)*(GlobalVol/64)*(Vol/64)*Scale; The panning formula: FinalPan=Pan+(EnvelopePan-32)*(128-Abs(Pan-128))/32; If no envelope is active, use the value 32 instead of "EnvelopePan" Envelope: --------- The envelopes are processed once per frame, instead of every frame where no new notes are read. This is also true for the instrument vibrato and the fadeout. Since I am so lazy and the tracker is rather self-explaining I am not going to write any more for the moment. - max x value: 0x144 = 324d (for enveloppe points) - max y value: 0x40 = 64d (for enveloppe points) ******************************** * Periods and frequencies: * ******************************** PatternNote = 1..96 (1 = C-0, 96 = B-7) FineTune = -128..+127 (-128 = -1 halftone, +127 = +127/128 halftones) RelativeTone = -96..95 (0 => C-4 = C-4) RealNote = PatternNote + RelativeTone; (0..118, 0 = C-0, 118 = A#9) Linear frequence table: ----------------------- Period = 10*12*16*4 - Note*16*4 - FineTune/2; Frequency = 8363*2^((6*12*16*4 - Period) / (12*16*4)); The above formulas DO work as long as you don't replace "*2^" by "shl" (the result of 2^(...) is a floating point number). When using linear Freq Tables, the distance between two octaves is 255 portamento units. e.g. the effect "1FF" at speed 1 will slide the pitch one octave up. Amiga frequence table: ---------------------- Period = (PeriodTab[(Note MOD 12)*8 + FineTune/16]*(1-Frac(FineTune/16)) + PeriodTab[(Note MOD 12)*8 + FineTune/16+1]*(Frac(FineTune/16))) *16/2^(Note DIV 12); (The period is interpolated for finer finetune values) Frequency = 8363*1712/Period; PeriodTab = Array[0..12*8-1] of Word = ( 907,900,894,887,881,875,868,862,856,850,844,838,832,826,820,814, 808,802,796,791,785,779,774,768,762,757,752,746,741,736,730,725, 720,715,709,704,699,694,689,684,678,675,670,665,660,655,651,646, 640,636,632,628,623,619,614,610,604,601,597,592,588,584,580,575, 570,567,563,559,555,551,547,543,538,535,532,528,524,520,516,513, 508,505,502,498,494,491,487,484,480,477,474,470,467,463,460,457); ************************* * Standard effects: * ************************* 0 Appregio 1 (*) Porta up 2 (*) Porta down 3 (*) Tone porta 4 (*) Vibrato 5 (*) Tone porta+Volume slide 6 (*) Vibrato+Volume slide 7 (*) Tremolo 8 Set panning 9 Sample offset A (*) Volume slide B Position jump C Set volume D Pattern break E1 (*) Fine porta up E2 (*) Fine porta down E3 Set gliss control E4 Set vibrato control E5 Set finetune E6 Set loop begin/loop E7 Set tremolo control E9 Retrig note EA (*) Fine volume slide up EB (*) Fine volume slide down EC Note cut ED Note delay EE Pattern delay F Set tempo/BPM G (010h) Set global volume H (*) (011h) Global volume slide I (012h) Unused J (013h) Unused K (014h) Unused L (015h) Set envelope position M (016h) Unused N (017h) Unused O (018h) Unused P (*) (019h) Panning slide Q (01ah) Unused R (*) (01bh) Multi retrig note S (01ch) Unused T (01dh) Tremor U (01eh) Unused V (01fh) Unused W (020h) Unused X1 (*) (021h) Extra fine porta up X2 (*) (021h) Extra fine porta down (*) = If the command byte is zero, the last nonzero byte for the command should be used. ********************************* * Effects in volume column: * ********************************* All effects in the volume column should work as the standard effects. The volume column is interpreted before the standard effects, so some standard effects may override volume column effects. Value Meaning 0 Do nothing $10-$50 Set volume Value-$10 : : : : : : $60-$6f Volume slide down $70-$7f Volume slide up $80-$8f Fine volume slide down $90-$9f Fine volume slide up $a0-$af Set vibrato speed $b0-$bf Vibrato $c0-$cf Set panning $d0-$df Panning slide left $e0-$ef Panning slide right $f0-$ff Tone porta ============================================================================ This should be just about everything (I hope?). You will probably need some information about the MOD format and maybe about S3M. A very good reference is MODFILxx.TXT (xx = version nr.): this file contains only very few errors, and it IS written in good English (easy to understand). I (Byteraver) will soon release a Fixed version of this file. Have fun! Fredrik Huss / Mr.H of Triton