User Guides v3.0

MIDI Filters

MIDI Filters support applying a wide range of transformations to MIDI events as they pass through the system.

MIDI Filters

Accessing MIDI Filters

To bring up the MIDI filter editor select either a MIDI Route Slot or a Plugin Slot and choose Edit -> MIDI Filters from the main menu.

You can also access the MIDI filters via the MIDI filter button in the object's slot in the main window:

MIDI Filters Button

Note the small green indicator on this button shows that there are active MIDI Filters on this object.

Port MIDI Filters

MIDI ports also have MIDI Filter support and provide a convenient way to massage incoming MIDI events across all songs.

For example you can add MIDI Filters to an environment MIDI Input port.

  1. Open Cantabile's Options
  2. Switch to the MIDI Ports page
  3. Double click on a MIDI Port
  4. Click the MIDI Filters button
MIDI Port Filters

MIDI Filter Processing Order

  • For MIDI Routes, MIDI Filters are applied after the other MIDI route settings.
  • For Plugins, MIDI Filters are applied before the events are forwarded to the plugin.

MIDI Filter Types

Cantabile supports a vast array of various filter types, the different types are introduced below. Most of the settings in each filter should be quite intuitive and straightforward, but a few are a little tricky, these are described in more detail together with the introduction of the filter below.

A couple of settings are common:

It is possible to indicate the source and target channel(s) for the events. It is possible to select multiple channels by holding the control key while clicking the channel numbers.
Copy event
Indicate whether to suppress or copy the original event.
Edge Triggered
If checked the source controller is treated as a momentary MIDI button that sends a value > 64 when pressed and < 64 when released. This kind of binding is edge-triggered in that it invokes the target when the value crosses from less that 64 to greater than 64. If unchecked the source controller is expected to send a non-zero value when pressed and no event or a CC value of 0 when released. ie: it triggers on any non-zero value.
Out of range
Choose whether to 'Discard', 'Clamp' or 'Slide' event values outside the specified range for the source event.
  • Discard: values outside the source range are discarded and the binding isn’t invoked.
  • Clamp: values are clamped to the source range and the binding invoked.
  • Slide: the source range is internally adjusted up/down to make the source value within range.

Aftertouch To Controller Map

The Aftertouch To Controller Map item generates a controller event based on aftertouch values. The aftertouch value can either be from a single note or calculated as the average or maximum of all held notes. This value is send to the selected controller as the controllers value.

Button Bank

The Button Bank item allows mapping two ranges of button controllers onto some other MIDI event.

Say you have two banks of button controllers that you'd like to translate to say a program change event. The button bank controller allows this by combining the button presses from one bank with the button presses from the other (using configurable add/multipliers operations) then sends the desired event.

There is a detailed description available.

Channel Map

The Channel Map filter item assigns all MIDI events from one or more MIDI channels to one or more other channels.

Channel Select

The Channel Select item is a simple way to filter out all MIDI events except those on one (or more) channels.

Controller Latch

Transforms an incoming MIDI controller button or pedal press to a sequencer of controller values. On each press of the source controller button/pedal the next value in the sequencer will be generated as a new controller event.

This filter is intended for cycling through VST parameters that have discrete values rather than continuous controller values. Eg: this could be used to assign a push button to toggle a VST parameter on/off.

Controller Map

The Controller Map filter item assigns all MIDI events for one MIDI controller to another MIDI controller. It is possible to map between nearly all kind of events, and to specify a value range to use for both source and target, thereby also scale the values of the events as needed.

Controller To Note

The Controller To Note filter item maps controller events to notes. It is possible to indicate a list of controllers and a list of notes (the two lists must contain the same number of elements), and the velocity can either be a specific number or taken from the controllers value.

Controller To Program Map

Maps a MIDI controller event to a specific MIDI program change event and/or maps controller button presses to next/previous program, ie if controller 63 is mapped to the next program, and the last program change event was 42, then pressing controller 63 will yield a program change 43 event.

HUI Switch Decoder

The HUI spec encodes button presses using two CC messages and uses a concept of zones and ports. A zone typically represents a group of buttons such as a channel strip while a port represents a particular button in that zone. Each zone has 8 ports and there are about 30 defined zones.

The HUI Switch Decoder filter map each button to a CC as follows:

CCNumber = zoneNumber * 8 + portNumber

