Splitting Up Midi Channels into Separate Virtual Midi Ports

There have been some other questions from LinnStrument users over the years here, but none that matched this very basic thing that I’d like to do.

The LinnStrument has a feature called Split mode, where it splits the playing surface in half. With the purpose of playing 2 instruments at once. When playing in MPE mode, it facilitates this by splitting up midi channels:

Channels 1-8 - Left Split
 Control Channel: 1
 Notes: 2-8

Channels 9-16 - Right Split
 Control Channel: 16
 Notes: 9-15

The problem is that DAWs like Ableton re-map the received midi channel which prevents you from controlling a unique instrument with each split.

Someone had mentioned that bome might be able to filter out and forward data on these sets of channels to a virtual midi port to fool Ableton into thinking there are 2 devices connected.

I’m new to bome and am in learning mode. I am struggling to find a way to forward, for instance, a raw 1 byte message from a specific channel. My initial thought was to forward all messages of a specific size on channels 1-8 to BMT1, and 9-16 to BMT2. But perhaps I’m thinking outside of the box provided.

Might there be a better way to do this? I was hoping I didn’t have to create unique actions for Note On/Off, MPE, and CC.

Hi and welcome to the Bome community!

The attached example will send note messages to BMT 1 for channels 1-8 and BMT2 for channels 9-16. I used raw MIDI to detect notes so that I could use single translators for both note-on and note-off messages. At this time there are no translators set up for CC, pitch bend or PC. If you need those you would need to add translators for that. I send the outgoing note message to the same MIDI channel as the incoming message.

There is an MPE message type, but I don’t think the Linn Instrument uses the standard MPE as it existed before the MPE spec was completed.

This should get you started.

MIDI-Port per Channel.bmtp (1.3 KB)

Steve Caldwell
Bome Customer Care


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

Hello Steve,
it’s sad the OP did not respond to his own thread after you prodived some help! I too am looking for to seperate midi channels per BMT 1, BMT 2, etc.
So i’ve opened up the project you posted but I fail to understand how it works :

What I would like is to pass a device (say a Komplete kontrol mk2 which is a midi channel 1 by default) through BMT 1 and have BMT 1 be a midi channel 6 for example. In ableton, KK mk2 is deactivated, BMT 1 is activated and when I press a key or use pitchwheel, ableton recieve a channel 6 midi msg.

I’m trying to understand : what does that mean in the rules ?
// Look for Note on-or off
rr=oo&224

// Look for MIDI CH 1-8
rr=oo&15

Specifically the rr=oo& confuses me.

Also, how would that work if I want to include CC and PC messages?

Thanks a lot !

Yes, I can see how this might be confusing the & operator is a bitwise and operator. In Hex this would be 0xE0. So I’m masking out the lower portion of the status byte (MIDI Channel) and looking only at the upper byte.
Basically, you and 0xE0 with the status byte and the status byte is either 0x80 or 0x90 the result would be 0x80 or 128.
So essentially it is checking if it is a note on 0x9n or note off 0x80. Otherwise we do nothing.

E in binary is 1110.

Status byte Upper bit and with E
9 = 1001
8 = 1000

9 & with E
1001 = 9
1110 = E

1000

8 & with E
1000 = 8
1110 = E

1000

Anything else AND with E would not give 0x8
If you want to include all MIDI messages you would leave this all off and then any status byte message would be valid.

Here I am using the AND operator to mask out the upper nibble of the status byte to get the lower nibble which is the MIDI channel. Anything AND with 0 = 0.

So
0xB5 & 0xF0 will yield a result of 5 which would be a MIDI channel of 4. (MIDI channels are zero based).

If you have trouble with this, I suggest you google ‘binary math’ or ‘binary logic’ and I’m sure there would be good tutorials on this subject.

Steve Caldwell
Bome Customer Care


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

Hello Steve and thanks again for the quick reply!
However, if the reply would have been in chinese character, it would have been pretty much the same to me;)

**Could you clarify that sentence by any chance? **
0xB5 & 0xF0 will yield a result of 5 which would be a MIDI channel of 4. (MIDI channels are zero based).

What does that mean : ‘are zero based’?

I did try your suggestion and go and read about binary logic, boolean operator… honestly, it feels like learning a whole new language on the topic of software engineering which seems rather overkill? Isn’t there a simpler way to go about this?

Like somewhere in the option where you can simply pick : BMT 2 -) midi channel 2
BMT 3 -) midi channel 3

Every devices that would go through those BMT could inherit the selected midi channel.

