Demoing BMT Pro, need help manipulating Linnstrument channel output

Hi everyone, I’m new to the Bome community and I’m currently demoing Bome in search of a solution. I’m trying to fully utilize the two different splits of the a Linnstrument controller (MPE device) in Ableton Live, but due to the way Live handles MPE data, I am having trouble accomplishing what I need.

The Linnstrument has two splits: a Left split, consisting of a Main channel set to Ch1 (for program change, basic CC data, etc) and seven per-note channels set to Ch2-8 for rotating through note messages (with accompanying strike and release velocity, pressure, timbre as CC74, and per-note pitch bend). The Right split works the same way, but its Main channel is Ch16 and its note channels are Ch9-15.

What I need is for the these two splits to appear as two different MIDI devices in Live’s preferences… with one additional tweak: converting everything that is transmitted on Ch16 from the Linnstrument’s Right Split to appear on Ch1 in the new virtual MIDI device.

Here it is laid out clearly in steps:

  • BMT 1 (Linnstrument Left Split)
    • Allow ONLY Linnstrument Ch1-8 data to pass
    • Send to Virtual Out (Ch1-8)
  • BMT 2 (Linnstrument Right Split)
    • Allow ONLY Linnstrument Ch9-16 data to pass
    • Convert Linnstrument’s Ch16 data to appear on Ch1 on BMT 2
    • Send to Virtual Out (Ch1 and Ch9-15)

Said another way:

  • Duplicate the output from the Linnstrument to Virtual Outs BMT 1 and BMT 2
    • For BMT 1, block transmission of any data from the Linnstrument on Ch9-16
    • For BMT 2, block transmission of any data from the Linnstrument on Ch1-8
      • After that step, for BMT 2, convert Ch16 data to appear on Ch1 in the BMT 2 Virtual Out

From looking around on the forums and simply seeing the scope of what BMTPro is capable of, its seems like what I’m trying to do should be possible, a trivial task for this program even. However, I’m having trouble wrapping my head around how this program works. I’ve tinkered with it for a few hours now and I’m just hitting road blocks. I’ve came across a few posts here that seem to be similar to what I’m looking for, and even have a few bmtp files linked, but none of them really work completely or the way that I need them to.

Can anyone supply a solution? Thank you for reading.

Hi,

If I read correctly, the following should do what you want.

We have 2 presets.
-The first handles anything to Application Port 1.
-The second handles anything to Application Port 2.

I set up routing for each at the preset level as described in this tutorial.

Within each preset we have 3 translators.
-The first handles all 3 byte incoming messages.
-The second handles all 2 byte incoming message

  • One byte messages carry no channel information so we pass them through untouched

In the rules of each preset we look at the MIDI channel of the incoming message and output the same message if the channels are allowed

For Channel 16 messages, we set up an additional rule to convert to MIDI CH 1

Here are the rules of 1.1 (Preset 1 translator 1)

// get channel
rr=oo&15
// Allow only Ch 1-8
if rr<8 then exit rules, skip Outgoing Action

// Send MIDI CH 15 to MIDI CH 1
if rr!=15 then skip next rule
// mask channel number to set to MIDI CH 1
oo=oo&240

In all cases that we output we send the same outgoing message as incoming message except for MIDI CH 16 as shown above.

I also set up default MIDI routes so that g SysEX will pass through.
Here is a log of the incoming and outgoing messages I tested with.

