blob: c6161d2c159a624c0373ce9cdc1e95066e2f3504 [file] [log] [blame]
<!-- XMidi is the document level element
every XMidi document must have one.
Within each XMidi document is zero
or more chunk.
-->
<!ELEMENT XMidi (CHUNK*, MThd, (MTrk | CHUNK)*)>
<!ATTLIST XMidi VERSION CDATA #REQUIRED>
<!ELEMENT MThd (FORMAT, TRACKS, PPNQ)>
<!-- see comments for CHUNK -->
<!ATTLIST MThd TYPE CDATA #REQUIRED>
<!ATTLIST MThd LENGTH CDATA #REQUIRED>
<!ELEMENT FORMAT (#PCDATA)>
<!ELEMENT TRACKS (#PCDATA)>
<!ELEMENT PPNQ (#PCDATA)>
<!-- a CHUNK consists of:
header
length
data
the header is the first four bytes of the
chunk and corresponds to the TYPE attribute.
the length is the second four byes of the
chunk and corresponds to the LENGTH attribute.
Note that the LENGTH is the length of the
data, not the data and the header.
The data follows the four byte length.
-->
<!ELEMENT CHUNK (HEXDATA*)>
<!ATTLIST CHUNK TYPE CDATA #REQUIRED>
<!ATTLIST CHUNK LENGTH CDATA #REQUIRED>
<!ELEMENT HEXDATA (#PCDATA)>
<!ELEMENT MTrk (DELTA*)>
<!-- see comments for CHUNK -->
<!ATTLIST MTrk TYPE CDATA #REQUIRED>
<!ATTLIST MTrk LENGTH CDATA #REQUIRED>
<!ELEMENT DELTA (STATUS | EDATA | CHANNEL)>
<!ATTLIST DELTA DTIME CDATA #REQUIRED>
<!ELEMENT STATUS (EDATA | CHANNEL)>
<!-- status name (for human readability) -->
<!ATTLIST STATUS SNAM CDATA #REQUIRED>
<!-- non-midi type (optional) -->
<!ATTLIST STATUS SNMT CDATA #IMPLIED>
<!-- actual status byte in hex -->
<!ATTLIST STATUS SVAL CDATA #REQUIRED>
<!-- length of status data (after length field)
(actual data will be in EDATA) -->
<!ATTLIST STATUS SLEN CDATA #REQUIRED>
<!ELEMENT EDATA (#PCDATA)>
<!ELEMENT CHANNEL (NOTE_OFF | NOTE_ON | AFTER |
CONTROL | PROGRAM | PRESSURE | WHEEL)>
<!-- the CHANNEL tag covers midi messages 80-EF.
in each of these cases, the first nibble of the
status byte tells us the event type, while
the second nibble tells us the channel number.
Depending on the event type, the status byte
is followed by 1 or 2 data bytes.
-->
<!ATTLIST CHANNEL TYPE CDATA #REQUIRED>
<!ATTLIST CHANNEL NUMBER CDATA #REQUIRED>
<!ELEMENT NOTE_OFF EMPTY>
<!-- two data bytes: pitch, velocity.
The name is like C# or Ab.
The register is to be determined.
-->
<!ATTLIST NOTE_OFF PITCH CDATA #REQUIRED>
<!ATTLIST NOTE_OFF VELOCITY CDATA #REQUIRED>
<!ATTLIST NOTE_OFF NAME CDATA #IMPLIED>
<!ATTLIST NOTE_OFF REGISTER CDATA #IMPLIED>
<!ELEMENT NOTE_ON EMPTY>
<!-- two data bytes: pitch, velocity.
The name is like C# or Ab.
The register is to be determined.
VIRTUAL_OFF is for the case of
velocity = 0, where it can be
interpreted as a note off message.
-->
<!ATTLIST NOTE_ON PITCH CDATA #REQUIRED>
<!ATTLIST NOTE_ON VELOCITY CDATA #REQUIRED>
<!ATTLIST NOTE_ON VIRTUAL_OFF CDATA #IMPLIED>
<!ATTLIST NOTE_ON NAME CDATA #IMPLIED>
<!ATTLIST NOTE_ON REGISTER CDATA #IMPLIED>
<!ELEMENT AFTER EMPTY>
<!-- after touch message has
two data bytes: pitch, pressure
The name is like C# or Ab.
The register is to be determined.
-->
<!ATTLIST AFTER PITCH CDATA #REQUIRED>
<!ATTLIST AFTER PRESSURE CDATA #REQUIRED>
<!ATTLIST AFTER NAME CDATA #IMPLIED>
<!ATTLIST AFTER REGISTER CDATA #IMPLIED>
<!ELEMENT CONTROL EMPTY>
<!-- control change message has
two data bytes: control number and value.
Each number has a name associated with it.
-->
<!ATTLIST CONTROL NUMBER CDATA #REQUIRED>
<!ATTLIST CONTROL VALUE CDATA #REQUIRED>
<!ATTLIST CONTROL NAME CDATA #IMPLIED>
<!ELEMENT PROGRAM EMPTY>
<!-- program (patch) change message
has one data byte, the patch number.
Patch numbers have General Midi
equivalents (GMNAME). -->
<!ATTLIST PROGRAM NUMBER CDATA #REQUIRED>
<!ATTLIST PROGRAM GMNAME CDATA #IMPLIED>
<!ELEMENT PRESSURE EMPTY>
<!-- channel pressure message has
one byte amount -->
<!ATTLIST PRESSURE AMOUNT CDATA #REQUIRED>
<!ELEMENT WHEEL EMPTY>
<!-- pitch wheel message has a
two byte PW amount.
This is really one 14-bit value split over two
bytes, using the lo-ord 7 bits of each byte.
Express here as an integer from 0 to 2**14-1
-->
<!ATTLIST WHEEL AMOUNT CDATA #REQUIRED>