<!-- Standard MIDI File DTD: MIDI XML Version 1.1 - 20 May 2005 Copyright © 2004-2005 Recordare LLC. http://www.recordare.com/ This MusicXML work is being provided by the copyright holder under the MusicXML Document Type Definition Public License Version 1.02, available from: http://www.recordare.com/dtds/license.html --> <!-- MIDI XML is an XML representation of standard MIDI files. Unlike standard MIDI files, it can have timestamps present as either absolute or delta values. This makes it convenient as an intermediate format to convert from MusicXML or other formats where note on and note off are not represented as discrete events. To convert to standard MIDI files, delta values must be used. Suggested use: <!DOCTYPE MIDIFile PUBLIC "-//Recordare//DTD MusicXML 1.1 MIDI//EN" "http://www.musicxml.org/dtds/midixml.dtd"> --> <!-- For Standard MIDI Files, channels are required; events are not rechannelized. --> <!ENTITY % ChannelRequired "#REQUIRED"> <!-- Component DTDs --> <!-- The MMA MIDI DTD contains the definitions of all MIDI events. Its regular address is: http://www.midi.org/dtds/MIDIEvents10.dtd For convenience, we include a local copy with our definition, and reference that here. --> <!ENTITY % midi PUBLIC "-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN" "MIDIEvents10.dtd"> %midi; <!-- Timestamps are either delta or absolute. They must all be one or the other throughout the MidiXML file. Timestamps are numeric values measured in MIDI ticks. --> <!ENTITY % Timestamp "(Delta | Absolute)"> <!ELEMENT Delta (#PCDATA)> <!ELEMENT Absolute (#PCDATA)> <!-- Standard MIDI File events include MIDI Channel messages, meta-events, and system exclusive events. Each track is a series of events. The MetaEvent and SysExEvent elements are defined below. The MIDIChannelMessage and MIDIMessage events are defined in the MMA's MIDI DTD (RP-038). --> <!ENTITY % MetaEvent "(SequenceNumber | TextEvent | CopyrightNotice | TrackName | InstrumentName | Lyric | Marker | CuePoint | ProgramName | DeviceName | Port | MIDIChannelPrefix | EndOfTrack | SetTempo | SMPTEOffset | TimeSignature | KeySignature | SequencerSpecific | OtherMetaEvent)"> <!ENTITY % SysExEvent "(SystemExclusive | EndOfExclusive)"> <!ENTITY % SmfEvent "(%MIDIChannelMessage; | %MetaEvent; | %SysExEvent;)"> <!ELEMENT Event (%Timestamp;, %SmfEvent;)> <!-- MIDI meta events. If empty, the value for the event is contained in an attribute, following the pattern of the MMA's MIDI DTD. Textual meta events have their values as text within the element. --> <!ELEMENT SequenceNumber EMPTY> <!ATTLIST SequenceNumber Value NMTOKEN #REQUIRED> <!ELEMENT TextEvent (#PCDATA)> <!ELEMENT CopyrightNotice (#PCDATA)> <!ELEMENT TrackName (#PCDATA)> <!ELEMENT InstrumentName (#PCDATA)> <!ELEMENT Lyric (#PCDATA)> <!ELEMENT Marker (#PCDATA)> <!ELEMENT CuePoint (#PCDATA)> <!ELEMENT MIDIChannelPrefix EMPTY> <!ATTLIST MIDIChannelPrefix Value NMTOKEN #REQUIRED> <!ELEMENT EndOfTrack EMPTY> <!ELEMENT SetTempo EMPTY> <!ATTLIST SetTempo Value NMTOKEN #REQUIRED> <!ELEMENT SMPTEOffset EMPTY> <!ATTLIST SMPTEOffset TimeCodeType NMTOKEN #REQUIRED Hour NMTOKEN #REQUIRED Minute NMTOKEN #REQUIRED Second NMTOKEN #REQUIRED Frame NMTOKEN #REQUIRED FractionalFrame NMTOKEN #REQUIRED> <!ELEMENT TimeSignature EMPTY> <!ATTLIST TimeSignature Numerator NMTOKEN #REQUIRED LogDenominator NMTOKEN #REQUIRED MIDIClocksPerMetronomeClick NMTOKEN #REQUIRED ThirtySecondsPer24Clocks NMTOKEN #REQUIRED> <!ELEMENT KeySignature EMPTY> <!ATTLIST KeySignature Fifths NMTOKEN #REQUIRED Mode NMTOKEN #REQUIRED> <!ELEMENT SequencerSpecific (#PCDATA)> <!-- The ProgramName and DeviceName meta-events are described in RP-019 from the MMA. They allow a Standard MIDI file to address multiple devices, enabling more than 16 channels of MIDI playback. --> <!ELEMENT ProgramName (#PCDATA)> <!ELEMENT DeviceName (#PCDATA)> <!-- The XMFPatchTypePrefix meta-event is described in RP-032 from the MMA. It allows specification of using General MIDI 1, General MIDI 2, or DLS to interpret subsequent program change and bank select messages in the same track. --> <!ELEMENT XMFPatchTypePrefix EMPTY> <!ATTLIST XMFPatchTypePrefix Value NMTOKEN #REQUIRED> <!-- The meta-event hex 21 has been used, at least unofficially, for a MIDI port or cable number. RP-019 deprecates this in favor of the DeviceName meta-event, but programs still use this. --> <!ELEMENT Port EMPTY> <!ATTLIST Port Value NMTOKEN #REQUIRED> <!-- An unrecognized meta-event has attributes for both its event number in hex and its length. The data for the invent is represented in hex within the element, as is done for system exclusives. --> <!ELEMENT OtherMetaEvent (#PCDATA)> <!ATTLIST OtherMetaEvent Number NMTOKEN #REQUIRED> <!-- MIDI system exclusive and end of exclusive events have their data represented as a series of 2-digit hex elements separated by spaces, as in the MMA MIDI DTD. --> <!ELEMENT SystemExclusive (#PCDATA)> <!ELEMENT EndOfExclusive (#PCDATA)> <!-- MIDI is the root element --> <!ELEMENT MIDIFile (Format, TrackCount, (TicksPerBeat | (FrameRate, TicksPerFrame)), TimestampType, Track+)> <!-- Format indicates MIDI format 0, 1, or 2. So far only types 0 and 1 are explicitly supported by MidiXML. --> <!ELEMENT Format (#PCDATA)> <!-- TrackCount indicate the number of tracks in a file: 1 for type 0, usually more for types 1 and 2. --> <!ELEMENT TrackCount (#PCDATA)> <!-- How many ticks in a beat (MIDI quarter note). --> <!ELEMENT TicksPerBeat (#PCDATA)> <!-- Frame rate and ticks per frame are used with SMPTE time codes. --> <!ELEMENT FrameRate (#PCDATA)> <!ELEMENT TicksPerFrame (#PCDATA)> <!-- TimestampType should be Delta or Absolute. Indicates the element name to look for in the initial timestamp in each MIDI event. --> <!ELEMENT TimestampType (#PCDATA)> <!-- Tracks contain the musical data and are made up of a series of events. The track number attribute is required. --> <!ELEMENT Track (Event*)> <!ATTLIST Track Number NMTOKEN #REQUIRED>