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 Hlsmann) (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 Hlsmann) 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 Hlsmann) 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 Hlsmann) 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