Replicate MIDI CCs on All Channels?

Is there a way to duplicate MIDI CCs from MIDI channel #1 on all MIDI channels in real time?

I’ve got a MIDI keyboard controller that supports “multi-mono” polyphonic aftertouch - that is, polyphonic aftertouch whereby notes are sent on separate MIDI channels. It works brilliantly with synths that don’t support MIDI Poly Pressure natively, but there’s a flaw - the keyboard controller doesn’t replicate MIDI CCs on all channels. Consequently, if you hold a chord and press the sustain pedal, only the first note (on MIDI Channel #1) sustains.

I was hoping to fix this with Cubase’s Input Transformer, but it appears to only support one Action per event. So, I can duplicate CCs from MIDI channel #1 onto MIDI channel #2, but not on MIDI channel’s 3-16.

I’ve also played with Note Expression but this only serves to present polyphonic aftertouch (and other controllers) that are already formatted correctly. It won’t do what my keyboard controller does by rerouting the notes received from MIDI channel #1 to other channels. Nor will it broadcast MIDI CC data received on MIDI channel #1 to the other channels.

I’ve asked Steinberg to code a Multi-Mono Polyphonic Aftertouch MIDI Insert, but I won’t hold my breath. [Granted, it’s a limited audience.]

But, cripes, I’m so close to having this working. Does anybody have any ideas?

For the record, I found a workaround. It’s not elegant but it works. It goes like this:

  1. Insert four instances of the Transformer
  2. Assign the following settings to each Transformer:
  3. MIDI Insert #1
    • Filter: Type Is - Equals - Controller
    • Action Target: Channel - Add - 1
    • Function: Insert
  4. MIDI Insert #2
    * Filter: Type Is - Equals - Controller
    * Action Target: Channel - Add - 2
    * Function: Insert
  5. MIDI Insert #3
    * Filter: Type Is - Equals - Controller
    * Action Target: Channel - Add - 4
    * Function: Insert
  6. MIDI Insert #4
    * Filter: Type Is - Equals - Controller
    * Action Target: Channel - Add - 8
    * Function: Insert
    To explain, the first Transformer simply replicates (via the Insert Function) every MIDI CC received on MIDI channel #1 to MIDI channel #2. Next, because the MIDI Inserts work in series, we can now duplicate the MIDI CCs from channels 1 and 2 to 3 and 4. Next, we continue exponentially, copying CCs from channels 1-4 to 5-8, and finally, from 1-8 to 9-16. Voila! All CCs received on MIDI channel #1 are now replicated to channels 2-16.

On the downside, there are no more MIDI Inserts available. Of course, if the target synth is 8-voice or less, you can probably free up at least one Insert.

If anyone has a better solution, please share!

For these types of situations I personally like Bidule. The VST/i plugin version isn’t free, but you can certainly give it a good test run with CuBase as a ReWire slave to see if it’s worth an investment. It might be overkill for your immediate needs, but I highly recommend giving it a run…for me it’s quite useful for a large number of things. There’s nothing else quite like it on the market in terms of doing all sorts of low level routing and transformation of both MIDI and Audio.

Bome Translator, in combination with a virtual MIDI port can also provide a lot more real time transformation abilities. There’s a free Classic Version of Bome Translator (Nag Screen at start up, but fully functional) if you’re on Windows. If you don’t already have a virtual port driver and you’re on Windows, I personally like loopMIDI. On Macs you don’t need a special driver…you can set up virtual ports through core audio.

Under either scenario, you can route things in a way where you can echo/transform things into a CuBase MIDI or Instrument track that has it’s output channel set to ‘any’.

Without third party tools…the natural workflow of this sort of tracking DAW…Yes, you can do complex/fancy keyboard and MIDI controller mappings directly in CuBase. Simply use LOTS OF TRACKS, ‘filter OUT’ things you don’t need for a given track/routing, and keep it all in nicely organized folders.

Use 16 MIDI Tracks in parallel…rather than trying to set up all those AUX MIDI Sends and ‘echo’ events, dump your MIDI keyboard controller into many tracks at once and simply ‘filter out’ what should NOT go into a given channel…just lay out 16 tracks, 1-16, from the get-go and direct them all where you want them to go. Drop them all in a Folder in the order you want so it’s easy to keep things grouped…you can easily fold/unfold that stack of tracks when you need more screen real estate.

Set each track to his own channel for the MIDI Output, while all the MIDI inputs are set to your MIDI controller.

Filter out note events using a local input transformer for all but but the channel(s)/note ranges that should be receiving note on/off events.

(Example of a Local Input Transformer that filters all note on/off events for a track)

Each track can have up to 4 independent ‘local transformers’ for filtering out the ‘unwanted stuff’. If all you are doing is ‘filtering’, then you can string together lots of ands and ors to filter out gobs of things in a single transformer. If they are MIDI tracks (not Instrument tracks), you can also get another 4 through MIDI Insert slots (and these can be pre, or post sequencer). Don’t forget to take advantage of transformer presets so you don’t have to keep building things over and over again from scratch on all your tracks. You can also take advantage of exporting a set of template tracks or MIDIloops to make quick work of bringing in a 16 track configuration quickly and easily. Experiment with things like clicking the record button under the folder as opposed to the ones on each track…starting to get the picture?

Don’t hesitate to use more than 16 tracks if you need/want them! The point is that during recording, you get an unlimited number of tracks in CuBase that are much easier to mute/block/arm/disarm/re-route, than they are to echo or duplicate ‘in real time’. Instead of thinking of your MIDI controller as a water hose with a sprayer on the end, think if it the other way round…a big bucket catching rain water, but with lots of nice pipes and spickets on the bottom that allow you to direct that rain water where-ever you want. Think of it more like hooking up dozens of mics at once, all routed and ready to go, where you can simply toggling them off and on (or filter the junk you don’t want going to a given routing destination out) as needed. If you need to dump the same event to 50 different channels, just open the inputs for those 50 tracks and set the ‘output’ of each track where you want it to go :slight_smile:

Enable record (or monitor if you just want to hear without recording) for all 16 of the tracks at the same time…

At this point note events will only go through the channel that isn’t filtering them. CC events will get echoed and channel transformed to all of your armed (for monitoring or recording) tracks.

(Example of a 16 channel Omni Instrument Setup:

Note it’s all in a folder. In this case I’m filtering note on/off from all channels but 1 using local input transformers, and passing/recording all CC events to all 16 channels. They get transformed to the proper channel because of my track channel outputs. I can mute/unmute, solo/unsolo, arm/disarm recording or monitoring all of the tracks in the folder with a single click by clicking the corresponding controls of the parent folder. I can easily collapse it all into a single lane in the project editor by closing the folder. Later in the project, if I wish, I can freeze, and then merge those 16 tracks into a single track for easier editing/scoring/etc.

Once I’ve set this up, I’ll select the folder and ‘export it’ as a track. Now I can quickly import this folder into any project I like all set up and ready to go.

If I wanted, I could easily set my track’s input transformers to only let through specific channels, ranges of notes, etc. for each track (make keyboard zones, remap various keys, etc.). The main point is…use lots of tracks…it’s easier to filter things you do NOT want, than to try to transform and echo things to several places from a ‘single track’.)

It’s easy to merge/freeze it all down to a single track after recording passes. And it’s just as easy to explode it back out into ‘channel lanes’ (separate events into independent ‘parts’ by channel on the same track and stack them) or back out to fully independent MIDI tracks. Just remember to freeze first before merging, and set your new merged track(s) to channel ‘any’ for the output so each event gets sent to the right place.

Keep in mind, that you can also build generic remote device maps that will allow you to remote control things like toggling the mute, monitor, and record controls of a track. I.E. One could make ‘organ stop’ style configurations to arm/disarm any tracks that you want to be active and sending/transforming to the destination assigned for the track (I do this with a bank of MPC pads myself…tap pad 1 and it lights up while track 1 gets armed…tap it again the light goes off and track 1 gets disarmed, etc.). If you want a single MIDI event to do several things at the same time you can also ‘stack maps’ with duplicate events linked to different DAW controls.

There’s a ton of stuff you can remote control through these generic remote maps that do not have native track types or automation lanes in the CuBase Project Editor (stopping the daw, launching macros, arming/disarming tracks for recording/monitoring, and much more). The good news is, you can use a virtual port and route a MIDI track through a generic remote device and automate all that stuff directly to a MIDI Track as well!

Bumped since I’ve added images, hyperlinks, and done a ton of edits to my previous post.

Thank you for the recommendations and thorough explanation, Brian. The solution I came up with above is working nicely so far and has the advantage of keeping everything together in a single MIDI Track for intuitive editing. But there’s a lot of good information to consider in your post and I’ll certainly keep it in mind. I can see how this opens a lot of possibilities. Thank you for taking the time to explain it.