Thanks

No BMT are MIDI ports. Every port can have 16 MIDI channels.

Zero based means the numbers start with 0 instead of 1 so MIDI Channel 1 = 0. MIDI Channel 2 = 1 etc up to MIDI CH 16 = 15
For MIDI basics you can google MIDI or go to MIDI.org.

So if you have 9 virtual MIDI ports each having 16 MIDI channels you have 9x16 or 144 possibilities.

Or if you don’t want to navigate through all of the MIDI jargon, maybe you can just tell me what you want to accomplish and I can get you started that way without all the long winded technical explanation.

Steve

If you just want to map MIDI CH 1 on KK to MIDI CH 6 on BMT 1 Virtual Port. I think that is what you are trying to do but if you only want pitch wheel on MIDI CH 6 and everything else on BMT 1 that would be a bit different. We can do that to but I need you to be precise on what you want.

Steve

Thank you for precising the ‘0 based’ I wasn’t sure if it was something simple like that are something related to mathematical/computer jargon!
To name a few in your first reply that were a 1st time seeing them (coming from 12+ years using midi controller and teaching music) :

bitwise and operator
*lower portion of the status byte (what’s a status byte and what is the lower portion what is left to the x in the ‘0xE0’? *
upper byte
E in binary is 1110

I want to point out that I do appreciate the time you took for trying to explain those rules!

Got you with the 16 port x 16 possible midi channels!

Well, it probably does make a lot of sens once you understand every terminology of the ‘mathematical logic’ you refered too. It just seemed a bit out of way and not directly related to midi/music when I tried using your keywords in google.

I’m just thinking we already have terminology that make sens to most musician regarding midi, couldn’t we use those to describe the rules or achieve what we want through the setup/menu in BOME?

Example in the translator option, when pressing a note (capture midi ticked) : Note ON on channe 2, with note 103(G7), velocity 105.

That above line is very clear at least way more then :
81 67 7F in the log window or (0x67) / (0x7F) in the capture window

Maby a suggestion in the future for BOME: maby the devs can look into simplifying the user interface or adding options as to allow access to more complex features even to the less experienced users.

Would that be possible or we can’t go about this without using rules ?

Sure, here is precisly what i’m trying to achieve at the moment :

  1. using KK in ‘midi mode’, I can sure select the desired channel (1 to 16) for piano keys or button using the Native Inst. controller editor. However, while in midi mode, I lose all the native feature of the keyboard (screen to controll plugin, etc). Thus I need to stay in native mode which is stuck on channel 1 by default. However, it conflicts with other controllers I have in ableton. I would like to use Bome to keep the KK in native mode but send midi data on another channel (notes, CC, PC, everything)

  2. a 2nd thing I’d like to do, on certain occasion : still in native mode, i’d like to be able to split the keyboard : say notes A0 to B2 on channel 5 and C3 to C8 on channel 6
    CC, PC could be on either channel

How would you suggest doing that?

Thanks

Many things can be done with less rules if you use multiple translators. I’ve found that by using rules, you can change a lot more in single translators much quicker. It is a matter of preference. Rules are primarily the major power of Bome MIDI Translator for very complex actions and dependencies.

You can use separate translators for each type of incoming trigger and then map (without rules) to the desired outgoing MIDI channel. So you would generally need separated translators for

Note On
Note Off
CC
Pitch Bend
NRPN (a form of CC)

Or you can do like the example I did with less translators and more rules.

Using global variable and rules, will make it much more flexible as you can define the desired incoming and outgoing channels as global variables and quickly change them in one place without adjusting all translators.

For instance, if I want to map MIDI CH 1 to MIDI Channel 5 I could set incoming global variable ga to 0 and outgoing global variable to gb and as I did in the attached project file.
I use local variables to make a translator handle any note or any velocity instead of 128 translators for 128 possible note numbers. and 128 translators for a possible 128 velocities.

I set translators for both note-on and note-off but you would need to set it for other types of MIDI messages

You could set up a translator to define the desired split point and then use rules in the note-translators to process output on different channels based on the split point.

I just showed someone else and example here.

Note-Channel-Mapping-Example.bmtp (2.0 KB)

Again, being a long time support person for Bome, I’ve found ways to use variables and rules to make bigger changes in project files without the need for re-doing multiple translators. I share these with users usually to help them not have to do a lot of re-work, but as you say, the examples sometimes might be somewhat confusing to new users. Most of our tutorial examples use the simple methods but are often harder to maintain.

Steve Caldwell
Bome Customer Care


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

Hello Steve,
thanks for these info + the example file, I have a lot of food for thoughts.
Also want to point out that the speed of response is unmatched by any other similar software company i’ve used : well played on your part!

Regarding my 2 goals, i’m gonna focus on the 1st one so it’s easier to know what we are talking about (goal : changing the whole keyboard to a different midi channel)…
I’ve opened your example file and tested playing a key (note on/off) :
Here is the result (see screenshot)

Do I need to add translators or add something to specify the desired channel, Midi IN and midi out seems to be the same in the log window :

Speaking of witch : Could you help me understand these values in the log window (or direct me at the right place to read about it : google or the manual didn’t help me on that)

114: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: 91 45 47
115: MIDI IN [KOMPLETE KONTROL - 1]: 81 45 55

EDIT :
I was initially testing your file with bome only opened, which was not yielding any restult. When launching ableton, it suddently started working, though I don’t understand why (see screen shot)

However, I can’t seem to find where you were able to select channel 5 (or gb 4) in the project. I would also need the velocities to be unaffected as to play piano normally (soft parts, loud parts, etc). Currently they are set at 127. Is it possible?

Thank you

Thanks for the positive encouragement!

Normally I would direct you to http://midi.org but right now it appears that the site is down. Here might be a good alternative that provides the basic structure of MIDI messages.

As far as the project file. In the third translator ( 0.2 with name of ‘Init - Initialize Globals’ ) of the first preset, I set global variables that are used to establish incoming MIDI channels to look for and outgoing channel to translate to. This is in the rules section.

// incoming MIDI Channel (Zero based)
ga=0
// outgoing MIDI Channel (Zero based)
gb=4

So we are looking for MIDI messages from MIDI channel 1 and sending to MIDI channel 3.

The reason you are seeing the same incoming and outcoming MIDI messages is probably because you are sending from KK instead of the alias ‘My Keyboard’. You can assign the alias "My Keyboard to your controller in the this menu.

image

I have my aliases for testing as follows:
image

You should set these up for your physical input and output devices.

You can learn more about aliases from this tutorial.

Once you assign aliases, you should not select the physical ports as well as you will likely get double outgoing messages.

Also, any time you have a MIDI thru path, if a translator is not targeted to handle a given incoming message with the ‘swallow’ option set , the message will pass through the thru path untouched which is why you are seeing the same incoming and outgoing messages.

Another useful tutorial link might be that of assigning ports.

For more information about device selection, see this tutorial.

As far as velocities. If you want them unaffected change the outgoing message of translators 1.0 and 1.1 from 127 to qq which will match the incoming velocity which was established as local variable qq.

image

Your other non-note messages (ie B0 01 09) pass through untouched because they didn’t trigger a translator. B0 01 09 is CC 1 (B means CC) on MIDI Channel 1 (0) . with velocity of 9.

Typically I like to do everything in translators as opposed to establishing MIDI thru paths because I like to control everything and don’t want unwanted messages slipping through.

Steve Caldwell
Bome Customer Care


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

Okay thank you, midi.org is back up and I did take a look at both site.
So I understand that there are 3 bytes on a ‘mathematical’ midi message (how do you phrase those sorts of messages?)

So for the 2nd and 3d byte : note number / velocities above 99, I don’t recall seeing 3 digits in bome. How does it work?
I understand for the channel note off 89 = channel 10, then 8A means channel 11 note off

Okay, I thought that 1st preset (0) init. was a generic one after update (I had to update to open your file). Now I see the rule in one of it’s translator. Is there a reason why these rules have to be in a seperate preset?
// incoming MIDI Channel (Zero based)
ga=0
// outgoing MIDI Channel (Zero based)
gb=4

I’ll want to implement this setup into my own projects so what is the purpose of these 2 translators?

Thanks for that tutorial, I had already watched it and I got to say, it is still a bit confusing to me(I think the fact that many ports are still visible with the same name, some in italic).

When I setup my aliasis as per your screenshot : Output application- BMT 2 / Input My keyboard - BMT 1

Nothing happens : Event monitor stays blank, nothing in login window. Here’s what it looks like :

Is there something I should thick in the right pane?
Otherwise, if I put my KK into the ‘Edit midi aliases menu’, I see proper value into the login window (from channel 1 to channel 5, velocity 127)
Yet, it’s only the case if ableton is open (with KK + BMT 2 is selected into it’s midi input). If I remove KK into the ableton inputs, it stops working. As you pointed out, it seems there’s some wierd midi spilling happening and usually. How should I fix this?

Got you the velocities tip on your last reply, it make sens and I can see how storing info into qq variable in order to recall them ‘as is’ can be useful

Thanks,

Nelligan

The bytes shown in the log are in hexadecimal. Please refer to the table below for conversion.

image

The first one will run the Perform ‘Init’ when the project file is opened. The the second one does the same if you hit Ctrl(Right) on your keyboard. I put the second one in to make it easier to re-initialize global variables. You can have multiple translators that do different things on Perform ‘Init’ like setting global variables (in rules), or enabling and disabling various presets, maybe sending an initialization sequence to a given port or such.

The original ports will still be visible but you should really use the aliases only. Aliases will use a “->” to show the port they are pointing to such as shown below where the alias ‘Application’ points to Bome MIDI Translator Virtual Port 2.

image

You need to point your aliases to the physical ports that you will be using. Usually the input port if from a MIDI controller. The Virtual Ports are usually used for application to application MIDI communications.

In your case you should assign the alias ‘KOMPLETE KONTROL - 1’ to ‘My Keyboard’ in Bome MIDI Translator Pro. Ableton should be looking at ‘BMT2’ instead of ‘KOMPLETE KONTROL -1’ as everything needs to go through Bome MIDI Translator Pro since it is acting as a ‘Man in the Middle’.

Here is a reference for how Hex, Binary and Decimal are referenced.
Computer (and MIDI) programmers use this numbering system as it is more easy to convert from binary (which computer use) to hex

Decimal 0 = Binary 0 = Hex 0
Decimal 1 = Binary 1 = Hex 1
Decimal 2 = Binary 10 = Hex 2
Decimal 3 = Binary 11 = Hex 3
Decimal 4 = Binary 100 = Hex 4
Decimal 5 = Binary 101 = Hex 5
Decimal 6 = Binary 110 = Hex 6
Decimal 7 = Binary 111 = Hex 7
Decimal 8 = Binary 1000 = Hex 8
Decimal 9 = Binary 1001 - Hex 9
Decimal 10 = Binary 1010 = Hex A
Decimal 11 = Binary 1011 = Hex B
Decimal 12 = Binary 1100 = Hex C
Decimal 13 = Binary 1101 = Hex D
Decimal 14 = Binary 1110 = Hex E
Decimal 15 = Binary 1111 = Hex F
Decimal 16 = Binary 1 0000 = Hex 10

Steve Caldwell
Bome Customer Care


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

Thanks for these 2 conversion table, as I did not find it in the manual !
I grasp the concept between DEC - HEX now.

The first one will run the Perform ‘Init’ when the project file is opened. The the second one does the same if you hit Ctrl(Right) on your keyboard. I put the second one in to make it easier to re-initialize global variables. You can have multiple translators that do different things on Perform ‘Init’ like setting global variables (in rules), or enabling and disabling various presets, maybe sending an initialization sequence to a given port or such.

Okay sounds cool and eventually something I would like to do. For the time being and specifically for setting up my KK full time on channel 5, it is my understanding that I don’t need any of those extra translator? In that case, I could get rid of preset 0 init, and copy and paste the rules of that last translator into preset 1 on one of the 2 translators? Just for the sake of keeping things as simple as possible

The original ports will still be visible but you should really use the aliases only. Aliases will use a “->” to show the port they are pointing to such as shown below where the alias ‘Application’ points to Bome MIDI Translator Virtual Port 2.

Perfect, I think I’ve realised what the issue was or why it wasn’t working as I expected to. It’s not really ableton that needed to be open, rather the plugins which it containned (in that case komplete kontrol vst). Otherwise, the keyboard is open but is in midi mode (different channel thus was not reacting). With the vst open, it automatically switches mode (on channel 1 and start reacting

Thanks again, I know it takes more time than simply using the project you provided but it’s way more satisfying to understand what i’m doing!

Thanks again,
Nelligan

Yes, understanding the basics is pretty important before you start the harder stuff. There is a lot of power in Bome MIDI Translator Pro but you have to have a good grasp on what is going on to make full use of it.

Steve Caldwell
Bome Customer Care


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

Cool! How about this question above though? If I got it wrong, where would you place those rules?
Thanks

You can have a single translator that has an incoming action ‘Project Opened’ and place the rules to initialize (and document) your global variable there. See this tutorial.

Getting rid of all but the last translator won’t do as it will never trigger the incoming action unless you change it to Project Opened.

Steve Caldwell
Bome Customer Care


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