Work in progress
Version 0.1.
This document specifies musical instrument control protocol transported over Open Sound Control 1.0.
Authors: Michał Gawron
OMI is meant to be more flexible than MIDI. It uses modern Open Sound Control 1.0 as a transport layer, and allows duplex communication between two OMI endpoints, provided that transport for OSC (typically TCP/IP or UDP/IP) allows duplex connections.
OMI features missing in MIDI:
This specification describes a set of modules, that can be implemented independently of each other.
Problems to be addressed: tuning (440Hz or other?)
This specification assumes that you're familiar with OSC 1.0.
All data types used in this document correspond to four basic OSC-defined data types:
int32
, float32
, OSC-string
and OSC-blob
.
Duplex or simplex
Mountpoints
[Controller]--------------[Instrument] --> params-list-request --> /voice/* --> /parameter/* <-- params-list [Controller]------[DAW]-----[Instrument] --> params-list-request --> /voice/* --> /parameter/* <-- params-list --> params-list-request --> /voice/* --> /parameter/* <-- params-list
Create new or update existing voice with the given frequency.
voice-id: int32
Unique voice identifier, allocated arbitrarily by the controller.
If the voice with given voice-id
doesn't exist yet, it's created.
Otherwise its frequency
attribute is updated.
This identifier is used by various other OMI messages that control parameters of a particular voice.
Keyboard controllers will use key number as a voice-id
, so it's possible to trigger
percussion sounds. Percussion instruments will ignore frequency
parameter.
frequency: float32
Voice frequency expressed in Hertz.
For MIDI-like note triggering with note-number, use the following formula to convert MIDI note number to frequency:
f = 2(k﹣69) / 12
where f is voice frequency and k is MIDI note number.
This message can come in an OSC bundle with other messages that will immediately affect the newly created voice,
for example /parameter/set-poly
. OMI server should immediately apply the parameter to the new voice.
Example use case: set voice's attack velocity
or release velocity
.
Release specified voice.
voice-id: int32
This message does not mean to cause immediate cease of the sound. It's up to the OSC server (an instrument) how the voice
should stop sounding. This means that the voice can still sound after the /voice/off
message,
and an OMI controller might want to reuse the voice-id
. It's then up to the OMI server whether
incoming parameter control messages will affect the old voice or not.
Shut down all voices immediately.
Parameters are meant to control sound engine inside the OMI server, but can be generally used for anything.
Parameters are identified by parameter-id
, which is an arbitrary OSC-string.
OSC server can provide detailed list of parameters to the controller. It might be be useful for DAW or sequencer,
where user will select parameter to control by its name, description, etc.
Simpler OMI controllers can use predefined parameter identifiers. The OMI server
should provide a possibility to assign one of the predefined identifiers to any of the controllers.
Set monophonic parameter to the given value.
parameter-id: OSC-string
value: float32
Monophonic parameter affects timbre of all created voices.
MIDI equivalent of this message is control change event.
Set polyphonic parameter to the given value.
parameter-id: OSC-string
voice-id: int32
value: float32
Polyphonic parameters are bound to existing voices, which means every voice has separate set of polyphonic parameters that can be controlled.
There is no general MIDI equivalent of this event, but there is one specific: key pressure event (also known as aftertouch or polyphonic aftertouch).
Tells the OMI controller that the OMI server has updated its parameters list.
Example use cases:
Parameter consists of:
Predefined parameter names for simple devices: omi:parameter-1
, omi:pitchbend
, omi:volume
, …
Problems to address: auto device discoverability (should be different specification probably); parameters list change; patches list change
For simplex communication.
MIDI compatibility - use cases involving OMI-aware DAW and MIDI-only controller
MIDI event | OMI message |
---|---|
Control change Channel pressure |
/parameter/set-mono |
Key pressure (aftertouch) | /parameter/set-poly |
Channel pressure = /controller/poly-set