Re-routing MIDI channels per port using the least amount of translators

I run a studio that has several hardware synths (currently 7), each one can be set to what MIDI channel they input and output (for the most part), these are not adjustable on all the synths.

I know I can convert each of their channels using translators that reroute MIDI Note On/Off and CC from the input channel of each synth (let’s say each synth is MIDI ch 1) for the specific synth/port to different MIDI channel and route to a Bome virtual port (to use as a singular device in my DAW), so I can essentially assign each of the synths to a different channel in the Bome adaptor.

However, this is like (I think) 6 translators per synth:

  • MIDI Note On - IN
  • MIDI Note Off - IN
  • CC - IN
  • MIDI Note On - OUT
  • MIDI Note Off - OUT
  • CC - OUT

Is there a way to do this sort of thing with less translators? Like using RAW MIDI data? I want to convert all MIDI channel data per port, from one channel to another.

Side question about variables, I notice that the variable dropdowns in the translator for Channel, Note and Velocity Incoming are hardcoded lists where for Outgoing are able to be populated with your own variable name. Are these variables global to the entire project or are they scoped only in the particular translator?

Thanks!

You can use 2 translators for each incoming device and use all local variable with the translatior

Any 3 byte message

Incoming Raw MIDI oo pp qq
Rules;
// Change MIDI channel to MIDI Channel 5
oo=oo&0xf0
oo=oo|4

Outgoing Raw MIDI
oo pp qq

Then do something similar for 2 byte messages

You do this with incoming for each device separated so that you can assign different devices different channels. This video tutorial shows more detail on how you can customize device selection.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Hey, thanks for the reply Steve. Ok, I am not super familiar with MIDI spec (or byte operations), but I just now looked it over a bit and am a bit confused about how the rules work (maybe this is the part that shows my byte operation ignorance) :slight_smile:

The rules you have here capture ANY MIDI channel part of the incoming message (i.e. note on = 8[ch], note off = 9[ch], etc.) into oo and then sets the oo var to intended outgoing channel (i.e. note on = 84, note off = 94, etc.). (I think?)

The part I am struggling with is the rule syntax here, like this rule you have works great for routing ANY incoming channel to a specific outgoing channel. If I wanted to capture a specific incoming channel and change it to a specific outgoing channel, what would the first rule look like?

Maybe seeing that as an example would help me understand.

The video you linked to is all good stuff but really focusing pm port routing and how the project/preset/translator hierarchy works, and not specifically about variables and dealing with raw MIDI.

Yep, that is how it works.

The below will restrict incoming to MIDI CH 1

Incoming : oo pp qq

Rules:

// mask out the MIDI type and only look at the MIDI CH
rr=oo&0x0f
// Only allow MIDI CH 1 to pass , For MIDI CH 2 change "0" below to "1"
if rr!=0 then exit rules, skip outgoing action
// Then continue with the rest of the rules.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Ok, I’m a little closer… This is my current rule set for going from my DAW/Bome Virtual Port to the external synth (which is setup to send/receive on MIDI ch1):

rr=oo&0x0F
// stop processing rules if the incoming channel is not 3
if rr!=2 then exit rules, skip Outgoing Action
oo=oo&0xF0
oo=oo|0

The part I’m not getting here is that this will send to the ext synth MIDI ch1 when I send from the DAW/BomeVP on channel 1 or 3, I would think that the if statement above would filter out everything except ch3 (i.e. rr!=2) this leads me to think that since the synth is set to receive on ch1 by default, something else is letting that through.

(this translator is set to only have the BOME VP incoming and to the ext synt outgoing)

Hi,
My guess is that you have some MIDI Thru routes set. It turns out that the “Swallow” option only works if the translator executes or the outgoing action is None.

In this case you need to either.

  1. Create a translator that block the message you want to get through by having an outgoing action of none
  2. Remove the MIDI thru route.

This really tripped me up as well. Typically I do not use MIDI through routes unless I absolutely have to (for instance to let random SysEX messages through that I don’t want to create a ton of translators for.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Yeah, not sure where the thru would be coming from. In this same preset I enable/disable routes to/from all my synths. I have routing set at the project level and then presets which enable or disable the routes based on the preset being enabled/disabled.

(my scenario is that I want to run “DAWless” by default so that all the synths clock off my main drum machine Roland TR-8s, so my default preset in this project enables routes from the drum machine to all the synths, then the other preset is to reroute everything to the Bome adaptor, which is the only MIDI port I have setup in my DAW, so then in this preset I also am re-routing all the input MIDI channels to set discrete MIDI channels in the Bome port per synth)

So, in this preset I don’t have any other translators other than the enable/disable routes. So sort of at a loss there as to why MIDI data is coming through that channel…

However, adding a translator at the end of the list that is input Bome adaptor Raw MIDI to None stops MIDI channel 1 from going through. I’m just hoping that as I setup the translators for converting the MIDI channels of the other synths that it doesn’t mess something up, but I don’t think it should since it’s always the last translator and happens after all the other routing has occured.

I’ll report back if it doesn’t work as I expect it will. :slight_smile:

Really appreciate you walking me through this, much less clutter doing it this way than having discrete translators for each synth’s MIDI message type (Note, Pitchwheel, CC, etc.).

Thanks