
From til@informatik.tu-chemnitz.de Fri Aug 18 14:56:40 1995
Path: news.tu-chemnitz.de!fauern!news.th-darmstadt.de!hrz-ws11.hrz.uni-kassel.de!newsserver.rrzn.uni-hannover.de!news.dkrz.de!news.tu-harburg.de!news.dfn.de!news.belwue.de!nadia.s.bawue.de!aragon.bb.bawue.de!osg.bb.bawue.de!jochen
Date: 15 Aug 1995 14:38:00 +0200
From: jochen@osg.bb.bawue.de (Jochen Schaeuble)
Newsgroups: comp.sys.ibm.pc.demos
Message-ID: <5rtNa-z9pVB@osg.bb.bawue.de>
References: <Pine.OSF.3.91.950813102852.8148A-100000@beta.loyno.edu>
Subject: Re: .DMF format?
X-Newsreader: XP v3.02
X-Charset: ISO-8859-1
Organization: T.C.F. - Jochen Schaeuble
Lines: 431

Hi...

  You asked for .DMF-Format Description... ok here it is.
  Also included is a source code to an .DMF sample ripper (UUENCODED .ARJ)

Have Phun

Bye
  Jochen

-------------------------------------------------------------------------
------------------------------------------------------------------------
DELUSION DIGITAL MUSIC FORMAT  -  rev 0.25 (10/6/94)
------------------------------------------------------------------------

Beschreibung des DELUSION DIGITAL MUSIC FORMAT Fileversion 8.
Die Dateikennung ist ".DMF".

Alle frheren DDMF Versionen sind Betaformate und sollten nicht weiter
benutzt werden, Xtracker 1.0 ldt alle Vorgnger Versionen korrekt und
speichert sie als Version 8 ab.


Das DDMF Format ist in folgenden Blcke unterteilt:

[DDMF] Format Kennzeichnung
[INFO] reserviert
[CMSG] Text Mitteilungen
[SEQU] Sequencer, Abspielreihenfolge der Pattern
[PATT] Patterndaten
[INST] reserviert
[SMPI] Defintionen der Samples.
[SMPD] Daten der Samples. Mu hinter dem SMPI Block gespeichert sein.
[ENDE] Endmarkierung des DDMFs


+----------------------------------------------------------------------+
| DDMF Header                                                          |
+------------+--------------------------------------------+------------+
| Fileoffset | Bezeichner                                 | Datentyp   |
+------------+--------------------------------------------+------------+
| 0h         | ID                                         | 4 Chars    |
+------------+--------------------------------------------+------------+
| Filekennung ist "DDMF"                                               |
+------------+--------------------------------------------+------------+
| 4h         | FILE VERSION                               | 1 Byte     |
+------------+--------------------------------------------+------------+
| DDMF Fileversion, diese Beschreibung gilt nur fr Version 8.         |
+------------+--------------------------------------------+------------+
| 5h         | TRACKER NAME                               | 8 Chars    |
+------------+--------------------------------------------+------------+
| Name des benutzten Trackers.                                         |
+------------+--------------------------------------------+------------+
| 0dh        | SONG NAME                                  | 30 Chars   |
+------------+--------------------------------------------+------------+
| Name des Musikstckes, nicht benutzte Zeichen sollten auf 0 stehen.  |
+------------+--------------------------------------------+------------+
| 2bh        | COMPOSER NAME                              | 20 Chars   |
+------------+--------------------------------------------+------------+
| Name des Komponisten, nicht benutzte Zeichen sollten auf 0 stehen.   |
+------------+--------------------------------------------+------------+
| 3fh        | DATE                                       | 3 Bytes    |
+------------+--------------------------------------------+------------+
| Erstellungsdatum: je ein Byte Tag, Monat, Jahr+1900                  |
+----------------------------------------------------------------------+

+----------------------------------------------------------------------+
| CMSG Block: Mitteilungen                                             |
+------------+--------------------------------------------+------------+
| Blockoffs. | Bezeichner                                 | Datentyp   |
+------------+--------------------------------------------+------------+
| 0h         | BLOCKID                                    | 1 Dword    |
+------------+--------------------------------------------+------------+
| Blockkennung "CMSG"                                                  |
+------------+--------------------------------------------+------------+
| 4h         | BLOCKLENGTH                                | 1 Dword    |
+------------+--------------------------------------------+------------+
| Lnge in Bytes bis zum nchsten Block.                               |
+------------+--------------------------------------------+------------+
| 8h         | FILLER                                     | 1 Byte     |
+------------+--------------------------------------------+------------+
| reserviert                                                           |
+------------+--------------------------------------------+------------+
| 9h         | MESSAGE                                    | Chars      |
+------------+--------------------------------------------+------------+
| ASCII-Text mit einer festen Zeilenlnge von 40 Zeichen.              |
| Lnge von MESSAGE = (BLOCKLENGTH - 1) Bytes.                         |
+----------------------------------------------------------------------+

