MIDI Channels In/Out


I was thinking your life was getting too easy, so I thought I would get some assistance. First I hope this finds you all well. I have to tell you that even though I doubt I'll do much more than scratch the surface, the program is amazing.

My controller has 2 keyboards. The upper keyboard transmits on channel 2 and the lower channel 3. CC messages are sent over channel 1.

I have certain libraries where the patch only accepts one channel. So I have to assign either MIDI channel 2 or 3 for note on/off messages (depending on the keyboard) and merge channel 1 with that so that CCs get through.

I have a library with a Kontakt multi which requires 5 incoming, separate MIDI channels. I took the long way around the first time and created 5 note on translators sending channel 1 and 2, to channels 12, 13, 14, 15, 16; and 5 note off translators to the same channels. Now since I have 2 keyboards, I duplicated all this for the lower keyboard as well (channel 3). It's a dog's breakfast. It was rather dumb of me to put all of this through 1 port. I can run upper and lower keyboards through separate ports to segregate the two.

When I look at incoming, I can select any channel. Outbound only allows the selection of one channel. There has to be a reason for that. Maybe to prevent chaos. What I want to know is, is there a way to create a single channel in and Omni out? For example, I want all data on channel 2 inbound to transmit on all channels outbound. Bear in mind that before doing Omni (if it's possible) you would have to merge channel 1 with channel 2, so that CC messages get through. I would like to do this with 2 translators. One to merge channel 1 with channel 2. Another to send out the combined channel as an Omni?

Can you help me out?




I did this with 5 translators as follows

Translator 1 merges CC from Channel 1 and Channel 2 and sends to MIDI CH 1 only. I use rules to qualify the incoming channel 

If it is a CC message on one of the targeted incoming channels, no further processing handles because I have "Stop Processing" set.

The second 2 translators take any 2 byte MIDI message from any incoming channel and use a timer to send it out to all channels one at a time.

The third 2 translatorst take any 3 byte MIDI message from any incoming channel and use a timer to send it out to all channels. However since Stop Processing is set in the first translator, 3 byte CC messages will not be passed again here but notes will.

I'm not addressing 1 byte messages since they are channel agnostic.

Finally all translators have Swallow set and a default MIDI route to allow for any other MIDI message (such as System Exclusive) to pass through untouched.


Steve Caldwell
Bome Customer Care

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



Thanks Steve,

But how do I send to all channels? Outbound only shows single channel. Also, what about latency. There wi be note on/off messages. In case my long drawn out note was dumb, I want to send all data from channels 1 and 2 to all channels. Forgive me if that was redundant.

But how do I send to all channels? Outbound only shows single channel. Also, what about latency. There wi be note on/off messages. In case my long drawn out note was dumb, I want to send all data from channels 1 and 2 to all channels. Forgive me if that was redundant.


SJC> The second and third pair of translators send out to all channels one at a time (however the same port). Are you looking to send out to multiple ports and channels?

For instance to send a CC 0 message to MIDI channel 1 you would send B0 00 xx.

The B indicates a CC message and the 0 is MIDI channel 1 (0-F = MIDI Channels 1-16)

The second byte (00) indicates the CC number.

The third byte (xx ) represents the CC value.

So if you want to send CC 0 to both MIDI channel 1 and 2, you have to send 2 channel messages

B0 00 xx B1 00 xx

Just use a timer to indicate the channel and loop through all channels.

The delay time is 0 between iteration so it will be as fast as the MIDI transport allows so latency should be negligable.

Here is example from the Log Window:


968: OUT 0.3 Timer gd times \"Three Byte Omni\": 0 ms (initial delay: 0 ms)

969: OUT 0.4 MIDI B0 00 00

970: OUT 0.4 MIDI B1 00 00

971: OUT 0.4 MIDI B2 00 00

972: OUT 0.4 MIDI B3 00 00

973: OUT 0.4 MIDI B4 00 00

974: OUT 0.4 MIDI B5 00 00

975: OUT 0.4 MIDI B6 00 00

976: OUT 0.4 MIDI B7 00 00

977: OUT 0.4 MIDI B8 00 00

978: OUT 0.4 MIDI B9 00 00

979: OUT 0.4 MIDI BA 00 00

980: OUT 0.4 MIDI BB 00 00

981: OUT 0.4 MIDI BC 00 00

982: OUT 0.4 MIDI BD 00 00

983: OUT 0.4 MIDI BE 00 00

984: OUT 0.4 MIDI BF 00 00


Steve Caldwell
Bome Customer Care

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




I am sorry to have to enquire again about getting this right. You've been great and very patient. I don't think I framed the issue properly.

Some preamble. I am attempting to simulate some key switches in a string library. The keyboard has only 61 keys and physically pressing the key switch keyswould invade those that cause the library to play sound.

I would like to transmit the values C1 (C0 if you're a Yamaha guy) to B1; depending either on one of 12 different CCs (multiple drawbars) or different values of a single CC (single drawbar).

The data will arrive on channel 1 and has to be transmitted to 5 channels (12, 13, 14, 15, 16) on the same port. The note on message has to be followed by a note off message (I just need to transmit the key so that it sets the switch in the library). So...say I get data on channel 1/CC 29/value is > 14 and <= 28 (yes I know AND/OR IF statements are cumbersome); MIDI note 24 would go on and then off. That would simulate the key switch. On the other hand, I could use separate sliders, using their unique CC numbers. In that case it would just be a question of which CC is transmitted.

C1 (Yamaha C0) to B1 doesn't physically exist on the keyboard, so there won't be any conflict with the library.

The way I would do it, it would take 12 notes x note on/off (2) x 5 channels; or 120 translators.

Now you mentioned timers. I must admit I don't know how to do this, and certainly don't know how to do it in this scenario. I have used raw MIDI data and I think I could decipher what is required by using the MIDI capture window.

I don't need the whole thing laid out for me. I just need to understand the structure ( including timers) which would allow me to get this done.

If you don't want to take this further, I certainly understand. But I could use the help.


I’m not 100% sure if I’m following you. Are you saying that you want each of 12 single notes down in the lower octave range to translate to a serials of organ drawbar CC’s each on a different MIDI channel so that you are using these notes to call a drawbar preset?
The note on command would set 5 drawbars and the note-off command just to ensure there are no hung notes?

This could certainly be done with less that 120 translators (but many more rules to help with the math).

Hi Steve,

Thanks for sticking with this. This would be the process. To clarify, I have a Kontakt multi with 5 instruments each receiving data on one of 5 channels: 12, 13, 14, 15 and 16

-I would do something on the controller, lets say I move a drawbar associated with CC 29

-that would arrive at Bome via channel 1 from my controller

-that would be translated to MIDI note 24 and sent on channels 12, 13, 14, 15 and 16; through a single Bome virtual port.

-this would have to be repeated for notes 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35. Everything would leave through the same port.

-this would also require an immediate note off message following the note on message so as not to confuse the key switch system

-also bear in mind that all channel 1 messages are already routed to channels 12, 13, 14, 15, and 16 in five other translators. So would I put a rule in the existing translators stating that if the incoming CCs were equal to the ones used to process the key switches, don't process the outbound action?

Thanks again,



I\'m still not 100% sure this is what you want.

Here I take CC 29 any value set to qq and I convert it to Note-On value qq and then Note-Off value with note 24 on MIDI channels 12-16.

You never specified if you wanted the incoming CC value to translator to outgoing Note velocity so I assumed this is what you want.

I use raw MIDI messages so that I can put everything in one translator. In this case I did not use a timer, rather just pushed out the note-on and off messages one at a time in the same translator.

I have a lookup table in the beginning so that you can have different sections to process incoming CC\'s separately and the outgoing note values or modify the velocities if you wish. You can modify the rules to meet your needs, however now at least you have a template for the rules. Right now, all I do is set the outgoing note number to variable rr based on the incoming CC number. Right now I have it only to look at CC29 and CC 30 on MIDI CH 1 which puts out note 24 and 25 respectively.


Steve Caldwell
Bome Customer Care

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


P.S. It seems the file I posted is not making the trip so if you email me, I\'ll send the attachment via email. I\'ll check into why this doesn\'t seem to be posting correctly.



Thanks Steve,

I have learned so much from this! Goto statements, etc. I didn't realize you could run multiple raw MIDI messages in one translator, let alone statements side by side.

I also now fully appreciate that I can select the correct raw message by performing the action on my controller and studying the resulting MIDI data.

I can use this as a template to perform all single to multi-channel actions. This saves countless numbers of translators.

Does the rules section care about white space? Does it matter if I leave 2 spaces between statements?


No doesn’t care about white space but every operation needs to be on a line by itself.

Glad I could help!