A VST plugin for enhancing non-MPE MIDI streams with MPE (MIDI Polyphonic Expression) capabilities based on user-defined mappings and rules, for Linux and Windows.
MPE Emulator is a MIDI proxy: an intermediary plugin which turns non-polyphonic, single channel aftertouch (channel pressure), pitch bend, or any MIDI Control Change (CC) message into polyphonic by applying them selectively to the lowest, highest, oldest, or newest note, either across the whole keyboard or restricted to a range of keys based on a configurable keyboard split point. It can also remap and reshape controller data, and do various other tricks to increase the expressiveness of a musical performance.
Features:
Retroactively add MPE functionality to non-MPE-capable MIDI input devices.
Remap controllers, e.g. turn modulation wheel data into MPE aftertouch and vice-versa.
Invert MIDI expression and controller data, and apply various other distortions.
Use the trigger velocity of notes as release velocity for synths that utilize it.
Split the keyboard and route polyphonic expressions to the two halves with different rules.
Transpose the two sides of the split point independently from each other. (E.g. extend the range of small keyboards, or play the same note with different expression settings.)
Route various expressions and controllers to the lowest, highest, oldest, or newest note globally, or across the split halves of the keyboard.
MIDI Learn.
MPE Emulator Lite:
MPE Emulator Lite is a platform-independent JS plugin for REAPER v6.74 and above which provides the most fundamental features of MPE Emulator.
Installation:
Before Installing: Choosing a Distribution
If your plugin host application supports VST 2.4, then you should download and install the FST version of MPE Emulator.
If your plugin host only supports VST 3, or if you can live with a few quirks and edge case bugs due to the incomplete MIDI support in the VST 3 protocol, then you should try the VST 3 bundle on both Windows and Linux.
If you are using an older VST 3 host, or if you are running a 32 bit (also known as „i686“ or „x86“) VST 3 host on a 64 bit Linux system, then it might not be able to load the VST 3 bundle, so you will have to go with a VST 3 single file MPE Emulator package that matches the architecture of your host application.
The 32 bit versions are usually only needed by those who deliberately use a 32 bit plugin host application, e.g. because they want to keep using some really old plugins which are not available for 64 bit systems.
If you are in doubt, then try the 64 bit FST version, and if your plugin host application doesn’t recognize it, then try the VST 3 bundle, and if that still fails to load, then try the 64 bit VST 3 single file version, then the 32 bit FST version, then the 32 bit VST 3 single file version, and so on.
System Requirements:
Operating System: Windows 7 or newer, or Linux (e.g. Ubuntu 22.04)
CPU: SSE2 support, 32 bit (i686) or 64 bit (x86-64)
RAM: around 30 MB per instance
The plugin can also be compiled for RISC-V 64 from its source code.
Tested with REAPER 7.17.
MPE Emulator Lite runs on any operating system and CPU where REAPER runs. The required minimum version of REAPER is v6.74.
Usage:
Place MPE Emulator in the signal chain between the raw MIDI input and a synthesizer plugin in the plugin host application. The exact steps to set up MIDI routing vary between different plugin host applications, so consult the documentation of your one.
+—————+ single channel +————–+ +————-+
| | raw MIDI data | | MPE data | |
| MIDI keyboard |—————>| MPE Emulator |———->| Synthesizer |
| | | | | |
+—————+ +————–+ +————-+Knobs
Most of the parameters that control the settings of the MIDI signal transformations can be adjusted via virtual knobs on the screen:Move the mouse cursor over a knob, and use the mouse wheel or move the mouse while holding down the left mouse button for adjusting the value.
Double click on a knob to reset it to its default value.
Table of Contents
Zone Configuration
An MPE zone is a group of MIDI channels where one channel is used for sending global MIDI events and controller changes which apply to all active notes (manager channel), and the other channels are allocated for individual polyphonic notes and controller events (member channels). Each controller event that is sent on a member channel is applied only to the note (or notes) that is played on that MIDI channel. One of the possible zones is called the „lower“ zone and the other is called „upper“. This has nothing to do with note pitches, these names actually refer to the layout of MIDI channel numbers.Currently, MPE Emulator uses only one zone which can be either the lower or the upper zone. The exact details of these are not important, what’s important is that MPE Emulator and the MPE-capable synthesizer must agree on the manager and the member channel layout. This can be achieved either by manually setting up the same MPE configuration in both the synthesizer and in MPE Emulator, or alternatively, MPE Emulator can send an MPE Configuration Message (MCM), and if the synthesizer implements MPE properly, then it will automatically configure itself to match the settings in MPE Emulator. (Though in practice, even some widely used commercial synthesizers ignore MCM messages, so you will likely have to manually verify that the zone settings of MPE Emulator and the synthesizer match up.)
Import Settings, Export Settings
The two icons at the top left corner of the „Main“ configuration section allow saving and loading settings as ordinary files, e.g. for transferring them across projects, different host applications, computers, etc.Override Release Velocity With Triggered Velocity (RelVel=TrigVel, Z1ORV)
Most MIDI keyboards emit Note Off events with note velocity set to either 0%, 50%, or 100%, regardless of how slow or fast the corresponding key is released. However, some synthesizers can utilize note release velocity, for example, to set the amplitude envelope release time accordingly. MPE Emulator remembers the note velocity for each triggered note, and can override the release velocity that is sent by the MIDI device to match the trigger velocity, so that softer notes are also release softly, and high velocity notes are also released with a high velocity.Emit MCM on Reset (MCM)
This toggle switch tells MPE Emulator to emit MPE Configuration Messages (MCM), or don’t bother, because the synthesizer would just ignore them anyways.Zone Type (ZONE, Z1TYP)
Click on the switch to change the channel layout used by MPE Emulator:Lower: channel 1 is the manager channel, channel 2-16 can be used as member channels.
Upper: channel 16 is the manager channel, channel 1-15 can be used as member channels.
Channels (CHAN, Z1CHN)
The number of channels to use as member channels. This determines the number of available polyphonic voices to use (within the limits of the synthesizer).Excess Note Handling (STEAL, Z1ENH)
Tells MPE Emulator what to do then a new note is triggered while all polyphonic voices are in use:Never: there’s no voice-stealing, the new note is ignored.
Low: the lowest note is stopped, and the new note is played on the channel where it used to be.
High: the highest note is stopped, and the new note is played on the channel where it used to be.
Old: the oldest note is stopped, and the new note is played on the channel where it used to be.
New: the newest note is stopped (the one played before the new one), and the new note is played on the channel where it used to be.
Anchor (ANCH, Z1ANC)
A split point for the keyboard. Each side of the keyboard can be transposed independently from each other, and expression and controller events can be applied differently to them. For example, one may want to send channel pressure (aftertouch) events only to the newest or the highest note above A3, but not to bass notes or chords played with the left hand.Transpose Below Anchor (TR BA, Z1TRB)
Select how many semitones notes below the anchor should be transposed up or down. This can be useful e.g. for extending the range of small keyboards with only a few octaves, or for playing the same note with different expression settings.Transpose Above Anchor (TR AA, Z1TRA)
Select how many semitones notes above the anchor should be transposed up or down. This can be useful e.g. for extending the range of small keyboards with only a few octaves, or for playing the same note with different expression settings.Table of Contents
Rules
Input (IN, Z1RxIN)
Click on the box next to the „IN“ label to select an input controller (MIDI CC) for the rule. CC events that are not matched by any rule’s input settings are sent globally on the manager channel, and those that are matched by one or more rules are handled as the rules specify. The possible values are:none: turn off the rule entirely.
MIDI Learn: the first controller message that is received after selecting this option will be assigned to the input of the rule.
Pitch Wheel: the pitch wheel.
Channel Pressure (Aftertouch): channel pressure, also known as channel aftertouch.
CC0 – CC119: normal MIDI CC numbers that are usually assigned to various knobs and faders on a MIDI keyboard. (Note: the mod wheel is CC1.)
Note: if you accidentally open the controller selector, just click on the already selected item to close it.
Output (OUT, Z1RxOU)
Click on the box next to the „OUT“ label to select the output controller (MIDI CC) for the rule. Usually it should be the same as the input, but in some cases, you might want to remap a particular controller to another. For example, if your MIDI keyboard does not have channel pressure (aftertouch) functionality, but aftertouch is assigned to some functionality in a particular synthesizer, then you can remap e.g. mod wheel events to be sent as channel pressure: assign the mod wheel to the input, and select channel aftertouch for the output, and then whenever you turn the mod wheel, the synthesizer will receive an aftertouch message instead of it. (Unfortunately, aftertouch is known to have some bugs and quirks in some plugin type and host combinations.)The available options are the same as for the input, but the MIDI Learn option is ignored for this parameter.
Note: if you accidentally open the controller selector, just click on the already selected item to close it.
Initial Value (INIT, Z1RxIV)
The initial value of the rule (before distortions). See Reset for the details.Target (TARGET, Z1RxTR)
Which polyphonic note (channel) to send the output of the rule:Global: send on the manager channel, and let the synthesizer apply it to all active notes.
All BA: send to all notes below the anchor.
All AA: send to all notes above the anchor.
Low: send on the channel that belongs to the lowest key that is being pressed across the entire keyboard.
High: send on the channel that belongs to the highest key that is being pressed across the entire keyboard.
Old: send to the channel which belongs to the key that has been pressed for the longest time across the entire keyboard.
New: send to the channel which belongs to the key that has been pressed for the shortest time across the entire keyboard.
Low BA: send on the channel that belongs to the lowest key that is being pressed below the anchor.
High BA: send on the channel that belongs to the highest key that is being pressed below the anchor.
Old BA: send to the channel which belongs to the key that has been pressed for the longest time below the anchor.
New BA: send to the channel which belongs to the key that has been pressed for the shortest time below the anchor.
Low AA: send on the channel that belongs to the lowest key that is being pressed above the anchor.
High AA: send on the channel that belongs to the highest key that is being pressed above the anchor.
Old AA: send to the channel which belongs to the key that has been pressed for the longest time above the anchor.
New AA: send to the channel which belongs to the key that has been pressed for the shortest time above the anchor.
Note: „above the anchor“ here includes the anchor key itself.
Distortion Level (DIST, Z1RxDL)
How much to distort the flat, linear curve of the controller with the selected distortion function.Invert (Z1RxNV)
Flip the controller: when 0% is received on the input, send 100%, and when the input is at 100%, then send 0%.Reset (Z1RxRS)
Select note initialization and reset behaviour. A reset can occur in one of two ways:When the target of a rule is „Global“, then the output controller of the rule will be reset when the plugin is re-initialized by the host, and when the zone configuration is changed.
When the target is anything else, then a reset can occur when a new note is triggered or an old one is stopped. A reset may affect the new note itself, and also the notes that used to be the targets of a rule before the note event, or which become the targets of a rule after the note event.
(For example, when the target of a rule is the highest note and a C4 is being played, then a reset occurs when the C5 key is pressed, affecting both the C4’s channel and the C5’s channel, because the former used to be the only note and therefore also the highest note, and now the latter is the highest. Then if the C5 note is released, then C4 becomes the highest again, and it also triggers a reset.)
The options for performing resets are:
INI: send the initial value of the rule to the affected notes.
LST: send the value that was received most recently for this rule to the affected notes.
OFF: no reset is sent to any channels, everything stays as it is until a new control event happens.
Midpoint (Z1RxMP)
Move the mouse cursor over the first function graph icon at the top right corner of a rule, and start moving it while holding the left mouse button down, or start using the mouse wheel to adjust the midpoint of the rule’s input. For example, if the midpoint is at 75%, then when the rule’s input controller is at 50%, MPE Emulator will send 75%. Moving the controller between 0% and 50% will make MPE Emulator emit values between 0% and 75%, and moving the controller between 50% and 100% will make MPE Emulator emit values between 75% and 100%.Together with the Invert toggle, this makes it possible to create a pair of rules which turn the two halves of the pitch bend wheel into different controllers, and to misuse it in various creative ways.
Distortion Type (Z1RxDT)
Click on the second function graph icon at the top right corner of a rule, or use the mouse wheel while holding the mouse cursor over it to select the non-linearity shape that the rule will use when its distortion level parameter is set to a value above 0%.