+----------------------------------------------------------------------+
| SEQU Block: Sequencer, Abspielreihenfolge der Pattern                |
+------------+--------------------------------------------+------------+
| Blockoffs. | Bezeichner                                 | Datentyp   |
+------------+--------------------------------------------+------------+
| 0h         | BLOCKID                                    | 1 Dword    |
+------------+--------------------------------------------+------------+
| Blockkennung "SEQU"                                                  |
+------------+--------------------------------------------+------------+
| 4h         | BLOCKLENGTH                                | 1 Dword    |
+------------+--------------------------------------------+------------+
| Lnge in Bytes bis zum nchsten Block.                               |
+------------+--------------------------------------------+------------+
| 8h         | SEQUENCER LOOP START                       | 1 Word     |
+------------+--------------------------------------------+------------+
| Sequencer Schleifenanfang                                            |
+------------+--------------------------------------------+------------+
| 0ah        | SEQUENCER LOOP END                         | 1 Word     |
+------------+--------------------------------------------+------------+
| Sequencer Schleifenende                                              |
+------------+--------------------------------------------+------------+
| 0ch        | SEQUENCER                                  | Words      |
+------------+--------------------------------------------+------------+
| Liste der Patternnummern die nacheinander abgespielt werden.         |
| Lnge von SEQUENCER = (BLOCKLENGTH - 4) Bytes                        |
+----------------------------------------------------------------------+

