DATABASE "Amiga_MOD_Packers_Described.guide"
@WIDTH 80

##
##       Version 4.1 (13/06/98)
##       written by  Asle
##

##
## Contents
##
@NODE main "Amiga MOD packers described"

 @{" -- Introduction -- " LINK intro}

 @{" AC1D Packer        " LINK AC1D}      @{" Channel Player v1  " LINK CHN1}      @{" Channel Player v2  " LINK CHN2}
 @{" Channel Player v3  " LINK CHN3}      @{" Digital Illusions  " LINK DI}      @{" Eureka Packer      " LINK Eureka}
 @{" FC-M Packer        " LINK FC_M}      @{" Fuzzac Packer      " LINK FUZZAC}      @{" Game Music Creator " LINK GMC}
 @{" Heatseeker mc1.0   " LINK HEETSEAK}      @{" Hornet Packer      " LINK HRT}      @{" Kefrens Sound M.   " LINK KSM}
 @{" Kris Tracker       " LINK Kris}      @{" Module Protector   " LINK ModProt}      @{" NoisePacker v1     " LINK NP1}
 @{" NoisePacker v2     " LINK NP2}      @{" NoisePacker v3     " LINK NP3}      @{" NoiseRunner        " LINK NRUN}
 @{" NoiseTracker Pak   " LINK NTK_PAK}      @{" Pha Packer         " LINK Pha}      @{" Polka Packer       " LINK Polka}
 @{" Power Music        " LINK Power}      @{" Promizer v0.1      " LINK PM01}      @{" Promizer v1.0c     " LINK PM10c}
 @{" Promizer v1.8a     " LINK PM18a}      @{" Promizer 2.0       " LINK PM20}      @{" Promizer v4.0      " LINK PM40}
 @{" ProPacker v1.0     " LINK PP10}      @{" ProPacker v2.1     " LINK PP21}      @{" ProPacker v3.0     " LINK PP3}
 @{" ProRunner v1.0     " LINK PRU1}      @{" ProRunner v2.0     " LINK PRU2}      @{" SKYT Packer        " LINK SKYT}
 @{" Slamtilt (STIM)    " LINK STIM}      @{" StarTrekker Pack   " LINK Star}      @{" The Player 4.0A/B  " LINK P40}
 @{" The Player 4.1A    " LINK P41A}      @{" The Player 5.0A    " LINK P50A}      @{" The Player 6.0A    " LINK P60A}
 @{" The Player 6.1A    " LINK P61A}      @{" Tracker Packer v1  " LINK TP1}      @{" Tracker Packer v2  " LINK TP2}
 @{" Tracker Packer v3  " LINK TP3}      @{" UNIC Tracker 1     " LINK UNIC}      @{" UNIC Tracker 2     " LINK UNIC2}
 @{" Wanton Packer      " LINK wanton}      @{" XANN Packer        " LINK XANN}      @{" Zen Packer         " LINK ZEN}


 @{"Thanks and Greets" LINK thanks}

 by Sylvain "Asle" Chipaux
@ENDNODE

##
## thx
##
@NODE thanks "* thanks *"

  Here follows various thanks, Greets and messages to the few people who helped
 me, in any way. some might be missing ... sorry then :) ... just tell me for
 the next release. 

  Gryzor, for Pro-Wizard, advices and packed MODs (LOTS !).
  Turbo & Marley, for Exotic Ripper.
  Buggs, for NoiseConverter (bugged by the way !).
  and Elsa pour m'avoir ignore depuis une semaine !.


  Now, Some greets and messages ...

  @{b} Slight @{ub}: t'as des nouvelles ziks de Bjorn ?.
  @{b} Xigh @{ub}: chais pas kwa mettre, de tte facon tu liras pas !.
  @{b} Nas @{ub}: merci pour le job :)
  @{b} Ivan Rebroff @{ub}: ouille ...
  @{b} Gryzor @{ub}: le voila ton Slamtilt ... fait depuis 1 bon mois.
  @{b} Xann @{ub}: j'ai de nouveau perdu ton E-mail :( ...
  @{b} Maniacs @{ub}: Thx for your great web pages !. Exotic rules :).


@ENDNODE
##
## intro
##
@NODE intro "* Introduction *"

  This guide contains the description of some 'packed' MOD formats. My guess
 is that nobody is interrested anymore in these descriptions, but I've gathered
 them all the same :). I think it's always good to know history. Now, it's not
 that much historical, so I ask for help/advices when it comes to what's
 already described and/or what will be !.
  Dont hesitate to send me Packed MODs, Packers and Trackers !. I'll welcome
 nearly everything.
  Check what's @{"new" LINK New} with this version.

  I've written a "ProWizard for PC" which supports all these described
 formats. It's 100 per 100 written in C and is, therefore, easily portable.
 It's functional save for the outlook which is awful :(. If someone happens
 to be interrested, contact me. Note that it's still at an early stage of
 development, though the convertions are OK :).


  Contact me :

   snail mail:  Chipaux Sylvain
                27 rue Prosper Legoute
                92160 Antony  France

   E-mail:      asle@mygale.org

   Tel:         (+33) 01-46-66-93-03

  (Snail mail and Tel are only valid until 08/98 ... so E-mailing is prefered)

  Sylvain "Asle" Chipaux

@ENDNODE

##
## What's new ?
##
@NODE New "* What's new *"

 @{b} v4.1 (13/06/98) @{ub}
  - some descriptions rewritten.

  - Added the following format description :
     - @{" Slamtilt (STIM)    " LINK STIM}


 @{b} v4.0 (29/03/98) @{ub}
  - Added the following formats descriptions :
     - @{" Fuzzac Packer      " LINK FUZZAC}
     - @{" Game Music Creator " LINK GMC}
     - @{" Heatseeker mc1.0   " LINK HEATSEEK}
     - @{" Kefrens Sound M.   " LINK KSM}
     - @{" NoisePacker v1     " LINK NP1}
     - @{" NoisePacker v2     " LINK NP2} Yeah !!
     - @{" NoisePacker v3     " LINK NP3}
     - @{" NoiseRunner        " LINK NRUN}
     - @{" NoiseTracker Pak   " LINK NTK_PAK}
     - @{" Promizer v4.0      " LINK PM40}
     - @{" ProPacker v1.0     " LINK PP10}
     - @{" The Player 4.0A/B  " LINK P40}
     - @{" The Player 4.1A    " LINK P41A}
     - @{" The Player 5.0A    " LINK P50A}
     - @{" The Player 6.0A    " LINK P60A} Yop ...
     - @{" The Player 6.1A    " LINK P61A} Yop ...
     - @{" Tracker Packer v1  " LINK TP1}
     - @{" Tracker Packer v2  " LINK TP2}
     - @{" Tracker Packer v3  " LINK TP3}
     - @{" Zen Packer         " LINK ZEN}


 @{b} v3.0 (08/01/98) @{ub}
   I sincerely hope nobody put his hand on this
  version because it's a REAL mess !!. Nobody
  'should' have this version but ... . If you
  happen to be one of these 'happy' dude, simply
  trash it over !.


 @{b} v2.0 (13/11/97) @{ub}
  - Added the following formats descriptions :
     - @{" AC1D Packer       " LINK AC1D}
     - @{" Channel Player v1 " LINK CHN1}
     - @{" Channel Player v2 " LINK CHN2}
     - @{" Channel Player v3 " LINK CHN3}
     - @{" Eureka Packer     " LINK Eureka}
     - @{" FC-M Packer       " LINK FC_M}
     - @{" Power Music       " LINK Power}
     - @{" Promizer v0.1     " LINK PM01}
     - @{" Promizer v1.0c    " LINK PM10c}
     - @{" Promizer v2.0     " LINK PM20}
     - @{" SKYT Packer       " LINK SKYT}
     - @{" StarTrekker Pack  " LINK Star}

  - Added from where I got the packed files in each description.

  - Added one Fx command in the @{" XANN Packer " LINK XANN} description


 @{b} v1.0 (29/09/97) @{ub}
  - First release


@ENDNODE

##
## Slamtilt (STIM)
##
@NODE STIM "* Slamtilt (STIM) *"

STIM format (SLAMTILT)
Created by ???
Analysed by Sylvain "Asle" Chipaux


Source :
 - Slamtilt (flipper game) GREAT musics by Christian Bjorklund !


Offset    size (byte)    Comment
------    -----------    -------
  0           4          "STIM" ID string

  4           4          Address of the sample descriptions

  8           4          ??? (0000000Ch)

 12           4          ??? (00000000h)
(Ch)

 16           2          ??? (001Fh) number of samples ?
(10h)

 18           2          size of the pattern list
(12h)

 20           2          number of pattern saved
(14h)

 22          128         pattern list
(16h)       (80h)

150          64*4        pattern addresses
(96h)                    all the addresses of the saved patterns
                         (up to 64).
                         !add $C to each value !.

406                      pattern datas.
(196h)




 we get something like that :

 pattern 0 :
   - addresses of tracks (4 words)
       first address is always 08h (right after this 8 byte table)
   - all the 64 row of voice 0
   - all the 64 row of voice 1
   - all the 64 row of voice 2
   - all the 64 row of voice 3
 pattern 1 :
 ...

 So, each pattern begins with 4 word. Each is the number of
byte to add to find the tracks 0, 1, 2 and 3.

 the size of each pattern is variable. It can be up to
300h bytes.


* case 1: empty lines

    val
   /    \\
  |      |
 1000 0000
 |
 if this bit is set, follows 'val' empty lines in the track.
 (ex: 81h -> THIS line plus one more are empty)
 (ex: 80h -> THIS line is empty)


* case 2: standard note packing


    __ Fx __
   /        \\
  ||        ||
 0000 0000  0000 0000  0000 0000
 |  |    |    |     |  |       |
 |   \\  /      \\   /    \\     /
 |    smp      note      Fx Val
 |                   
 Description bit set to 0.

 'note' : check below for the correspondance table.
 'smp'  : the sample (from 0 to 1Fh)
          smp = (byte1&0x1F)
 'Fx'   : effect (standard ptk effect)
          Fx = ((byte2>>4)&0xC0)|((byte1>>5)&0x03)




relative note number: (Protracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (STIM)

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24




???          4*31        sample datas addresses

 each sample data starts with a 8 bytes long header which is
as follow :

 $0 : (word) lenght of the sample (/2)
 $2 : (byte) finetune (as ptk)
 $3 : (byte) volume
 $4 : (word) loop start (/2)
 $6 : (word) loop lenght (/2)



@ENDNODE

##
## The Player 6.1A
##
@NODE P61A "* The Player 6.1A *"

The player 6.1A
Created by Jarno Paananen (Guru/Sahara Surfers) (1995)
Analysed by Asle / ReDoX (asle@mygale.org)

Source:
 - Own converted MODs with the packer (sent by Gryzor !)

Note: The 'only' difference remains in the repacking of the tracks datas. 
      I'LL WELCOME ANY INFO ABOUT HOW TO DEPACK SAMPLES !!!. thanks :).

Offset    size (byte)    Comment
------    -----------    -------
  0           2          (Smp_Addy) Address of the sample data
                         
  2           1          (NOP) number of pattern saved

  3           1          (NOS) Number of sample (only the first 6 lower bits !)
                         if bit 6 is set to 1, at least one sample is packed.
                         if bit 7 is set to 1, ALL the samples are delta.
                         (both cases are possible at the same time ...)

Note: if bit 6 is set to 1 (packed samples), the 4 following bytes are
     the unpacked sample data size : 
  4           4          Size of the unpacked samples datas
      Then, dont forget to add 4 to all the following offsets.

      ***************************************
      * the following is repeated NOS times *
      * with 6 bytes description for 1 smp  *
******************************************************
                                                     *
  4            2         Sample size (/2)            *
  6            1         finetune (0->F)             *
  7            1         volume (0->40h)             *
  8            2         Loop Start / 2              *
                                                     *
******************************************************

Note: The player removes what's beside the sample loop, so, it saves
     only the start address. If there's no loop, this value is $FFFF.
Note: if the sample size is > $FF00 (this case is impossible under ptk !),
     you have to NOT this sample size and you'll get the number of sample
     you have to repeat (the datas are the same). The first possible value
     is 00 !.
Note: if the sample is packed/delta , the finetune byte is changed in the
     same way as the number of sample upward :
     if bit 6 is set to 1, the sample is packed.
     if bit 7 is set to 1, the sample is delta.
     And here, too, both cases are possible at the same time.


NOS*6+4      NOP*8       track table. Each pattern contains 4 tracks
                         and here is the address of the four track per
                         patterns. The first address is $0000.

Note: According to the documentation of the packer, it supports the 'new'
     100 pattern feature added by Noxious in their Ptk 2.*. The doc says that
     if the packing of the track data is higher than 64k, then this table is
     saved with DWORD (not just WORD). I've not yet encountered the case, but
     I guess there's a bit, somewhere, that states the fact because I cant see
     how we could know if it's saved on DWORD or only WORD ... .
      Dont forget that the actual size will be (NOP*16) for the following
     offsets.


NOS*6+4        ?         Pattern table. This table ends with $FF
+NOP*8

NOS*6+4                  Tracks datas.
+NOP*8                   (Pat_Size is the size of the pattern list)
+Pat_Size                Each track contains 64 notes. The size is
                         between 4 and 256 bytes.


Note description:

case 1: (flag bit set to 1)

   - flag bit set to 1
  /
 |             Sample
 |             Number
 |              /  \\
 |             |    |
 0000-0000  0000-0000  0000-0000
 |  | |        |       |       |
  \\/   \\      /         \\     /
  $F   relative          value
         note
        number


Note: 'value' is signed. if 'value' is < 80h, then follow 'value' empty rows.
     if 'value' is > 7Fh, then the current note is repeated 'value'-7Fh times

Note: When the 4 last bits of 1st bytes are set to 1 (=$F) then there's no
     effect nor effect value.

Note: The relative note number can NOT be higher than $48 ... it explains the
     possibility of the case #2 ... .

IMPORTANT: It seems that if I should detail every possible case, I'll stay
 here for ages !. So, I'll shorten a bit all this. So, In this case #1, the
 flag bit is set to 1, meaning there's an extra byte I called 'value'. This
 byte disappear when the flag bit is set to 0.




case 1': (flag bit set to 1)

   - flag bit set to 1
  /
 |            effect
 |          parameter
 |           /     \\
 |          |       |
 0000-0000  0000-0000  0000-0000
 |  | |  |             |       |
  \\/   \\/               \\     /
  $E effect              value


Note: When the 4 last bits of 1st bytes are set to 1 (=$E) then there's no
     Sample number nor Relative note number.

IMPORTANT: Here, we have the same shit about this flag bit. Refer to case #1
 'IMPORTANT' line to understand what I mean.




case 2: (flag byte set to 1)

   - flag bit set to 1
  /
 |
 |            value
 |           /     \\
 |          |       |
 0000-0000  0000-0000  0000-0000
 |       |  |          |       |
  \\     /   0           \\     /
    $FF                Nbr Bytes

Some explanations: this case allow the re-use of some already saved notes.
 To find these, we need to know where and how many notes to read. The where
 is answered by the 'Nbr Bytes' byte. To find where are the notes to re-read,
 you have to go back 'Nbr Bytes' before where you are AFTER the actual
 position (which is after having read these three bytes). The number of notes
 to re-read is answered by 'value'. BUT, you HAVE to remove $C0 to it to
 find the real number of notes to read !. The reason to this is explained
 by the following case :



case 2':

   - flag bit set to 1
  /
 |
 |            value
 |           /     \\
 |          |       |
 0000-0000  0000-0000
 |       |  |
  \\     /   0
    $FF

Some explanations: And there we have the other possible pack when the 1st byte
 is $FF. This case is only possible if 'value' is < $40 !. This case is the
 number of empty rows to bypass (-1). This is only possible at the beginning of
 a track because empty notes are already taken care of. As an exemple :
 $FF01 means there's two empty lines.

IMPORTANT: Hum ... if there's only ONE empty note, the flag bit is set to 0
 and, as explained a few times already, the extra byte is removed. So, one
 empty line is $7F.

IMPORTANT (again :): if the last bit of 'value' is set to 1, then, the number
 of bytes is coded on two bytes :


case 2'': (flag byte set to 1)

   - flag bit set to 1
  /
 |
 |            value
 |           /     \\
 |          |       |
 0000-0000  0000-0000  0000-0000  0000-0000
 |       |  |          |                  |
  \\     /   1           \\                /
    $FF                  Number of Bytes




case 3: (flag byte set to 1)

   - flag byte set to 1
  /
 |        Sample
 |        Number                    value
 |        /   \\                    /     \\
 |       |     |                  |       |
 0000-0000  0000-0000  0000-0000  0000-0000
  |      |       |  |  |       |
   \\    /         \\/    \\     /
  relative      effect   effect
    note                 value
   number


Note: 'value' is explain in a 'Note' in case #1.

IMPORTANT: Here, we have the same shit about this flag bit. Refer to case #1
 'IMPORTANT' line to understand what I mean.



sample number:
 The last bit of the sample number is also the first of the relative
note number. It's entirely possible considering the fact that the notes
are *2 ... so this bit is never used by the note. 


effect:

 * Effects with volume slide (5,6,A) are signed. AFF -> A10  A01 -> A01.
 * Arpeggio effect number is 8h in this format.
 * If the effect is a pattern break/jump, the track ends !.


relative note number (P61A):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48

becomes (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113


Information: When you encounter the effect command D or B (pattern break/jump),
            the track data ends, as stated upward. What's important, is that
            ALL the other tracks of THIS pattern have the same number of row
            as the one which ends with the break/jump. As an exemple,
            if track 0 has a pattern break at line 2, the 3 other tracks
            have ONLY 3 rows !.


 Follow Sample datas.

Note: As described in the sample headers, all the samples are not always
     saved !. Refer up there to get the point :).

Note: If the samples are delta, use the following formula ... heh, read
     carefully because it's a FAKE delta !.

  'new' and 'old' are both unsigned bytes
  'Sample_Data' is a table of signed bytes
  +-------------------------------------+
  |old=0                                |
  |                                     |
  |for i=1 to Sample_Size               |
  |  new = (100h - Sample_Data[i]) + old|
  |  Sample_Data[i] = new               |
  |  old = new                          |
  +-------------------------------------+


@ENDNODE


##
## Zen Packer
##
@NODE ZEN "* format Zen Packer *"

Zen Packer format
Created by Dweezil / Stellar (1992)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - five files sent by Gryzor (thx !)

Note: Not much to do since Gryzor described this format fairly well in Prowiz.

Offset    size (byte)    Comment
------    -----------    -------
  0           4          (PAT_ADDY) Address of the pattern table.

  4           1          number of pattern (-1)

  5           1          (SIZE) size of the pattern list
                         (number of pattern to play)


      ***************************************
      * the following is repeated 31 times  *
      * with 16 bytes description for 1 smp *
*******************************************************
                                                      *
  6            2         finetune (*48h)              *
                                                      *
  8            2         volume                       *
                                                      *
 10            2         sample size / 2              *
(0Ah)                                                 *
 12            2         Loop size / 2                *
(0Ch)                                                 *
 14            4         sample address (in file)     *
(0Eh)                                                 *
 18            4         loop start address (in file) *
(12h)                                                 *
                                                      *
*******************************************************


502            ?         pattern data. Stored one after another, each one
(1F6h)                   contains 4 tracks. 

 pattern 1:
  row 1 : voice 1, voice 2, voice 3, voice 4
  row 2 : voice 1, voice 2, voice 3, voice 4
  row ...
  row 64: voice 1, voice 2, voice 3, voice 4
 pattern 2:
  ...

                         That's for the theory because all the notes are not
                         saved !. One note is 4 bytes long and each pattern
                         ends with $FF000000. So, a pattern size is between
                         4 and 1024 bytes.


     unused-      Sample number
            \\         /   \\
             |       |     |
  0000 0000  0000 0000  0000 0000  0000-0000
  |       |   |      |       |  |  |       |
   \\     /     \\    /         \\/    \\     /
   position   relative      effect  effect
    number      note                 value
               number


Note: 'position number' is the position of the note in the pattern. The first
     value is 00. That way, empty notes are not saved since there are only the
     position with notes that are saved. Though, the last note (position = $FF)
     is always saved, whatever the note value is.
Note: The relative note number is *2, and, therefore, the first bit is NEVER
     used by the note.


relative note number: (Protracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (ZEN)

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48




PAT_ADDY     SIZE*4      Pattern table. It's the address of each pattern
                         in the file (dword). The 'PAT_ADDY' is defined
                         upward, as well as 'SIZE'.

PAT_ADDY       4         $FFFFFFFF   to mark the end of the pattern table ..
+SIZE*4                  I guess :).

PAT_ADDY       ?         sample data
+SIZE*4
+4



@ENDNODE

##
## Tracker Packer 3
##
@NODE TP3 "* format Tracker Packer v3 *"

Tracker Packer v3 format
Created by Crazy Crack / Complex (1993-1994)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - Own converted MODs with the packer (sent by Gryzor !)
 - Tons of intros/demos/zikdisk ...

Note: It's the same format as the version 2 save for the repacking of
     the notes. I guess it was done for the replayer because this version
     does not gain one single byte. I had to fight hard to understand this
     new packing ... I cant figure out how Crazy Crack managed to enhance
     his replayer with such a way of packing !.

Offset    size (byte)    Comment
------    -----------    -------
  0           8          ID "CPLX_TP3"
  8        20 (14h)      title

 28           2          (NOS) Number of sample (*8). Also, that's the size
(1Ch)                    of the whole sample headers.

      ***************************************
      * the following is repeated NOS times *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
 30            1         Finetune (0 -> F)           *
(1Eh)                                                *
 31            1         Volume (0 - 40h)            *
(1Fh)                                                *
 32            2         Sample Size / 2             *
(20h)                                                *
 34            2         Loop Start / 2              *
(22h)                                                *
 36            2         Loop Size / 2               *
(24h)                                                *
                                                     *
******************************************************

30+8*NOS       1         ?!? ($00)

31+8*NOS       1         (PLS) Pattern list size.

32+8*NOS     PLS*2       The pattern list. Each number of pattern is *8 !.

32+8*NOS     NOP*8       (NOP stands for the REAL number of pattern which value
+PLS*2                    is known by getting the highest value in the previous
                          table and by adding 1 since the first is 0)
                         Track table per pattern. Each SAVED pattern is made of
                         4 tracks and here are the addresses of each track.
                         This is a table of words. The first address is $0000!.
                         To get the real track address, add to the present
                         value : (34+8*NOS+2*PLS+NOP*8).

32+8*NOS       2         ?!?
+PLS*2
+NOP*8

34+8*NOS       ?         Tracks datas. Each track is saved one after another.
+PLS*2                   It consists of 64 possible notes. the size of each
+NOP*8                   track is variable and is between 1 byte and
                         300h bytes. Here follows the whole lot of cases one
                         can find in the track data (the note packing).


case 1:

     value
    /   \\
   |     |
 1100-0000
 ||
 if these bits are set, you have to bypass (80h - value) bytes for those
are empty notes.


case 2:

    -description bit set to 0
   /
  |
 1000-0000  0000-0000
 |  |   |   |       |
 |   \\ /     \\     /
 | effect  effect value
  \\
   -description bit set to 1


case 3: no effect

     - sample number
    /         /\\
   |         |  |
  0000-0000  0000-0000
  | |     |       |  |
 /   \\   /         \\/
|   relative     effect
|     note
|    number
|------------description bit set to 0

Note: effect, here, is EMPTY !.
Note2: To get the real note number, here, you have to NOT this value, or you
      can do that: result = 7Fh - byte1;


case 4:

     - sample number
    /         /\\
   |         |  |
  0000-0000  0000-0000  0000-0000
  | |     |       |  |  |       |
 /   \\   /         \\/    \\     /
|  relative      effect   effect
|    note                 value
|   number
|------------description bit set to 0


For all those cases:

effect:
 the arpeggio (0) effect has been remapped to 8
 Note that all the volume slide commands (5,6,A) are signed !. Here an example:
  A 01 -> A 10    A FF -> A 01    etc. ..

relative note number: (Protracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (TP3)

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24



 Follows Sample datas stored like Protracker.

Note: As in NoisePacker v3, the sample data address MUST be even !. It means
     you have to bypass one byte after reading the tracks datas if the address
     where you are is uneven.

Note: Tracker Packer 3.1 (the original packer) puts two empty bytes at the
     end of every module it converts. No matter the MOD I converted, these
     two bytes are always here ... .

@ENDNODE

##
## Tracker Packer v2
##
@NODE TP2 "* format Tracker Packer v2 *"

Tracker Packer v2 format
Created by Crazy Crack / MEXX (1993-1994)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - Three TP2 file sent by Gryzor (thx !)

Note: Lots of new features, regarding the previous version which was rather
     good already !. The packing of the notes is one of the best I've seen
     so far as now. Really great packer ... though, I think Heatseeker is
     still better :).

Offset    size (byte)    Comment
------    -----------    -------
  0           8          ID "MEXX_TP2"
  8        20 (14h)      title

 28           2          (NOS) Number of sample (*8). Also, that's the size
(1Ch)                    of the whole sample headers.

      ***************************************
      * the following is repeated NOS times *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
 30            1         Finetune (0 -> F)           *
(1Eh)                                                *
 31            1         Volume (0 - 40h)            *
(1Fh)                                                *
 32            2         Sample Size / 2             *
(20h)                                                *
 34            2         Loop Start / 2              *
(22h)                                                *
 36            2         Loop Size / 2               *
(24h)                                                *
                                                     *
******************************************************

30+8*NOS       1         ?!? ($00)

31+8*NOS       1         (PLS) Pattern list size.

32+8*NOS     PLS*2       The pattern list. Each number of pattern is *8 !.

32+8*NOS     NOP*8       (NOP stands for the REAL number of pattern which value
+PLS*2                    is known by getting the highest value in the previous
                          table and by adding 1 since the first is 0)
                         Track table per pattern. Each SAVED pattern is made of
                         4 tracks and here are the addresses of each track.
                         This is a table of words. The first address is $0000!.
                         To get the real track address, add to the present
                         value : (34+8*NOS+2*PLS+NOP*8).

32+8*NOS       2         ?!?
+PLS*2
+NOP*8

34+8*NOS       ?         Tracks datas. Each track is saved one after another.
+PLS*2                   It consists of 64 possible notes. the size of each
+NOP*8                   track is variable and is between 1 byte and
                         300h bytes. Here follows the whole lot of cases one
                         can find in the track data (the note packing).

case 1:

     value
    /   \\
   |     |
 1100-0000
 ||
 if these bits are set, you have to bypass (80h - value) bytes for those
are empty notes.


case 2:

    -description bit set to 0
   /
  |
 1000-0000  0000-0000
 | |   |    |       |
 |  \\ /      \\     /
 | effect  effect value
  \\
   -description bit set to 1


case 3: no effect

  0000-0000  0000-0000
  ||      |     | |  |
 /  \\    / \\   /   \\/
| relative sample effect
|   note   number
|  number
|------------description bit set to 0

Note: effect, here, is EMPTY !.


case 4:


  0000-0000  0000-0000  0000-0000
  ||      |     | |  |  |       |
 /  \\    / \\   /   \\/    \\     /
| relative sample effect  effect
|   note   number         value
|  number
|------------description bit set to 0


Note: the first bit of 'relative note number' and the last of 'sample number'
     are the same but can only be used by the sample number because the note
     value is even ... thus, its first bit is never used.


For all those cases:

effect:
 the arpeggio (0) effect has been remapped to 8
 Note that all the volume slide commands (5,6,A) are signed !. Here an example:
  A 01 -> A 10    A FF -> A 01    etc. ..

relative note number: (Protracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (TP2)

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48



 Follows Sample datas stored like Protracker.
Nothing is packed..


@ENDNODE

##
## The Player 6.0A
##
@NODE P60A "* format The Player 6.0A *"

The player 6.0A
Created by Jarno Paananen (Guru/Sahara Surfers) (1994)
Analysed by Asle / ReDoX (asle@mygale.org)

Source:
 - Own converted MODs with the packer (sent by Gryzor !)

Note: Not much differencies with the version 5.0a .. . The sample can be delta
     and/or packed, and the pattern table is no more *2. that's about all.
     Enough I guess :), but all the work I did for version 5.0a is still
     usable ... great :).
      I'LL WELCOME ANY INFO ABOUT HOW TO DEPACK SAMPLES !!!. thanks :).

