Complex Sysex outgoing message

Hi everyone, new BMT user here

First, I’d like to apologize because it’s going to be a very long post, I hope to make it as clear and detailed as possible.

I’m really enjoying the software so far, I read the whole manual, watch the video tutorial series and I read a lot of different forums to help me with BMT and all of them have been of great help so thank you to all the community. I’m below a novice level and I still managed to do everything I ever wanted to do with my gear thanks to BMT and to all the community on the forum.

Nevertheless, I’m facing a problem to which I still haven’t found a solution yet. For a little bit of context, I’m using a Novation Zero SL MKII as my main controller to control my Roland JV-1080 sound module (it mainly uses Sysex and not CC) via BMT. I managed to program my Novation to control my Roland JV-1080 with all of the parameters I was wishing for such as envelope, fx, levels, tone select and a whole bunch of other stuff.

The only parameter I still can’t figure out how to program through Bome is the Wave bank selection because its sysex is a little different.

For example, here’s how I successfully programmed my Novation Zero SL MKII to control the attack parameter of the Roland JV-1080 via BMT :

Firstly, I route the midi ports accordingly from my JV-1080 to my Novation in the Midi Router section then I create a new translator with the following parameters :

Incoming section :

I select Midi Message and Control Change

I tick the Capture Midi box

I touch my Novation Zero SL MKII encoder so BMT can read the incoming CC message

In the dialog box below, I click on the one that says « Control change on ch… set ‘pp’ to »

In the Value field below, I select «Any value » and I tick the box that says « Set variable to » and I choose ‘oo’

Outgoing section :

I select Midi Message and Raw Midi/ System Exclusive

I tick the Capture Midi box

I touch the desired parameter on the Roland JV-1080 so BMT can read the outgoing sysex message

In the dialog box below, I click on the sysex message

Then, I modify the last values of the sysex message by replacing those with ‘oo’ and ‘pp’ variable. Here ‘oo’ corresponds to the parameter value of the sysex message and the ‘pp’ variable corresponds to the checksum.

For example, an outgoing sysex that looks like this : F0 41 10 6A 12 03 00 10 6E 11 6E F7 with 6E being the attack value and 6E being the checksum will be modified to F0 41 10 6A 12 03 00 10 6E oo pp F7.

I now have to create a rule otherwise my Roland JV-1080 will read an error message because of the checksum not being calculated according to the value increase. I now have to create the following rule :

Rule :

// 03 00 10 6E
pp=0+0x03
pp=0+0x00
pp=0+0x10
pp=0+0x6E
// oo
pp=pp+oo
// calculate the remainder of pp/128
pp=pp%128
// substract the remainder from 128
pp=128-pp
if pp==128 then pp=0

All of it helped me make my whole setup work perfectly. Now for the not so fun part. My Roland JV-1080 has a wave parameter that let me browse through each waves that make up a sound, for example, piano waves, acoustic guitar waves etc… There are 255 waves in each of the 2 banks, making up a total of 510 waves. I’d like to browse through these waves using one of the encoders on my Novation Zero SL MKII.

Here’s how the sysex system works for this parameter : the 13th value always starts at 00 and gradually go up to 0F. When the value exceeds 0F it always goes back to 00 but it increment the 12th value to 1 step. For example :

Here are the first 16 waves :

F0 41 10 6A 12 03 00 10 01 00 01 00 00 6B F7
F0 41 10 6A 12 03 00 10 01 00 01 00 01 6A F7
F0 41 10 6A 12 03 00 10 01 00 01 00 02 69 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 03 68 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 04 67 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 05 66 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 06 65 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 07 64 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 08 63 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 09 62 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 0A 61 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 0B 60 F7
F0 41 10 6A 12 03 00 10 01 00 01 00 0C 5F F7
F0 41 10 6A 12 03 00 10 01 00 01 00 0D 5E F7
F0 41 10 6A 12 03 00 10 01 00 01 00 0E 5D F7
F0 41 10 6A 12 03 00 10 01 00 01 00 0F 5C F7
F0 41 10 6A 12 03 00 10 01 00 01 00 00 6B F7
F0 41 10 6A 12 03 00 10 01 00 01 00 00 6B F7

Then the following 16 waves :

F0 41 10 6A 12 03 00 10 01 00 01 01 00 6A F7
F0 41 10 6A 12 03 00 10 01 00 01 01 01 69 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 02 68 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 03 67 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 04 66 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 05 65 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 06 64 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 07 63 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 08 62 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 09 61 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 0A 60 F7
F0 41 10 6A 12 03 00 10 01 00 01 01 0B 5F F7
F0 41 10 6A 12 03 00 10 01 00 01 01 0C 5E F7
F0 41 10 6A 12 03 00 10 01 00 01 01 0D 5D F7
F0 41 10 6A 12 03 00 10 01 00 01 01 0E 5C F7
F0 41 10 6A 12 03 00 10 01 00 01 01 0F 6B F7

Then it’ll keep going like this with the next 12th value being 02, then 03 etc… and it ends at F0 41 10 6A 12 03 00 10 01 00 01 0F 0E 4E F7.

The same process repeats with the second bank of waves with now the 11th fixed value not being 01 anymore but 02 so for example : the first wave of the first bank being F0 41 10 6A 12 03 00 10 01 00 01 00 00 6B F7 and the first wave of the second bank being F0 41 10 6A 12 03 00 10 01 00 02 00 00 6A F7.

Can you guys help me, I’m pretty sure it has to do with the rules tab but I have no idea what to write in it, I simply want to be able to browse through these waves using my Novation Zero SL MKII encoder (CC)