+----------------------------------------------------------------------+
| PATT Block: Patterndaten                                             |
+------------+--------------------------------------------+------------+
| Blockoffs. | Bezeichner                                 | Datentyp   |
+------------+--------------------------------------------+------------+
| 0h         | BLOCKID                                    | 1 Dword    |
+------------+--------------------------------------------+------------+
| Blockkennung "PATT"                                                  |
+------------+--------------------------------------------+------------+
| 4h         | BLOCKLENGTH                                | 1 Dword    |
+------------+--------------------------------------------+------------+
| Lnge in Bytes bis zum nchsten Block.                               |
+------------+--------------------------------------------+------------+
| 8h         | PATTERN ENTRIES (1-1024)                   | 1 Word     |
+------------+--------------------------------------------+------------+
| Anzahl der gespeicherten Pattern.                                    |
+------------+--------------------------------------------+------------+
| 0ah        | MAX TRACKS (1-32)                          | 1 Byte     |
+------------+--------------------------------------------+------------+
| Anzahl der der maximal benutzten Tracks.                             |
+------------+--------------------------------------------+------------+
| 0bh        | PATTERNS                                   | Words      |
+------------+--------------------------------------------+------------+
| Folgende Struktur PATTERN ENTRIES mal wiederholt                     |
|+------------+-------------------------------------------+------------+
|| Patternoff.| Bezeichner                                | Datentyp   |
|+------------+-------------------------------------------+------------+
|| 0h         | TRACK ENTRIES (1-1024)                    | 1 Byte     |
|+------------+-------------------------------------------+------------+
|| Anzahl der gespeicherten Tracks in diesem Pattern.                  |
|+------------+-------------------------------------------+------------+
|| 1h         | BEAT                                      | 1 Byte     |
|+------------+-------------------------------------------+------------+
|| BEAT = xxxxyyyy                                                     |
||        ||||++++- reserviert                                         |
||        ++++----- Notenzeilen pro Beatschlag                         |
|+------------+-------------------------------------------+------------+
|| 2h         | TICK ENTRIES                              | 1 Word     |
|+------------+-------------------------------------------+------------+
|| Anzahl der gespeicherten Notenzeilen in diesem Pattern              |
|+------------+-------------------------------------------+------------+
|| 4h         | PATTERNLENGTH                             | 1 Dword    |
|+------------+-------------------------------------------+------------+
|| Lnge der Patterndata, Bytes bis zum nchsten Pattern.              |
|+------------+-------------------------------------------+------------+
|| 6h         | PATTERDATA                                | Bytes      |
|+------------+-------------------------------------------+------------+
|| Der Patterndatenstrom ist folgendermassen codiert:                  |
||                                                                     |
|| Folgende Struktur TICK ENTRIES mal wiederholt                       |
||+--------------------------------------------------------------------+
||| <GLOBAL TRACK> (<TRACK> * TRACK ENTRIES)                           |
||+--------------------------------------------------------------------+
||| GLOBAL TRACK                                                       |
|||                                                                    |
|||  INFO          1 Byte                                              |
|||  (COUNTER)     1 Byte                                              |
|||  (DATA)        1 Byte                                              |
|||                                                                    |
|||  INFO = xxxxxxxx                                                   |
|||         ||||||||                                                   |
|||         ||++++++- Global Track Ereigniss                           |
|||         |+------- reserviert                                       |
|||         +-------- Pack                                             |
|||                                                                    |
|||  Falls Pack=1 ist das nchst gelesene Byte COUNTER.                |
|||  COUNTER ist ein Zhler der jede Notenzeile herunter gezhlt wird, |
|||  es sind keine GLOBAL Track Informationen gespeichert bis COUNTER  |
|||  wieder auf 0 steht. COUNTER wird bei einem Patternwechsel auf 0   |
|||  gesetzt. Ist Pack=0 so ist kein COUNTER gespeichert und fr       |
|||  COUNTER gilt der Wert 0, d.h. im nchsten Tick ist wieder ein     |
|||  GLOBAL TRACK gespeichert.                                         |
|||                                                                    |
|||  Falls Global Track Ereigniss > 0 ist folgt ein weiters Byte DATA, |
|||  das die Effektdaten fr den zugehrige Ereigniss liefert. Ist das |
|||  Global Track Ereigniss = 0 ist DATA nicht gespeichert.            |
|||                                                                    |
|||  Definition der Global Track Ereignisse siehe DMF_EFF.TXT          |
|||                                                                    |
||+--------------------------------------------------------------------+
||| TRACK                                                              |
||| ------                                                             |
|||                                                                    |
|||  INFO                 1 Byte                                       |
|||  (COUNTER)            1 Byte                                       |
|||  (INSTRUMENT)         1 Byte                                       |
|||  (NOTE)               1 Byte                                       |
|||  (VOLUME)             1 Byte                                       |
|||  (INSTRUMENT EFFECT)  2 Bytes                                      |
|||  (NOTE EFFECT)        2 Bytes                                      |
|||  (VOLUME EFFECT)      2 Bytes                                      |
|||                                                                    |
|||                                                                    |
|||  INFO                                                              |
|||  -----                                                             |
|||                                                                    |
|||  INFO = xxxxxxxx                                                   |
|||         ||||||||                                                   |
|||         |||||||x reserviert                                        |
|||         ||||||1=VOLUME EFFECT gespeichert / 0=nicht gespeichert    |
|||         |||||1=NOTE EFFECT gespeichert / 0 ...                     |
|||         ||||1=INSTRUMENT EFFECT gespeichert / 0 ...                |
|||         |||1=VOLUME gespeichert / 0 ...                            |
|||         ||1=NOTE gespeichert / 0 ...                               |
|||         |1=INSTRUMENT gespeichert / 0 ...                          |
|||         1=COUNTER gespeichert / 0 ...                              |
|||                                                                    |
|||  Folgende Werte sind also nur gespeichert wenn die entsprechenden  |
|||  Bits in INFO gesetzt sind, wenn nicht bedeuted das keine nderung |
|||  des entsprechenden Parameters.                                    |
|||                                                                    |
|||                                                                    |
|||  COUNTER                                                           |
|||  --------                                                          |
|||                                                                    |
|||  COUNTER ist ein Zhler der jeden Tick herunter gezhlt wird, es   |
|||  sind keine Informationen fr diesen Track gespeichert bis COUNTER |
|||  wieder auf 0 steht. COUNTER wird bei einem Patternwechsel auf 0   |
|||  gesetzt. Ist COUNTER nicht gespeichert so gilt fr COUNTER der    |
|||  Wert 0, d.h. fr die nchsten Notenzeilen sind wieder Daten fr   |
|||  diesen Track gespeichert.                                         |
|||                                                                    |
|||                                                                    |
|||  INSTRUMENT                                                        |
|||  -----------                                                       |
|||                                                                    |
|||  Die Samplenummer des Samples das Angeschlagen wird.               |
|||                                                                    |
|||                                                                    |
|||  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 definiert                                        |
|||   129-236 = Die Note wird in den Notenpuffer gespeichert und nicht |
|||             gespielt, eine spielende Note wird nicht verndert.    |
|||             Das MSBit wird gelscht die Noten entsprechen dann den |
|||             Noten 1-108.                                           |
|||             Der Notenpuffer wird als 2 Parameter fr Noten-Effekte |
|||             verwendet z.B. fr Note Portamentos, wo die Effekt-    |
|||             daten schon fr den Steigungsgrad vergeben sind.       |
|||                                                                    |
|||   237-254 = Nicht definiert                                        |
|||   255     = Note Off, setzt die Notenfrequenz auf 0 hz             |
|||                                                                    |
|||                                                                    |
|||  VOLUME                                                            |
|||  -------                                                           |
|||                                                                    |
|||   0     = Nicht definiert                                          |
|||   1-255 = Neue Lautstrke des Tracks, lineare Skalierung           |
|||                                                                    |
|||                                                                    |
|||  INSTRUMENT EFFECT                                                 |
|||  ------------------                                                |
|||                                                                    |
|||   1.Byte: Instrument Effekt Nr.                                    |
|||   2.Byte: Instrument Effekt Daten                                  |
|||                                                                    |
|||                                                                    |
|||  NOTE EFFECT                                                       |
|||  ------------                                                      |
|||                                                                    |
|||   1.Byte: Noten Effekt Nr.                                         |
|||   2.Byte: Noten Effekt Daten                                       |
|||                                                                    |
|||                                                                    |
|||  VOLUME EFFECT                                                     |
|||  --------------                                                    |
|||                                                                    |
|||   1.Byte: Volume Effekt Nr.                                        |
|||   2.Byte: Volume Effekt Daten                                      |
|||                                                                    |
|||                                                                    |
|||  Definition der Volume,Noten,Instrument Effekte in DMF_EFF.TXT     |
|||                                                                    |
||+--------------------------------------------------------------------+
|+---------------------------------------------------------------------+
+----------------------------------------------------------------------+

