DMF-FORM.TXT

─────────────────────────────────────────────────────
DELUSION DIGITAL MUSIC FILEFORMAT  V0.16B1 (25/12/93)
─────────────────────────────────────────────────────

Sorry dudes, some stuff is still in German, but who carez ;-)
Will be converted to English soon.... Ask us for probz


EXTENSION IS  ".DMF"

Header [DDMF]:
══════════════
             ID                   "DDMF"                   4   BYTES
             VERSION              current is 04            1   BYTE
             TRACKER NAME         ex. "XTRACKER" ;-)       8   BYTES
             SONG NAME            ex. "my first DMF"       30  BYTES
             COMPOSER NAME        ex. "COSMIC"             20  BYTES
             DATE                 ex. "27 12 93"           3   BYTES
                                  Day,Month,Year


InfoHeader [INFO]:
══════════════════
             ID                   "INFO"                   4   BYTES
             INFO_SIZE            Jump Bytes to next Block 1   LONGINT


Composer Message [CMSG]:
════════════════════════
             ID                   "CMSG"                    4  BYTES
             MSG_SIZE             Jump Bytes to next Block  1  LONGINT
             Filler                                         1  BYTE
             Message              array of char             N  BYTES


Sequencer [SEQU]:
═════════════════
             ID                   "SEQU"
             SEQU_SIZE            Jump Bytes to next Block 1   LONGINT
             SEQU LOOP START                               1   WORD
             SEQU LOOP END                                 1   WORD
             SEQUENCER            (SEQU_SIZE/2 WORDS)-1 !!!


Pattern [PATT]:
═══════════════

             ID                   "PATT"                   4   BYTES
             PATT_SIZE            Jump Bytes to next Block 1   LONGINT
             MAX PATTERN          1-1024                   1   WORD
             MAX TRACKS           Tracks required to play  1   BYTE
                                  this piece of Music =<16

For 1 to MAX PATTERN:

               TRACK ENTRYS         Tracks (max.32)          1   BYTE
               BEAT                 HI│LOW                   1   BYTE
                                     │  │
                    Ticks per Beat ──┘  └── Beats per Measure

               MAX TICK             Ticks the Pattern is     1   WORD
                                    long. (max. 512)
               JMP_SIZE             Bytes to Jump to next    1   LONGINT
                                    Pattern


Track Datastream:  (( ) * MAX Tracks)
                   (( ) * MAX Tracks)
                      ...

GLOBAL TRACK
─────────────

                EFFECT               the global effect        1   BYTE
                DATA                 the data for gl. eff.    1   BYTE
                                     only stored if EFFECT>0

 Getrennte allgemeine Spur für:

  Speed, Delays, Beat/Tick Change, Flags, General Volume


INFO BYTE
──────────

XXXXXXXX  = Info Byte
││││││││
│││││││x not used
││││││1 Effekt VOLUME / 0 not stored
│││││1 Effekt NOTE / 0 not stored
││││1 Effekt INSTRUMENT / 0 not stored
│││1 Volume stored / 0 not stored
││1 Note stored / 0 not stored
│1 Instrument stored / 0 not stored
1 Counter to next Info Byte / 0 not stored, next Info Byte in 1 Tick

Wenn ein Bit im Info gesetzt ist ein Daten Byte für den Eintrag
gespeichert bei Effekten sind 2 Daten Byte (Effekt Nr. und Effekt Daten)
gespeichert.

Counter ist ein Zähler in Ticks bis zum nächsten Info Byte wenn Counter Bit
in Info = 0 dann ist für den nächsten Tick wieder ein Info Byte
vorhanden.

Effekt Gruppen:

INSTRUMENT: Jump Position, Loop Controll, Reverse, Scratch, Filter

NOTE: Portamento, Tremolo, Vibrato, Arpeggio

VOLUME: Set, Slide, Tremolo, Vibrato, Arpeggio, Stereo

Es könnten also maximal 3 Effekte gleichzeitig ausgelöst werden jeder in
einem anderen Bereich. Maximale Grösse eines Track Eintrags sind 11 Byte
(Info=0FEh).


Def.: Note

       0       = Keine Änderung
       1-108   = Note in Halbtonschritten,  C0=1 bis H8=108
                 Dies entspricht einer Midi Note mit 1 addiert
       109-128 = nicht defined
       129-236 = Set Note Buffer
                 Die Note wird in den Note Buffer gespeichert und nicht
                 gespielt, eine spielende Note wird dabei nicht verändert.
                 Das MSBit wird gelöscht die Noten entsprechen dann den
                 Noten 1-108.

                 Der Note Buffer wird als 2 Parameter für Note Effekte
                 verwendet z.B. für Tone Portamentos wo die Effekt Daten
                 schon für den Steigungsgrad vergeben sind.
                 Note Buffer könnte man auch dazu verwenden um Noten aus
                 zuklammern, also um auszuprobieren wie sich das Stück
                 ohne diese Note anhört ;-)

       237-254 = nicht definiert
       255     = Note Off

