Unable to filter MIDI by channel

Hi,

I am a new user of Bome MIDI translator Pro.

I would like Bome MIDI to filter all MIDI messages of any kind from a channel to send them to a dedicated port. It includes all notes ON/OFF, channel controlers, program changes, etc...

I am very surprised I cannot do that using a simple user option in the subtype of a midi message. I used to do it with MIDIOx with no effort.

Is there a simple way to do this without missing a kind of message ? Maybe a translator with : - raw midi/Sysex message type - midi message : "pp qq rr" to capture only the first bytes - rules : extract channel number to filter (I may include too many cases) ss=pp%16 if ss!=10 then exit rules, skip Outgoing Action - outgoing send midi message with content=pp qq rr

Does the content=pp qq rr send the full midi message in all cases with following parameters ? Do I have to create multiple translators for any length or type of message ?

It is hard for me to understand how to process this case. Could you help me ?

If you turn off your default MIDI routes and the only create translators for messages you want to send through, you can do this. You can set input to pp qq rr and then evaluate the channel . For instance MIDI channel 3

// mask channel

tt=pp&0x0f

if tt==2 then exit rules, skip outgoing action

Or you can only let channel 3 through

if tt ==3 then exit rules, execute outgoing action

Outgoing Raw pp qq rr

If the outgoing action is executed, yes all variable defined in the outgoing action will be sent.

MIDI CC , program changes and Note messages are 3 bytes so you can do that with a single translator.

Any MIDI message with a different number of bytes, yes, you will have to check for all incoming bytes for the incoming action.

Steve Caldwell

Bome Q&A Moderator and

Independent Bome Programming Consultant/Specialist

bome@sniz.biz

 

Thanks Steve !

My pleasure, except I forgot that program change is only 2 bytes.

Hi Steve,

First of all a happy new year to everyone! Sorry to resurrect this thread but I’m having issues with the suggested method above, here’s my scenario:

I’d basically like to filter out all MIDI messages on channel 1-8 being sent from a Synthstrom Deluge to an Elektron Octatrack. However, all MIDI messages on channel 9-16 shall be transmitted. I managed to accomplish the filtering by doing the following:

[MIDI Router]
No default MIDI routing from the Deluge to the Octatrack

[Translator]
Incoming:
MIDI Message
RAW MIDI / System Exclusive
oo pp qq
Specific Ports… Deluge

Rules:
// extract MIDI channel (0–15)
ga=oo&15
// block channels 1–8 (0-7)
if ga<8 then exit rules, skip Outgoing Action

Outgoing:
MIDI Message
RAW MIDI / System Exclusive
oo pp qq
Specific Ports… Octatrack


Here comes the issue: while the filtering works just fine, clock, note on/off and control changes are transmitted as expected, program changes are only transmitted after pressing “Play” on the Deluge. However, if I disable the translator for troubleshooting purposes and create a direct MIDI routing from the Deluge to the Octatrack, program changes are being transmitted all the time, even when “Play” has not been pressed - which is what I like to achieve.

How is that? Already had quite a discussion with ChatGPT about it, hope to find some help.

Greetings from Germany

Program changes are 2 byte MIDI messages so you should have something like this

Incoming: Raw MIDI oo pp
Rules :
rr=oo&15
if rr<8 then exit rules, skip outgoing action
Outgoing: Raw MIDI oo pp

Also in your original translator, I would use rr instead of ga unless you need to use the variable for a separate translator. ga is a global variable while rr is a local variable.

Steve Caldwell
Bome Customer Care


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

Thanks for the quick response Steve! I now created two Translators, one for each MIDI Message type(s):

[Translator 1 - Filter Note On/Off + CC Messages]
Incoming:
MIDI Message
RAW MIDI / System Exclusive
oo pp qq
Specific Ports… Deluge

Rules:
// extract MIDI channel (0–15)
rr=oo&15

if rr<8 then exit rules, skip Outgoing Action

Outgoing:
MIDI Message
RAW MIDI / System Exclusive
oo pp qq
Specific Ports… Octatrack


[Translator 2 - Filter Program Change Messages]
Incoming:
MIDI Message
RAW MIDI / System Exclusive
oo pp
Specific Ports… Deluge

Rules:
// extract MIDI channel (0–15)
rr=oo&15

if rr<8 then exit rules, skip Outgoing Action

Outgoing:
MIDI Message
RAW MIDI / System Exclusive
oo pp
Specific Ports… Octatrack


However, I now got a doubling in the Timing Clock, which I can only avoid by either disabling Translator 1 or 2. Any ideas on that?

Hi,

Try removing your MIDI route and the add a one byte translator

Incoming : Raw MIDI oo
Outgoing: Raw MIDI oo

Steve Caldwell
Bome Customer Care


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

That does result in three times the tempo, there were no MIDI routes setted up.

Aren’t there other ways inside BMTP to filter MIDI messages from specific channels that don’t influence the Timing Clock?

Edit: I cannot really quantify if it’s really three times the tempo as the Octatrack max. sequencer tempo is limited to 300 BPM. It feels a little faster than just having the two previous translators though.

Put stop processing as an option with each of the translators.

Steve Caldwell
Bome Customer Care


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

Using three Translators, with “oo pp qq”, “oo pp” and “oo” results in exactly double the tempo staying consistent. Stop processing is enabled on all of them.

Maybe you are getting extra timing clocks from another source. Did you check that?

Also make sure you are checking which input port you have open for incoming messages.

Here is the file that I created.

Raw-Filter-2025-01-03.bmtp (1.8 KB)

Steve Caldwell
Bome Customer Care


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

Thanks a lot for providing an example, it was just the order of Translators that caused the issue. I didn’t know I have to “stack” them in increasing order, starting with “oo”, going over “oo pp” all the way to “oo pp qq”. Now everything works like a charm!

1 Like