+----------------------------------------------------------------------+
| SMPI Block: Sample Defintionen                                       |
+------------+--------------------------------------------+------------+
| Blockoffs. | Bezeichner                                 | Datentyp   |
+------------+--------------------------------------------+------------+
| 0h         | BLOCKID                                    | 1 Dword    |
+------------+--------------------------------------------+------------+
| Blockkennung "SMPI"                                                  |
+------------+--------------------------------------------+------------+
| 4h         | BLOCKLENGTH                                | 1 Dword    |
+------------+--------------------------------------------+------------+
| Lnge in Bytes bis zum nchsten Block.                               |
+------------+--------------------------------------------+------------+
| 8h         | SAMPLE ENTRIES (1-255)                     | 1 Word     |
+------------+--------------------------------------------+------------+
|  Anzahl der gespeicherten Samples, maximal 255.                      |
+------------+--------------------------------------------+------------+
| 6h         | SAMPLES                                    | Bytes      |
+------------+--------------------------------------------+------------+
| Folgende Struktur SAMPLE ENTRIES mal wiederholt                      |
|+------------+-------------------------------------------+------------+
|| Sampleoff. | Bezeichner                                | Datentyp   |
|+------------+-------------------------------------------+------------+
|| 0h         | Y = NAME LENGTH (0-30)                    | 1 Byte     |
|+------------+-------------------------------------------+------------+
|| Lnge des Samplenamens, die Lnge des ist auf maximal 30 Zeichen    |
|| beschrnkt.                                                         |
|+------------+-------------------------------------------+------------+
|| 1h         | SAMPLE NAME                               | X Chars    |
|+------------+-------------------------------------------+------------+
|| Name des Samples in ASCII Zeichen. Lnge des Namens ist NAME LENGTH |
|| Zeichen.                                                            |
|+------------+-------------------------------------------+------------+
|| Y + 1h     | SAMPLE LENGTH                             | 1 Dword    |
|+------------+-------------------------------------------+------------+
|| Lnge des Samples in Bytes.                                         |
|+------------+-------------------------------------------+------------+
|| Y + 5h     | SAMPLE LOOP START                         | 1 Dword    |
|+------------+-------------------------------------------+------------+
|| Sample Schleifen Start Position.                                    |
|+------------+-------------------------------------------+------------+
|| Y + 9h     | SAMPLE LOOP END                           | 1 Dword    |
|+------------+-------------------------------------------+------------+
|| Sample Schleifen End Position.                                      |
|+------------+-------------------------------------------+------------+
|| Y + 0dh    | C3 FREQUENCY                              | 1 Word     |
|+------------+-------------------------------------------+------------+
|| Frequenz, in Hz, mit der das Sample bei der Note C-3 gespielt wird. |
|| Das Sample kann dadurch beliebig gestimmt werden. Gltiger Bereich  |
|| fr C3 FREQUENCY ist 1000-45000 Hz.                                 |
|+------------+-------------------------------------------+------------+
|| Y + 0fh    | VOLUME                                    | 1 Byte     |
|+------------+-------------------------------------------+------------+
|| Samplelautstrke.                                                   |
||                                                                     |
|| VOLUME = 0 kein Auswirkung                                          |
||          1-255 Lautstrke, linearer Skalierung                      |
|+------------+-------------------------------------------+------------+
|| Y + 10h    | TYPE                                      | 1 Byte     |
|+------------+-------------------------------------------+------------+
||                                                                     |
|| TYPE = xxxxxxx0   = kein Schleife                                   |
||        xxxxxxx1   = Sample wird mit einer Schleife gespielt, das    |
||                     Sample spielt vom Start bis SAMPLE LOOP END und |
||                     wiederholt danach den Bereich von SAMPLE LOOP   |
||                     START bis SAMPLE LOOP END.                      |
||        xxxxxx0x   = 8BIT Sample                                     |
||        xxxxxx1x   = 16BIT Sample                                    |
||        xxxxXXxx   = Kompremierungsverfahren                         |
||        xxxx00xx   = Unkompremiert vorzeichenbehaftet                |
||        xxxx01xx   = Kompremierungs Typ0                             |
||        xxxx10xx   = (Kompremierungs Typ1)                           |
||        xxxx11xx   = (Kompremierungs Typ2)                           |
||        xXXXxxxx   = nicht Definiert                                 |
||        0xxxxxxx   = --> Die Sampledaten sind im SMPD Block des DMFs |
||                     gespeichert.                                    |
||        1xxxxxxx   = --> Die Sampledaten sind in einer Biblothek     |
||                     gespeichert.                                    |
||                                                                     |
|+------------+-------------------------------------------+------------+
|| Y + 11h    | LIBRARY NAME                              | 8 Byte     |
|+------------+-------------------------------------------+------------+
|| Biblotheks Kennzeichnung unter der das Sample zu finden ist.        |
|+------------+-------------------------------------------+------------+
|| Y + 19h    | FILLER                                    | 1 Word     |
|+------------+-------------------------------------------+------------+
|| reserviert                                                          |
|+------------+-------------------------------------------+------------+
|| Y + 1bh    | ID CRC32                                  | 1 DWord    |
|+------------+-------------------------------------------+------------+
|| Prfsumme der Sampledaten.                                          |
|+---------------------------------------------------------------------+
+----------------------------------------------------------------------+

