|
Post by gurbz on Feb 21, 2019 20:18:03 GMT
Hi Nic, I’m planning a midi designer pro 2 layout with a lot of controls. mididesigner.com/qa/7079/layout-boss-katana-f-w-2-04-primova-midx-20-preset-versionIt will be controlling the boss katana amp (!)which has a lot of effects and parameters. The amp contains roughly 5 sections: eq, boost, modulation, amp, delay, reverb. The modulation section alone has 35 effects, each containing roughly 6 parameters like rate, mix, etc You can understand that a MDP2 layout would contain hundreds of controls. Luckily there is streambyter and it maybe possible to use one knob for multiple parameters? For example knob 1 from the modulation section controls the rate of the chorus, phaser, flanger, etc. i think this has be done before, could you give me hint in the right direction?
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Feb 22, 2019 10:46:46 GMT
Hi gurbz , You can send multiple events when you see a specific event and use data from the trigger event to populate your send events. I'm assuming this is all sysex, so for my example I am going to make up a sysex convention to demonstrate how to do this. Consider this small example sysex message: F0 41 12 34 56 20 F7The first red part is made up Roland preamble. The green '56' represents a parameter number and the blue '20' represents that parameter's value. Let's assume this is 'knob 1'. So, to trap that event you would write: # match roland + equip IF M0 == F0 41 12 34
# match 'knob 1', (hex 56) IF M4 == 56 # send your other events here SND M0 M1 M2 M3 57 M5 END
# match a different knob IF M4 == 60 # send events here END ENDWhen we see that roland sysex message for knob 1, we send another sysex message with the same preamble (M0 M1 M2 M3) and 'knob 2' which I just made up to be identified by hex 57 and with the value from the original message (parameter value) at M5. For more outgoing knobs, you add more SND rules. For more incoming knobs you duplicate the IF M4 == 56/END clause and change '56' to the correct number for that knob. Now, we could do something slightly more adventurous. Let's say we want to send the inverted parameter value to knob 3 which has a hex number of 58. ie. when knob 1 is set to 0, knob 3 is set to 127: # calculate inverted value MAT I0 = 7F - M5
# send knob 3 with inverted value SND M0 M1 M2 M3 58 I0That little bit of code above would sit in the IF M4 == 56/END clause in the original code at the top. Hope that gets you going. Regards, Nic.
|
|
|
Post by gurbz on Feb 22, 2019 16:50:42 GMT
Wow! Thanks Nic. I’m gonna try this. You blow me away every time with excellent support! I’ll let you know how progress is coming along.
Cheers,
Gurbz
|
|
|
Post by gurbz on Jun 25, 2019 16:04:11 GMT
Hmm, not getting there.
message mdp2 out (midi log): Message Out: Length=15: F0 41 00 00 00 00 33 12 60 00 00 54 00 4C F7
when I enter the values above:
IF M0 == 12 60 00 00
# match 'knob 1', (hex 54) IF M4 == 54 # send your other events here SND M1 M2 M3 56 M5 END
# match a different knob IF M4 == 55 # send events here END END
What am I doing wrong, I ‘m a newbie at hex/sysex
thx,
Gurbz
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 25, 2019 16:25:52 GMT
Hi gurbz , The sysex message is in an array 'M' that will have (in this case) 15 elements, numbered from 0 to 0E (that's 0-14 in decimal) So, I have added the byte indexes of that message MDP is seeing so you can see which byte is at which index: > Byte Index 0 1 2 3 4 5 6 7 8 9 A B C D E > Message Out: Length=15: F0 41 00 00 00 00 33 12 60 00 00 54 00 4C F7So '12 60 00' starts at byte 7, so your first IF needs to be: IF M7 == 12 60 00 00and a knob number would be identified at index 'B', so those IF statements should be like: IF MB == 54I would strongly recommend you add another surrounding IF that defines that this is indeed a sysex message, so your code would look like this with all of my tweaks: IF M0 == F0 41 00 00 # roland sysex IF M7 == 12 60 00 00 # katana
# match 'knob 1', (hex 54) IF MB == 54 # clone to knob 56 SND M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 MA 56 MC MD ME END
# match a different knob IF MB == 55 # send events here END END ENDRegards, Nic.
|
|
|
Post by gurbz on Jun 25, 2019 21:02:45 GMT
Output now:
Message Out: Length=15: F0 41 00 00 00 00 33 12 60 00 00 54 0A 42 F7 Message Out: Length=15: F0 41 00 00 00 00 33 12 60 00 00 56 F0 42 F7 Message Out: Length=15: F0 41 00 00 00 00 33 12 60 00 00 54 0D 3F F7 Message Out: Length=15: F0 41 00 00 00 00 33 12 60 00 00 56 F0 3F F7
😳 strange things happening here Nic... mdp2 ‘s bewitched! Awesome! 😄 thanks!
I notice that the last bit -parameter value- is not doubled? And how do I control data, there’s a lot more Sysex now?
Vision: when turning for example turning knob 1-6 I can use those parameters, somehow by choice, for different sysex ranges, hence different fx, the clone data is being send and the original data blocked by choice. That sounds pretty far out to me? Is that even possible. (Trying to get my head around this.)
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 25, 2019 21:17:53 GMT
Aah, yes, there is an inconsistency in the StreamByter language. Change this line:
SND M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 MA 56 MC MD ME
to
SND M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 MA 56 M0C MD ME
Which should make that value byte get cloned correctly also.
'MC' is a special variable meaning message channel, so we need to be specific that we want the 13th byte of the message.
> And how do I control data, there’s a lot more Sysex now?
Yes, that could be a hi-res value (14 bit) or maybe something else since it seems to be 2 bytes.
Do you have a sysex implementation document for the katana? You will probably need that to be able to understand how to parse and generate the correct messages.
Regards, Nic.
|
|
|
Post by gurbz on Jun 25, 2019 21:27:13 GMT
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 25, 2019 21:51:30 GMT
Yes! Although looks complex and think it requires Roland checksums. There is a thread on here on how to calculate I think.
Regards, Nic.
|
|
|
Post by gurbz on Jun 25, 2019 21:58:32 GMT
Hmm, in MDP2 I only enter 41 00 00 00 00 33 12 60 00 00 54 V for sysex I select ‘Roland four byte model ID’ which generates automatically a checksum I think.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 26, 2019 6:20:38 GMT
Right, but you will probably need to calculate a new checksum on the sysex messages that are colned or generated inside StreamByter
Regards, Nic.
|
|
|
Post by gurbz on Jun 26, 2019 6:31:13 GMT
But I see: if a fx block parameter ‘s value ( say fx chorus) is chosen, I can alter the sysex values of a range by cloning them and blocking the original values.
|
|
|
Post by gurbz on Jun 26, 2019 6:37:39 GMT
Crossing messages, didn’t read your last one. So checksum becomes an issue. What do I need for this and how do I know it becomes an issue, how do I know a script is not worling because of checksum? I understand MDP2 for a bit now but this sysex code doesn’t feel natural to me. I’m getting a bit used to it though.
|
|
|
Post by gurbz on Jun 26, 2019 8:43:14 GMT
I think I saw a excel sheet with the roland checksum, I’ll cross reference it with mdp2 and will be back
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 26, 2019 9:06:43 GMT
I could not find the code I wrote before, but found the algorithm. I think this code will calculate and set the checksum for those katana messages generated by StreamByter:
# roland checksum for katana ASS I0 = M8 MAT I0 = I0 + M09 MAT I0 = I0 + M0A MAT I0 = I0 + M0B MAT I0 = I0 + M0C MAT I0 = I0 % 80 MAT I0 = 80 - I0 IF I0 == 80 ASS I0 = 0 END SND M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 MA 56 M0C I0 ME
You will need to replicate this code for each time you need to calculate a checksum before a send.
Regards, Nic.
|
|