OSC Musical Interface

Work in progress

Version 0.1.

This document specifies musical instrument control protocol transported over Open Sound Control 1.0.

Authors: Michał Gawron

Introduction

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.

Notation

Terms

OMI server
A hardware or software instrument, synthesizer, DAW, sequencer or similar type device or computer program that reacts to OMI messages in a ways described in this document.
OMI controller
A hardware controller, DAW, sequencer or similar type device or computer program that generates OMI messages to control the OMI server.
OMI message
An OSC message sent to OMI server or OMI conroller, that has meaning described in this document.

Data types

All data types used in this document correspond to four basic OSC-defined data types: int32, float32, OSC-string and OSC-blob.

OMI endpoints

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
				

Voice control

/voice/on (voice-id, frequency)

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.

/voice/off (voice-id)

Release specified voice.

voice-id: int32
Specifies voice to shut down.

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.

/voice/panic

Shut down all voices immediately.

Parameter control

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.

/parameter/set-mono (parameter-id, value)

Set monophonic parameter to the given value.

parameter-id: OSC-string
Parameter identifier, tells which parameter to update.
value: float32
Parameter value. Value must be in range [0, 1.0].

Monophonic parameter affects timbre of all created voices.

MIDI equivalent of this message is control change event.

/parameter/set-poly (parameter-id, voice-id, value)

Set polyphonic parameter to the given value.

parameter-id: OSC-string
Parameter identifier, tells which parameter to update.
voice-id: int32
Voice identifier. As polyphonic parameters are bound to voices, this parameter tells for which voice the parameter should be updated.
value: float32
Parameter value. Value must be in range [0, 1.0].

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).

/parameter/list

Tells the OMI controller that the OMI server has updated its parameters list.

Example use cases:

/parameter/get-list

Machine control

/transport/move-head (measures, move-type)

Synchronization

Preset change

Instrument-to-controller protocol

parameters

Parameter consists of:

Controlling device's UI (LCD screens, etc)

Legacy mode

Predefined parameter names for simple devices: omi:parameter-1, omi:pitchbend, omi:volume, …

Devices discovery

Problems to address: auto device discoverability (should be different specification probably); parameters list change; patches list change

General OMI - General MIDI

For simplex communication.

MIDI use cases

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

MIDI NoteOn event
/voice/on (midi_note_number, 2^((midi_note_number - 69) / 12))

OMI use cases