Offset    size (byte)    Comment
------    -----------    -------
  0           2          (Smp_Addy) Address of the sample data
                         
  2           1          (NOP) number of pattern saved

  3           1          (NOS) Number of sample (only the first 6 lower bits !)
                         if bit 6 is set to 1, at least one sample is packed.
                         if bit 7 is set to 1, ALL the samples are delta.
                         (both cases are possible at the same time ...)

Note: if bit 6 is set to 1 (packed samples), the 4 following bytes are
     the unpacked sample data size : 
  4           4          Size of the unpacked samples datas
      Then, dont forget to add 4 to all the following offsets.

      ***************************************
      * the following is repeated NOS times *
      * with 6 bytes description for 1 smp  *
******************************************************
                                                     *
  4            2         Sample size (/2)            *
  6            1         finetune (0->F)             *
  7            1         volume (0->40h)             *
  8            2         Loop Start / 2              *
                                                     *
******************************************************

Note: The player removes what's beside the sample loop, so, it saves
     only the start address. If there's no loop, this value is $FFFF.
Note: if the sample size is > $FF00 (this case is impossible under ptk !),
     you have to NOT this sample size and you'll get the number of sample
     you have to repeat (the datas are the same). The first possible value
     is 00 !.
Note: if the sample is packed/delta , the finetune byte is changed in the
     same way as the number of sample upward :
     if bit 6 is set to 1, the sample is packed.
     if bit 7 is set to 1, the sample is delta.
     And here, too, both cases are possible at the same time.


NOS*6+4      NOP*8       track table. Each pattern contains 4 tracks
                         and here is the address of the four track per
                         patterns. The first address is $0000.

Note: According to the documentation of the packer, it supports the 'new'
     100 pattern feature added by Noxious in their Ptk 2.*. The doc says that
     if the packing of the track data is higher than 64k, then this table is
     saved with DWORD (not just WORD). I've not yet encountered the case, but
     I guess there's a bit, somewhere, that states the fact because I cant see
     how we could know if it's saved on DWORD or only WORD ... .
      Dont forget that the actual size will be (NOP*16) for the following
     offsets.


NOS*6+4        ?         Pattern table. This table ends with $FF
+NOP*8

NOS*6+4                  Tracks datas.
+NOP*8                   (Pat_Size is the size of the pattern list)
+Pat_Size                Each track contains 64 notes. The size is
                         between 4 and 256 bytes.


Note description: (the same as P50A !)

case 1: (flag bit set to 0)

   - flag bit set to 0
  /
 |        Sample
 |        Number
 |        /   \\
 |       |     |
 0000-0000  0000-0000  0000-0000
  |      |       |  |  |       |
   \\    /         \\/    \\     /
  relative      effect   effect
    note                 value
   number



case 2: (flag byte set to 1)

   - flag byte set to 1
  /
 |        Sample
 |        Number                    value
 |        /   \\                    /     \\
 |       |     |                  |       |
 0000-0000  0000-0000  0000-0000  0000-0000
  |      |       |  |  |       |
   \\    /         \\/    \\     /
  relative      effect   effect
    note                 value
   number


Note: 'value' is signed. if 'value' is < 80h, then follow 'value' empty rows.
     if 'value' is > 7Fh, then the current note is repeated 100h-'value' times



case 3: (flag byte set to 1)

   - flag byte set to 1
  /
 |              
 |            lines
 |           /     \\
 |          |       |
 0000-0000  0000-0000  0000-0000  0000-0000
 |       |             |                  |
  \\     /               \\                /
    $80                  number of bytes


Note: Yop, that's the main packing goody ... . Well, if the first byte is $80,
     the second is the number of lines we'll have to repeat, and the last
     two bytes (a word in this case) is the number of bytes to go back to
     reach the starting point where to read our lines. Err, substract the
     number of byte to the current file pointer position (meaning after having
     read these 4 bytes) !.
      IMPORTANT!: while repeating notes, if you encounter the case 2 (empty
     rows or one line repeated), IT COUNTS ONLY FOR ONE LINE, whatever the
     number of empty/repeat row you'll have to do !!!. so much easier ... grrr.



sample number:
 The last bit of the sample number is also the first of the relative
note number. It's entirely possible considering the fact that the notes
are *2 ... so this bit is never used by the note. 


effect:

 * Effects with volume slide (5,6,A) are signed. AFF -> A10  A01 -> A01.
 * Arpeggio effect number is 8h in this format.
 * If the effect is a pattern break/jump, the track ends !.


relative note number (P60A):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48

becomes (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113


Information: When you encounter the effect command D or B (pattern break/jump),
            the track data ends, as stated upward. What's important, is that
            ALL the other tracks of THIS pattern have the same number of row
            as the one which ends with the break/jump. As an exemple,
            if track 0 has a pattern break at line 2, the 3 other tracks
            have ONLY 3 rows !.


 Follow Sample datas.

Note: As described in the sample headers, all the samples are not always
     saved !. Refer up there to get the point :).

Note: If the samples are delta, use the following formula ... heh, read
     carefully because it's a FAKE delta !.

  'new' and 'old' are both unsigned bytes
  'Sample_Data' is a table of signed bytes
  +-------------------------------------+
  |old=0                                |
  |                                     |
  |for i=1 to Sample_Size               |
  |  new = (100h - Sample_Data[i]) + old|
  |  Sample_Data[i] = new               |
  |  old = new                          |
  +-------------------------------------+


@ENDNODE

##
## The Player 5.0A
##
@NODE P50A "* format The Player 5.0A *"

The player 5.0A
Created by Jarno Paananen (Guru/Sahara Surfers) (1993)
Analysed by Asle / ReDoX (asle@mygale.org)

Source:
 - Own converted MODs with the packer (sent by Gryzor !)

Note: Arg !, such a note packing method !. Pfff ... it took me almost 10 hours
     to write (and debug) a depacker !. God, how can he use such a mess ?!?.
     Anyway, I'm not sure if it's the best crunching rate yet, but it certainly
     is good :). Somehow, I guess he did better with the P60A and P61A ...
     I'll tell you when I begin them :). I know, however, that it's possible
     to do yet a bit better ! (I did :).

Offset    size (byte)    Comment
------    -----------    -------
  0           2          (Smp_Addy) Address of the sample data
                         
  2           1          (NOP) number of pattern saved

  3           1          (NOS) Number of sample (only the first 6 lower bits !)
                         if bit 7 is set to 1, ALL the samples are delta.

      ***************************************
      * the following is repeated NOS times *
      * with 6 bytes description for 1 smp  *
******************************************************
                                                     *
  4            2         Sample size (/2)            *
  6            1         finetune (0->F)             *
  7            1         volume (0->40h)             *
  8            2         Loop Start / 2              *
                                                     *
******************************************************

Note: The player removes what's beside the sample loop, so, it saves
     only the start address. If there's no loop, this value is $FFFF.
Note: if the sample size is > $FF00 (this case is impossible under ptk !),
     you have to NOT this sample size and you'll get the number of sample
     you have to repeat (the datas are the same). The first possible value
     is 00 !.


NOS*6+4      NOP*8       track table. Each pattern contains 4 tracks
                         and here is the address of the four track per
                         patterns. The first address is $0000.

NOS*6+4        ?         Pattern table. Each value is (*2). This table ends
+NOP*8                   with $FF.

NOS*6+4                  Tracks datas.
+NOP*8                   (Pat_Size is the size of the pattern list)
+Pat_Size                Each track contains 64 notes. The size is
                         between 4 and 256 bytes.


Note description:

case 1: (flag bit set to 0)

   - flag bit set to 0
  /
 |        Sample
 |        Number
 |        /   \\
 |       |     |
 0000-0000  0000-0000  0000-0000
  |      |       |  |  |       |
   \\    /         \\/    \\     /
  relative      effect   effect
    note                 value
   number



case 2: (flag byte set to 1)

   - flag byte set to 1
  /
 |        Sample
 |        Number                    value
 |        /   \\                    /     \\
 |       |     |                  |       |
 0000-0000  0000-0000  0000-0000  0000-0000
  |      |       |  |  |       |
   \\    /         \\/    \\     /
  relative      effect   effect
    note                 value
   number


Note: 'value' is signed. if 'value' is < 80h, then follow 'value' empty rows.
     if 'value' is > 7Fh, then the current note is repeated 100h-'value' times



case 3: (flag byte set to 1)

   - flag byte set to 1
  /
 |              
 |            lines
 |           /     \\
 |          |       |
 0000-0000  0000-0000  0000-0000  0000-0000
 |       |             |                  |
  \\     /               \\                /
    $80                  number of bytes


Note: Yop, that's the main packing goody ... . Well, if the first byte is $80,
     the second is the number of lines we'll have to repeat, and the last
     two bytes (a word in this case) is the number of bytes to go back to
     reach the starting point where to read our lines. Err, substract the
     number of byte to the current file pointer position (meaning after having
     read these 4 bytes) !.
      IMPORTANT!: while repeating notes, if you encounter the case 2 (empty
     rows or one line repeated), IT COUNTS ONLY FOR ONE LINE, whatever the
     number of empty/repeat row you'll have to do !!!. so much easier ... grrr.



sample number:
 The last bit of the sample number is also the first of the relative
note number. It's entirely possible considering the fact that the notes
are *2 ... so this bit is never used by the note. 


effect:

 * Effects with volume slide (5,6,A) are signed. AFF -> A10  A01 -> A01.
 * Arpeggio effect number is 8h in this format.
 * If the effect is a pattern break/jump, the track ends !.


relative note number (P50A):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48

becomes (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113


Information: When you encounter the effect command D or B (pattern break/jump),
            the track data ends, as stated upward. What's important, is that
            ALL the other tracks of THIS pattern have the same number of row
            as the one which ends with the break/jump. As an exemple,
            if track 0 has a pattern break at line 2, the 3 other tracks
            have ONLY 3 rows !.


 Follow Sample datas

Note: As described in the sample headers, all the samples are not always
     saved !. Refer up there to get the point :).

Note: If the samples are delta, use the following formula ...

  'new' and 'old' are both unsigned bytes
  'Sample_Data' is a table of signed bytes
  +-------------------------------------+
  |old=Sample_Data[0]                   |
  |                                     |
  |for i=1 to Sample_Size               |
  |  new = old - Sample_Data[i]         |
  |  Sample_Data[i] = new               |
  |  old = new                          |
  +-------------------------------------+


