This specification defines a data type for a MIDI message, midi:MidiEvent, which is normalised for fast and convenient real-time processing. MIDI is the Musical Instrument Digital Interface, a ubiquitous binary standard for controlling digital music devices.

For plugins that process MIDI (or other situations where MIDI is sent via a generic transport) the main type defined here, midi:MidiEvent, can be mapped to an integer and used as the type of an LV2 Atom or Event.

This specification also defines a complete human and machine readable description of the MIDI standard (except for standard controller numbers). These descriptions are detailed enough to express any MIDI message as properties.

Reference

ClassesProperties

Classes

ActiveSense

Subclass ofSystemRealtime
status FE
Active Sense Message

ChannelPressure

Subclass ofVoiceMessage
chunk
byteNumber 0
property pressure
statusMask D0
Channel Pressure Message

Chunk

In domain ofbyteNumber
property
In range ofchunk
MIDI Chunk

A series of contiguous bytes (usually one) in a message.

Clock

Subclass ofSystemRealtime
status F8
Clock Message

Continue

Subclass ofSystemRealtime
status FB
Continue Message

HexByte

In range ofstatus
statusMask
velocity
owl:onDatatype xsd:hexBinary

A hexadecimal byte, which is a xsd:hexBinary value <= FF

MidiEvent

Subclass ofatom:Atom
ev:Event
In range ofbinding
owl:onDatatype xsd:hexBinary
MIDI Message

A single raw MIDI message (i.e. a sequence of bytes).

This is equivalent to a standard MIDI messages, except with the following restrictions to simplify handling:

  • Running status is not allowed, every message must have its own status byte.
  • Note On messages with velocity 0 are not allowed. These messages are equivalent to Note Off in standard MIDI streams, but here only proper Note Off messages are allowed.
  • "Realtime messages" (status bytes 0xF8 to 0xFF) are allowed, but may not occur inside other messages like they can in standard MIDI streams.
  • All messages are complete valid MIDI messages. This means, for example, that only the first byte in each event (the status byte) may have the eighth bit set, that Note On and Note Off events are always 3 bytes long, etc. Where messages are communicated, the writer is responsible for writing valid messages, and the reader may assume that all events are valid.

If a midi:MidiEvent is serialised to a string, the format should be xsd:hexBinary, e.g. (in Turtle notation):

[] eg:someEvent "901A01"^^midi:MidiEvent .

QuarterFrame

Subclass ofSystemCommon
status F1
Quarter Frame Message

Reset

Subclass ofSystemRealtime
status FF
Reset Message

SongPosition

Subclass ofSystemCommon
chunk
byteNumber 0
byteNumber 1
property songPosition
status F2
Song Position Pointer Message

SongSelect

Subclass ofSystemCommon
status F3
Song Select Message

Start

Subclass ofSystemRealtime
status FA
Start Message

Stop

Subclass ofSystemRealtime
status FC
Stop Message

SystemCommon

Subclass ofSystemMessage
System Common Message

SystemExclusive

Subclass ofSystemMessage
status F0
System Exclusive Message

SystemMessage

Subclass ofMidiEvent
statusMask F0
System Message

SystemRealtime

Subclass ofSystemMessage
System Realtime Message

TuneRequest

Subclass ofSystemCommon
status F6
Tune Request Message

VoiceMessage

Subclass ofMidiEvent
statusMask F0
Voice Message

Properties

benderValue

TypeDatatype Property
Rangexsd:short
bender value

The value of a pitch bender (-8192 to 8192).

binding

TypeObject Property
RangeMidiEvent
binding

The MIDI event to bind a parameter to. This describes which MIDI events should be used to control a port, parameter, or other object. The binding should be a midi:MidiEvent but the property that represents the control value may be omitted. For example, to bind to the value of controller 17:

byteNumber

TypeDatatype Property
DomainChunk
Rangexsd:unsignedByte
byte number

The 0-based index of a byte which is part of this chunk.

channel

TypeDatatype Property
Rangexsd:unsignedByte
MIDI channel

The channel number of a MIDI message.

chunk

RangeChunk
MIDI chunk

A chunk of a MIDI message.

controllerNumber

TypeDatatype Property
Rangexsd:byte
MIDI controller number

The numeric ID of a controller (0 to 127).

controllerValue

TypeDatatype Property
Rangexsd:byte
MIDI controller value

The value of a controller (0 to 127).

noteNumber

TypeDatatype Property
Rangexsd:byte
note number

The numeric ID of a note (0 to 127).

pressure

TypeDatatype Property
Rangexsd:byte
key pressure

Key pressure (0 to 127).

programNumber

TypeDatatype Property
Rangexsd:byte
program number

The numeric ID of a program (0 to 127).

property

TypeObject Property
DomainChunk
Rangerdf:Property
property

The property this chunk represents.

songNumber

TypeDatatype Property
Rangexsd:byte
song number

The numeric ID of a song (0 to 127).

songPosition

TypeDatatype Property
Rangexsd:short
song position

Song position in MIDI beats (16th notes) (-8192 to 8192).

status

TypeDatatype Property
RangeHexByte
status byte

The exact status byte for a message of this type.

statusMask

TypeDatatype Property
RangeHexByte
status mask

The status byte for a message of this type on channel 1, i.e. a status byte with the lower nibble set to zero.

velocity

TypeDatatype Property
RangeHexByte
velocity

The velocity of a note message (0 to 127).

History

Version 1.10 (2019-02-03)
  • Fix incorrect range of midi:chunk.
Version 1.8 (2012-10-14)
  • Use consistent label style.
  • Add midi:binding and midi:channel predicates.
  • Add midi:HexByte datatype for status bytes and masks.
  • Remove non-standard midi:Tick message type.
  • Add C definitions for message types and standard controllers.
  • Fix definition of SystemExclusive status byte.
Version 1.6 (2012-04-17)
  • Add class definitions for various message types.
  • Document how to serialise a MidiEvent to a string.
  • Merge with unified LV2 package.
Version 1.4 (2011-11-21)
  • Update packaging.
  • Improve documentation.
Version 1.2 (2011-05-26)
  • Add build system for installation.
  • Switch to ISC license.
Version 1.0 (2010-10-04)
  • Initial release.