ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ³ DIGITRAKKER FILE-FORMAT INFORMATION by proton/n-Factor ³ ³ ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; This file contains information about the songmodule-format "MDL" and the sample-format "SPL". If you have some problems or if you have questions about these formats, which are not answered in here, just contact me. ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º THE SONGMODULE-FORMAT (MDL) V000 º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Offset Lenght Description 000 004 "DMDL"; the four letters mark the mdl-format 004 001 version; the current version is 0 005 ??? the different data-blocks are stored at this position The MDL-songmodule-format is subivided into the following blocks: "IN" - infoblock; contains most songparameters, like speed, length etc. "PN" - patternnames; contains the names of the pattern "ME" - songmessage; contains the songinformation from the composer "PA" - pattern; contains the tracklists for every pattern "TR" - tracks; contains the different tracks for the pattern "IS" - instruments; contains information for every used sample "SA" - samples; contains the sample-datas The sequence of the blocks in a file is not fixed so they can be stored in any way. Digitrakker uses the descripted sequence. The structure for every block is the same: Offset Lenght Description 000 002 "xx"; block-ID (example: "IN" for infoblock) 002 004 blocklength; this dword contains the length of the following datas. 006 datas for this block... The next block will be at offset (006 + ). ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ The Infoblock (IN) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Offset Lenght Description 000 002 "IN"; infoblock-ID 002 004 blocklenght 006 032 songname; name of the songmodule (filled with spaces [32]) 038 020 composername; name of the song-composer 058 002 songlength; Digitrakker supports up to 255 songpositions 060 002 songrepeat 062 001 mainvolume (001-255) 063 001 song-speed (001-255) 064 001 beats per minute (004-255) 065 032 channel-information: bit 0-6 - panposition (0=left,127=right) bit 7 - 0=channel on, 1=channel off 097 sequencer; contains the number of the pattern for every songposition ??? the names for every channel (8 chars for one name). = 8 * ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ The Patternnames (PN) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Offset Lenght Description 000 002 "PN"; patternnames-ID 002 004 blocklenght 006 the names for every pattern (16 chars for one name). = 16 * ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ The Songmessage (ME) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Offset Lenght Description 000 002 "ME"; songmessage-ID 002 004 blocklenght 006 ??? songmessage; every line is closed with the CR-char (13). A 0-byte stands at the end of the whole text. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ The Patterndatas (PA) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Offset Lenght Description 000 002 "PA"; patterndata-ID 002 004 blocklenght 006 001 number of pattern; values from 1 to 255 are possible 007 tracksequencing-data for the used patterns; These sequencer-lists descripe which track is used as which voice in each saved pattern. Every pattern consists of 32 channels. The first word in this list is the number of the track at pattern 0, voice 0. The second is track for pattern 0, voice 1 and so on... As every pattern consists of 32 voices (channels), the tracksequencing-list needs 32 words = 64 bytes. = 64 * . As every track is saved independend, it is possible to save some discspace by this methode: If the song contains equal tracks at several positions in the patterns, these double tracks will only saved one time. Track 0 is not saved and represents an empty track. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ The Trackdatas (TR) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Offset Lenght Description 000 002 "TR"; trackdata-ID 002 004 blocklenght 006 002 number of tracks 008 ??? track-datablocks; every trackdatablock is stored in this way: Ofs.000 Len.002 length of the trackdatas 002 datas for this track Every track consists of 64 notepositions and every notposition contains 6 bytes: byte 0 - note-value; 1=C-0,2=C#0,...,120=B-9,0=nothing,255=stopper byte 1 - sample-number; 1-255; 0=nothing byte 2 - volume; 1-255; 0=no volume change byte 3, low nibble - number of the first effect-command byte 3, high nibble - number of the second effect-command byte 4 - databyte for the first effect-command byte 5 - databyte for the second effect-command So one track needs 6 * 64 = 384 bytes in the memory. Digitrakker stores the tracks in a packed way. The structure of this (very effective!) packformat is the following: bit 76543210 byte 0 - xxxxxxyy if yy = 00 -> +1 is the number of the empty notepositions which are following. if yy = 01 -> the last noteposition will be repeated +1 times. if yy = 10 -> the noteslot from position is copied to the actual position. if yy = 11 -> the following datas will be put in the actual noteslot: bit 2 = 1 -> note bit 3 = 1 -> sample bit 4 = 1 -> volume bit 5 = 1 -> effectcommand numbers bit 6 = 1 -> databyte for effect 1 bit 7 = 1 -> databyte for effect 1 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ The Instrument-Infoblock (IS) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Offset Lenght Description 000 002 "IS"; intrumentinfo-ID 002 004 blocklenght 006 001 number of samples; vales from 0 to 255 are possible 007 instrument-datas; the datablock for an instrument contains 57 bytes, so = 57 * number of saved samples The structure of one instrument-datablock: 000 001 sample-number; (1-255) 001 032 sample-name; the name of the sample (filled with [32]) 033 008 filename of the sample 041 002 C-4 sample-frequence in hz (00000-65535) 043 004 sample-length 047 004 sample-repeatstart 051 004 sample-repeatlength; if this value is set to 0, the sample will not loop 055 001 sample-volume (001-255) 056 001 infobyte: bit 0 -> 0=8 bit sample, 1=16 bit sample bit 1 -> 0=forward looping, 1=bidirectional looping bit 2,3 -> packmethode (0=not packed, methodes 2 and 3 doesn't exist in this version) bit 4-7 -> not used (should be set to 0) ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ The Sampledatas (SA) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Offset Lenght Description 000 002 "SA"; sampledata-ID 002 004 blocklenght 006 ??? sampledatas; samples are stored in numeric sequence Unpacked samples are stored in signed form. Packmethode (1) only works with 8 bit samples, so 16 bit samples will always be unpacked. The description of the sample-packmethode (1):... This methode is based on the huffman-algorithm. It's an easy form, but very fast and effective on samples. The packed sample is a bit-data-stream: Byte 0 Byte 1 Byte 2 Byte 3 Bit 76543210 fedcba98 nmlkjihg ....rqpo A packed byte is stored in the following form: xxxx10..0s => byte = + (number of <0>-bits between s and 1) * 16 - 8 ; if s=1 then byte = byte xor 255 If there are no <0>-bits between the first bit (sign) and the <1>-bit, you have the following form: xxx1s => byte = ; if s=1 then byte = byte xor 255 To depack one byte, you have to use the following algorithm: ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ read bit ³ ³ sign = bit ³ ³ read bit ³ ³ if bit = 1 ³ ³ then read [3bits] ³ ³ byte = [3bits] ³ ³ goto next ³ ³ else byte = 8 ³ ³loop: read bit ³ ³ if bit = 0 ³ ³ then byte = byte + 16 ³ ³ goto loop ³ ³ else read [4bits] ³ ³ byte = byte + [4bits] ³ ³next: if sign = 1 ³ ³ then byte = byte xor 255 ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Two examples: xxxx s 1001101 = ( 9 + 1 * 16 - 8 ) xor 255 = 238 xxx s 01010 = 2 Note that the depacked bytes are delta values. To convert them to real data use this algorithm: oldbyte = 0 for sampleposition = 1 to samplelength newbyte = byte [sampleposition] + oldbyte byte [sampleposition] = newbyte oldbyte = newbyte next sampleposition ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º THE SAMPLE-FORMAT (SPL) V000 º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Offset Lenght Description 000 004 "DSPL"; the four letters mark the spl-format 004 001 version; the current version is 0 005 032 sample-name; the name of the sample (filled with [32]) 037 008 filename of the sample 045 002 C-4 sample-frequence in hz (00000-65535) 047 004 sample-length 051 004 sample-repeatstart 055 004 sample-repeatlength; if this value is set to 0, the sample will not loop 059 001 sample-volume (001-255) 060 001 infobyte: bit 0 -> 0=8 bit sample, 1=16 bit sample bit 1 -> 0=forward looping, 1=bidirectional looping bit 2,3 -> packmethode (0=not packed, methodes 2 and 3 doesn't exist in this version) bit 4-7 -> not used (should be set to 0) 061 ??? sampledatas... (see above)