lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jul 11, 2018 20:01:04 GMT
Hi Nic, just a quick question this time! I'm wondering if there's any way to get a tempo value from MF Dynamic Clock. I'm tapping the tempo into the Dynamic Clock module... and have to get this tempo to another app that doesn't accept Midi Clock but accepts CCs for tempo setting. Any ideas?
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 11, 2018 20:54:11 GMT
Hi lid55 , I will need to check in the morning, but the DC should be sending its tempo via MIDI tempo message. Will confirm with details or deny then. Regards, Nic.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 12, 2018 9:32:18 GMT
Hi lid55 , OK, I got all of that wrong! I was thinking about time signature and SPP - there is no official tempo message other than clock ticks. So, in order to forward on the tempo via CC you would need some Stream Byter code that measures the tick intervals and calculates the tempo from that and sends off a CC when appropriate. Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jul 12, 2018 15:48:57 GMT
Ok thanks for looking into this Nic. I was hoping there was some sort of secret DynamicClock polling feature or Sysex or something... ok will have to do it the complex way. So basically, this would mean using a timer variable to find the time between MIDI ticks? Maybe a few intervals and then average the numbers to get at a bpm? Any idea how CPU intensive this would be for MidiFire?.... I'll probably try a few things here... but there is also another workaround I'm looking at (external to MidiFire)... which might be simpler than getting this working... hard to tell at the moment. I'll post here if I pursue this further, thanks again.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 13, 2018 10:03:43 GMT
Hi lid55 , Yes, you got it. Calculate the time interval between 24 ticks (gives you ms/beat) and then divide 60000 (EA60) by that to get current bpm. This is not likely to be very CPU intensive. Regards, Nic.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 13, 2018 10:11:14 GMT
Of course, the bpm value will be truncated to the nearest whole number, so not sure how useful this will be in practice. Here's a little bit of code
# show bpm IF LOAD ASS L0 = 0 # tick counter END IF M0 == F8 # got tick MAT L1 = L0 % 18 # if on 24 tick boundary IF L1 == 0 MAT L2 = EA60 / T0 # calculate+show bpm SET LB0 L2 +D END MAT L0 = L0 + 1 # increment tick counter END
Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jul 13, 2018 17:03:30 GMT
Thanks for this Nic, works well, and quickly! I do have one hope regarding this method though. I'm fine with the bpm being truncated to the nearest whole number (rounding up or down would be better, since it's more accurate... but lets forget about this for now), but since I would like everything to be in sync, is it possible somehow to replace the tempo in the MF Dynamic Clock with the rounded bpm? I've had some success replacing it, with the SysEx method... but I'm stumped as to how I could replace the SysEx bpm values (that are split into two, representing decimals) with the current tapped tempo (in hex) on-the-fly. Any ideas?
Here's what I was working with:
# show bpm IF LOAD ASS L0 = 0 # tick counter END
IF M0 == F8 # got tick MAT L1 = L0 % 18 # if on 24 tick boundary IF L1 == 0 MAT L2 = EA60 / T0 # calculate+show bpm SET LB0 L2 +D SND F0 5A 01 25 00 F7 #snd sysEx to Dynamic Clock to make bpm a whole number END MAT L0 = L0 + 1 # increment tick counter END
XX = XX +B
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jul 13, 2018 17:39:41 GMT
I have an idea but it's missing pieces:
if less than 100: IF L2 < 64, then M2 = 00, M3 = L2 (converted into decimal) if greater than 99: IF L2 > 63, then M2 = 01, M3 = L2 (converted into decimal) - 100 if greater than 199: IF L2 > C7, then M2 = 02, M3 = L2 (converted into decimal) - 200
etc...
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 13, 2018 20:35:41 GMT
Hi lid55 , If your bpm is in L2 as above, then the following should send the correct sysex: # convert bpm in L2 to DC sysex MAT I0 = L2 / 64 # get hundreds MAT I1 = L2 % 64 # strip hundreds MAT I1 = I1 / A # get tens MAT I1 = I1 * 10 # shift left MAT I2 = L2 % A # get units MAT I1 = I1 + I2 # add units to tens SND F0 5A I0 I1 00 F7This does not handle bpm values > 999! Regards, Nic.
|
|
lid55
MidiFire Beta
Posts: 75
|
Post by lid55 on Jul 13, 2018 23:02:14 GMT
Thanks Nic! Yeah this works! I send the SysEx after a few beats, after things stabilize...
|
|