@ENDNODE

##
## NoiseTracker Pak
##
@NODE NTK_PAK "* format NoiseTracker Pak *"

NoiseTracker Pak format
Created by United Force (1990)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - Three NTPK files sent by Gryzor (thx !)

Note: Heh, Gryzor, je ne comprends vraiment pas comment tu as reussi a
     faire pour comvertir ce format !. C'est tout simplement de la folie
     pour gerer ces arpeggio qui ne sont pas forcement la ... . Bravo !.

Note: Here's is the description of this (old) format. While you can ask
     me the C source codes I wrote to convert all the formats I've described
     as of yet, I simply cant provide you with this one !. I could not
     write a safe one ... . Use Prowiz :). If you wonder why, check the
     note packing and you'll quickly understand !.

Offset    size (byte)    Comment
------    -----------    -------

      ***************************************
      * the following is repeated 31 times  *
      * with 12 bytes description for 1 smp *
*********************************************************
                                                        *
 0             4         sample address in the file     *
 4             2         Sample Size / 2                *
 6             1         ?!? Finetune                   *
 7             1         Volume (0 - 40h)               *
 8             2         Loop Start / 2                 *
10 (0Ah)       2         Loop Size / 2                  *
                                                        *
*********************************************************

372            1         Size of the pattern list
(174h)

373            1         NoiseTracker byte set to $00
(175h)

374           128        pattern list.
(176h)       (80h)

502            ?         pattern data. Each pattern starts with an
(1F6h)                   ID : "PATT" followed by 3 words which are
                         the address of the tracks. only 3 because the
                         first track starts always at 0 :). The address
                         all start AFTER these 6 bytes (dont count the
                         4 ID bytes).
                         So, each pattern contains 4 tracks which are
                         saved one after the other. Each track can be
                         any size between 2 and 192 bytes. Each track
                         contains up to 64 notes which are packed the
                         way below ..

 each note 2 or 3 bytes (if saved).


case 1:

    $FF       value
  /     \\    /     \\
 |       |  |       |
 1111-1111  0000-0000

Note: if first byte is $FF then, the second byte is the number of row
     to bypass (empty rows).


case 2:

   - Sample number
  /          /\\
 |          |  |                 
 0000 0000  0000 0000
   |     |       |  |
    \\   /         \\/
   relative     effect
    note
   number

Note: effect is EMPTY !!!. Beware, because arpeggio effect is NOT remapped.
     So, knowing that every parameter is possible for an arpeggio, it purely
     becomes mindbombimg to test ... .


case 3:

   - Sample number
  /          /\\
 |          |  |                 
 0000 0000  0000 0000  0000 0000
   |     |       |  |  |       |
    \\   /         \\/    \\     /
   relative     effect   effect
    note               parameter
   number


IMPORTANT!: it appears that is the size of a pattern is not even, there's
           a 00 AFTER the last note of the last track so that the next
           pattern address is even.


relative note number: (Protracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (NTPK)

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24


 Follow Sample datas stored like Protracker.
Nothing is packed..

Note: Here, the same remark about the address. If the ending location of
     the last note id not even, add one empty byte to reach the samples !.

@ENDNODE

##
## Track Packer v1
##
@NODE TP1 "* format Tracker Packer v1 *"

Tracker Packer v1 format
Created by Crazy Crack / MEXX
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - One TP1 file sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0           4          ID "MEXX"
  4           4          size of the module
  8        20 (14h)      title
 28           4          address of the sample data (in the file !)
(1Ch)

      ***************************************
      * the following is repeated 31 times  *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
 32            1         Finetune (0 -> F)           *
(20h)                                                *
 33            1         Volume (0 - 40h)            *
(21h)                                                *
 34            2         Sample Size / 2             *
(22h)                                                *
 36            2         Loop Start / 2              *
(24h)                                                *
 38            2         Loop Size / 2               *
(26h)                                                *
                                                     *
******************************************************

280            1         ?!? ($00)
(118h)

281            1         size of the pattern list
(119h)

282           512        pattern addresses (+10000h !)
(11Ah)       (200h)


794            ?         pattern data
(31Ah)

 we get something like

 pattern 0 :
 row 0 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 1 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 2 ...
 row 63| voice 1 | voice 2 | voice 3 | voice 4 |
 pattern 1 :
 ...

 the size of each pattern is variable and is between
100h and 300h bytes. One voice can be 1,2 or 3 bytes long.
it depends if bit 7 of first byte is set to 1. If so,
you have to check if the bit 6 is also set to 1 or not.
If it is set to 1, then it's an empty row. If not, then,
there's only an effect and its value.


 1100-0000
 ||
 if these bits are set, nothing follows and this is an
empty note. it meens for PTK four bytes set to 00h.


    -description bit set to 0
   /
  |
 1000-0000  0000-0000
 | |   |    |       |
 |  \\ /      \\     /
 | effect  effect value
  \\
   -description bit set to 1


if first bit is set to 0, follows the description

  0000-0000  0000-0000  0000-0000
  ||      |     | |  |  |       |
 /  \\    / \\   /   \\/    \\     /
| relative sample effect  effect
|   note   number         value
|  number
|------------description bit set to 0


Note: the first bit of 'relative note number' and the last of 'sample number'
     are the same but can only be used by the sample number because the note
     value is even ... thus, its first bit is never used.


relative note number: (ProTracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (TP1)

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48



 Follows Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## ProPacker 1.0
##
@NODE PP10 "* format ProPacker v1.0 *"

ProPacker 1.0 format
Created by ???
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - two ProPacked files sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------

      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
*********************************************************
                                                        *
 0             2         Sample Size / 2                *
(14h)                                                   *
 2             1         Finetune (0 -> F)              *
(16h)                                                   *
 3             1         Volume (0 - 40h)               *
(17h)                                                   *
 4             2         Loop Start / 2                 *
(18h)                                                   *
 6             2         Loop Size / 2                  *
(1Ah)                                                   *
                                                        *
*********************************************************

248            1         size of pattern table
(F8h)

249            1         noisetracker byte ($7F)
(F9h)

250           512        Track numbers. It's 4 lists of 128 bytes.
(FAh)        (200h)      Each is composed by the numbers of tracks
                         used.

762            ?         track data. Each track is (64*4=256) bytes
(2FAh)                   long. the 64 notes are stored like protracker.


 So, each note takes 4 bytes and is stored that way :

        -note value
       /           \\
      |             |                 
 0000 0000  0000 0000  0000 0000  0000 0000  
 ||||                  |  | |  |  |       |
 ||| \\                 | /   \\/    \\     /
 |||  \\--Sample number--/  effect   effect
 \\|/                               parameter
  \\
   --unused


 Follows Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## Promizer 4.0
##
@NODE PM40 "* format Promizer v4.0 *"

Promizer v4.0 format
Created by MC68000 (Frank Hlsmann) (1994)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - Two PM40 sent by Gryzor (Thx !).

Note: Very similar to the version 2.0 of the same named packer. I noticed
     five main modifications ... . First, there's no more this replay code
     routine at the beginning :). Second, the finetune is no more *2. Third,
     the sample number is no more *4 in the packed notes. fourth, the
     releative note number is no more *2 (in the packed notes too). and last,
     the note 00-00h (empty note) is no more saved in the reference table.
     There's also these 4 empty bytes before the sample data which have been
     removed ... .


Offset    size (byte)    Comment
------    -----------    -------

 0             4         "PM40" Id.

 4             3         ?!? ($00-00-00)

 7             1         size of the pattern list

 8            256        128 word pattern table.
             (100h)      it 'seems' to be * 200h .. but then, what are all
                         those $98 in PM40.Numb_Movement ?!?!?. I guess it's
                         not very important if you handle this list like
                         Gryzor did ... generate an entirely new pattern list
                         starting at 0.

      ***************************************
      * the following is repeated 31 times  *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
264  (108h)    2         Sample Size / 2             *
266  (10Ah)    1         Finetune (0 -> F)           *
267  (10Bh)    1         Volume (0 - 40h)            *
268  (10Ch)    2         Loop Start / 2              *
270  (10Eh)    2         Loop Size / 2               *
                                                     *
******************************************************


512            4         Address of sample data (add 4)
(200h)                   (I call it ADD#1)

516            4         Address of the reference table (add 8)
(204h)                   (I call it ADD#2)

520            ?         pattern data. Each pattern is 512 bytes long. Though,
(208h)                   that's the theory because some patterns may NOT be
                         that long. In fact, you'll have to check if the note
                         isn't a PATTERN BREAK command or a PATTERN JUMP. If
                         so, the pattern ends and another begins ... therefore,
                         its size is less than the 512 'standard bytes'.
                         Now, whatever the pattern size is, its meaning does
                         not vary :). In fact, those data are some values which
                         refer to a "reference table" (description is right
                         below).
                         RMQ: first value is 00h. it is an empty note which
                             is NOT saved in the reference table !

ADD#2          ?         the "reference table" which contains the standard
                         PTK pattern data. Its size is easy to calculate since
                         it consists of blocks of 4 bytes, knowing that there
                         are 'n' blocks ('n' is the highest value in the
                         pattern data).


      * Here's a quick description of these four bytes

       0000-0000  0000-0000  0000-0000  0000-0000
       ||||    |  |       |  |||| |  |  |       |
       ||| \\  /    \\     /   ||||  \\/    \\     /
       |||sample   relative  ||/ effect  effect
       |||         note nbr  |/          value
        \\\\\\                  /
         ---- unused --------

 
relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (PM40):

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24

 

ADD#1          ?         Sample datas. Stored like Protracker ... .


@ENDNODE

##
## The Player 4.1A
##
@NODE P41A "* format The Player 4.1A *"

The player 4.1A
Created by Jarno Paananen (Guru/Sahara Surfers)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - 4 P41A files sent by Gryzor ! (thx).
 - 1 own ripped music from the game Goal.

Note:
 The only difference with the version 4.0* is that in the sample
decription, the finetune value and the volume value have been
reversed ... meaning the volume is before the finetune.

Offset    size (byte)    Comment
------    -----------    -------
  0           4          "P41A" Id.
                         
  4           1          Real number of pattern

  5           1          Size of pattern list (PatSize)
                         (number of pattern to play)

  6           1          Number of sample (NOS)

  7           1          ?????????? (00h)

  8           4          tracks data address (TDA)
                         add 4 bytes .. the size of a dword.

12 (Ch)       4          tracks table address (TTA)
                         add 4 bytes.

16 (10h)      4          samples data address (SDA)
                         add 4 bytes.

      ***************************************
      * the following is repeated NOS times *
      * with 16 bytes description for 1 smp *
******************************************************
                                                     *
 20 (14h)      4         THIS sample data address    *
                         (first is 00000000h !)      *
                         (so, add SDA+4 ..)          *
 24 (18h)      2         Sample size (/2)            *
 26 (1Ah)      4         loop start address          *
                         (same shit as data address) *
 30 (1Eh)      2         Loop Size / 2               *
 32 (23h)      1         ?!?!? (00h)                 *
 33 (24h)      1         volume (0->40h)             *
 34 (22h)      2         finetune *74 ?!?            *
                                                     *
******************************************************

Note: I guess there's can happen the same thing as in version 4.0* ... the
     sample address being the same for several samples. I've not encountered
     the case, though. Heh, the fact is that I've no chiptunes :).


  ?        PatSize*8     Pattern list.
                         it consists of a list of 4 word which are the
                         address of each track. Add TTA to each address
                         to find the conresponding data of a track.

  ?            2         two bytes set to $FFFF. A "refer-to" as to
                         specify for sure the end of the pattern list ..
                         I guess :).

  ?            ?         track datas. Each track is 64 notes. One note is
                         4 bytes long ... most of the time :).

Note description:

case 1: (flag byte set to 0)

   - flag byte set to 0
  /
 |        Sample
 |        Number
 |        /  /\
 |       |  |  |
 0000-0000  0000-0000  0000-0000  0000-0000
  |      |       |  |  |       |  |       |
   \\    /         \\/    \\     /    \\     /
  relative      effect   effect   info byte
    note                 value
   number


info byte:

 This is a signed byte. Two cases follow ..

case 1: (this byte is > 00h)
 it is, then, the number of empty lines that follow after this note.

case 2: (this byte is >= 80h)
 it is the number of time this note is repeated.

case 3: Heh ... not a case actually, merely noting that if this byte
 is null, then nothing happens :).


sample number:
 The last bit of the sample number is also the first of the relative
note number. It's entirely possible considering the fact that the notes
are *2 ... so this bit is never used by the note. 


effect:

 * Effects with volume slide (5,6,A) are recoded. In fact, if the effect
  value is > 80h, then it's a slide up. (e.g. : A81 is A10 and A01 stays A01).
  I've only encountered this thing with A command ... I'm only suspecting
  it's the same for effects 5 and 6.
 * Arpeggio effect number is 8h in this format.



relative note number (P41A):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48

becomes (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113





case 2: (flag byte set to 1)

   - flag byte set to 1
  /
 |
 |
 |
 |
 0000-0000  0000-0000  0000-0000  0000-0000
  |      |  |       |  |                  |
   \\    /    \\     /    \\                /
    empty    number      \\              /
            of lines     starting address
            to repeat
         

some explanations are needed, I guess :) :
 So, if the first byte is 80h, the second byte is the number of lines
one will have to repeat. Those "have to be repeated lines" are at the
"starting address" specified by the last two bytes. Dont forget to
add TDA + 4 bytes to this value to really have the address in the file.
As an exemple, if you have N lines to repeat from address A, you have to
point at A and read N notes and put them in this track. Remember that
each note is 4 bytes !. Also, remember that the note at the corresponding
address can have a not-null info-byte !. Thus, the empty lines or the
repeat lines are to be counted !.






 Follows Sample datas stored like Protracker.
Nothing is packed..

@ENDNODE

##
## The Player 4.0A / 4.0B
##
@NODE P40 "* format The Player 4.0A / 4.0B *"
The player 4.0A and 4.0B
Created by Jarno Paananen (Guru/Sahara Surfers)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - 3 P40A files sent by Gryzor ! (thx).
 - 3 P40B files sent by Gryzor ! (thx).

Offset    size (byte)    Comment
------    -----------    -------
  0           4          "P40A" Id.
                         "P40B" Id.
                         Note: It's the only difference I've found !.
                         
  4           1          Real number of pattern

  5           1          Size of pattern list (PatSize)
                         (number of pattern to play)

  6           1          Number of sample (NOS)

  7           1          ?????????? (00h)

  8           4          tracks data address (TDA)
                         add 4 bytes .. the size of a dword.

12 (Ch)       4          tracks table address (TTA)
                         add 4 bytes.

16 (10h)      4          samples data address (SDA)
                         add 4 bytes.

      ***************************************
      * the following is repeated NOS times *
      * with 16 bytes description for 1 smp *
******************************************************
                                                     *
 20 (14h)      4         THIS sample data address    *
                         (first is 00000000h !)      *
                         (so, add SDA+4 ...)         *
 24 (18h)      2         Sample size (/2)            *
 26 (1Ah)      4         loop start address          *
                         (same shit as data address) *
 30 (1Eh)      2         Loop Size / 2               *
 32 (22h)      2         finetune *74 ?!?            *
 34 (23h)      1         ?!?!? (00h)                 *
 35 (24h)      1         volume (0->40h)             *
                                                     *
******************************************************

Note: The sample address can be the same for several samples !. The player
     saves only once the same samples.


  ?        PatSize*8     Pattern list.
                         it consists of a list of 4 word which are the
                         address of each track. Add TTA to each address
                         to find the conresponding data of a track.

  ?            2         two bytes set to $FFFF. A "refer-to" as to
                         specify for sure the end of the pattern list ..
                         I guess :).

  ?            ?         track datas. Each track is 64 notes. One note is
                         4 bytes long ... most of the time :).

Note description:

case 1: (flag byte set to 0)

   - flag byte set to 0
  /
 |        Sample
 |        Number
 |        /  /\\
 |       |  |  |
 0000-0000  0000-0000  0000-0000  0000-0000
  |      |       |  |  |       |  |       |
   \\    /         \\/    \\     /    \\     /
  relative      effect   effect   info byte
    note                 value
   number


info byte:

 This is a signed byte. Two cases follow ..

case 1: (this byte is > 00h)
 it is, then, the number of empty lines that follow after this note.

case 2: (this byte is >= 80h)
 it is the number of time this note is repeated.

case 3: Heh ... not a case actually, merely noting that if this byte
 is null, then nothing happens :).


sample number:
 The last bit of the sample number is also the first of the relative
note number. It's entirely possible considering the fact that the notes
are *2 ... so this bit is never used by the note. 


effect:

 * Effects with volume slide (5,6,A) are recoded. In fact, if the effect
  value is > 80h, then it's a slide up. (e.g. : A81 is A10 and A01 stays A01).
  I've only encountered this thing with A command ... I'm only suspecting
  it's the same for effects 5 and 6.
 * Arpeggio effect number is 8h in this format.



relative note number (P40):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48

becomes (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113





case 2: (flag byte set to 1)

   - flag byte set to 1
  /
 |
 |
 |
 |
 0000-0000  0000-0000  0000-0000  0000-0000
  |      |  |       |  |                  |
   \\    /    \\     /    \\                /
    empty    number      \\              /
            of lines     starting address
            to repeat
         

some explanations are needed, I guess :) :
 So, if the first byte is 80h, the second byte is the number of lines
one will have to repeat. Those "have to be repeated lines" are at the
"starting address" specified by the last two bytes. Dont forget to
add TDA + 4 bytes to this value to really have the address in the file.
As an exemple, if you have N lines to repeat from address A, you have to
point at A and read N notes and put them in this track. Remember that
each note is 4 bytes !. Also, remember that the note at the corresponding
address can have a not-null info-byte !. Thus, the empty lines or the
repeat lines are to be counted !.






 Follows Sample datas stored like Protracker.
Nothing is packed..


@ENDNODE

##
## NoiseRunner
##
@NODE NRUN "* format NoiseRunner *"

NoiseRunner format
Created by Chaos / Sanity
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - six files sent by Gryzor (thx!)

Note: This format reminds me of the XANN packer for two reasons, first, a
     packed file has the same size as the ptk version. Next, all the effect
     commands have been remaped.

Offset    size (byte)    Comment
------    -----------    -------

      ***************************************
      * the following is repeated 31 times  *
      * with 16 bytes description for 1 smp *
******************************************************
                                                     *
  0            1         $00                         *
  1            1         Volume (0 - 40h)            *
  2            4         Sample address (memory)     *
  6            2         Sample size / 2             *
  8            4         Loop start address (memory) *
 12 (0Ch)      2         Loop Size / 2               *
 14 (10h)      2         Finetune or garbage !       *
                                                     *
******************************************************

Note: when saying 'garbage', it's because this format writes itself on
     the ptk. So, these 'garbage' bytes are what was in the ptk before
     the overwriting. About the finetune, if the first byte is < F0h, then
     the two bytes contain datas from the ptk (thx Gryzor for that !).
     Check below for the complete list of finetunes.


496           454        Garbage. As explain above, that what's left of the
(1F0h)                   ptk header. These bytes are to be ignored !.

950            1         Size of the pattern list (as ptk)
(3B6h)

