MIDI Poly Aftertouch to Separate MIDI Channels

Few MIDI instruments respond to MIDI Polyphonic Aftertouch messages - even high-end instruments costing many thousands of dollars.

But there’s a fix! Through scripting, users of other DAWs are converting MIDI polyphonic aftertouch data into channel aftertouch data and then redistributing each note, along with its corresponding channel aftertouch data, to an unused MIDI channel (chosen in round-robin order). Any instrument that supports multiple MIDI channels can then playback each note with its corresponding channel aftertouch data, with up to sixteen-note polyphony. This is similar to a MIDI guitar’s use of six MIDI channels to afford each string its own, dedicated pitch bender.

This could be realized in Cubase in a number of ways - some more involved than others:

  • Create a MIDI plugin specifically for this purpose. Include a MIDI channel range parameter for synths that can’t respond to all 16 MIDI channels.
  • Extend Cubase’s Transformer for the required program logic - namely, determining the next available MIDI channel and managing note/AT channel assignments
  • Add a scripting language to Cubase that supports real-time processing of MIDI data on playback

I realize polyphonic aftertouch is a boutique feature, but it would make some of your pro users very happy! :smiley:

Thank you for your consideration.

(Vic puts on “Devil’s Advocate” hat :wink: )…
So, how would that deal with overlapping MIDI notes? (i.e. aftertouch continuing to be applied to first note, while a 2nd note is then added)?

For example, the first note pressed (say, C5) is routed to MIDI channel #1 (because all MIDI channels are available to begin with). Channel #1 is flagged as being “in use” and will remain so until a C5 note off event is received. Meanwhile, any polyphonic aftertouch data corresponding to C5 is converted to channel aftertouch data for MIDI channel #1.

Next, a second note is pressed (say, E5). MIDI channel #1 is in use, so we look for another MIDI channel that is free. MIDI channel #2 is available so, as before, we route the E5 Note-On event to channel #2, flag the channel as being “in use,” and proceed to convert any E5 polyphonic aftertouch data to channel aftertouch data on MIDI channel #2. Again, this continues until E5 is released.

This continues for each note played, up to a max polyphony of 16 (assuming the receiving instrument supports 16 simultaneous MIDI channels).

When a note (say, C5) is released, the corresponding MIDI channel is cleared. That is, the “in-use” flag is reset. This MIDI channel is then ready to receive another note and its associated aftertouch data.

Ideally, the next MIDI channel used would be the one that has gone unused longest, just in case we’re transmitting to an instrument with limited polyphony per MIDI channel - say, a rack full of Moog Voyager mono synths. I’m trying to think if a round-robin approach would work this out automatically or not, but it’s making my head hurt. :smiley:

Does that make sense?

Sorry… I misunderstood. I got it the wrong way round… yes, o.k. if transmitting poly aftertouch… I thought you were wanting to convert channel aftertouch into poly :blush: :wink: .

By the way, I realized some additional functions necessary to make this work properly on playback. Here’s the program logic I’ve deduced so far:

  1. Filter out any channel aftertouch data (because polyphonic aftertouch data will be converted into channel aftertouch data in step 4 and would conflict).
  2. Route each MIDI note to a free MIDI channel, according to the user-specified range of target MIDI channels (e.g., 1-16, 2-9), using a FIFO (first-in, first out) strategy. In other words, for each Note On, use the MIDI channel that has gone unused longest. This way, each synth voice receives the maximum opportunity to decay before a new note is assigned to its MIDI channel. By contrast, a straight round-robin strategy could result in synth voices getting cut off prematurely.
  3. If all MIDI channels are being used, new notes should take precedence. Terminate the longest playing note to free its MIDI channel and assign the new note to it, as in Step 2.
  4. Route any polyphonic aftertouch data to its respective MIDI note’s MIDI channel and convert it to channel aftertouch data.
  5. If the aforementioned polyphonic aftertouch data relates to a note that was terminated in Step 3, then discard the polyphonic aftertouch data. Repeat until an accordant Note Off event is reached.
  6. Replicate all MIDI CC and Pitch Bend messages on all MIDI channels. This way, channel controllers (e.g., sustain pedal) will affect all notes appropriately. [The resulting density of data might create MIDI communication delays. Options for thinning or eliminating data on inactive channels might be useful.]

I think that covers it.