lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jan 4, 2018 20:41:10 GMT
Hi Nic, I spoke too soon... I thought I wouldn’t need to use a “hold” function in MidiFire because my foot controller has this functionality, but I now find that it could be extremely useful to have this within MidiFire instead, for simplicity’s sake.
I never used the +H function in MidiBridge, so I’m not sure if there was the possibility of changing how long the hold was, but I would like that function as well.
Having delved into MidiFire a bit now, I imagine it’s not too difficult to “manually” create this function (i.e. without a +H capability)- using a timing variable would be the easiest way, I’m guessing.
I’ve written some “pseudo-code” ideas below:
IF M0 == [footOn-CC] SND T00 (I’m assuming this will start the timer) END
IF M0 == [footOff-CC] && T00 >= 750 (ms) SND [trigger-CC] END
Any suggestions?
Regards, - Brett
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jan 8, 2018 11:59:16 GMT
Hi lid55, Take a look at this threadI think this will do what you want (and more) Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jan 8, 2018 18:15:05 GMT
Hi nic, thanks for the resource. I checked it out but I could use some help:
• I don't understand how it can work without a timer variable (T00 to T07).
• I think I might understand this one, but could you confirm that: "IM2" would be the third value/index in local variable array 1?
• also, "SFIN"... would that be label1 set to an arbitrary string ("S") called "FIN"?
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jan 8, 2018 18:24:59 GMT
Hi lid55, Hmm, good point. Yeah, it doesn't use timer variables but injects a timeout event with a SND +I +D line. Wrote this some time ago. When a note on 'button down' is seen, it schedules a delayed timeout event. If the button is released (note off, or note/on+off 2 or more times) before it times out then it treats as 'normal' or double/triple tap. If the timeout triggers and no note off was seen, it then does the hold event instead. IM2 means that whatever value is currently in M2 is used to index into the array, so if M2 was 3 then it would resolve to I3 for example. Yes, SFIN sets the label to 'FIN' If you want me to actually answer your first question about how to use a timer variable, just poke me! Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jan 8, 2018 23:37:22 GMT
Hi Nic, actually that would probably be most helpful for me, if you could explain how I could use a timing variable in this context, since I’m not currently using Note messages from my foot controller, but Foot On and Foot Off (CC messages). Additionally starting from scratch and building it up sounds better to me, from a learning perspective, since that other post seems pretty complicated to me.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jan 9, 2018 11:55:44 GMT
Hi lid55, OK, so let's go back and expand your pseudocode to use timing variables. First thing to bear in mind is that each time you refer to a timing variable, it's value will be the time in milliseconds since the last time you referred to it. First referral will always return 0. So, you would generally assign the value of a timer variable to another variable even if you don't use it (as per below) IF M0 == B0 01 7F # CC1 ON ASS L0 = T0 # start timer END
IF M0 == B0 01 00 # CC1 OFF IF T0 > 2EE # elapsed > 750ms SND [trigger-CC] END END
Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jan 10, 2018 18:11:44 GMT
Thanks Nic, umm... what about if I assign T0 to 0 on "Foot On" instead?
for example:
IF M0 == B0 01 7F # CC1 Foot On ASS T0 = 0 END
would this start the timer? (as well as RESET it each time I press down on the foot key)?
- Brett
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jan 11, 2018 8:46:28 GMT
Hi lid55 , If you assign a value to a timer variable it is actually ineffectual. The underlying value of a timer variable will always be the value in ms from the last time the value was *queried*, so assigning 0 to T0 will not reset it - nor will it 'start' the timer. You *have* to refer to the value to start the timer. Thus, you do need to refer to the T0 variable value in your 'foot down' condition to mark the time of that condition. This is what my rule does, even though it does not specifically use that value. Note, that in the foot-up condition, my rules refer to T0 in the IF statement directly since all I want to do is check how long elapsed since the foot-down and no more. Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jan 12, 2018 3:14:32 GMT
Hi Nic, thanks for the info on how the timer variables work.
In trying your code, I couldn't get things working right. At first I couldn't get the "[trigger-CC]" to fire at all with trying all kinds of hold timing, but then I tried "T0 >= 2EE" (adding the = sign).... which made the message trigger but ALL the time, regardless of timing interval. I then also realized this is probably the wrong way to set this up since, for example, I want the message to fire unattached to how long OVER the hold amount I keep the key down. ie. the way this is set up now, if I kept holding the key down... the trigger wouldn't fire at all until I release the key. That's my pseudo code though, so, that's my error.
So some new ideas:
IF M0 == [footOn-CC] ASS L1 = 0 # reset "gate" to open if necessary ASS L0 = T0 # start timer END
IF T0 >= 2EE # elapsed > 750ms IF L1 == 0 # AND if "gate" is still open SND [trigger-CC] END END
IF M0 == [footOff-CC] ASS L1 = 1 # close "gate" variable END
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jan 12, 2018 3:44:34 GMT
Somehow that's also not quite working.... the T0 when it gets to the hold point (in this case 750ms), doesn't "fire" any message....
I might be jumping to conclusions but.... this might necessitate a +I "inject" along with a +D?
Any easier ways come to mind?
- Brett
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jan 12, 2018 11:14:00 GMT
Hi lid55, Yes, we really need a 'trigger' event that gets fired at the end of the interval and when that event is seen then you assess whether you did a foot-up in the interim or not. This is what the code that I pointed you at does. We could either modify that code to work with CC's instead of notes, but maybe a better way would be to add a Stream Byter before that converts your CC to a note on/off event and a Stream Byter afterwards that converted the resultant note off/on to whatever it is you wish to trigger for the hold or normal events. If you would like me to write this for you, let me know which CC it is you want to use as the foot-down/up and what you want to happen on normal press/release or hold. Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jan 13, 2018 1:49:35 GMT
Thanks for the offer Nic, but I think I’ve got it. It doesn’t have the extra “double tap” and “triple tap” (etc), or the labeling features of yours... and I still need to test this with an actual foot controller, but it seems to work thus far:
IF M0 == B0 00 7F # if FootOn ASS L1 = 1 # set/reset "gate" to open SND B1 01 01 +D1000 +I # set HOLD amount END
IF M0 == B0 00 00 # if FootOff ASS L1 = 0 # close "gate" END
IF M0 == B1 01 01 # if received HOLD message IF L1 == 1 # and if "gate" is still open SND BF 7F 7F # send trigger message END END
B0 00 00 = XX +B B1 01 01 = XX +B
So... doesn’t use a timer variable at all... just compares with a preset +D. Not the most elegant probably, but pretty simple, I think....
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jan 15, 2018 10:22:35 GMT
Hi lid55, Good stuff. Simple is good and if it works you're in business! Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Feb 1, 2018 1:46:20 GMT
ok so, I spoke too soon... the problem with my ruleset above is... if I have multiple fast presses, there’s a chance that the delayed message comes at exactly the same time I’m pressing the key down... and therefore, triggers even if it’s not a true “hold” scenario. It does work in situations where I’m only using single presses... but.... I would much rather it be foolproof.
Anyways, I’ve been studying the Blueboard ruleset and testing out the Timer variables. I think there may be a bug with the timer variable, or I just don’t understand it yet.
Here’s a stripped down ruleset to show what I mean:
IF M0 == B0 00 7F # CC ON ASS L0 = T0 # start timer END
IF M0 == B0 00 00 # CC OFF IF T0 > 2EE # elapsed > 750ms SND BF 7F 7F END END
So simply, I believe this SHOULD trigger if the “CC OFF” message is more than 750ms... but it doesn’t... unless I add an equal sign to the operator, for example: (T0) “>=“ (2EE)... and then it triggers EVERY time... even if the “CC OFF” is less than 750ms
Is this a bug or am I missing something?
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Feb 1, 2018 11:02:44 GMT
Hi lid55 , Yep, that's a bug. This will be fixed for next release. In the meantime, you can workaround by assigning the timer value to a variable and using that in the test: IF M0 == B0 00 7F # CC ON ASS L0 = T0 # start timer END
IF M0 == B0 00 00 # CC OFF ASS L0 = T0 # stop timer IF L0 > 2EE # elapsed > 750ms SND BF 7F 7F END ENDRegards, Nic.
|
|