Def.: Volume

       0 = keine Änderung
       1 - 255 = Volume (255=Max Volume, linear Scale)

  For 1 to MAX TICKS:

    Global Effect Nr.                1 BYTE
    (Effect Data)                    1  "


    For 1 to MAX TRACKS

      PatternEntry:
      ─────────────
      Info Byte                      1 BYTE
      (Counter Byte)                 1  "
      (Instrument Byte)              1  "
      (Note Byte)                    1  "
      (Volume Byte)                  1  "
      (INSTRUMENT Effekt Word)       2  "
      (NOTE Effekt Word)             2  "
      (VOLUME Effekt Word)           2  "

    END MAX TRACKS
  END MAX TICKS
END MAX PATTERN


Instrument [INST]:
═══════════════════

Ist dieser Block nicht vorhanden zeigen die Instrument Nr. im Pattern
direkt auf die Samples im [SMPI] Block.

             ID                   "INST"                   4   BYTES
             INSTR_SIZE            Jump Bytes to next Block 1   LONGINT
             MAX INSTR             max. 255                 1   BYTE

             NAME                 the Instrumentname       30  BYTES

             INSTR TYPE                                     1  BYTE
                   xxxxxxXX   = Instrument Type
                   xxxxxx00   = Sample aus [SMPI] Block
                   xxxxxx01   = Midi Device, Midi Keyboard
                   xxxxxx10   = FM Instrument ;-)))))))
                   xxxxxx11   = Not Defined
                   xxxxxXxx   = 1 = valid Attack Envelop, 0 = not valid
                   xxxxXxxx   = 1 = Sustain ON, 1 = Sustain OFF
                   XXXXxxxx   = not used

             RANGE ENTRYS         Anzahl der Range Definition Entrys
                                                            1  BYTE
For 1 to RANGE ENTRYS
             RANGE DEFINITION
             SMPI NR              Nr. des Samples im [SMPI] Block
                                  das für diesen Bereich gespielt
                                  wird                      1  BYTE
             RANGE_Length         Halbtonschritte der dieser Eintrag
                                  gilt                      1  BYTE
END RANGE DEFINTION

             ENVELOP              6 Point Envelop noch nicht geanu
                                  definiert ;-)



SampleInfo [SMPI]:
══════════════════
             ID                   "SMPI"                   4   BYTES
             SMPI_SIZE            Jump Bytes to next Block 1   LONGINT
             MAX SAMPLES          max. 250                 1   BYTE

For 1 to MAX SAMPLES:

             NAME_LENGTH          length of NameBlock      1   BYTE
             NAME                 the samplename           NAME_LENGTH BYTES
             LENGTH               length of Sample         1   LONGINT
             LOOP_START           start of the loop        1   LONGINT
             LOOP_END             end of the loop          1   LONGINT
             FREQUENCY            frequency for C-3        1   WORD
             VOLUME               Instrument Volume        1   BYTE
                                  0 = don't change current Volume
                                  1 - 255 = Volume (255=Max Volume, linear Scale)
             TYPE                 sample type              1   BYTE
                              xxxxxxx0   = not looped
                              xxxxxxx1   = looped
                              xxxxxx0x   = 8BIT
                              xxxxxx1x   = 16BIT    (not yet supported)
                              xxxxXXxx   = Packe Type
                              xxxx00xx   = Unpacked signed
                              xxxx01xx   = Pack Type 0
                              xxxx10xx   = Pack Type 1
                              xxxx11xx   = Pack Type 2
                              xXXXxxxx   = not defined.
                              0xxxxxxx   = --> stored in dmf
                              1xxxxxxx   = --> stored in bib.

             FILLER               not defined ;-)         1   WORD
                                  should be zero

             CRC32_ID             checksum do identify    1   DWORD
                                  equal Samples in bib.

END MAX SAMPLES


SampleData [SAMPD]:
═══════════════════
             ID                   "SMPD"                   4   BYTES
             SMPD_SIZE            Jump Bytes to next Block 1   LONGINT

             SAMPLELENTGH         Jump Bytes to next Entry 1   LONGINT
             SAMPLE DATA          Data of Sample         SAMPLELENGTH Bytes

Stream:       


[Ende]:      ID                   "ENDE"
═══════

END DDMF

═════════════════════════════════════════════════════════════════════════════

Das DMF Format ist somit folgende Blöcke unterteilt:

[DDMF] Format Kennzeichnung. The almighty DELUSION DIGITAL MUSIC FORMAT ;-)

[INFO] Info wird nur wenn nötig gespeichert. Defintion fehlt...

[SEQU] Sequencer, solange wie der Block

[PATT] Pattern Data, es ist für jeden Pattern eine beliebige Track Zahl
       möglich sonst werden bei 16 Spuren z.b. in einem Pattern nur 4 benützt
       werden zuviel Overhead gespeichert.

[SMPI] Info der Samples.

[SMPD] Daten der Samples. Sollte nach dem SMPI Block gespeichert sein.

[ENDE] Letzter Block im File ;-)