Sending Raw MIDI with Delays

I’m in the process of moving from a laptop-based system with BMT to a hardware-based system centered around BomeBox. One of the key elements is to switch patches on various external Synths (VL40, Tooro, CraftSynth, Link, etc) attached to my rig.

This is not simply a matter of issuing a PC to the Synth, because a number of these synths do not have the ability to properly store a fully developed snapshot of a patch. The VL70, for example, does not store the full set of parameters in it’s INT(ernal) banks (‘because of memory limitations’ some people have opined on newsgroups). Also, some patches require a change to global parameters (the Breath Curve on the VL70, for example. So, I have taken to loading a factory preset and then modifying it as needed by SysEx commands, and then issuing Global Parameter changes by various MIDI commands, including some SysEx.

I successfully implemented this from Ableton Push 3S by a rather involved system involving a home-grown Max4Live (M4L) plugin that reads a ‘TMID’ file containing the directives, is triggered on a MIDI keystroke on the Push 3S, and then sends it out a MIDI stream to the device. (These text files are compiled by a perl script that reads a specification file of my own design and spits out a flock of these TMID files). The M4L plugin honors a series of delays, which are critical to not overloading the target synth. Here is an example TMID for changing patches on a VL70:

0 176 0 33;
10 176 32 1;
20 192 49;
186 176 7 104;
252 240 67 16 87 2 1 12 32 247;
318 240 67 16 87 0 0 12 69 247;
384 240 67 16 87 8 0 8 76 247;
450 240 67 16 87 8 0 5 1 247;

In this format, the first number is the delay (in msec) from the start of the MIDI sequence before issuing the bytes of MIDI (in decimal).

After experimenting to find the proper delays for each MIDI message, this scheme worked very well in performances and jam / recording sessions, over the last 6 months. My sets have involved multiple, simultaneous, complex patch changes (I sometimes play two synths in parallel from my Sylphyo windsynth), and I don’t recall a glitch anywhere while playing live …

As the next phase of my upgrade, I’m moving from a MIDI ‘waterfall’ setup (using MIDI Thru) to a star setup using Bome Box (which is still sitting in US Customs … sigh). Some questions:

  1. It looks like there is no ‘Block MIDI’ feature in BMT that integrates both Raw MIDI and Delays (as is implemented by my M4L plugin). So, I will need to use 8 separate BMT translations (for the example above of 8 different delays for 8 MIDI messages) … and each BMT translation would have it’s own delay.
    Is that the best way?

  2. I just want to confirm that a delay in a Translation is from the time that the translation is executed - and that they are not cumulative. Is that correct? (The manual seems to imply that, but I can’t see anywhere where that is explicitly said).

Also … I am trying to avoid a laborious, manual cut-and-paste process that will be prone to error and synchronization issues. Is it possible for me to change my perl script to output the lines for the .BMTP file such as

Outgoing12=MID1F0431057080014vcF7 Delay Timer1:100:1

(or some such - I have not totally figured out the syntax …)

… and then write another script to ‘hack’ those lines into the .BMTP file automatically …

  1. Has such an automated bulk-import into BMT’s .BMTP file every been done, and might there be existing tools or processes to make that easier??

By the way, this issue does tangentially relate to this other thread (but I believe they are really separate things):

Hi,

Yes, this can be done with the new Perform function of Bome MIDI Translator Pro 1.9.0 and also within BomeBox

I have an example below.

For calling Perform ‘Send’
the first parameter is the number of bytes to send
the second parameter is the delay in ms
the remaining parameters are the values (in decimal) of the bytes you want to send.

Translator 1.0 fires on activation and calls the performs in rules.
Translators 1.1 and 1.2 fire when ‘Send’ is called. They both read the number of bytes and only execute if the first byte matches the number bytes for the outgoing action. In this way you do not get stray nonsense bytes.
Translator 1.1 fires when ‘SendSX’ is called. Again the first parameter is the number of bytes and the second is the delay.
For SendSX, I hardcode the beginning F0 and F7 since they are always the same.

It is important to use local variable whenever possible so that you are not overriding bytes with global variables. There a 10 local variables to use total so if some bytes are always the same, it is probably best to hard code them in the outgoing MIDI message, otherwise care must be taken to use different global variables for each translator. I could have also hardcoded the 2nd through 4th byte here which would allow SysEX with 3 more bytes available

As far as populating translators, you should be able to use a spreadsheet or something to get the format needed and then paste into the rules text box. I don’t recommend trying to do this in a text editor directly as there are some issues with how rules are stored in the .bmtp file that may cause you some grief.

In preset 0, I have 2 translators, one that enables the preset and another than disables it. When it is enabled, it fires. I have the default outgoing port of preset 1 to go to the alias ‘VL70’

image

You can learn more about aliases from this tutorial.

For more information about device selection, see this tutorial.

Here is what the log looks like when enabling the preset.
I have the timestamp box checked so you can also see that the timing is working.

Preset-Sent-SysEX-2024-10-29.bmtp (2.7 KB)

Steve Caldwell
Bome Customer Care


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

WOW!

I honestly thought that this was likely a ‘no joy’ scenario - that I might be one of the very few beings in the universe to face such an arcane situation. But BMT provides the tools …

This will significantly smooth my development / transition process. I can easily generate the …

Perform "Send",3,0,176,0,33
Perform "Send",3,10,176,32,1
Perform "Send",2,20,192,49
Perform "Send",3,186,176,7,104
Perform "SendSX",7,252,67,16,87,0,0,12,69
...

… lines of text from my perl script.

use a spreadsheet or something to get the format needed

I have actually developed my own input format. A sample (with internal documentation) is attached, for the VL70.

**
VL70.tmid.txt (26.7 KB)
**

1 Like

Yes, sometimes the stars will nicely align. The perform capability is a rather recent and useful feature.

Steve

PS. I have a typo on the delay of one of the SysEX message, I put 50 instead of 450 so you will need to correct that.

Got the whole thing working from BMT in my Laptop - very straightforward!

Thanks SO MUCH!