Outils pour utilisateurs

Outils du site


back2root:ibm-pc-ms-dos:xm

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
back2root:ibm-pc-ms-dos:xm [2023/05/21 00:44] – supprimée - modification externe (Date inconnue) 127.0.0.1back2root:ibm-pc-ms-dos:xm [2023/05/21 00:44] (Version actuelle) – ↷ Page déplacée de back2root:archives:xm à back2root:ibm-pc-ms-dos:xm frater
Ligne 1: Ligne 1:
 +====== XM Module format ======
 +
 +<WRAP round box>
 +The XM module format description for XM files version $0104.
 +
 +By Mr.H of Triton in 1994.
 +
 +- Be prepared! Are you sure you want to know? :-)
 +
 +</WRAP>
 +
 +===== The XM file structure =====
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  Offset  ^  Length  ^  Type                                                                                              ^
 +|  0        17      |  (char)   | ID text: 'Extended module: '                                                             |
 +|  17      |  20      |  (char)   | Module name, padded with zeroes                                                          |
 +|  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 =====
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  Offset  ^  Length  ^  Type                                         ^
 +|  ?       | 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                 |
 +
 +
 +===== Instruments: =====
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  Offset  ^  Length  ^ Type      ^                                  ^
 +|  ?        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:
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  Offset  ^ Length  ^  Type                                                   ^
 +|  +29      4      |  (dword)  | Sample header size                            |
 +|  +33      96      (byte)   | Sample number for all notes                   |
 +|  +129    |  48      (byte)   | Points for volume envelope                    |
 +|  +177    |  48      (byte)   | Points for panning envelope                   |
 +|  +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    |  2      |  (word)   | Reserved                                      |
 +===== Sample headers =====
 +
 +^ Offset  ^  Length    Type      ^
 +|    ?      |  (dword)  |Sample length                                                                               |
 +|   +4      |  (dword)  |Sample loop start                                                                           |
 +|   +8      |  (dword)  |Sample loop length                                                                          |
 +|  +12      |   (byte)  |Volume                                                                                      |
 +|  +13      |   (byte)  |Finetune (signed byte -16..+15)                                                             |
 +|  +14      |   (byte)  |Type: Bit 0-1: 0 = No loop, 1 = Forward loop, 2 = Ping-pong loop; 4: 16-bit sampledata      |
 +|  +15      |   (byte)  |Panning (0-255)                                                                             |
 +|  +16      |   (byte)  |Relative note number (signed byte)                                                          |
 +|  +17      |   (byte)  |Reserved                                                                                    |
 +|  +18    22  |   (char)  |Sample name                                                                                 |
 +
 +__Sample data:__
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^ Offset  ^  Length  ^  Type  ^                                                                                            ^
 +|  ?      |  ?              | Sample data (signed): The samples are stored as delta values. \\ To convert to real data:  |
 +
 +<code pascal>
 +old=0;
 +for i=1 to len
 +  new=sample[i]+old;
 + sample[i]=new;
 + old=new;
 +</code>
 +===== Pattern format =====
 +
 +The patterns are stored as ordinary MOD patterns, except that each note is stored as 5 bytes:
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  Offset  ^  Length  ^  Type    ^                                 ^
 +|  ?        1        (byte)  | Note (0-71, 0 = C-0)            |
 +|  +1      |  1        (byte)  | Instrument (0-128)              |
 +|  +2      |  1        (byte)  | Volume column byte (see below)  |
 +|  +3      |  1        (byte)  | Effect type                     |
 +|  +4      |  1        (byte)  | Effect parameter                |
 +
 +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 ^  description 
 +|    |set: Note follows |
 +|    |set: Instrument follows |
 +|    |set: Volume column byte follows |
 +|    |set: Effect type follows  |
 +|    |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.
 +
 +===== Volumes and envelopes =====
 +
 +==== The volume formula ====
 +
 +<WRAP round box>
 +
 +<m 13>FinalVol=(FadeOutVol/65536)*(EnvelopeVol/64)*(GlobalVol/64)*(Vol/64)*Scale</m>
 +
 +</WRAP>
 +
 +
 +
 +
 +==== The panning formula: ====
 +
 +<WRAP round box>
 +
 +<m 13>FinalPan=Pan+(EnvelopePan-32)*(128-Abs(Pan-128))/32</m>
 +
 +</WRAP>
 +
 +
 +==== 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.
 +
 +===== Periods and frequencies =====
 +
 +<WRAP round box>
 +<m 13>PatternNote = 0..95</m> 
 +
 +<color #00a2e8>(0 = C-0, 95 = B-7)</color>
 +
 +<m 13>FineTune = -128..+127</m> 
 +
 +<color #00a2e8>(-128 = -1 halftone, +127 = +127/128 halftones)</color>
 +
 +<m 13>RelativeTone = -96..95</m>  
 + 
 +<color #00a2e8>(0 => C-4 = C-4)</color>
 +
 +<m 13>RealNote = PatternNote + RelativeTone</m> 
 +
 +<color #00a2e8>(0..118, 0 = C-0, 118 = A#9)</color>
 +</WRAP>
 +==== Linear frequence table ====
 +
 +<code pascal>
 +Period = 10*12*16*4 - Note*16*4 - FineTune/2;
 +Frequency = 8363*2^((6*12*16*4 - Period) / (12*16*4));
 +</code>
 +
 +==== Amiga frequence table: ====
 +
 +<code pascal>
 +Period = (PeriodTab[(Note MOD 12)*8 + FineTune/16]*(1-Frac(FineTune/16)) + PeriodTab[(Note MOD 12)*8 + FineTune/16]*(Frac(FineTune/16)))*16/2^(Note DIV 12);
 +</code>
 +
 +(The period is interpolated for finer finetune values)
 +
 +<code pascal>
 +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);
 +</code>
 +
 +====== Standard effects ======
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  Code  ^  Note  ^  Description             ^
 +|  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            | Set global volume        |
 +|  H      (*)   | Global volume slide      |
 +|  K            | Key off                  |
 +|  L            | Set envelope position    |
 +|  P      (*)   | Panning slide            |
 +|  R      (*)   | Multi retrig note        |
 +|  T            | Tremor                   |
 +|  X1    |  (*)   | Extra fine porta up      |
 +|  X2    |  (*)   | 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.
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  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              |
 +
 +<WRAP round info>
 +This should be just about everything (I hope?). You will probably need
 +some information about the MOD format and maybe about S3M.
 +
 +Have fun!
 +
 +Fredrik Huss / Mr.H of Triton
 +</WRAP>
 +