When pressed value of 127 is sent, when released 0. ie: a standard MIDI button style behaviour. For example: zone 14 port 4 would be mapped to 14 * 8 + 4 = CC #116.

As there aren’t enough CC numbers to cover the full range of zones, if the calculated CC number exceeds 127 then the CC numbers wrap around and the next channel number is used.

A few more details are available in this blog post

Key Range

The Key Range filter item transposes a range of notes up or down by a specified interval. It is possible to change the channel of the notes, and indicate if notes outside the range should be suppressed. Also, if the target channel is different from the source channel then it is possible to indicate whether or not to map other events than notes to the new channel.

Also consider the related filter types Keyboard Split and Transpose.

Key Range To Note

Maps a range of notes to a single note on the same channel, and keeps the velocity. It is possible to suppress notes outside the indicated range.

Keyboard Split

Splits a keyboard range by a specified note, and maps the lower and upper part to two channels, potentially also transposed. It is possible to choose to have other events than notes mapped to the new channels as well.

Also consider the related filter types Key Range and Transpose.

Note As Controller

Maps a range of notes to either a single controller, or a range of controllers. It is possible to indicate a condition, ie a controller where the value must be >63, otherwise the filter item will be bypassed.

If the range of notes maps to a single controller, then the index of the source note within the range of notes is used to calculate the controller value.

If the range of notes maps to a range of controllers, then the index of the source note within the range of notes is used to calculate the controller number, and the value for the controller is as indicated by the settings for Released and Pressed.

There is a detailed description available.

Note Map

Mapping of each single note to any note, or same, or suppress it.

Pitch Based Velocity Ramp

The Pitch Based Velocity Ramp adjusts the velocity of notes according to their pitch. This filter is useful for adjusting instruments that get too loud or too quite at different parts of the keyboard.

It is possible to indicate the key range to be affected, and how much the velocity should be adjusted across the key range. It is also possible to indicate if notes below and above the key range should be adjusted or left at their original velocity. These options are useful if you want to create a sequence of pitched velocity ramps for different key ranges.

Program Map

Maps a single program change command to another program change command. Supports banked program changes.


The Sostenuto midi filter implements the sostenuto pedal from a grand piano, it’s similar to the damper/sustain pedal except it only holds the notes that were on at the time the pedal was pressed.

The MIDI controller for Sostenuto is CC#66.

Sticky Note

Keeps a note playing until specifically released, either by the specified Master Release Note or the specified Master Release Controller. It can either be monophonic, in which case the previous note is released when a new note is played, or polyphonic, then all notes are kept playing until released.

Suppress Events

Filter out notes, controllers, after touch, program change, channel pressure, pitch bend or midi clock on one or more channels. It is possible to indicate a range for notes and for controllers, and also choose whether the range is included or excluded from filtering. The range can be empty, which makes it possible to indicate and empty range of allowed notes, the same as suppressing all notes.

Sysex Decoder

The Sysex handling is described in detail in the Sysex guide

Sysex Encoder

The Sysex handling is described in detail in the Sysex guide

Sysex Patcher

The Sysex handling is described in detail in the Sysex guide


The Transpose filter item transposes a range of notes up or down by a specified interval, and optionally changes the channel of those notes.

Notes outside the specified key range are not transposed, nor is their channel changed.

Also consider the related filter types Keyboard Split and Key Range.

Velocity Gate

The velocity gate filter can be used to remap notes according to their velocity. This can be used for example to play one instrument with soft notes and another with loud notes. The keyboard range filter can be used to either remap notes to a new MIDI channel, or to simply suppress notes outside the specified velocity range.

There is a setting, Velocity Delta, which specifies how much to adjust the velocity of remapped notes by, possible values are from -127 up to 127.

Velocity/Controller Curve

The Velocity Curve filter item manipulates the values of velocity, controllers, aftertouch, channel pressure and pitch bend events.

It is possible to select what to be affected, and what curve shape to use, either normal Curve or S-shaped Enhance. The curve can be adjusted to taste, and it is possible to narrow the range affected by the curve.

Voice Allocator

The Voice Allocator maps notes out on different channels, and is intended for playing polyphonic on a monophonic synth by having several instances of the synth made available on different channels. The notes are spread out on the available channels after the principle to pick the least recently used inactive channel and if all are active, then use the least recently used active channel and send the needed note-off event.

See Also

See also the Cantabile 2 User Guide as some MIDI filters are identical.