--- /dev/null
+<!--\r
+ XML DTD for MIDI messages\r
+ \r
+ Version 1.0, 19 January 2003\r
+ \r
+ Formal Public Identifier:\r
+ "-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN"\r
+\r
+ URI:\r
+ "http://www.midi.org/dtds/MIDIEvents10.dtd"\r
+\r
+ Parameter entities which must be defined before use:\r
+ %ChannelRequired; #IMPLIED\r
+ for use in contexts, where the event is always\r
+ rechannelized\r
+ #REQUIRED\r
+ when channel messages require Channel attribute\r
+\r
+ e.g.\r
+ <!ENTITY % MIDIDTD PUBLIC "-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN"\r
+ "http://www.midi.org/dtds/MIDIEvents10.dtd" >\r
+ %MIDIDTD;\r
+-->\r
+\r
+<!--\r
+ CHANNEL MESSAGES\r
+ \r
+ Attribute values:\r
+ Note, Velocity, Pressure, Control, Value, Number are all 0..127\r
+ except: PitchBend's Value is 0..16383\r
+-->\r
+\r
+<!ELEMENT NoteOn EMPTY>\r
+ <!ATTLIST NoteOn\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Note NMTOKEN #REQUIRED\r
+ Velocity NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT NoteOff EMPTY>\r
+ <!ATTLIST NoteOff\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Note NMTOKEN #REQUIRED\r
+ Velocity NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT PolyKeyPressure EMPTY>\r
+ <!ATTLIST PolyKeyPressure\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Note NMTOKEN #REQUIRED\r
+ Pressure NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT ControlChange EMPTY>\r
+ <!ATTLIST ControlChange\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Control NMTOKEN #REQUIRED\r
+ Value NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT ProgramChange EMPTY>\r
+ <!ATTLIST ProgramChange\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Number NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT ChannelKeyPressure EMPTY>\r
+ <!ATTLIST ChannelKeyPressure\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Pressure NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT PitchBendChange EMPTY>\r
+ <!ATTLIST PitchBendChange\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Value NMTOKEN #REQUIRED>\r
+\r
+<!--\r
+ Channel mode messages\r
+-->\r
+<!ELEMENT AllSoundOff EMPTY>\r
+ <!ATTLIST AllSoundOff\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>\r
+\r
+<!ELEMENT ResetAllControllers EMPTY>\r
+ <!ATTLIST ResetAllControllers\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>\r
+\r
+<!ELEMENT LocalControl EMPTY>\r
+ <!ATTLIST LocalControl\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Value (off|on) #REQUIRED>\r
+\r
+<!ELEMENT AllNotesOff EMPTY>\r
+ <!ATTLIST AllNotesOff\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>\r
+\r
+<!ELEMENT OmniOff EMPTY>\r
+ <!ATTLIST OmniOff\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>\r
+\r
+<!ELEMENT OmniOn EMPTY>\r
+ <!ATTLIST OmniOn\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>\r
+\r
+<!ELEMENT MonoMode EMPTY>\r
+ <!ATTLIST MonoMode\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Value NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT PolyMode EMPTY>\r
+ <!ATTLIST PolyMode\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>\r
+\r
+<!--\r
+ 14-bit control changes:\r
+ Value is 0..16383\r
+ \r
+ ControlChange14's Control is MSB 0..31\r
+ RPNN and NRPN are 0..16383\r
+-->\r
+\r
+<!ELEMENT ControlChange14 EMPTY>\r
+ <!ATTLIST ControlChange14\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ Control NMTOKEN #REQUIRED\r
+ Value NMTOKEN #REQUIRED> \r
+\r
+<!ELEMENT RPNChange EMPTY>\r
+ <!ATTLIST RPNChange\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ RPN NMTOKEN #REQUIRED\r
+ Value NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT NRPNChange EMPTY>\r
+ <!ATTLIST NRPNChange\r
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;\r
+ NRPN NMTOKEN #REQUIRED\r
+ Value NMTOKEN #REQUIRED>\r
+\r
+\r
+<!--\r
+ SYSTEM MESSAGES\r
+-->\r
+\r
+<!ELEMENT SysEx (#PCDATA | SysExDeviceID | SysExChannel)*> \r
+ <!-- contains string of hex bytes without radix information, e.g.:\r
+ <SysEx>F0 01 02 <SysExDeviceID/> 03 04 05 <SysExChannel Multiplier="1" Offset="32"/> F7</SysEx> \r
+ -->\r
+\r
+<!ELEMENT SysExDeviceID EMPTY> <!-- Byte as a function of user-visible Device ID\r
+ e.g. 17 as the default on many Roland devices.\r
+ Most sysex messages will use this element. -->\r
+ <!ATTLIST SysExDeviceID\r
+ Multiplier NMTOKEN "1"\r
+ Offset NMTOKEN "0"> <!-- multiplier and offset are decimal --> \r
+ \r
+<!ELEMENT SysExChannel EMPTY> <!-- Byte as a function of MIDI Channel 1-16, for\r
+ specialized situations where a sys-ex message\r
+ is being directed to a specific MIDI channel.\r
+ Generally only older devices require use of this. -->\r
+ <!ATTLIST SysExChannel\r
+ Multiplier NMTOKEN "1"\r
+ Offset NMTOKEN "0"> <!-- multiplier and offset are decimal -->\r
+ \r
+<!ELEMENT MTCQuarterFrame EMPTY>\r
+ <!ATTLIST MTCQuarterFrame\r
+ MessageType (FrameLSNibble | FrameMSNibble |\r
+ SecsLSNibble | SecsMSNibble |\r
+ MinsLSNibble | MinsMSNibble |\r
+ HrsLSNibble | HrsMSNibbleSMPTEType) #REQUIRED\r
+ DataNibble NMTOKEN #REQUIRED>\r
+\r
+<!ELEMENT SongPositionPointer EMPTY>\r
+ <!ATTLIST SongPositionPointer\r
+ Position NMTOKEN #REQUIRED> <!-- 0-16383 -->\r
+\r
+<!ELEMENT SongSelect EMPTY>\r
+ <!ATTLIST SongSelect\r
+ Number NMTOKEN #REQUIRED> <!-- 0-127 -->\r
+\r
+<!ELEMENT TuneRequest EMPTY>\r
+<!ELEMENT TimingClock EMPTY>\r
+<!ELEMENT Start EMPTY>\r
+<!ELEMENT Continue EMPTY>\r
+<!ELEMENT Stop EMPTY>\r
+<!ELEMENT ActiveSensing EMPTY>\r
+<!ELEMENT SystemReset EMPTY>\r
+\r
+<!--\r
+ ENTITIES\r
+-->\r
+\r
+<!ENTITY % MIDIChannelVoiceMessage "(NoteOn | NoteOff | PolyKeyPressure | ControlChange | ProgramChange\r
+ | ChannelKeyPressure | PitchBendChange)">\r
+<!ENTITY % MIDIChannelModeMessage "(AllSoundOff | ResetAllControllers | LocalControl | AllNotesOff\r
+ | OmniOff | OmniOn | MonoMode | PolyMode)">\r
+<!ENTITY % MIDIChannelMessage "(%MIDIChannelVoiceMessage; | %MIDIChannelModeMessage;)">\r
+<!ENTITY % MIDISystemMessage "(SysEx | MTCQuarterFrame | SongPositionPointer | SongSelect\r
+ | TuneRequest | TimingClock | Start | Continue | Stop | ActiveSensing | SystemReset)">\r
+<!ENTITY % MIDIMessage "(%MIDIChannelMessage; | %MIDISystemMessage; )">\r