951            1         Noisetracker byte set to $7F (as ptk)
(3B7h)

952           128        Pattern table (as ptk)
(3B8h)       (80h)

1080           4         "M.K." ptk's ID.
(438h)

1084           ?         pattern datas.
(43Ch)


 each pattern follows one after another and is stored like that :

 pattern 0 :
 row 0 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 1 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 2 ...
 row 63| voice 1 | voice 2 | voice 3 | voice 4 |
 pattern 1 :
 ...

 the size of each pattern is 1024 bytes. Each note is 4 bytes long and
is stored that way :


  0000-0000  0000-0000  0000-0000  0000-0000
  |       |  |       |  |       |  |       |
   \\     /    \\     /    \\     /    \\     /
   effect     effect     relative    Sample
             parameter    note     number (*8)
                         number

Note: All the effect have been remapped.
00: tone portamento            (3 under ptk)
04: slide up                   (1 under ptk)
08: slide down                 (2 under ptk)
0C: no effect                  (0 under ptk)
10: set vibrato                (4 under ptk)
14: portamento + volume slide  (5 under ptk)
18: vibrato + volume slide     (6 under ptk)
1C: ?!? probably tremolo (7)
20: set panning (NOT A PTK COMMAND ... I stick on Gryzor's Prowiz here ..)
24: sample offset              (9 under ptk)
28: volume slide               (A under ptk)
2C: ?!? probably pattern jump (B)
30: set Volume                 (C under ptk)
34: pattern break              (D under ptk)
38: Extended commands          (E under ptk)
3C: set speed                  (F under ptk)

relative note number: (Protracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (NoiseRunner)

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48



 Follows Sample datas stored like ProTracker.
Nothing is packed..




-------------------
Finetune (2 bytes)

 There's a finetune IF the first byte if > F0h. The first fine value is BC8
and you 'just' have to add 48h to get the next.

FB-C8  ->  -1  (0Fh)
FC-10  ->  -2  (0Eh)
FC-58  ->  -3  (0Dh)
FC-A0  ->  -4  (0Ch)
FC-E8  ->  -5  (0Bh)
FD-30  ->  -6  (0Ah)
FD-78  ->  -7  (09h)
FD-C0  ->  -8  (08h)
FE-08  ->  +7  (07h)
FE-50  ->  +6  (06h)
FE-98  ->  +5  (05h)
FE-E0  ->  +4  (04h)
FF-28  ->  +3  (03h)
FF-70  ->  +2  (02h)
FF-B8  ->  +1  (01h)

00-00  ->   0  (00h) (no finetune)

 There are some NoiseRunner packed files with 00-00 but not always, as
explained upward.


@ENDNODE

##
## NoisePacker v3
##
@NODE NP3 "* format NoisePacker v3 *"

Noise Packer v3 format
Created by Twins / Phenomena (1991)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - four NP3 packed files sent by Gryzor ! (thx)
 - own MODs converted with the packer (sent by Gryzor !)
 - tons of intros/demos/musicdisks ...

Note: Lotsa similarities with NP2 ... . Some reorder in the sample
     headers and the repacking of the notes. Heh, a track is no more
     always 192 bytes long ... it can even be only 1 byte !.

Offset    size (byte)    Comment
------    -----------    -------
  0           2          Number of sample + $C.
                         
  2           2          Size of pattern list
                         (/2 to get real size)

  4           2          ?!?

  6           2          track data size

      ***************************************
      * the following is repeated NOS times *
      * with 16 bytes description for 1 smp *
******************************************************
                                                     *
  8            1         ? Finetune (0 -> F)         *
  9            1         Volume (0 - 40h)            *
 10 (0Ah)      4         ?!?                         *
                          (looks like it's always)   *
                          (four 00h ...)             *
 14 (Eh)       2         Sample Size / 2             *
 16 (10h)      4         ???                         *
                          (looks like it's always)   *
                          (four 00h ...)             *
 20 (14h)      2         Loop Size / 2               *
 22 (16h)      2         Loop Start / 2              *
                                                     *
******************************************************


  ?            2         Size of pattern list (again !?)

  ?            2         ?!?

  ?            ?         Pattern list (words) (*8)

  ?            ?         Track list per pattern. 2 bytes for one track
                         address and then, 8 bytes for one pattern.
                         Since the track datas begin right after, you have
                         to add TDA (track data address). This TDA is the
                         number of bytes you'll have read AFTER this list.
                         You can calculate it if you want ... that way:
                         8 + (NumberOfSample*16) + 4 + (PatternListSize*2)

Note: Beware because this list is reversed !. Meaning that one pattern first
     contains the address of its track 4, then of track 3 ... .

 TDA            ?        Track datas. Each track is saved after another
                         and the maximum size 192 (C0h) bytes long.

* Each track consists of 64 notes, 1 or 3 bytes each.
* Follows the description of one note :


case 1:

    - description bit set to 0
   /
  /        sample number
 |        /   \\
 |       |     |
 0000 0000  0000 0000  0000 0000
  |      |       |  |  |       |
   \\    /         \\/    \\     /
  relative      effect   effect
  note nbr             parameter


case 2:

   - description bit set to 1
  /
 |
 0000 0000
  |      |
   \\    /
number of empty row (substract this value to 80h !)



NOTE :  First bit of 'relative note number' and lst of 'sample number' are
       the same bit ... but a note number is *2, so this bit is never used
       by the note number.

NOTE : The Arpeggio effect is remapped to the effect number #8.
       The Volume slide effect is remapped to the effect number #7 BUT with
        signed value !! (7FE -> A01). Now, don't forget to place correctly
        the slide up ... so when converting just donc forget to <<4 !
       (704 -> A40)
       The Vibrato + Volume slide effect (6) is signed !. So, same as
        volume slide : 6FA -> 606  and  604 -> 640
       The portamento + Volume slide effect (5) is signed !. So, same as
        volume slide : 5FA -> 506  and  504 -> 540
       The set filter command (E0) is changed (EFF -> E01)
       The pattern jump 'seems' to be *2 and starts at FC !. So jump to
        pattern 0 is BFC, to pattern 1 BFE, to pattern 2 B00 etc. ... .


Protracker note period table

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

Noisepacker v3 relative note numbers

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48



 Follows Sample datas stored like Protracker.
Nothing is packed..

Note: The sample data start address is ALWAYS even !. That means that you have
     to bypass one byte if the current address is not even !!.


@ENDNODE

##
## NoisePacker v2
##
@NODE NP2 "* format NoisePacker v2 *"

Noise Packer v2 format
Created by Twins / Phenomena (1990)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 -three NP2 packed files sent by Gryzor ! (thx)
 -the original packer sent, also, by Gryzor !!!.
 -tons of intros/demos/musicdisks ...

Note: It's the very same as NoisePacker v1 save for the loop start value
     which is, here, /2. Also, maybe something around Set filter effect ..
     not sure, though.

Offset    size (byte)    Comment
------    -----------    -------
  0           2          Number of sample + $C.
                         
  2           2          Size of pattern list
                         (/2 to get real size)

  4           2          ?!?

  6           2          track data size

      ***************************************
      * the following is repeated NOS times *
      * with 16 bytes description for 1 smp *
******************************************************
                                                     *
  8            4         ?!?                         *
                          (looks like it's always)   *
                          (four 00h ...)             *
 12 (Ch)       2         Sample Size / 2             *
 14 (Eh)       1         Finetune (0 -> F)           *
                          (U sure gryzor ???)        *
 15 (Fh)       1         Volume (0 - 40h)            *
 16 (10h)      4         ???                         *
                          (looks like it's always)   *
                          (four 00h ...)             *
 20 (14h)      2         Loop Size / 2               *
 22 (16h)      2         Loop Start / 2              *
                                                     *
******************************************************


  ?            2         Size of pattern list (again !?)

  ?            2         ?!?

  ?            ?         Pattern list (words) (*8)

  ?            ?         Track list per pattern. 2 bytes for one track
                         address and then, 8 bytes for one pattern.
                         Since the track datas begin right after, you have
                         to add TDA (track data address). This TDA is the
                         number of bytes you'll have read AFTER this list.
                         You can calculate it if you want ... that way:
                         8 + (NumberOfSample*16) + 4 + (PatternListSize*2)

Note: Beware because this list is reversed !. Meaning that one pattern first
     contains the address of its track 4, then of track 3 ... .

 TDA            ?        Track datas. Each track is saved after another
                         and is 192 (C0h) bytes long.

* Each track consists of 64 notes, 3 bytes each.
* Follows the description of one note :


           sample number
          /   \\
         |     |
 0000 0000  0000 0000  0000 0000
 |      |        |  |  |       |
  \\    /          \\/    \\     /
 relative       effect   effect
 note nbr              parameter

NOTE : About 'relative note number', in fact, all the 8 bits are used
      but I pictured only the last 7 ones to show the use of the first
      bit by the sample number. The correct value for this note number
      can be obtained like that : Byte&FEh. Below is the complete table
      and you can see that all the value are *2 ... so first bit is
      never used.

NOTE : The Arpeggio effect is remapped to the effect number #8.
       The Volume slide effect is remapped to the effect number #7 BUT with
        signed value !! (7FE -> A01). Now, don't forget to place correctly
        the slide up ... so when converting just donc forget to <<4 !
       (704 -> A40)
       The Vibrato + Volume slide effect (6) is signed !. So, same as
        volume slide : 6FA -> 606  and  604 -> 640
       The Portamento + Volume slide effect (6) is signed !. So, same as
        volume slide : 6FA -> 606  and  604 -> 640
       The set filter command (E0) is changed (E02 -> E01)
       The pattern jump 'seems' to be *2 and starts at FC !. So jump to
        pattern 0 is BFC, to pattern 1 BFE, to pattern 2 B00 etc. ... .


Protracker note period table

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

Noisepacker v2 relative note numbers

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48


 Follows Sample datas stored like Protracker.
Nothing is packed..



@ENDNODE

##
## NoisePacker v1
##
@NODE NP1 "* format NoisePacker v1 *"

Noise Packer v1 format
Created by Twins / Phenomena (1990)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 -two NP1 packed files sent by Gryzor ! (thx)

Offset    size (byte)    Comment
------    -----------    -------
  0           2          Number of sample + $C.
                         
  2           2          Size of pattern list
                         (/2 to get real size)

  4           2          ?!?

  6           2          track data size

      ***************************************
      * the following is repeated NOS times *
      * with 16 bytes description for 1 smp *
******************************************************
                                                     *
  8            4         ?!?                         *
                          (looks like it's always)   *
                          (four 00h ...)             *
 12 (Ch)       2         Sample Size / 2             *
 14 (Eh)       1         Finetune (0 -> F)           *
                          (U sure gryzor ???)        *
 15 (Fh)       1         Volume (0 - 40h)            *
 16 (10h)      4         ???                         *
                          (looks like it's always)   *
                          (four 00h ...)             *
 20 (14h)      2         Loop Size / 2               *
 22 (16h)      2         Loop Start                  *
                                                     *
******************************************************


  ?            2         Size of pattern list (again !?)

  ?            2         ?!?

  ?            ?         Pattern list (words) (*8)

  ?            ?         Track list per pattern. 2 bytes for one track
                         address and then, 8 bytes for one pattern.
                         Since the track datas begin right after, you have
                         to add TDA (track data address). This TDA is the
                         number of bytes you'll have read AFTER this list.
                         You can calculate it if you want ... that way:
                         8 + (NumberOfSample*16) + 4 + (PatternListSize*2)

Note: Beware because this list is reversed !. Meaning that one pattern first
     contains the address of its track 4, then of track 3 ... .

 TDA            ?        Track datas. Each track is saved after another
                         and is 192 (C0h) bytes long.

* Each track consists of 64 notes, 3 bytes each.
* Follows the description of one note :


           sample number
          /   \\
         |     |
 0000 0000  0000 0000  0000 0000
 |      |        |  |  |       |
  \\    /          \\/    \\     /
 relative       effect   effect
 note nbr              parameter

NOTE : About 'relative note number', in fact, all the 8 bits are used
      but I pictured only the last 7 ones to show the use of the first
      bit by the sample number. The correct value for this note number
      can be obtained like that : Byte&FEh. Below is the complete table
      and you can see that all the value are *2 ... so first bit is
      never used.

NOTE : The Arpeggio effect is remapped to the effect number #8.
       The Volume slide effect is remapped to the effect number #7 BUT with
        signed value !! (7FE -> A01). Now, don't forget to place correctly
        the slide up ... so when converting just donc forget to <<4 !
       (704 -> A40)
       The Vibrato + Volume slide effect (6) is signed !. So, same as
        volume slide : 6FA -> 606  and  604 -> 640
       The Portamento + Volume slide effect (5) is signed !. So, same as
        volume slide : 5FA -> 506  and  504 -> 540
       The pattern jump 'seems' to be *2 and starts at FC !. So jump to
        pattern 0 is BFC, to pattern 1 BFE, to pattern 2 B00 etc. ... .


Protracker note period table

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

Noisepacker v1 relative note numbers

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48


 Follows Sample datas stored like Protracker.
Nothing is packed..


@ENDNODE

##
## Kefrens Sound Machine
##
@NODE KSM "* format Kefrens Sound Machine *"

Kefrens-Sound Machine format
Created by Razmo / Kefrens (1989)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - 6 KSM files sent by Gryzor ! (thx).

Note: Most probably based on SoundTracker format ... only 15 samples.
     the effect command numbers are 'almost' ptk-like !.


Offset    size (byte)    Comment
------    -----------    -------

  0            2         "M." Id

  2           13         Title
             (0Dh)

 15            1         "a". Always here ... at least in the 6 example
(0Fh)                    files I have.

 16           16         ?!? (16 empty bytes)
(10h)        (10h)

      ***************************************
      * the following is repeated 15 times  *
      * with 32 bytes description for 1 smp *
******************************************************
                                                     *
 32           16         ?!?                         *
(20h)        (10h)                                   *
 48            4         Sample address in the file  *
(30h)                                                *
 52            2         Sample size                 *
(34h)                                                *
 54            1         Volume (0 - 40h)            *
(36h)                                                *
 55            1         ?!?                         *
(37h)                                                *
 56            2         Loop Start                  *
(38h)                                                *
 58            6         ?!?                         *
(38h)                                                *
                                                     *
******************************************************
Note: the 16 first bytes are anything but clear ... . It appears to finish
     more or less in the same way with lots of "(". The last byte is always
     empty.

512          1024        List of the tracks numbers per pattern. there's
(200h)                   256 possible positions !. It ends when $FF is
                         the number of the first voice. Sometime, all the
                         four voices are $FF ... but not always, so better
                         refer to the first voice :).
                         First value is $00 !.

1532           4         $FF-FF-FF-FF. To mark the end of the upward list.
(5FCh)

1536           ?         Track data. Each track is 64 notes which are 3 bytes
(600h)                   long. So each track is 192 bytes long.

Description of one note :


         Sample number (0->Fh)
              /\\
             |  |
  0000-0000  0000-0000  0000-0000
  |       |       |  |  |       |
   \\     /         \\/    \\     /
  relative        effect  effect
    note                  value
   number


effect:
D: Volume slide (A under ptk)

C and F are the same as ptk ... I cant says for the others for I still
look for them :).



relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (KSM):

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24


 Follows Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## Heatseeker
##
@NODE HEATSEEK "* format Heatseeker *"

Heatseeker mc1.0 format
Created by Heatseeker / Cryptoburners (1991)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - two Heatseeker packed files sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------

      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
*********************************************************
                                                        *
 0             2         Sample Size / 2                *
(14h)                                                   *
 2             1         Finetune (0 -> F)              *
(16h)                                                   *
 3             1         Volume (0 - 40h)               *
(17h)                                                   *
 4             2         Loop Start / 2                 *
(18h)                                                   *
 6             2         Loop Size / 2                  *
(1Ah)                                                   *
                                                        *
*********************************************************

248            1         size of pattern table
(F8h)

249            1         noisetracker byte ($7F)
(F9h)

250           128        pattern table. same as ptk.
(FAh)         (80h)

378            ?         pattern data. each pattern is saved the same
(17Ah)                   way as protracker. The notes, however are not
                         always saved the same way ... .


 So, each note takes 4 bytes and is stored that way :

case 1: (standard note value)

        -note value
       /           \\
      |             |                 
 0000 0000  0000 0000  0000 0000  0000 0000  
 ||||                  |  | |  |  |       |
 || \\\\                 / /   \\/    \\     /
 ||  \\--Sample number---/  effect   effect
  \\                               parameter
   --description bits set to 0.


case 2: (empty lines)


    number of empty lines to bypass (-1 !)
                                   /     \\
                                  |       |
 1000 0000  0000 0000  0000 0000  0000 0000
 ||
 | \\
  \\ --description bit set to 0
   --description bit set to 1


case 3: (repeat track)
  Here, both description bits are set to 1 (first byte = $C0).
 When that happens, you have to go back to the track number
 ((byte3*256)+byte4)/4 (Yes, this value is *4), and read all
 this track to put it here.
  The size of this track is 4 !. Simply because it's only a
 reference ... .


                nbr of the track to repeat (*4)
                        /                \\
                       |                  |
 1100 0000  0000 0000  0000 0000  0000 0000
 ||
  \\
   --description bits set to 1

 Note: the first possible nbr to repeat is 0 !.



 Follow Sample datas stored like Protracker.
Nothing is packed..

@ENDNODE

##
## Game Music Creator
##
@NODE GMC "* format Game Music Creator *"
Game Music Creator format
Created by Andreas Tadic (1989)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - "GMC.Knight_Of_The_Sky" sent by Gryzor (thx!)

Note: This format is based on OOOOOOLLD SoundTracker format. Read through all
     this description ... for the effect command numbers for example :).

Offset    size (byte)    Comment
------    -----------    -------

      ***************************************
      * the following is repeated 15 times  *
      * with 16 bytes description for 1 smp *
******************************************************
                                                     *
  0            4         ?!? probably some address.. *
  4            2         Sample Size /2              *
  6            1         ?!? $00                     *
  7            1         Volume (0 - 40h)            *
  8            4         ?!? probably some address.. *
 12 (0Ch)      2         Loop Size                   *
 14 (0Eh)      2         ? probably Loop Start       *
                                                     *
******************************************************
Note: The loop size is NOT /2 in the example file Gryzor sent me ... but when
     creating GMC files with Noiseconverter, the /2 is there. Also, it puts
     the loop start two bytes before the loop size ... which simply cant be
     possible regarding Gryzor's example. Since I've already experienced some
     problems with the convertion I made with Noiseconverter, I'll stick on
     Gryzor's example ... so, like described upward. I just wanted to warn
     people who are using Noiseconverter for this format. Though, I found
     this tool very helpful when it came to list the effects command :).

240            3         ?!? ($00-00-00)
(F0h)

243            1         Size of the pattern list
(F3h)

244           200        Pattern order table. Contains 100 word
(F4h)        (C8h)       which are the numbers of pattern to
                         play. Each value is * 400h !. In fact one could
                         take each value as an address ... just add 444
                         to find the real pattern address :).

444           ???        pattern data ... Each pattern is stored one
(1BCh)                   after another.


 pattern 0 :
 row 0 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 1 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 2 ...
 row 63| voice 1 | voice 2 | voice 3 | voice 4 |
 pattern 1 :
 ...

 the size of each pattern is 1024 (400h) bytes long.
 The notes are saved in the Soundtracker format. Thanks Gryzor for this
info, but WHAT IS THIS FORMAT ?!?. Heh, I was still in my birth bed when
Soundtracker was released !. Anyway, it happens that this format is rather
simple, save for the effect number changes :).

          Sample number --
                         /\\
                        |  |
  0000-0000  0000-0000  0000-0000  0000-0000
  |  | |             |       |  |  |       |
   \\/   \\           /         \\/    \\     /
 unused  note pitch         effect  effect
                                     value


note pitchs:

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

effect commands:
1: slide up       (same as ptk)
2: slide down     (same as ptk)
3: set volume     (Fx C under ptk)
4: pattern break  (Fx D under ptk)
5: pattern jump   (Fx B under ptk)
6: set filter off (Fx E00 under ptk)  not sure at all for this one !.
7: set filter on  (Fx E01 under ptk)
8: set speed      (Fx F under ptk)


 Follow Sample datas stored like ProTracker (should I say SoundTracker ?).
Nothing is packed..

@ENDNODE

##
## Fuzzac Packer
##
@NODE FUZZAC "* format Fuzzac Packer *"

Fuzzac Packer format
Created by Fuzzac / Silents (1990)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
  - "FUZZ.Tropical_sunset" sent to me by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0            4         "M1.0" Id ... not sure, with but one
                         exemple file, it's sort of hard to
                         conclude :).

  4            2         ?!?

      ***************************************
      * the following is repeated 31 times  *
      * with 68 bytes description for 1 smp *
******************************************************
                                                     *
  6           60         Sample Name                 *
             (3Ch)                                   *
 66            2         Sample Size / 2             *
(42h)                                                *
 68            2         Loop Start / 2              *
(44h)                                                *
 70            2         Loop Size / 2               *
(46h)                                                *
 72            1         Finetune (0 -> F)           *
(48h)                                                *
 73            1         Volume (0 - 40h)            *
(49h)                                                *
                                                     *
******************************************************

2114           1         (NOP) Number of pattern to play
(842h)                   e.g. : the size of the pattern list.

2115           1         number of tracks saved.
(843h)

2116           2         ?!?
(844h)

2118           ?         track numbers table. 4 bytes (dword) for each track
                         It's four tables which are NOP long. First table
                         is the number of tracks for voice 1, etc. .
                         As far as I could tell, it seems the two last
                         bytes are never used, the first IS the track
                         number, and the second byte (always $40) could
                         be the number of row for this track.
                         Some other exemple files are welcome :).
                         the size of this table is NOP*4*4.

  ?            ?         tracks datas. each track 'seems' to have 64 rows.
                         each row is 4 bytes, though :). Each note is stored
                         like Protracker.


      - Sample number ---
     /                  /\\
    |                  |  |
 0000 0000  0000 0000  0000 0000  0000 0000
 |||  |             |       |  |  |       |
 |||   \\           /         \\/    \\     /
 |||    Note Period        effect   effect
  \\                               parameter
   -- unused



 ?            4          "SEnd" ... no clue what's this all about !.
                         Though, I'm sure it's 'extra' data which are NOT
                         track data, nor sample data. Probably an ID of
                         some sort ... . The meaning, however, is anything
                         but clear !.


 Follow Sample datas stored like Protracker.