+----------------------------------------------------------------------+
| SMPD Block: Sample Daten                                             |
+------------+--------------------------------------------+------------+
| Blockoffs. | Bezeichner                                 | Datentyp   |
+------------+--------------------------------------------+------------+
| 0h         | BLOCKID                                    | 1 Dword    |
+------------+--------------------------------------------+------------+
| Blockkennung "SMPD"                                                  |
+------------+--------------------------------------------+------------+
| 4h         | BLOCKLENGTH                                | 1 Dword    |
+------------+--------------------------------------------+------------+
| Lnge in Bytes bis zum nchsten Block.                               |
+------------+--------------------------------------------+------------+
| 8h         | SAMPLE DATA                                | Bytes      |
+------------+--------------------------------------------+------------+
| Folgende Struktur SAMPLE ENTRIES (SMPI) wiederholt                   |
|+------------+-------------------------------------------+------------+
|| Sampleoff. | Bezeichner                                | Datentyp   |
|+------------+-------------------------------------------+------------+
|| 0h         | SAMPLE DATA LENGTH                        | 1 Dword    |
|+------------+-------------------------------------------+------------+
|| Lnge des Sampledatenstroms. Bei kompremierten Samples die Lnge    |
|| des Samplepackstroms. Bei einem Sample das in einer Biblothek       |
|| gespeichert ist steht SAMPLE DATA LENGTH auf 0.                     |
|+------------+-------------------------------------------+------------+
|| 4h         | SAMPLE DATA STREAM                        | X Bytes    |
|+------------+-------------------------------------------+------------+
|| Sampledatenstrom.                                                   |
|+---------------------------------------------------------------------+
+----------------------------------------------------------------------+

+----------------------------------------------------------------------+
| ENDE Block: End-Markierung des DDMFs                                 |
+------------+--------------------------------------------+------------+
| Blockoffs. | Bezeichner                                 | Datentyp   |
+------------+--------------------------------------------+------------+
| 0h         | "ENDE"                                     | 1 Dword    |
+------------+--------------------------------------------+------------+
## CrossPoint v3.02 ##

