Developers: how to add MPE compatibility

If you are a developer of MIDI sound generators and would like to add MPE (MIDI Polyphonic Expression) capability, this page will give you some help. MPE is pretty straightforward and is very similar to the old MIDI Mode 4 (Omni off, Mono). It is summarized on the page "What is MPE?" (click at left) and the official MPE specification can be downloaded from the MIDI Association web site here.

In brief overview, implementing MPE in your synth involves the following:

1) routing each incoming Member channel (called "per-note channel" in LinnStrument) to its own voice, listening only for the five per-note messages (Note On, Note Off, Pitch Bend, CC74 and Channel Pressure),

2) routing the Master Channel (1 for Lower Zone or 16 for Upper Zone) messages to all voices in that zone.

3) adding UI elements for users to select the Master channel (1 or 16), Member Channels (2 - x for lower zone, or 15 - x for upper zone), and MPE pitch bend range of +/- 48.

4) creating MPE presets. See below.

Note: It best to permit the MPE Pitch Bend Range to be set globally (not individually for each sound preset) so if the controller has a different bend range than the default +/-48, the user doesn't have to change it for each sound.

Creating new expressive sounds

With your MPE implementation, it is important to also create expressive preset sounds. I use the term expressive sounds to mean sounds that respond to continuous X, Y and Z finger moments in addition to a conventional MIDI keybaord's velocity and release velocity.

It is common for a synth maker to add MPE capability but no expressive preset sounds, or to create "MPE sounds" that are merely standard keyboard sounds with quick and minor tweaks that add some pressure and Y-axis control that MPE instrument players don't find useful.

Here are some tips to help create quality MPE sounds, specifically for correct use for finger pressure and Y-axis finger movement.

1) Pressure
In a conventional MIDI piano keyboard, pressure (aftertouch) is sent only after the key is fully pressed and the note is sounding, and therefore is not useful for controlling the overall volume of each note from silence to full, but rather for adding an extra effect to a note that is already sounding. In an MPE controller, pressure (aftertouch) messages are sent continuously from the lightest to heaviest touch, and can therefore be used to continuously control the overall volume of each note from silence to full level, analogous to wind pressure on a wind instrument or bow pressure on a bowed string instrument. For this reason, it is good to create some MPE sounds that use pressure to continuously control note volume from silence to full.

2)  Y-axis
MPE controllers add Y-axis (front/back) control. Often people initially make the mistake of thinking that Y-axis should be used in the same way as Mod Wheel, adding LFO modulation. This is not a good idea because one of the main purposes of expressive controllers is to replace the venerable and unnatural LFO with performed gestures like vibrato (left/right finger movement) or tremolo (repeated varying pressure). Instead, a better use of Y-axis is to provide a continuous change in timbre, analogous to picking a guitar or bowing a violin at different string positions between the bridge and neck, or varying embouchure on a wind instrument. A good example of this in subtractive synthesis is to assign Y-axis to vary the pulse width of a pulse oscillator, thereby providing a continuous change in the fundamental harmonic content of the waveform in such a way that all tones produced are useful. In this way, timbral variation becomes a performance gesture.

For some examples of good expressive sounds, see the Surge XT page (link at left)n and watch the video of me (Roger) demonstrating some of the expressive sounds in its "LinnStrument MPE" library.

If you have any questions, you're welcome to contact me.

- Roger