I really hope that you will be able to help me out, thanks a lot everyone,

Best regards,

Fred

Hi and welcome to the Bome community!

Is your encoder relative of absolute? If it is absolute, then you will only be able to get 127 (0-127) values from it. If it is relative, then we should be able to convert to any of value by using an increment and decrement message and using a global variable to track the current value. Otherwise you would need to use 2 encoders.

By the way, looking at this post, I would not classify you as a novice as some of the stuff you did is at an advanced level.

Steve Caldwell
Bome Customer Care


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

Hi and thank you a lot for taking the time to answer that fast Steve.

The possibilities with the Novation are almost endless, I don’t really know what are absolute and relative encoders, with a little bit of research if I understand it correctly, relative means there’s no fix value (making it an endless encoder) and absolute are fixed values (such as 0-127), if I understand correctly, yes it has both. By the way, out of all the encoders, 8 of them are infinite (endless knobs as they called them) if I enter the parameters of the encoders I have several options, the manual says as follows :

0-127 : Control value displayed with range 0 to 127. This is best suited to a parameter with a single direction increase/ decrease e.g. track volume

-64/+63: Control value displayed with range -64 to +63. This is best suited to a parameter with a bi-directional increase/ decrease (zero position in the middle) e.g. track pan.

REL1 (Relative 1): A message with value 65 is sent out for every clockwise step (increment) and a message with value 63 is sent out for every anti-clockwise step (decrement). With this option the encoder functions as a true endless control rather than emulates an analogue pot as with the 0-127 and -64/+63 settings.

REL2 (Relative 2): This is similar to the ‘REL1’ setting however it includes encoder acceleration. A message with value 64+n is sent out for every clockwise step (increment) and a message with value 64-n is sent out for every anti-clockwise step (decrement). The value n depends on how fast you rotate the encoder. It will be 1 when you rotate it slowly and get larger the faster you rotate it, meaning that you can scale the full range of a parameter with a small quick turn of an encoder.

0-16K (14-bit mode): MIDI data values are transmitted as a 7-bit binary number, allowing a maximum value range of 0-127. The MIDI Specification allows for two MIDI control messages to be sent together where the data values form an MSB (most significant byte) and LSB (least significant byte) pair, making a 14-bit binary number and allowing a maximum value range of 0-16383. This is useful where fine control over a parameter is required, however the parameter you are controlling must be able to receive 14-bit MIDI values. If you want to send 14-bit values for fine control over a parameter then set DispType to ‘0-16K’. For CC controls, the MIDI Specification only allows for CC numbers 0 to 31 to be used in this way. Two CC messages are sent when the value of a parameter is changed – the first with the MSB value and the second with the LSB value. To enable the receiving device to distinguish between which CC message has the MSB value and which has the LSB value, the LSB value message is sent using a different CC number, calculated by adding 32 to the original CC number. Consequently CC numbers 32 to 63 are used for sending the LSB value in 0-16K (14-bit) mode. As an example, if a CC encoder has DispType set to ‘0-16K’ and CC Num set to 0 then, for each encoder step, two messages will be sent – a CC0 message with the MSB value and a CC32 message with the LSB value. The important point to note is that if an encoder has Control set to ‘CC’ and DispType set to ‘0-16K’ then CC Num should only be set from 0 through 31 and not higher.

APOT: This is a variation of ‘REL2’ and is the same system that is used by some other existing popular control surfaces. A message with value 0+n is sent out for every clockwise step (increment) and a message with value 64+n is sent out for every anti-clockwise step (decrement). The value n will equal 1 when you rotate the encoder slowly and increases as you rotate the encoder faster.

Once again, thank you a whole lot !

OK, please find the attached. Use the APOT option.

First we determine the direction and amount and store it into the local variable tt

// determine direction
if qq<64 then tt=qq
if qq>64 then tt=qq-64
if qq>64 then tt=tt*-1
Log "Log incoming increment/decrement =%tt%"

Then we add or subtract from the global variable ga which contains the absolute value. We don’t let it go over 510 or under 0.

// Add/subtract value (ga)
ga=ga+tt
if ga>510 then ga=510
if ga<0 then ga=0

Now we break it up into two chunks LSB and MSB in preparation to send the SysEX message as separate bytes.

// Now lets break it up into MSB and LSB
// LSB is 0-F store in rr
// mask it
rr=ga&15
// Put the rest into ss
ss=ga>>4

Then we do the Roland Checksum calculation. I didn’t test this as I don’t have your Roland gear.

// Checksum
// add the address bytes
qq=3
qq=qq+0
qq=qq+16
qq=qq+110
// add the data bytes
qq=qq+rr
qq=qq+ss
// calculate the remainder of pp/128
qq=qq%128
// subtract the remainder from 128
qq=128-qq
if qq==128 then qq=0

The output is sent as raw midi:

//header
F0 41 10 6A 12 03 00 10 01 00 01 
// msb
ss
// lsb
rr
// checksum 
qq
// footer 
F7

I used the following from my aliases. The encoder type seems to match what Mackie MCU VPOTS use so I used an X-Touch MINI.

image

You can learn more about aliases from this tutorial.

and the project file.

Roland-JV-180 Browse.bmtp (1.9 KB)

Steve Caldwell
Bome Customer Care


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

Thanks a lot Steve ! I’m traveling for work right now but I’ll try that as soon as possible and I’ll keep you updated.

Thanks a thousand times for all your help man !

Best regards,

Fred

OK, let me know.

Steve Caldwell
Bome Customer Care


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