Nothing is packed..


@ENDNODE

##
## UNIC Tracker 1 format
##
@NODE UNIC "* Format UNIC Tracker *"

Unic Tracker format
Created by Anders E. Hansen (Laxity / Kefrens) 1991-1993
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - "Guardian Dragon" demo by Kefrens
 - "Guardian Dragon II" demo by Kefrens
 - "Desert Dream" demo by Kefrens (first music)

NOTE: Very similar to Protracker format ... . "good luck rippers" :).


Offset    size (byte)    Comment
------    -----------    -------
  0         20 (14h)     Title

      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
 20           20         Sample Name                 *
(14h)                                                *
 40            2         finetune (signed word) ...  *
(28h)                                                *
 42            2         Sample Size / 2             *
(2Ah)                                                *
 44            1         ?                           *
(2Ch)                                                *
 45            1         Volume (0 - 40h)            *
(2Dh)                                                *
 46            2         Loop Start / 4  (or / 2)    *
(2Eh)                                                *
 48            2         Loop Size / 2               *
(30h)                                                *
                                                     *
******************************************************

(about this loop start /4 or /2, I cannot tell for sure bcoz I've
encountered BOTH cases : "Guardian dragon" (/2) & "Guardian dragon II" (/4).
I guess Laxity did a new version of his tracker in between those two demos :).
It's not that hard to check if it's /2 or /4 ... somehow, the hardiest was
to know :).


950            1         Number of pattern to play
(3B6h)
951            1         "noisetracker byte" set to $00
(3B7h)
                         
952           128        pattern table
(3B8h)       (80h)

