December 6, 2012 at 12:38 am #5134
I’m new here, so hello all!
I’m trying to control the ARP settings of the microQ. I’ve got some experience with midi & sysex, but almost none in programming. I’m wondering if it’s possible to program what i want with ctrlr (& Lua?) And, if yes, where I should start to learn Lua for this purpose.
So, here’s the problem:
The sysex messages i want to send are in fact controlling 3 arp parameters with only one message. Of course, my purpose is to have one separate controller for each of these 3 parameters.
e.g: F0 (…) xy (…) F7
xy byte is controlling 3 parameters: Step, Glide and Accent.
formulated in bits, it looks like this:
sss= 3 bits for a value 0-7 for Step
g= 1 bit for a value 0-1 for Glide
aaa= 3 bits for a value 0-7 for Accent
I’ve encountered 2 problems with my controllers (Kenton CF, Berhinger BCR, ..) and other programs (MidiOX, ..):
1. I need 3 variables (1 for each parameter) that can be updated each time i change a knob dedicated to one of these parameters. (BCR doesn’t have variables)
Without variables, each control will be resetting the 2 others to some fixed value, and i don’t want that.
2. I need these variables to be short enough (1 and 3 bits), and to be summed in the 8 bit bytes form each time i move a controller. (Kenton offer variables, but only full 8 bit bytes, and it can’t sum them).
So, in short, i would like to have:
– 3 knobs, each defining a different variable (sss, g or aaa)
– each time one of these knob is moved, it should send the sysex message including the sum of the variables at the actual state of the 3 knobs.
Does it sound possible? …and easy to do?
I hope i’ve been clear enough yet not too long in my explanations 🙂
If not, please tell me and i’ll give the long version 😉
Thank you!December 6, 2012 at 5:40 pm #5137SynthetechParticipant
- Topics: 13
- Replies: 70
- Total: 83
If I get help on my question on how to script a line that will output a sysex hex code out, with variable #’s in it, I could probably figure up something.
I prev. managed to call a patch dump from my Korg, then set every single knob to the correct value.. one by one.
Youll need a control knob that is set to call a LUA script up every time they activate/change in value. In the script we piece the code together by calling the values for each “modulator”/control knob, inserting their values into the code and transmit it to the synth.
question- the 1 bit variable in there.. is it a byte of it’s own, or shared in one of the other two bytes? Do you have an example of a full F0-F7 of this sysex message to look at?December 6, 2012 at 8:47 pm #5138
Thanks for the answer Synthetech. Here’s an example of a full mQ arp sysex message:
F0 3E 10 00 20 00 02 47 xx F7
3E = Waldorf id
10= microQ id
00= also an id of some sort.. (?)
20= determines what sound parameter is to be edited
00= determines what part/patch is to be edited, depending on the mode the mQ is actually on (e.g. 00-0F for the 16 parts of a Multi setup)
02 & 47= determines for the arp parameters what step is edited. I didn’t talk about it above (to make it shorter) but the parameters i’m trying to control are concerning only one step of the 16 steps arpeggiator. So, it’ll have to be copied for the other steps as well. “02 47” is for step 1.
xx= is where the problem is. value range is 00-7F.
Here i’ve got to confess i’m not entirely confident about my denominations… To make sure we’re talking about the same thing, what i call a ‘byte’ is a couple of hex numbers, like the ones i just detailed (e.g 00, 7F, F0, ..) If i understand well, these are made of 8 bits each.
So, the 1 bit value (Glide parameter) is really just one bit of the ‘xx’ byte. The same is true for the 3-bits values (Step and Accent), which are also a part of the same ‘xx’ byte. Together, it makes 7 bits. In front of them, there is a 0 (zero), so we’ve got our 8 bits.
say i want to send the current values for the 3 parameters (the mQ forces me to send them alltogether in the same sysex msg): Accent: 3, glide: 0, step: 1
Accent: 3 over 3 bits is = 011
Glide: 0 over 1 bit is = 0
Step: 1 over 3 bits = 001
My 8-bit message will then be :00010011
0 (leftmost is always zero)
0001 0011 = 13 in hex (if i calculated right)December 6, 2012 at 11:34 pm #5142
so, the 2 values for the Glide (1 bit) parameter (for all other values identical to the example above) are:
0001 0011 (value of 0) &
= 13 h
0001 1011 (value of 1)
= 1B h
The problem is still the same: by sending these values for Glide i also send values for Accent (3) & Step (1), and they must be in phase with their respective controllers.
The 8 bits of this byte are structured like this: 0sssgaaa
So, talking bit-wise, i need 3 variables associated with 3 knobs: aaa, sss, g
Then, i guess i’ll have to calculate how to sum them up.
Maybe something like (in non-hex math):
knobs ranges defined as below:
aaa = 0-7 (8 values in steps of 1)
g= 0/8 (2 values in steps of 8)
sss= 0-112 (8 values in steps of 16)
And then sum them up, convert to hex and send it as xx in the sysex string.
Once i know how to do that, i’ll probably also be able to change the other parts of the sysex message concerning which sound or which arp step is edited. ..December 7, 2012 at 12:32 am #5143atomKeymaster
- Topics: 159
- Replies: 2945
- Total: 3104
It’s simple though you’ll need LUA for that.
first add 3 sliders (or any other components that suite your needs), remove the SysEx formula from them and then set the MIDI Type to None
select one of the components and find the “Called when the modulator value changes” property, click on the second icon (create new), type in a name (something like createArpMessage) then select it from the comboBox, for the other two components just select the method you added (all three components should be linked to that method).
Open the LUA Editor and find your method in the list. Double click to edit it, paste this as the code for the method:
-- -- Called when a modulator value changes -- @mod http://ctrlr.org/api/class_ctrlr_modulator.html -- @value new numeric value of the modulator -- createArpMessage = function(mod, value) accent= panel:getModulatorByName("accent") glide= panel:getModulatorByName("glide") step= panel:getModulatorByName("step") bi= BigInteger(0) bi:setBitRangeAsInt (0, 3, accent:getValue()) bi:setBitRangeAsInt (4, 1, glide:getValue()) bi:setBitRangeAsInt (5, 3, step:getValue()) hexData= string.format ("F0 3E 10 00 20 00 02 47 %02x F7", bi:getBitRangeAsInt(0,7)) console ("Binary variable: "..bi:toString(2,8)) console ("Sending message: "..hexData) midi= CtrlrMidiMessage(hexData) panel:sendMidiMessageNow (midi) endDecember 11, 2012 at 9:33 pm #5170
Ok atom, thank you for the answer!
I will try that out asap.
I was thinking of maybe dig into LUA for a couple of synths (mQ, micron, ..) but after seeing the code over here i’m not sure i’ll get my head over it… still quite newb in programming & don’t know where to begin..December 12, 2012 at 12:08 pm #5175atomKeymaster
- Topics: 159
- Replies: 2945
- Total: 3104
Perhaps i’ll add a feature to do the same without LUA, it’s something i was planning for a long time, to add expression evaluation in SysEx formulas. Once i’m done with the Program Manager i’ll see about that.
- The forum ‘Programming’ is closed to new topics and replies.