LinnStrument Support Page

For Developers of MIDI Sound Generators:

How to add MPE Capability

If you are a developer of MIDI sound generators and would like to add MPE (Multidimensional Polyphonic Expression) compatibility, this page will give you some help. MPE is pretty straightforward:

Each note's messages are sent on a unique MIDI channel, rotating through a contiguous block of "Per-Note" channels. The per-note messages sent over each channel are limited to Note On, Note Off, Channel Pressure (for finger pressure), Pitch Bend (for x-axis movement) and CC74 (for Y-axis movement).

Messages that apply to all voices (such as Sustain Pedal (CC64), Volume (CC7), Program Change, etc.) are sent over a separate "Master" channel.  An alternative implementation is to use no Master channel and to send these common messages over all of the Per-Note channels, in which case the receiver will recognize all messages other than the 5 per-note messages are common to all voices, regardless of the channel over which it is received.

So the main work is:

1) routing each incoming Per-Note channel to its own voice, listening only for the above 5 per-note messages, and

2) routing all other received messages, regardless of channel, to all voices.

MPE has already been implemented in lots of MIDI sound generators. The most popular MPE implementation in plug-in software instruments is for each channel to act as a one-channel polyphonic sound generator, thereby working fine with either single-channel or MPE controllers. For example, if normal one-channel polyphonic messages are received from a traditional MIDI keyboard, the sound generator works as a single-channel polyphonic sound generator. Or if messages are received from an MPE controller on multiple channels with each note on a separate channel, it also works fine for MPE operation. There is no need to define which channels are received, just listen to all channels and the host DAW will send you one, some or all channels. If a Pitch Bend Range message is received--useful for changing between the common +/- 2 semitone range of traditional MIDI keyboards and the default +/- 48 semitone range of MPE controllers--it simply follows the rule of applying to all voices. That said, it would also be helpful to give users a simple way to change the Pitch Bend Range manually, and preferably globally so they don't have to change it after selecting each new preset.

It is the DAW's responsibility to route MIDI channels to tracks. If a DAW does not currently permit routing all received channels to the selected track, it should be changed to do so. Also, in the case of a split keyboard MPE controller (or two connected MPE controllers), each split will send over a specific range of channels, for example 1-8 for the left split and 9-16 for the right split. For this case, the DAW should have the ability to select the received MPE channel range. In the above split-keyboard example, two tracks could be selected, one receiving on channels 1-8 and the other on channels 9-16.

If you are adding MPE to a standalone software instrument or a hardware instrument, you'll need to provide the ability to directly receive MIDI data from either a single-channel controller or an MPE controller over a specific range of channels, rejecting other channels sent on the same MIDI cable/port. One method would be to use 3 parameters:

1) Receive Mode: either "Single Channel", "All Channels" (all channels mixed together), or "MPE".
2) Receive Channel / Low MPE Channel: 1-16
3) High MPE channel: 1-16 (range is limited to channels higher than the "Low MPE Channel")

For example, to receive a normal single-channel MIDI keyboard on channel 1, these 3 parameters would be set as follows:
Receive Mode = Single Channel, Receive Channel / Low MPE Channel = 1, High MPE Channel = (doesn't matter).

Or to receive an MPE controller on channels 9 - 16, these 3 parameters would be set as follows:
Receive Mode = MPE, Receive Channel / Low MPE Channel = 9, High MPE Channel = 16.


Roger Linn Design  •  Berkeley, CA, USA

Roger Linn Design  •  Berkeley, CA, USA