1080           4         "M.K."  ID string. Gryzor says this ID is not
(438h)                   always present. I've only two Unic files and
                         both have this ID. Now, Marley states there
                         can be the ID "UNIC" instead or even $00-00-00-00.
                         I've just find out that the first music of the demo
                         "desert dream" by Kefrens is a UNIC, has a title and
                         no ID string !. Coool ... thx Laxity :(.
1080/1084      ?         Pattern datas.


 each pattern takes 300h bytes
 row 00 | channel 1 | channel 2 | channel 3 | channel 4 |
 row 01 | channel 1 | channel 2 | channel 3 | channel 4 |
  ...
 row 63 | channel 1 | channel 2 | channel 3 | channel 4 |


 each channel is coded that way :

 0000 0000  0000 0000  0000 0000
 ||\\     /  \\  / \\  /  \\       /
 ||relative  || effect   effect
 || note     ||          value
 ||number    ||
 ||          //
 | \\        //
 |  sample number
 |
unused

effect:
  Just note that pattern break effect command (D**) uses HEX value
 in UNIC format (while it is DEC values in PTK). Thus, it has to
 be converted !.

relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (UNIC):

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24


 Follows Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## UNIC Tracker 2 format
##
@NODE UNIC2 "* Format UNIC Tracker 2 *"

Unic Tracker 2 format
Created by Anders E. Hansen (Laxity / Kefrens) 1991-1993
Analysed by Asle / ReDoX (asle@warka.com)

(VERY similare to UNIC tracker format ... . Who knows, maybe it's
the very same tracker with but a few minor changes ... . Someone
knows how to contact Laxity ?)

Source :
 - "Desert Dream" demo by Kefrens (second and last music)
 - 2 musics sent by Gryzor (Thx !)


Offset    size (byte)    Comment
------    -----------    -------
      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
  0           20         Sample Name                 *
             (14h)                                   *
 20            2         finetune (signed word) ...  *
(14h)                                                *
 22            2         Sample Size / 2             *
(16h)                                                *
 24            1         ?                           *
(18h)                                                *
 25            1         Volume (0 - 40h)            *
(19h)                                                *
 26            2         Loop Start / 4  (or / 2)    *
(1Ah)                                                *
 28            2         Loop Size / 2               *
(1Ch)                                                *
                                                     *
******************************************************

(about this loop start /4 or /2, I keep it that way knowing there
were the two possible cases in UNIC format. UNIC2 file I have, have
all this value /4).


930            1         Number of pattern to play
(3A2h)
931            1         "noisetracker byte" set to $00
(3A3h)
                         
932           128        pattern table
(3A4h)       (80h)

1060           ?         Pattern datas.
(424h)

 each pattern takes 300h bytes
 row 00 | channel 1 | channel 2 | channel 3 | channel 4 |
 row 01 | channel 1 | channel 2 | channel 3 | channel 4 |
  ...
 row 63 | channel 1 | channel 2 | channel 3 | channel 4 |


 each channel is coded that way :

 0000 0000  0000 0000  0000 0000
 ||\\     /  \\  / \\  /  \\       /
 ||relative  || effect   effect
 || note     ||          value
 ||number    ||
 ||          //
 | \\        //
 |  sample number
 |
unused

effect:
  Just note that pattern break effect command (D**) uses HEX value
 in UNIC2 format (while it is DEC values in PTK). Thus, it has to
 be converted !.

relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (UNIC / UNIC2):

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24


 Follows Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## XANN Packer format
##
@NODE XANN "* Format XANN Packer *"

XANN Packer format
Created by XANN / The Silents 1992
Analysed by Asle / ReDoX (asle@warka.com)

 Heh, XANN, pourrais-tu me re-envoyer ton E-Mail svp ...
je vais m'attaquer au "vrai" XANN packer :).

Source :
 - 3 musics from "Lethal Exit" demo by Digital
 - 1 file sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0h         200h        Pattern address table. 128 patterns addresses
                         which are dword.

200h           6h        ? filled with $00

      ***************************************
      * the following is repeated 31 times  *
      * with 16 bytes description for 1 smp *
******************************************************
                                                     *
206h           1h        ?finetune?                  *
207h           1h        Volume (0 - 40h)            *
208h           4h        Loop start address          *
20Ch           2h        Loop Size / 2               *
20Eh           4h        Sample Address              *
212h           2h        Sample Size / 2             *
214h           2h        ?                           *
                                                     *
******************************************************

3F6h          46h        ? filled with $00

43Ch           ?         pattern data


 each pattern is 400h bytes with 4 bytes for a note description.

row  1: voice1|voice2|voice3|voice4
row  2: voive1|voice2|voice3|voice4
...
row 64: voive1|voice2|voice3|voice4

 0000 0000  0000 0000  0000 0000  0000 0000
 \\    /\\ /  \\       /  \\       /  \\       /
 sample |   relative     effect     effect
 number |     note                  value
        |    number
       unused

effect: all the effects number have changed and here is the list
$04: $0  (arpeggio)
$08: $1  (portamento up)
$0C: $2  (portamento down)
$10: $3  (tone portamento with FxVal set to 0x00)
$14: $3  (tone portamento)
$18: $4  (vibrato with no FxVal)
$1C: $4  (vibrato)
$20:   !! never seen ... probably $5 with no FxVal
$24: $5  (tone portamento + volume slide)
$28: $6  (vibrato + volume slide UP)
$2C: $6  (vibrato + volume slide DOWN)
$30:   !! never seen ... probably $7 with no FxVal
$34:   !! never seen ... probably $7
$38: $9  (sample offset)
$3C: $A  (volume slide UP !!!  so effect value is <<4 when converting)
$40: $A  (volume slide DOWN !!!)
$44: $B  (position jump)
$48: $C  (set volume)
$4C: $D  (pattern break)
$50: $F  (set speed)
$54:   !! never seen ... probably $F (set BPM)
$58: $E with effect value $01  (set filter)
$5C: $E with effect value |= $10  (fine slide up)
$60: $E with effect value |= $20  (fine slide down)
$64:   !! never seen ... probably $E3?
$68:   !! never seen ... probably $E3*
$6C:   !! never seen ... probably $E4*
$70:   !! never seen ... probably $E5*
$74:   !! never seen ... probably $E60
$78:   !! never seen ... probably $E6*
$7C:   !! never seen ... probably $E7*
$80:   !! never seen ... probably $E90
$84: $E with effect value |= $90  (retriger)
$88: $E with effect value |= $A0  (fine volume slide up)
$8C: $E with effect value |= $B0  (fine volume slide down)
$94: $E with effect value |= $D0  (note delay)
$98: $E with effect value |= $E0  (pattern delay)
$9C:   !! never seen ... probably $EF*


relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

relative note number (XANN):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48


 Follows Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Kris Tracker format
##
@NODE Kris "* Format Kris tracker *"

Kris tracker format  (also called ChipTracker by NoiseConverter & Exotic)
Created by Kris / Anarchy
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - KRIS.EndLevel1 module from MultiPlayer package
 - 4 KRIS files sent by Gryzor (Thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0           16h        Title

      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
 16h          16h        Sample Name or $01 if no smp*
 2Ch           2         Sample Size / 2             *
 2Eh           1         Finetune (0 -> F)           *
 2Fh           1         Volume (0 - 40h)            *
 30h           2         Loop Start                  *
 32h           2         Loop Size / 2               *
                                                     *
******************************************************

3B8h           4         "KRIS" id.
3BCh           1         Number of pattern to play
3BDh           1         7Fh (set that way for some
                         OLD NoiseTracker replayers )
                         NOTE: ProWiz example has this byte set
                         to 00h ... .

3BEh         400h        track table per pattern. each track number is a word.
                         first track number is 00-00h and IS saved !. In fact,
                         it is the address of the track ... . Add this value
                         to $7C0 (starting address of tracks datas) to find the
                         corresponding track datas.
7BEh           2         ?? seems to be 00-00h.

7C0h           ?         tracks datas.


 each track is 100h bytes with 4 bytes for a note description.

 0000 0000  0000 0000  0000 0000  0000 0000
 \\       /  \\       /   |   \\  /  \\       /
  relative   sample     |  effect  effect
  note       number   unused        value
  number

BEWARE: if the relative note number is $A8, it means there are
       no note !.

relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (KRIS): (somehow, it could mean that there are more
                 than 3 octaves supported. Though, I've never
                 seen KRIS mods with other values )

C-1 to B-1 : 46,48,4a,4c,4e,50,52,54,56,58,5a,5c
C-2 to B-2 : 5e,60,62,64,66,68,6a,6c,6e,70,72,74
C-3 to B-3 : 76,78,7a,7c,7e,80,82,84,86,88,8a,8c


 Follows Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Pha Packer format
##
@NODE Pha "* Format Pha Packer*"

PhaPacker format (also called ProPacker V1.0 by NoiseConverter & Exotic Ripper)
                 (also called HanniPacker and/or StrangePlayer)
Created by Azatoth / Phenomena
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - "In The Kitchen" demo by Anarchy
 - "Deja Vu" demo by Anarchy

Offset    size (byte)    Comment
------    -----------    -------

      ***************************************
      * the following is repeated 31 times  *
      * with 14 bytes description for 1 smp *
******************************************************
                                                     *
 0             2         Sample Size / 2             *
 2             1         ??                          *
 3             1         Volume (0 - 40h)            *
 4             2         Loop Start / 2              *
 6             2         Loop Size / 2               *
 8             4         address of this sample      *
 12 ($C)       1         finetune - $b (?seems ok?)  *
 13 ($D)       1         ??                          *
                                                     *
******************************************************

434 ($1B2)    14         ?!?!?!? Couldn't understand
                         nothing out of these bytes.
                         Though, it's fairly safe to
                         say that there might be the
                         number of pattern in pattern
                         list ... . It's possible to
                         convert without this info, but
                         it's VERY hard !.

448 ($1C0)    512 ($200) pattern list (128 dword)

 it's a table of pointers which points at the adresses
of the pattern data in the "PhaPacked" file. So, the
pattern 0 will be the one starting right after the smp
data. Beware of the unused patterns when converting !.


960 ($3C0)    ??         sample data

 stored the same way as Protracker.


??            ??         pattern data

 Stored like protracker .. meaning:
 row 01: voice 1 | voice 2 | voice 3 | voice 4
 row 02: voice 1 | voice 2 | voice 3 | voice 4
 ...

 each voice is 4 bytes (ot two bytes .. see below).

Two cases depending of first byte:

 0000-0000  0000-0000
 \\       /  \\       /
   $ff        value

 If the first byte is $ff, then the following byte is
the number of times the previous value in THIS row will
be re-used. Well, in fact, it's ($ff-value) number of
times !.
 example :

  01-02-0A-0A  00-00-0F-06  02-00-00-37  FF-F5
  1st four bytes : Sample #1, Note #1, Fx Vol Slide, FxArg $0A.
  2nd four bytes : no sample, no note, Fx Set Speed, FxArg $06.
  3rd four bytes : sample #2, no note, no Fx or arpeggio, FxArg $37.
  4th block : $ff meaning previous block (02-00-00-37) will be repeated
             FF-F5=0A times IN THE VOICE #3 !!!.



 0000-0000  0000-0000  0000-0000  0000-0000
 ||\\     /  \\       /  |  | \\  /  \\       /
 ||sample   relative    \\/   Fx    Fx Arg
 ||number     note    unused
 ||          number
 ||
 description bits, both set to 0 in this case.

relative note number: (ProTracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (Pha Packer)

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,13,15,17,19
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48

@ENDNODE

##
## Wanton Packer format
##
@NODE wanton "* Format Wanton Packer*"

Wanton Packer format
Created by Wanton / Bloodsuckers
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - converted MODs with NoiseConverter
 - two WN packed files sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0           14h        Title

      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
 14h          16h        Sample Name                 *
 2Ah           2         Sample Size / 2             *
 2Ch           1         Finetune (0 -> F)           *
 2Dh           1         Volume (0 - 40h)            *
 2Eh           2         Loop Start / 2              *
 30h           2         Loop Size / 2               *
                                                     *
******************************************************

3B6h           1         Number of pattern to play
3B7h           1         7Fh (set that way for some
                         OLD NoiseTracker replayers )
3B8h         80h         pattern table

438h           3         { 'W','N',0x00 }  ID string
43Bh           1         real number of pattern (thx Gryzor's ProWiz !)
43Ch           ?         Pattern datas.

 each pattern takes 400h bytes
 row 00 | channel 1 | channel 2 | channel 3 | channel 4 |
 row 01 | channel 1 | channel 2 | channel 3 | channel 4 |
  ...
 row 63 | channel 1 | channel 2 | channel 3 | channel 4 |

 each channel is coded that way :

 0000 0000  0000 0000  0000 0000  0000 0000
 \\       /  \\       /   |   \\  /  \\       /
 relative    sample     |  effect  effect
   note      number   unused       value
  number     0 -> 1f


relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (WN):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48


 Follows Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Promizer 1.8a format
##
@NODE PM18a "* Format Promizer 1.8a *"

Promizer v1.8a format
Created by MC68000 / TECH (Frank Hlsmann)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - Own converted MODs with the packer.


Offset    size (byte)    Comment
------    -----------    -------

 0        4456 (1168h)   Replay routine and, certainly, near the end of this
                         block, some unidentified bytes. Since I could manage
                         without these to convert, I guess they are not that
                         very important.

4456          4          Number of bytes to add to get the sample data
(1168h)                  starting address (so, it's 4460+ "this value").
                         (SDAV - Sample Data Address Value)
                         RMQ: This info could be of great value when
                         ripping, however, I couldn't find any interrest
                         for converting ... .

4460          4          Size of the pattern data, which starts at address
(116Ch)                  146Ah. (WPS - Whole Patterns Size)

      ***************************************
      * the following is repeated 31 times  *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
4464 (1170h)   2         Sample Size / 2             *
4466 (1172h)   1         Finetune (0 -> F)           *
4467 (1173h)   1         Volume (0 - 40h)            *
4468 (1174h)   2         Loop Start / 2              *
4470 (1176h)   2         Loop Size / 2               *
                                                     *
******************************************************

4712           2         word. (NOP) Number of pattern *4
(1268h)

4714          512        pattern table. It's the starting address of each
(126Ah)                  pattern from $146A. Pattern $00 address, in this
                         list, will be $00000000.


5226          WPS        pattern data. Each pattern is 512 bytes long. Though,
(146Ah)                  that's the theory because some patterns may NOT be
                         that long. In fact, you'll have to check if the note
                         isn't a PATTERN BREAK command or a PATTERN JUMP. If
                         so, the pattern ends and another begins ... therefore,
                         its size is less than the 512 'standard bytes'.
                         Now, whatever the pattern size is, its meaning does
                         not vary :). In fact, those data are some values which
                         refer to a "reference table" (description is right
                         below).
                         RMQ: first value is 00h.

5226+          ?         the "reference table" which contains the standard
WPS                      PTK pattern data. Its size is easy to calculate since
                         it consists of blocks of 4 bytes, knowing that there
                         are 'n' blocks ('n' is the highest value in the
                         pattern data).


      * Here's a quick description of these four bytes (like ptk ...)

         _____byte 1_____   byte2_    _____byte 3_____   byte4__
        /                 /        /                 /         /
       0000          0000-00000000  0000          0000-00000000
 
       Upper four    12 bits for    Lower four    Effect command.
       bits of sam-  note period.   bits of sam-
       ple number.                  ple number.
 
      Note period table
       C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
       C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
       C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

      * NOTE: This period table is only valid for samples with a finetune
       set to 0 !. Promizer 1.8a saves HERE the fintuned values !. So,
       here follows the lists of the period tables for each tuning, well,
       not HERE :), but at the end of this file ... .
 


5226+WPS       4         Four empty bytes ... . Surely they have a very good
                         reason for beeing here, but, for now, it's beyond
                         my understanding :(.

 (next come the sample datas. We got two ways to find the starting address.)
 (we could follow step by step, as described here, but with a lot of       )
 (calculating ... . Now, there is this long byte in the description that I )
 (find very useful for the job. I use this way below. So, first there is   )
 (less calculating, but also, I think it's FAR safer that way !.           )

4460+SDAV      ?         Sample datas. (The address "4460" is not an error ..)
(116Ch)                  I explain this a bit upward.



 Follow Sample datas stored like ProTracker.
Nothing is packed..




---------------------
 * Period tables for each tuning (extracted from PT-play.s written by
  Peter "CRAYON" Hanning / Mushroom Studio !). It's the official
  Protracker V2.1A Playroutine .. .

tuning 0:  (already written above, so check there for this one)

Tuning 1:
            850,802,757,715,674,637,601,567,535,505,477,450
            425,401,379,357,337,318,300,284,268,253,239,225
            213,201,189,179,169,159,150,142,134,126,119,113

Tuning 2:
            844,796,752,709,670,632,597,563,532,502,474,447
            422,398,376,355,335,316,298,282,266,251,237,224
            211,199,188,177,167,158,149,141,133,125,118,112

Tuning 3:
            838,791,746,704,665,628,592,559,528,498,470,444
            419,395,373,352,332,314,296,280,264,249,235,222
            209,198,187,176,166,157,148,140,132,125,118,111

Tuning 4:
            832,785,741,699,660,623,588,555,524,495,467,441
            416,392,370,350,330,312,294,278,262,247,233,220
            208,196,185,175,165,156,147,139,131,124,117,110

Tuning 5:
            826,779,736,694,655,619,584,551,520,491,463,437
            413,390,368,347,328,309,292,276,260,245,232,219
            206,195,184,174,164,155,146,138,130,123,116,109

Tuning 6:
            820,774,730,689,651,614,580,547,516,487,460,434
            410,387,365,345,325,307,290,274,258,244,230,217
            205,193,183,172,163,154,145,137,129,122,115,109

Tuning 7:
            814,768,725,684,646,610,575,543,513,484,457,431
            407,384,363,342,323,305,288,272,256,242,228,216
            204,192,181,171,161,152,144,136,128,121,114,108

Tuning -8:
            907,856,808,762,720,678,640,604,570,538,508,480
            453,428,404,381,360,339,320,302,285,269,254,240
            226,214,202,190,180,170,160,151,143,135,127,120

Tuning -7:
            900,850,802,757,715,675,636,601,567,535,505,477
            450,425,401,379,357,337,318,300,284,268,253,238
            225,212,200,189,179,169,159,150,142,134,126,119

Tuning -6:
            894,844,796,752,709,670,632,597,563,532,502,474
            447,422,398,376,355,335,316,298,282,266,251,237
            223,211,199,188,177,167,158,149,141,133,125,118

Tuning -5:
            887,838,791,746,704,665,628,592,559,528,498,470
            444,419,395,373,352,332,314,296,280,264,249,235
            222,209,198,187,176,166,157,148,140,132,125,118

Tuning -4:
            881,832,785,741,699,660,623,588,555,524,494,467
            441,416,392,370,350,330,312,294,278,262,247,233
            220,208,196,185,175,165,156,147,139,131,123,117

Tuning -3:
            875,826,779,736,694,655,619,584,551,520,491,463
            437,413,390,368,347,328,309,292,276,260,245,232
            219,206,195,184,174,164,155,146,138,130,123,116

Tuning -2:
            868,820,774,730,689,651,614,580,547,516,487,460
            434,410,387,365,345,325,307,290,274,258,244,230
            217,205,193,183,172,163,154,145,137,129,122,115

Tuning -1:
            862,814,768,725,684,646,610,575,543,513,484,457
            431,407,384,363,342,323,305,288,272,256,242,228
            216,203,192,181,171,161,152,144,136,128,121,114


@ENDNODE

##
## ProRunner v1
##
@NODE PRU1 "* Format ProRunner v1 *"

ProRunner v1 format
Created by Cosmos / Sanity (1992)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - Converted MODs with NoiseConverter
 - 3 PRUN1 files sent by Gryzor (Thx !).


Offset    size (byte)    Comment
------    -----------    -------
  0           14h        Title

      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
 14h          16h        Sample Name                 *
 2Ah           2         Sample Size / 2             *
 2Ch           1         Finetune (0 -> F)           *
 2Dh           1         Volume (0 - 40h)            *
 2Eh           2         Loop Start / 2              *
 30h           2         Loop Size / 2               *
                                                     *
******************************************************

3B6h           1         Number of pattern to play
3B7h           1         7Fh (set that way for some
                         OLD NoiseTracker replayers )
3B8h         80h         pattern table

438h           4         "SNT."  ID string
43Ch           ?         Pattern datas.

 each pattern takes 400h bytes
 row 00 | channel 1 | channel 2 | channel 3 | channel 4 |
 row 01 | channel 1 | channel 2 | channel 3 | channel 4 |
  ...
 row 63 | channel 1 | channel 2 | channel 3 | channel 4 |

 each channel is coded that way :

 0000 0000  0000 0000  0000 0000  0000 0000
 \\       /  \\       /   |   \\  /  \\       /
  sample     relative   |  effect  effect
  number     note     unused       value
  0 -> 1f    number


relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (PRUN1):

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24


 Follows Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## ProRunner v2
##
@NODE PRU2 "* Format ProRunner v2 *"

ProRunner v2 format
Created by Cosmos / Sanity (1992)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - "Rampage" demo by Tek
 - "Rodeo" intro by Banal Project
 - "Crash test" demo by Cryptoburners
 - various cracktro by Fairlight,Delirium,paradox ...


Offset    size (byte)    Comment
------    -----------    -------
  0           4          ID "SNT!"
  4           4          pointer to the sample data (thx gryzor :)

      ***************************************
      * the following is repeated 31 times  *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
 8             2         Sample Size / 2             *
 Ah            1         Finetune (0 -> F)           *
 Bh            1         Volume (0 - 40h)            *
 Ch            2         Loop Start / 2              *
 Eh            2         Loop Size / 2               *
                                                     *
******************************************************

100h           1         Number of pattern to play
101h           1         NoiseTracker restart byte
102h          80h        Pattern order table
182h          100h       ?? are those used in fact ?!?
                         might be used when playing ...
282h          80h        pointer table

 pointer table contains 64 pointers ( one word each )
pointing at the first pattern data. It starts at 0000h
and goes on adding pattern sizes. As an exemple, if
pattern 0 is 1024 bytes long and pattern 1 is 1000
bytes long, first pointer table will be 0000, second
will be 0400. the rest is filled with 0000h.
 seems unusable to me ...

302h           ?         pattern data

 we get something like

 pattern 0 :
 row 0 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 1 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 2 ...
 row 63| voice 1 | voice 2 | voice 3 | voice 4 |
 pattern 1 :
 ...

 the size of each pattern is variable and is between
100h and 300h bytes. One voice can be 1 or 3 bytes long.
it depends if bit 7 of first byte is set to 1. If so,
the size of this voice is 1 byte. It means there's
nothing at this line. If this bit is set to 0, the size
of this voice is 3 bytes. so we get :

 1000 0000
 |
 if this bit is set, nothing follows and this is an
empty note. it meens for PTK four bytes set to 00h.
 1100 0000
  |
 if both first bits are set to 1, it meens that
previous note IN THIS ROW will be re-used ... .

if first bit is set to 0, follows the description

  0000 0000  0000 0000  0000 0000
  ||     ||     | |  |  |       |
 -| \\   /  \\   /   \\/    \\     /
| relative sample effect  effect
|   note   number         value
|  number
|------------description bit set to 0

sample number :
  hard to get by this way of coding :( ... anyway, let's try
 tro explain it ...
  first, we agree it's coded on 5 bits.
   0 0 0 0 0   ( in the order of saving )
  I name these bit 0, bit 1, bit 2, bit 3 and bit 4 in the
 same order of saving.
  in fact, all we got to do, is to rol the whole five bits
 by one on the left.
  exemples :
   10000 will become 00001   (sample 1)
   01010 will become 10100   (sample 20)
   00010 will become 00100   (sample 4)
   etc...

relative note number: (ProTracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (ProRunner v2)

C-1 to B-1 : 01,03,05,07,09,0b,0d,0f,11,13,15,17
C-2 to B-2 : 19,1b,1d,1f,21,23,25,27,29,2b,2d,2f
C-3 to B-3 : 31,33,35,37,39,3b,3d,3f,41,43,45,47



 Follows Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## ProPacker 2.1 format
##
@NODE PP21 "* Format ProPacker v2.1 *"

ProPacker v2.1
Created by C Estrup / Static Bytes (1991)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - "Realtime Margherita" demo by Arise
 - "Meetro" demo by Balance
 - 5 PP21 files sent by Gryzor (Thx !)


Offset    size (byte)    Comment
------    -----------    -------

      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
******************************************************
                                                     *
  0 (00h)      2         Sample Size / 2             *
  2 (02h)      1         Finetune (0 -> F)           *
  3 (03h)      1         Volume (0 - 40h)            *
  4 (04h)      2         Loop Start / 2              *
  6 (06h)      2         Loop Size / 2               *
                                                     *
******************************************************


248 (F8h)      1         (NOP) Number of pattern to play
249 (F9h)      1         "NoiseTracker" byte (set to 7Fh)
250 (FAh)   512 (200h)   Tracks table. In fact, it's four (4) tables of
                         128 (80h) bytes each, where 128 is the number
                         of pattern position. So, it's four tables for
                         the four voices. These tables contain the numbers
                         of tracks for each voice. (1st value is 0)

762 (2FAh)  128*NOP      Tracks "data". It's 64 values (2 bytes each) which
                         refer to the following table. (1st value is 0)

762+
(128*NOP)      4         (SIZ) Size of the "reference table".

762+
(128*NOP)
+4            SIZ        "Reference table". Hard to find a name in fact :(.
                         Well, this table contains the real tracks data. It's
                         filled with the standard ptk four bytes description
                         for one note. As an example, let's suppose the Track
                         "data" value is 00-01, then, its real value will be
                         the second block of four bytes in this table.
                         A quick calculation shows that it can be very
                         expensive because there's around 4,5 million
                         possibilities ... (36*31*16*256).

      * Here's a quick description of these four bytes (like ptk ...)

         _____byte 1_____   byte2_    _____byte 3_____   byte4_
        /                 /        /                 /        /
       0000          0000-00000000  0000          0000-00000000
 
       Upper four    12 bits for    Lower four    Effect command.
       bits of sam-  note period.   bits of sam-
       ple number.                  ple number.
 
      Note period table
       C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
       C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
       C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113
 



 Follow Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## ProPacker v3.0 format
##
@NODE PP3 "* Format ProPacker v3.0 *"

ProPacker v3.0 format
Created by C Estrup / Static Bytes (1994)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - Crusaders's Eurochart #16
 - Crusaders's Eurochart #23 music sent by Gryzor (Thx !)

NOTE: This format is extremly similar to the ProPacker 2.1 !. The only
     difference remains in the fact that the track data is *4 here.


Offset    size (byte)    Comment
------    -----------    -------

      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
******************************************************
                                                     *
  0 (00h)      2         Sample Size / 2             *
  2 (02h)      1         Finetune (0 -> F)           *
  3 (03h)      1         Volume (0 - 40h)            *
  4 (04h)      2         Loop Start / 2              *
  6 (06h)      2         Loop Size / 2               *
                                                     *
******************************************************


248 (F8h)      1         (NOP) Number of pattern to play
249 (F9h)      1         "NoiseTracker" byte (set to 7Fh)
250 (FAh)   512 (200h)   Tracks table. In fact, it's four (4) tables of
                         128 (80h) bytes each, where 128 is the number
                         of pattern position. So, it's four tables for
                         the four voices. These tables contain the numbers
                         of tracks for each voice. (1st value is 0)

762 (2FAh)  128*NOP      Tracks "data". It's 64 values (1 word each) which
                         refer to the following table. (1st value is 0).
                         Beware coz each value is *4 !.

762+
(128*NOP)      4         (SIZ) Size of the "reference table".

762+
(128*NOP)
+4            SIZ        "Reference table". Hard to find a name in fact :(.
                         Well, this table contains the real tracks data. It's
                         filled with the standard ptk four bytes description
                         for one note. As an example, let's suppose the Track
                         "data" value is 00-01, then, its real value will be
                         the second block of four bytes in this table.
                         A quick calculation shows that it can be very
                         expensive because there's around 4,5 million
                         possibilities ... (36*31*16*256).

      * Here's a quick description of these four bytes (like ptk ...)

         _____byte 1_____   byte2_    _____byte 3_____   byte4_
        /                 /        /                 /        /
       0000          0000-00000000  0000          0000-00000000
 
       Upper four    12 bits for    Lower four    Effect command.
       bits of sam-  note period.   bits of sam-
       ple number.                  ple number.
 
      Note period table
       C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
       C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
       C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113
 



 Follow Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## Digital Illusions format
##
@NODE DI "* Format Digital Illusions *"

Digital Illusion format
Created by TSL (the Silents) for Digital Illusion (1991)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - converted MODs with NoiseConverter
 - Two files from Pinball Fantasy (thx Gryzor !)


Offset    size (byte)    Comment
------    -----------    -------
  0           2          Number of sample [NOS]
  2           4          Address of pattern table (in the file !) [1]
  6           4          Address of pattern data (in the file !)  [2]
 10 (Ah)      4          Adresss of sample data (in the file !)

      ***************************************
      * the following is repeated NOS times *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
 14 (Eh)       2         Sample Size / 2             *
 16 (10h)      1         Finetune (0 -> F)           *
 17 (11h)      1         Volume (0 - 40h)            *
 18 (12h)      2         Loop Start / 2              *
 20 (14h)      2         Loop Size / 2               *
                                                     *
******************************************************

10+NOS*8     NOP*2       pointer table on pattern
                         NOP = Number of pattern (REAL!!!)
                         (this is a table containing the addresses)
                         (IN THE FILE of each pattern data)
                         (several ways to get its size ...)
                         ( -> read 'til you reach the Address of)
                         (   the pattern table)
                         ( -> read all through pattern table and)
                         (   get the highest pattern to play, then)
                         (   read this number of word ... safer !)

[1]           NOP        Pattern order table
[1]+NOP        1         $FF (terminates pattern order table)
[2]           ???        pattern data ...

 we get something like that

 pattern 0 :
 row 0 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 1 | voice 1 | voice 2 | voice 3 | voice 4 |
 row 2 ...
 row 63| voice 1 | voice 2 | voice 3 | voice 4 |
 pattern 1 :
 ...

 the size of each pattern is variable. it can be between 256 (100h)
and 768 (300h)

 if bit 7 of first byte is set to 1 : two cases

*first case

  0000 0000  0000 0000  0000 0000
  ||    ||      | |  |  |       |
  | \  /  \    /   \/    \     /
  |  sample relativ effect  effect
  |  number  note           value
  |         number
  |------------description bit set to 1

*second case

  0000 0000  all bits are set to 1 ($ff) then it's an empty voice
  |          meaning for Ptk 4 empty bytes.
  |
  |------------description bit set to 1

 if bit 7 of first byte is set to 0 : one case

  0000 0000  0000 0000
  ||    ||      | |  |
 -| \\  /  \\    /   \\/
|  sample relativ  effect
|  number  note
|         number
|------------description bit set to 0


relative note number: (ProTracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (Digital Illusion)

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24



 Follows Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## Module Protector format
##
@NODE ModProt "* Format Module Protector *"

Module Protector format
Created by Matrix / LSD (David Counter 1992)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - Arise & Drinks 40kb tracktro
 - converted MODs with NoiseConverter
 - 3 files sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------

NOTE: Gryzor states there can be an ID at the beginning
     of a Module Protector packed file. Now, in the small
     exemple written in Pro-Wizard doc, there IS a 'TRK1'
     ID in the header and all the description below is
     starting right after ... just add 4 bytes at each
     offset if the ID is there :). (Hi nicolas)

      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
******************************************************
                                                     *
 0             2         Sample Size / 2             *
 2             1         Finetune (0 -> F)           *
 3             1         Volume (0 - 40h)            *
 4             2         Loop Start / 2              *
 6             2         Loop Size / 2               *
                                                     *
******************************************************

248 ($F8)      1         Size of pattern table
249 ($F9)      1         NoiseTracker restart byte ($7F)
250 ($FA)   128 ($80)    Pattern table

378 ($17A)     4         ?!? wheter it's $00000000 or it is the
                         beginning of the pattern data. BUT, a
                         note COULD be $00000000 ! ... so, how
                         do we process here ?!?. Pro-Wizard seems
                         to test if it's empty ... if so, it bypass
                         these 4 bytes and begins the pattern data
                         right after.

382 or 378     ?         Pattern datas
($17E) ($17A)            (Pattern datas are stored like Ptk)
                         (one pattern is 1024 ($400) bytes).


 Follow the Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Polka Packer format
##
@NODE Polka "* Format Polka Packer *"

Polka Packer format (also called Polka Runner by NoiseConverter ...)
Created by ??? / Polka Brothers '94
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - ProWizard Hex-dump exemple


Offset    size (byte)    Comment
------    -----------    -------
  0           14h        Title

      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
 14h          12h        Sample Name                 *
 26h           4         Sample adress (memory)      *
 2Ah           2         Sample Size / 2             *
 2Ch           1         Finetune (0 -> F)           *
 2Dh           1         Volume (0 - 40h)            *
 2Eh           2         Loop Start / 2              *
 30h           2         Loop Size / 2               *
                                                     *
******************************************************

3B6h           1         Number of pattern to play
3B7h           1         7Fh (set that way for some
                         OLD NoiseTracker replayers )
3B8h         80h         pattern table

438h           3         "PWR."  ID string
43Ch           ?         Pattern datas.

 each pattern takes 400h bytes
 row 00 | channel 1 | channel 2 | channel 3 | channel 4 |
 row 01 | channel 1 | channel 2 | channel 3 | channel 4 |
  ...
 row 63 | channel 1 | channel 2 | channel 3 | channel 4 |

 each channel is coded that way :

 0000 0000  0000 0000  0000 0000  0000 0000
 \\       /  \\       /   |   \\  /  \\       /
 relative    sample     |  effect  effect
   note      number   unused       value
  number     0 -> 1f


relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (POLK):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48


 Follows Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Hornet Packer format
##
@NODE HRT "* Format Hornet Packer *"

Hornet Packer format
Created by Hornet / Alcatraz
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - ProWizard Hex-dump exemple
 - 2 Hornet files sent by Gryzor (Thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0           14h        Title

      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
 14h          12h        Sample Name                 *
 26h           4         Sample adress (memory)      *
 2Ah           2         Sample Size / 2             *
 2Ch           1         Finetune (0 -> F)           *
 2Dh           1         Volume (0 - 40h)            *
 2Eh           2         Loop Start / 2              *
 30h           2         Loop Size / 2               *
                                                     *
******************************************************

3B6h           1         Number of pattern to play
3B7h           1         7Fh (set that way for some
                         OLD NoiseTracker replayers )
3B8h         80h         pattern table

438h           3         "HNT!"  ID string
43Ch           ?         Pattern datas.

 each pattern takes 400h bytes
 row 00 | channel 1 | channel 2 | channel 3 | channel 4 |
 row 01 | channel 1 | channel 2 | channel 3 | channel 4 |
  ...
 row 63 | channel 1 | channel 2 | channel 3 | channel 4 |

 each channel is coded that way :

 0000 0000  0000 0000  0000 0000  0000 0000
 \\       /  \\       /   |   \\  /  \\       /
  sample     relative   |  effect  effect
  number      note    unused       value
   *2 !      number


relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (HNT):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48


 Follows Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## AC1D Packer format
##
@NODE AC1D "* Format AC1D Packer *"

AC1D packer format
Created by Slammer / Anarchy (19??)
Analysed by Asle / ReDoX (asle@warka.com)

(NOTE: This is the "dump" version, not the memory rip. There are some few)
(differences ... first, the ID string is the other way around ($D1CA), next,)
(all the addresses are useless because they point in the memory ... )

Source :
 - "In The Kitchen" demo by Anarchy


Offset    size (byte)    Comment
------    -----------    -------
  0           1          Number of pattern to play
  1           1          Probably the "Noisetracker" byte (7Fh)
  2           2          $AC1D  ID string
  4           4          Address of the sample data

      ***************************************
      * the following is repeated 31 times  *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
 8             2         Sample Size / 2             *
 Ah            1         Finetune (0 -> F)           *
 Bh            1         Volume (0 - 40h)            *
 Ch            2         Loop Start / 2              *
 Eh            2         Loop Size / 2               *
                                                     *
******************************************************

256           512        Pattern addresses table
(100h)       (200h)

768           128        Pattern order table
(300h)       (80h)

896            ?         Pattern data
(380h)


 we get something like

 pattern 0 :
   all the 64 row of voice 0
   all the 64 row of voice 1
   all the 64 row of voice 2
   all the 64 row of voice 3
 pattern 1 :
 ...

 Each pattern begins with 3 dword. Each is the number of
byte to add to find the voice 1, 2 and 3. (Voice 0 starts
always at 0).

 the size of each pattern is variable. It can be up to
300h bytes. One note can be 1 or 3 bytes long,
or even 0 bytes :).
 The first bit of the first byte is a description bit.
If it is set to 1, it means there wont be any note during
the next (first_byte - $80):


* case 1:

     val
  /      \\
 1000 0000
 |
 if this bit is set, follows 'val' empty in the voice.


* case 2:

 0000 0000  0000 0000
 ||\\     /  \\  / \\  /
/ | note    Smp2  ||
|Smp              ||
|              bin(0111)
|
Description bit set to 0.

 As far as I can tell, it seems Fx Command 7 is not supported
by this packer, and, therefore, is used here for another purpose.
First, about the 'Smp', it is the sample value (max $1f). Next,
the 'bin' value is, in this case, set to 7, meaning there's no
effect command, nor effect value. At least, the Note. It seems
it is the "standard" relative note number as found in many other
packers, save that it supports one more octave. When converting
back to Ptk, just remove $C to this value ... and check below
the correspondance table.


* case 3:

if first bit is set to 0, follows the description

     Sample number
    /         /\\
   |         |  |
  0000 0000  0000 0000  0000 0000
  | |     |       |  |  |       |
 -|  \\   /         \\/    \\     /
|  relative       effect  effect
|    note         (!$7)   value
|   number
|------------description bit set to 0


 As in case 2 , with the effect command != 7. The only
difference with previous case is the adding of an effect
value.


Note: if the Note value is $3F, it means there no note !.
On another hand, if Note value is $00, it means the note
is C-1 ($358 under Ptk).


relative note number: (ProTracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (AC1D)

C-1 to B-1 : 00,0d,0e,0f,10,11,12,13,14,15,16,17
C-2 to B-2 : 18,19,1a,1b,1c,1d,1e,1f,20,21,22,23
C-3 to B-3 : 24,25,26,27,28,29,2a,2b,2c,2d,2e,2f



 Follows Sample datas stored like ProTracker.
Nothing is packed..

@ENDNODE

##
## Channel Player v1 format
##
@NODE CHN1 "* Format Channel Player v1 *"

Channel Player v1 format
Created by Alan / Impact (1994)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - One file sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0           2          Number of sample (+$A)  (NOS)

  2           2          size if pattern table
                         (number of pattern to play *4)

  4           2          ?!?
  6           4          ?!?


      ***************************************
      * the following is repeated NOS times *
      * with 16 bytes description for 1 smp *
*******************************************************
                                                      *
 10            4         Sample start address(memory) *
(Ah)                                                  *
 14            2         Sample size / 2              *
(Eh)                                                  *
 16            1         ?!?                          *
(10h)                                                 *
 17            1         Volume                       *
(11h)                                                 *
 18            4         Loop start address           *
(12h)                                                 *
 22            2         Loop size / 2                *
(16h)                                                 *
 24            2         Fintune (*$48)               *
(18h)                                                 *
                                                      *
*******************************************************

 ?             ?         Pattern table. composed of 4 track
                         numbers (byte). The size is in $2 of the file.

 ?             ?         Pattern data. Each track is saved one after
                         another and take 192 bytes (each).

 we get something like

 pattern 0 :
   all the 64 row of voice 0
   all the 64 row of voice 1
   all the 64 row of voice 2
   all the 64 row of voice 3
 pattern 1 :
 ...

 the size of each pattern is 300h bytes. One note is 3 bytes long.


     Sample number
          |   /\\
          |  |  |
  0000 0000  0000 0000  0000 0000
  |       |       |  |  |       |
   \\     /         \\/    \\     /
   relative       effect  effect
     note         (!$7)   value
    number


Note: The relative note number is *2, and therefore, the bit 0
     of the first byte NEVER will be set to 1. It is, then, used
     by the sample number (from 0 to $1F). Just dont forget to
     'OR' the relative note number with $FE :).
Note: Beware of the effects numbers 5,6,A (the ones with a
     volume slide) because the effect parameter is a SIGNED
     value !.


relative note number: (ProTracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (CHN1)

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48



 Follow Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Channel Player v2 format
##
@NODE CHN2 "* Format Channel Player v2 *"

Channel Player v2 format
Created by Alan / Impact (1994)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - One file sent by Gryzor (thx !)

NOTE: almost the same as v1 ... . The size of the pattern list is *8 here
     and the pattern list is composed of the addresses of the tracks, not
     the numbers. Also, there's the packing of the tracks (2 or 3 bytes
     for one note).


Offset    size (byte)    Comment
------    -----------    -------
  0           2          Number of sample (+$A)  (NOS)

  2           2          size if pattern table
                         (number of pattern to play *8)

  4           2          ?!?
  6           4          ?!?


      ***************************************
      * the following is repeated NOS times *
      * with 16 bytes description for 1 smp *
*******************************************************
                                                      *
 10            4         Sample start address(memory) *
(Ah)                                                  *
 14            2         Sample size / 2              *
(Eh)                                                  *
 16            1         ?!?                          *
(10h)                                                 *
 17            1         Volume                       *
(11h)                                                 *
 18            4         Loop start address           *
(12h)                                                 *
 22            2         Loop size / 2                *
(16h)                                                 *
 24            2         Fintune (*$48)               *
(18h)                                                 *
                                                      *
*******************************************************

 ?             ?         Pattern table. composed of 4 track
                         numbers (word). The size is in $2 of the file.

 ?             ?         Pattern data. Each track is saved one after
                         another.

 we get something like

 pattern 0 :
   all the 64 row of voice 0
   all the 64 row of voice 1
   all the 64 row of voice 2
   all the 64 row of voice 3
 pattern 1 :
 ...

 the size of each pattern is variable. It can be up to
300h bytes. One note can be 2 or 3 bytes long.
 The first bit of the first byte is a description bit.


* case 1:

    -relative note number
   /      /
  |      |
 1000 0000  0000 0000
 |       |     | |  |
 |        \\   /   \\  \\
 |       sample   effect
 |       number
  \\
   -if this bit is set, there's only a pitch, a sample nbr and a Fx
    (no FxArg)


* case 2:

if first bit is set to 0, follows the description

     Sample number
          |   /\\
          |  |  |
  0000 0000  0000 0000  0000 0000
  ||      |       |  |  |       |
 -| \\    /         \\/    \\     /
|  relative       effect  effect
|    note         (!$7)   value
|   number
|------------description bit set to 0


Note: The relative note number is *2, and therefore, the bit 0
     of the first byte NEVER will be set to 1. It is, then, used
     by the sample number (from 0 to $1F). Just dont forget to
     'OR' the relative note number with $FE :).
Note: Beware of the effects numbers 5,6,A (the ones with a
     volume slide) because the effect parameter is a SIGNED
     value !.


relative note number: (ProTracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (CHN2)

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48



 Follow Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Channel Player v3 format
##
@NODE CHN3 "* Format Channel Player v3 *"

Channel Player v3 format
Created by Alan / Impact (1994)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - One file sent by Gryzor (thx !)

NOTE: almost the same as v1 ... . The size the pattern list is *8 here
     and the pattern list is composed of the addresses of the tracks, not
     the numbers. Also, there's the packing of the tracks (1 or 3 bytes
     for one note).


Offset    size (byte)    Comment
------    -----------    -------
  0           2          Number of sample (+$A)  (NOS)

  2           2          size if pattern table
                         (number of pattern to play *8)

  4           2          ?!?
  6           4          ?!?


      ***************************************
      * the following is repeated NOS times *
      * with 16 bytes description for 1 smp *
*******************************************************
                                                      *
 10            4         Sample start address(memory) *
(Ah)                                                  *
 14            2         Sample size / 2              *
(Eh)                                                  *
 16            1         ?!?                          *
(10h)                                                 *
 17            1         Volume                       *
(11h)                                                 *
 18            4         Loop start address           *
(12h)                                                 *
 22            2         Loop size / 2                *
(16h)                                                 *
 24            2         Fintune (*$48)               *
(18h)                                                 *
                                                      *
*******************************************************

 ?             ?         Pattern table. composed of 4 track
                         numbers (word). The size is in $2 of the file.

 ?             ?         Pattern data. Each track is saved one after
                         another.

 we get something like

 pattern 0 :
   all the 64 row of voice 0
   all the 64 row of voice 1
   all the 64 row of voice 2
   all the 64 row of voice 3
 pattern 1 :
 ...

 the size of each pattern is variable. It can be up to
300h bytes. One note can be 1 or 3 bytes long.
 The first bit of the first byte is a description bit.


* case 1:

    -relative note number
   /      /
  |      |
 1000 0000
 |
 if this bit is set, there's only a pitch (no sample,Fx,FxArg)


* case 2:

if first bit is set to 0, follows the description

     Sample number
          |   /\\
          |  |  |
  0000 0000  0000 0000  0000 0000
  ||      |       |  |  |       |
 -| \\    /         \\/    \\     /
|  relative       effect  effect
|    note         (!$7)   value
|   number
|------------description bit set to 0


Note: The relative note number is *2, and therefore, the bit 0
     of the first byte NEVER will be set to 1. It is, then, used
     by the sample number (from 0 to $1F). Just dont forget to
     'OR' the relative note number with $FE :).
Note: Beware of the effects numbers 5,6,A (the ones with a
     volume slide) because the effect parameter is a SIGNED
     value !.


relative note number: (ProTracker)

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes : (CHN3)

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48



 Follow Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Eureka Packer format
##
@NODE Eureka "* Format Eureka Packer *"

Eureka Packer format
Created by Eureka / Concept (1990-91)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
  - Own converted musics with the packer (bugged btw ..).
  - "EU.Enigma Year" sent to me by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0           14h        Title

      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
 20           22         Sample Name                 *
(14h)        (16h)                                   *
 42            2         Sample Size / 2             *
(2Ah)                                                *
 44            1         Finetune (0 -> F)           *
(2Ch)                                                *
 45            1         Volume (0 - 40h)            *
(2Dh)                                                *
 46            2         Loop Start / 2              *
(2Eh)                                                *
 48            2         Loop Size / 2               *
(30h)                                                *
                                                     *
******************************************************

 950           1         Number of pattern to play
(3B6h)

 951           1         noisetracker byte set to $7F
(3B7h)

 952          128        pattern table
(3B8h)       (80h)

1080           4         address of the sample data
(438h)

1084           ?         track table. It is the address of each
(43Ch)                   track for each pattern. Each value is a
                         word. So, first pattern will be defined
                         by the four first tracks (4 first words).

  ?           24         ?!? (no clue !)


  ?            ?         tracks datas. Refer to the track address table
                         upward. All the files I've packed so far DO
                         have the first track address at $850, but ... .


 each track is packed as follow :

case 1: (same as ptk with the two first bits both set to 0)

     -- Sample number ---
    /                   /\\
   ||                  |  |
 0000 0000  0000 0000  0000 0000  0000 0000
 ||   |             |       |  |  |       |
 ||    \\           /         \\/    \\     /
 ||     Note Period        effect   effect
  \\                               parameter
   -- descriptions bits both set to 0


case 2: (only an effect with its parameter)

 0100 0000  0000 0000
 ||   \\  /  \\       /
 ||  effect  effect
 ||         parameter
 | \\
  \\ - description bit 6 set to 1
   - description bit 7 set to 0


case 3: (no effect nor effect parameter)

   - description bit 7 set to 1
  / - description bit 6 set to 0
 | /
 ||
 1000 0000  0000 0000  0000 0000
      |  |  |  | |             |
      four   \\ |  \\           /
   lower bits \\|   Note Period
   of smp nbr  |
              four
           higher bits
           of smp nbr


case 4: (empty rows ..)

   - description bit 7 set to 1
  / - description bit 6 set to 1
 | /
 ||
 1100 0000
   |     |
    \\   /
     -------- Number of empty row to bypass (-1 !).




 Follow Sample datas stored like Protracker.
Nothing is packed..
@ENDNODE

##
## FC-M Packer format
##
@NODE FC_M "* Format FC-M Packer *"

FC-M packer format
Created by ?
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - two FC-M packed files sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------

 0             4         "FC-M" ID

 4             2         ?!? ($0100) probably the version number
                         of the packer .. .

 6             4         "NAME" pseudo chunk ID indicating the
                         title of the song follows.

10            20         title of the song
(Ah)         (14h)

30             4         "INST" pseudo chunk ID indicating the
(1Eh)                    two following bytes a the descriptions
                         of the samples.


      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
*********************************************************
                                                        *
34             2         Sample Size / 2                *
(22h)                                                   *
36             1         Finetune (0 -> F)              *
(24h)                                                   *
37             1         Volume (0 - 40h)               *
(25h)                                                   *
38             2         Loop Start / 2                 *
(26h)                                                   *
40             2         Loop Size / 2                  *
(28h)                                                   *
                                                        *
*********************************************************

282            4         "LONG" pseudo chunk ID indicating the
(11Ah)                   following two bytes are the pattern list
                         lenght and the ntk byte.

286            1         size of pattern table
(11Eh)

287            1         noisetracker byte ($7F)
(11Fh)

288            4         "PATT" pseudo chunk ID indicating the
(120h)                   following bytes are the pattern list.

292            ?         pattern table.
(124h)                   the lenght is written upward.

 ?             4         "SONG" pseudo chunk ID indicating the
                         following bytes are the pattern data.

 ?             ?         pattern data. Stored like Protracker


 So, each note takes 4 bytes and is stored the same way as ptk :


        -note value
       /           \\
      |             |                 
 0000 0000  0000 0000  0000 0000  0000 0000  
 |  |                  |  | |  |  |       |
  \\  \\                /  /   \\/    \\     /
   \\--Sample number-----/  effect   effect
                                  parameter


 ?             4         "SAMP" pseudo chunk ID indicating the
                         following bytes are the sample data.
                         ALL the sample data !!.


 Follows Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## Power Music format
##
@NODE Power "* Format OPTIMOD's Power Music *"

Power Music format
Created by Joakim Ogren
Analysed by Asle / ReDoX (asle@warka.com)

Source:
 - one !PM! packed file sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0          20 14h      Title

      ***************************************
      * the following is repeated 31 times  *
      * with 30 bytes description for 1 smp *
******************************************************
                                                     *
 20           22         Sample Name                 *
(14h)        (16h)                                   *
 42            2         Sample Size / 2             *
(2Ah)                                                *
 44            1         Finetune (0 -> F)           *
(2Ch)                                                *
 45            1         Volume (0 - 40h)            *
(2Dh)                                                *
 46            2         Loop Start / 2              *
(2Eh)                                                *
 48            2         Loop Size / 2               *
(30h)                                                *
                                                     *
******************************************************

950            1         Number of pattern to play
(3B6h)
951            1         noisetracker byte (FFh)
(3B7h)
952           128        pattern table
(3B8h)       (80h)

1080           4         "!PM!"  ID string
(438h)
1084           ?         Pattern datas. Same storing as ptk.
(43Ch)


 each pattern takes 400h bytes
 row 00 | channel 1 | channel 2 | channel 3 | channel 4 |
 row 01 | channel 1 | channel 2 | channel 3 | channel 4 |
  ...
 row 63 | channel 1 | channel 2 | channel 3 | channel 4 |

 each note is coded that way :

   ----Sample number-----
  /  /                \\  \\
 |  |                  |  |
 0000 0000  0000 0000  0000 0000  0000 0000
      |             |       \\  /  \\       /
       \\           /       effect  effect
        -Note value               parameter
                   


 Follows Sample datas ... use the following formula to
retrieve the original samples :

|------------------------------------------------------|
|  NewSample[0] = OldSample[0]                         |
|  cpt=0                                               |
|                                                      |
|Loop_Point:                                           |
|  NewSample[cpt] = NewSample[cpt-1] + OldSample[cpt]  |
|  cpt = cpt + 1;                                      |
|  goto Loop_Point                                     |
|------------------------------------------------------|

 There, and just dont forget to use SIGNED CHARS !!!!.

@ENDNODE

##
## Promizer 0.1 format
##
@NODE PM01 "* Format Promizer 0.1 *"

Promizer 0.1 packer format (formely known as Avalon packer)
Created by Franck Hulsmann (MC68000/Masque)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - three PMZ packed files sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------

      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
*********************************************************
                                                        *
 0             2         Sample Size / 2                *
 2             1         Finetune (0 -> F)              *
 3             1         Volume (0 - 40h)               *
 4             2         Loop Start / 2                 *
 6             2         Loop Size / 2                  *
                                                        *
*********************************************************

248            2         Size of pattern list (* 4)
(F8h)

250           512        pattern table. It is the address of
(FAh)        (200h)      of pattern. First address is $00000000.

762            4         size of ALL the pattern data
(2FAh)

766            ?         pattern data. stored like 'almost' like
(2FEh)                   Protracker. The difference remains in the
                         fact that you have to 'NOT' all the 4 bytes
                         save for the 4 lower bits.


 So, each is stored that way :


   -----Sample Number----
  /  /                \\  \\
 |  |                  |  |
 0000 0000  0000 0000  0000 0000  0000 0000  
      |             |       |  |  |       |
       \\           /         \\/    \\     /
        Note value         effect   effect
                                  parameter

NOTE: Promizer v0.1 (as v1.0c and v1.8a) saves the "finetuned"
     pitch if the sample got a 'not null' finetune. Refer to
     the table below where there are all the possible pitchs
     for each finetune.



 Follows Sample datas stored like ProTracker.
Nothing is packed..


---------------------
 * Period tables for each tuning (extracted from PT-play.s written by
  Peter "CRAYON" Hanning / Mushroom Studio !). It's the official
  Protracker V2.1A Playroutine .. .

tuning 0: (Standard)
            856,808,762,720,678,640,604,570,538,508,480,453
            428,404,381,360,339,320,302,285,269,254,240,226
            214,202,190,180,170,160,151,143,135,127,120,113

Tuning 1:
            850,802,757,715,674,637,601,567,535,505,477,450
            425,401,379,357,337,318,300,284,268,253,239,225
            213,201,189,179,169,159,150,142,134,126,119,113

Tuning 2:
            844,796,752,709,670,632,597,563,532,502,474,447
            422,398,376,355,335,316,298,282,266,251,237,224
            211,199,188,177,167,158,149,141,133,125,118,112

Tuning 3:
            838,791,746,704,665,628,592,559,528,498,470,444
            419,395,373,352,332,314,296,280,264,249,235,222
            209,198,187,176,166,157,148,140,132,125,118,111

Tuning 4:
            832,785,741,699,660,623,588,555,524,495,467,441
            416,392,370,350,330,312,294,278,262,247,233,220
            208,196,185,175,165,156,147,139,131,124,117,110

Tuning 5:
            826,779,736,694,655,619,584,551,520,491,463,437
            413,390,368,347,328,309,292,276,260,245,232,219
            206,195,184,174,164,155,146,138,130,123,116,109

Tuning 6:
            820,774,730,689,651,614,580,547,516,487,460,434
            410,387,365,345,325,307,290,274,258,244,230,217
            205,193,183,172,163,154,145,137,129,122,115,109

Tuning 7:
            814,768,725,684,646,610,575,543,513,484,457,431
            407,384,363,342,323,305,288,272,256,242,228,216
            204,192,181,171,161,152,144,136,128,121,114,108

Tuning -8:
            907,856,808,762,720,678,640,604,570,538,508,480
            453,428,404,381,360,339,320,302,285,269,254,240
            226,214,202,190,180,170,160,151,143,135,127,120

Tuning -7:
            900,850,802,757,715,675,636,601,567,535,505,477
            450,425,401,379,357,337,318,300,284,268,253,238
            225,212,200,189,179,169,159,150,142,134,126,119

Tuning -6:
            894,844,796,752,709,670,632,597,563,532,502,474
            447,422,398,376,355,335,316,298,282,266,251,237
            223,211,199,188,177,167,158,149,141,133,125,118

Tuning -5:
            887,838,791,746,704,665,628,592,559,528,498,470
            444,419,395,373,352,332,314,296,280,264,249,235
            222,209,198,187,176,166,157,148,140,132,125,118

Tuning -4:
            881,832,785,741,699,660,623,588,555,524,494,467
            441,416,392,370,350,330,312,294,278,262,247,233
            220,208,196,185,175,165,156,147,139,131,123,117

Tuning -3:
            875,826,779,736,694,655,619,584,551,520,491,463
            437,413,390,368,347,328,309,292,276,260,245,232
            219,206,195,184,174,164,155,146,138,130,123,116

Tuning -2:
            868,820,774,730,689,651,614,580,547,516,487,460
            434,410,387,365,345,325,307,290,274,258,244,230
            217,205,193,183,172,163,154,145,137,129,122,115

Tuning -1:
            862,814,768,725,684,646,610,575,543,513,484,457
            431,407,384,363,342,323,305,288,272,256,242,228
            216,203,192,181,171,161,152,144,136,128,121,114


@ENDNODE

##
## Promizer 1.0c format
##
@NODE PM10c "* Format Promizer 1.0c *"

Promizer v1.0c format
Created by MC68000 / TECH (Frank Hlsmann)
Analysed by Asle / ReDoX (asle@warka.com)

(NOTE: almost the very same as PM18a save that ALL the offset are 4 bytes)
(shorter here ...)

Source :
 - "Flower Power" demo by Anarchy


Offset    size (byte)    Comment
------    -----------    -------

 0        4452 (1164h)   Replay routine and, certainly, near the end of this
                         block, some unidentified bytes. Since I could manage
                         without these to convert, I guess they are not that
                         very important.

4452          4          Number of bytes to add to get the sample data
(1164h)                  starting address (so, it's 4456+ "this value").
                         (SDAV - Sample Data Address Value)
                         RMQ: This info could be of great value when
                         ripping, however, I couldn't find any interrest
                         for converting ... .

4456          4          Size of the pattern data, which starts at address
(1168h)                  1466h. (WPS - Whole Patterns Size)

      ***************************************
      * the following is repeated 31 times  *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
4460 (116Ch)   2         Sample Size / 2             *
4462 (116Eh)   1         Finetune (0 -> F)           *
4463 (116Fh)   1         Volume (0 - 40h)            *
4464 (1170h)   2         Loop Start / 2              *
4466 (1172h)   2         Loop Size / 2               *
                                                     *
******************************************************

4708           2         word. (NOP) Number of pattern *4
(1264h)

4710          512        pattern table. It's the starting address of each
(1266h)                  pattern from $1466. Pattern $00 address, in this
                         list, will be $00000000.


5222          WPS        pattern data. Each pattern is 512 bytes long. Though,
(1466h)                  that's the theory because some patterns may NOT be
                         that long. In fact, you'll have to check if the note
                         isn't a PATTERN BREAK command or a PATTERN JUMP. If
                         so, the pattern ends and another begins ... therefore,
                         its size is less than the 512 'standard bytes'.
                         Now, whatever the pattern size is, its meaning does
                         not vary :). In fact, those data are some values which
                         refer to a "reference table" (description is right
                         below).
                         RMQ: first value is 00h.

5222+          ?         the "reference table" which contains the standard
WPS                      PTK pattern data. Its size is easy to calculate since
                         it consists of blocks of 4 bytes, knowing that there
                         are 'n' blocks ('n' is the highest value in the
                         pattern data).


      * Here's a quick description of these four bytes (like ptk ...)

         _____byte 1_____   byte2_    _____byte 3_____   byte4_
        /                 /        /                 /        /
       0000          0000-00000000  0000          0000-00000000
 
       Upper four    12 bits for    Lower four    Effect command.
       bits of sam-  note period.   bits of sam-
       ple number.                  ple number.
 
      Note period table
       C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
       C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
       C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

      * NOTE: This period table is only valid for samples with a finetune
       set to 0 !. Promizer 1.8a saves HERE the fintuned values !. So,
       here follows the lists of the period tables for each tuning, well,
       not HERE :), but at the end of this file ... .
 


5222+WPS       4         Four empty bytes ... . Surely they have a very good
                         reason for beeing here, but, for now, it's beyond
                         my understanding :(.

 (next come the sample datas. We got two ways to find the starting address.)
 (we could follow step by step, as described here, but with a lot of       )
 (calculating ... . Now, there is this long byte in the description that I )
 (find very useful for the job. I use this way below. So, first there is   )
 (less calculating, but also, I think it's FAR safer that way !.           )

4456+SDAV      ?         Sample datas. (The address "4456" is not an error ..)
(1168h)                  I explain this a bit upward.



 Follow Sample datas stored like ProTracker.
Nothing is packed..




---------------------
 * Period tables for each tuning (extracted from PT-play.s written by
  Peter "CRAYON" Hanning / Mushroom Studio !). It's the official
  Protracker V2.1A Playroutine .. .

tuning 0:  (already written above, so check there for this one)

Tuning 1:
            850,802,757,715,674,637,601,567,535,505,477,450
            425,401,379,357,337,318,300,284,268,253,239,225
            213,201,189,179,169,159,150,142,134,126,119,113

Tuning 2:
            844,796,752,709,670,632,597,563,532,502,474,447
            422,398,376,355,335,316,298,282,266,251,237,224
            211,199,188,177,167,158,149,141,133,125,118,112

Tuning 3:
            838,791,746,704,665,628,592,559,528,498,470,444
            419,395,373,352,332,314,296,280,264,249,235,222
            209,198,187,176,166,157,148,140,132,125,118,111

Tuning 4:
            832,785,741,699,660,623,588,555,524,495,467,441
            416,392,370,350,330,312,294,278,262,247,233,220
            208,196,185,175,165,156,147,139,131,124,117,110

Tuning 5:
            826,779,736,694,655,619,584,551,520,491,463,437
            413,390,368,347,328,309,292,276,260,245,232,219
            206,195,184,174,164,155,146,138,130,123,116,109

Tuning 6:
            820,774,730,689,651,614,580,547,516,487,460,434
            410,387,365,345,325,307,290,274,258,244,230,217
            205,193,183,172,163,154,145,137,129,122,115,109

Tuning 7:
            814,768,725,684,646,610,575,543,513,484,457,431
            407,384,363,342,323,305,288,272,256,242,228,216
            204,192,181,171,161,152,144,136,128,121,114,108

Tuning -8:
            907,856,808,762,720,678,640,604,570,538,508,480
            453,428,404,381,360,339,320,302,285,269,254,240
            226,214,202,190,180,170,160,151,143,135,127,120

Tuning -7:
            900,850,802,757,715,675,636,601,567,535,505,477
            450,425,401,379,357,337,318,300,284,268,253,238
            225,212,200,189,179,169,159,150,142,134,126,119

Tuning -6:
            894,844,796,752,709,670,632,597,563,532,502,474
            447,422,398,376,355,335,316,298,282,266,251,237
            223,211,199,188,177,167,158,149,141,133,125,118

Tuning -5:
            887,838,791,746,704,665,628,592,559,528,498,470
            444,419,395,373,352,332,314,296,280,264,249,235
            222,209,198,187,176,166,157,148,140,132,125,118

Tuning -4:
            881,832,785,741,699,660,623,588,555,524,494,467
            441,416,392,370,350,330,312,294,278,262,247,233
            220,208,196,185,175,165,156,147,139,131,123,117

Tuning -3:
            875,826,779,736,694,655,619,584,551,520,491,463
            437,413,390,368,347,328,309,292,276,260,245,232
            219,206,195,184,174,164,155,146,138,130,123,116

Tuning -2:
            868,820,774,730,689,651,614,580,547,516,487,460
            434,410,387,365,345,325,307,290,274,258,244,230
            217,205,193,183,172,163,154,145,137,129,122,115

Tuning -1:
            862,814,768,725,684,646,610,575,543,513,484,457
            431,407,384,363,342,323,305,288,272,256,242,228
            216,203,192,181,171,161,152,144,136,128,121,114


@ENDNODE

##
## Promizer 2.0 format
##
@NODE PM20 "* Format Promizer 2.0 *"

Promizer v2.0 format
Created by MC68000 / Masque / TRSI (Frank Hlsmann)
Analysed by Asle / ReDoX (asle@warka.com)

NOTE: It's more or less the same structure as PM18a. The 'only' great
     difference is the repacking of the Notes (no more like ptk). thus,
     all the crap (!) about the finetuned value in PM18a are no more in
     this version. Periods are replaced by relative note numbers. Far
     easier to handle when converting :).

Source:
 - Two ripped PM20 from various cracktro ..
 - "PM20.Drd" sent by Gryzor (Thx !). Bubble Bobble rules :)


Offset    size (byte)    Comment
------    -----------    -------

 0        5094 (13E6h)   Replay routine and, certainly, near the end of this
                         block, some unidentified bytes. Since I could manage
                         without these to convert, I guess they are not that
                         very important.
5094        72 (48h)     all the 36 note pitch (similar to ptk's). Each is
(13E6h)                  saved as a word. It's not much use to know this,
                         but there are so many unclear bytes in this format,
                         that I welcome every small "victory" like this :).

5198           2         number of pattern (REAL !)
(144Eh)

5200           2         "used" size of the pattern table
(1450h)                  /2 to get pattern list size ...

5202          128        64 word pattern table.
(1452h)

      ***************************************
      * the following is repeated 31 times  *
      * with 8 bytes description for 1 smp  *
******************************************************
                                                     *
5458 (1552h)   2         Sample Size / 2             *
5460 (1554h)   1         Finetune (0 -> 1E) (*2 !)   *
5461 (1555h)   1         Volume (0 - 40h)            *
5462 (1556h)   2         Loop Start / 2              *
5464 (1558h)   2         Loop Size / 2               *
                                                     *
******************************************************


5706           4         Address of sample data + $144E
(164Ah)                  ($144E is the number of pattern address)

5710           4         Address of the "reference table" + $144E
(164Eh)

   NOTE: These two dword give us the size of the "reference table" when
        substracting. ($164A - $164E)

5714                     pattern data. Each pattern is 512 bytes long. Though,
(1652h)                  that's the theory because some patterns may NOT be
                         that long. In fact, you'll have to check if the note
                         isn't a PATTERN BREAK command or a PATTERN JUMP. If
                         so, the pattern ends and another begins ... therefore,
                         its size is less than the 512 'standard bytes'.
                         Now, whatever the pattern size is, its meaning does
                         not vary :). In fact, those data are some values which
                         refer to a "reference table" (description is right
                         below).
                         RMQ: first value is 00h.

$144E          ?         the "reference table" which contains the standard
+$164E                   PTK pattern data. Its size is easy to calculate since
                         it consists of blocks of 4 bytes, knowing that there
                         are 'n' blocks ('n' is the highest value in the
                         pattern data).
                         The other way to get the size is described upward.


      * Here's a quick description of these four bytes

       0000-0000  0000-0000  0000-0000  0000-0000
       ||    |||  |       |  |  | |  |  |       |
       | \\  / ||   \\     /   |  |  \\/    \\     /
       |sample||   relative   \\/ effect  effect
       |      ||   note nbr unused       value
    unused   unused 

 
relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (PM20):

C-1 to B-1 : 02,04,06,08,0a,0c,0e,10,12,14,16,18
C-2 to B-2 : 1a,1c,1e,20,22,24,26,28,2a,2c,2e,30
C-3 to B-3 : 32,34,36,38,3a,3c,3e,40,42,44,46,48

 

?              4         Four empty bytes as in PM18a. Still not figured
                         out their meaning !.

$144E          ?         Sample datas.
+$164A


(NOTE: It seems ProWizard adds four empty bytes here when ripping ... .
The original packer, promizer 2.0, doesn't. ).


@ENDNODE

##
## SKYT Packer format
##
@NODE SKYT "* Format SKYT Packer *"

SKYT packer format
Created by Mr. Bluesky / Drifters (NoiseConverter states it's SKYT/Drifters)
Analysed by Asle / ReDoX (asle@warka.com)

Source :
 - two SKYT packed files sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------

      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
*********************************************************
                                                        *
 0             2         Sample Size / 2                *
 2             1         Finetune (0 -> F)              *
 3             1         Volume (0 - 40h)               *
 4             2         Loop Start / 2                 *
 6             2         Loop Size / 2                  *
                         if there's no loop, this value *
                         is $0000 (not $0001 as ptk !)  *
                                                        *
*********************************************************

248            8         ?!? (empty bytes). It could be for a 32nd
(F8h)                    sample or just to wait $100 address :).

256            4         ID "SKYT"
(100h)

260            1         Size of pattern table (-1)
(104h)

261            ?         Pattern table.
(105h)                   What's really stored is the number of
                         each track.

 dump exemple:

0100: 53 4B 59 54 13 00 0B 00  - 0C 00 0D 00 0E 00 0B 00   SKYT............
0110: 0F 00 10 00 11 00 12 00  - 13 00 14 00 15 00 0B 00   ................

 - pattern table size is 20 ($13+1)
 - first pattern tracks are $000b,$000c,$000d and $000e


?              1         ?!? ($00h)

?              ?         track datas. Each track is 256 bytes long
                         (64 rows * 4 bytes).


 So, each note takes 4 bytes and is stored that way :


   -Relative note Nbr    -Unused
  /     \\               /  /
 |       |             |  |
 0000 0000  0000 0000  0000 0000  0000 0000  
            | ||    |       |  |  |       |
           / /  \\  /         \\/    \\     /
          / /  Sample      effect   effect
  Unused----   number             parameter


relative note number (PTK):

C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453
C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226
C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113

becomes (PRUN1):

C-1 to B-1 : 01,02,03,04,05,06,07,08,09,0a,0b,0c
C-2 to B-2 : 0d,0e,0f,10,11,12,13,14,15,16,17,18
C-3 to B-3 : 19,1a,1b,1c,1d,1e,1f,20,21,22,23,24


 Follows Sample datas stored like ProTracker.
Nothing is packed..
@ENDNODE

##
## StarTrekker Pack format
##
@NODE Star "* Format StarTrekker Pack *"

StarTrekker pack format
Created by Mr. Spiv / Cave (1991)
Analysed by Asle / ReDoX (asle@warka.com)

Source:
  - four packed files sent by Gryzor (thx !)


Offset    size (byte)    Comment
------    -----------    -------
  0         20 (14h)     Title

      **************************************
      * the following is repeated 31 times *
      * with 8 bytes description for 1 smp *
******************************************************
                                                     *
 20            2         Sample Size / 2             *
(14h)                                                *
 22            1         Finetune (0 -> F)           *
(16h)                                                *
 23            1         Volume (0 - 40h)            *
(17h)                                                *
 24            2         Loop Start / 2              *
(18h)                                                *
 26            2         Loop Size / 2               *
(1Ah)                                                *
                                                     *
******************************************************

 268           2         Number of pattern to play (*4)
(10Ch)                   *4 because each pattern is stored as
                         an address (dword)

 270           2         ?!? ($0000)
(10Eh)

 272          512        pattern table. Address of each pattern
(110h)       (200h)      starting AFTER this pattern list. meaning
                         first pattern address is $00000000 !. Just
                         add $314 to each address.

 784           4         Address of sample data (add $314 !).
(310h)

 788           ?         pattern data. the size is between 100h and 400h.
(314h)


 each note is packed as follow :

case 1: (same as ptk with the first bits set to 0)

     Sample number (*4 !!)
    /                   /\\
   ||                  |  |
 0000 0000  0000 0000  0000 0000  0000 0000
 |    |             |       |  |  |       |
 |     \\           /         \\/    \\     /
 |      Note Period        effect   effect
  \\                               parameter
   -- description bit set to 0


case 2: (no note)

   - description bit 7 set to 1
  /
 |
 1000 0000




 Follow Sample datas stored like Protracker.
Nothing is packed..

@ENDNODE