3302016 - MIDI IN [Bome MIDI Translator 1 Virtual In]: 90 25 7F
3302016 - MIDI OUT [Bome MIDI Translator 2 Virtual Out]: 90 25 7F
3302019 - MIDI IN [Bome MIDI Translator 1 Virtual In]: B0 23 4F
3302019 - MIDI OUT [Bome MIDI Translator 2 Virtual Out]: B0 23 4F
3302019 - MIDI IN [Bome MIDI Translator 1 Virtual In]: C0 23
3302019 - MIDI OUT [Bome MIDI Translator 2 Virtual Out]: C0 23
3302019 - MIDI IN [Bome MIDI Translator 1 Virtual In]: 98 25 7F
3302019 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: 98 25 7F
3302019 - MIDI IN [Bome MIDI Translator 1 Virtual In]: B8 23 4F
3302019 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: B8 23 4F
3302019 - MIDI IN [Bome MIDI Translator 1 Virtual In]: C8 23
3302019 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: C8 23
3302019 - MIDI IN [Bome MIDI Translator 1 Virtual In]: 9F 25 7F
3302019 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: 90 25 7F
3302086 - MIDI IN [Bome MIDI Translator 1 Virtual In]: BF 23 4F
3302086 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: B0 23 4F
3302086 - MIDI IN [Bome MIDI Translator 1 Virtual In]: CF 23
3302086 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: C0 23
3302086 - MIDI IN [Bome MIDI Translator 1 Virtual In]: F8
3302086 - MIDI OUT [Bome MIDI Translator 2 Virtual Out]: F8
3302086 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: C0 23 F8
3302086 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: F8
3302086 - MIDI IN [Bome MIDI Translator 1 Virtual In]: F0 25 43 37 F7
3302086 - MIDI OUT [Bome MIDI Translator 2 Virtual Out]: F0 25 43 37 F7
3302086 - MIDI OUT [Bome MIDI Translator 3 Virtual Out]: F0 25 43 37 F7

Since I don’t have a Linnstrument I set the aliases as follows.

image

The use of aliases is discussed in this tutorial.

And finally the MIDI thru routes (For SysEX)

image

Linnstrument-MPE-Special-Handling.bmtp (2.1 KB)

Steve Caldwell
Bome Customer Care


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

Steve! This is brilliant - worked exactly as I envisioned! And how efficiently yours looked compared to the mess I was trying to get to work!

I’ve done a bit of coding here and there so I have a decent grasp of variables and logic and whatnot, but I think what I was missing was the knowledge you seem to have regarding raw MIDI… I understand basic MIDI and MPE, and have done a good bit of MIDI data manipulation in MaxMSP, but the raw MIDI is something I don’t really know about… clearly it came in clutch seeing as how simple this was to put together! I knew it would be, just couldn’t figure it out on my own. The video paired with this solution you provided went a long way in me understanding the hierarchy of how the different layers work together too, thank you!

I’m going to test this a bit more to make sure all the messages are getting through, but I expect they will. In the meantime, could you clarify a few things?

  • What are the differences between three byte and two byte messages in MIDI, and how is it that they’re useful here? Do you have a good resource you could point me towards?
  • I think I understand the logic of each translator converting some data to a variable, “swallowing” (blocking) certain messages, only to check them in the rules and then output the variables if they pass the rule test… but why do we need to have a translator for the one byte messages, and swallow them, then output them again, if they’re not even supposed to be touched in this use case?
  • In the rules I see, what does the “&15” mean in “rr=oo&15” ?
  • Likewise for the “&240” in the last line ?

Thanks again! I’m going to keep tinkering with this and I’ll update again to confirm that everything is working well.

A good reference for MIDI message is midi.org This page describe the key MIDI messages.

Great question! MT Pro may not know it is a one byte MIDI message and may try processing it as part of a 2 or 3 byte message, so I just capture it and pass it on as a translator. There was a bit of trial and error in figuring this out.

We are taking part of a byte and 15 is 0x0f which is the channel number
0x90 is note on (9) midi channel 1 (0)
0x81 is note on (9) midi channel 2 (1) etc
The ampersand operator is a logical AND so we are just grabbing the channel number and discarding the MIDI message type
9=note on unless velocity is 0 then it is a note-of
8= note off
B= Control change
C= Program Change

240 is 0xF0. In this case we are just taking the message type and since the 0 is MIDI CH 1 we pass it along on MIDI CH 1.

Glad I could help!

Steve Caldwell
Bome Customer Care


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

This is wonderful Steve, thank you so much for the info and help. I purchased the full version this morning!

One more question, it would be pretty slick to be able to rename the virtual outs to something customizable rather than “BMT 1” or “BMT 2”… I see you have that feature for Bome Network as an add-on, but might this be on the horizon for Bome MIDI Translator Pro?

I know it is on the list of user requests but I have no visibility on if and when this would happen. In the meantime, I use Unlimited Named Virtual Ports sometimes but most of the time stick with BMT ports as they are usually easier to remember by the applications I use. Also I like their very short names that are exposed by MT Pro.

Steve Caldwell
Bome Customer Care


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