diff options
Diffstat (limited to 'site/udo/bpmdetect.udo')
-rwxr-xr-x | site/udo/bpmdetect.udo | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/site/udo/bpmdetect.udo b/site/udo/bpmdetect.udo new file mode 100755 index 0000000..6eb0f60 --- /dev/null +++ b/site/udo/bpmdetect.udo @@ -0,0 +1,57 @@ +#ifndef UDO_BPMDETECT
+#define UDO_BPMDETECT ##
+
+/*
+ BPM detection from trigger
+
+ This file is part of the SONICS UDO collection by Richard Knight 2021
+ License: GPL-2.0-or-later
+ http://1bpm.net
+*/
+
+
+/*
+ Detect a BPM given a stream of pulses
+
+ kdone, kbpm bpmdetect kpulse [, imaxpulses, imintime]
+
+ kdone outputs 1 when a new BPM has been ascertained
+ kbpm the detected BPM
+ kpulse trigger input
+ imaxpulses number of pulses to consider: will output BPM after this many
+ imintime minimum time between beats to normalise signal
+*/
+opcode bpmdetect, kk, kjj
+ kpulse, imaxpulses, imintime xin
+ imax = (imaxpulses == -1) ? 4 : imaxpulses
+ imintime = (imintime == -1) ? 0.2 : imintime
+ kcycle init 0
+ ktimesum init 0
+ ktime timeinsts
+ klasttime init 0
+ kbpm init 0
+ kdone init 0
+ if (kpulse == 1 && klasttime != 0) then
+ kelapsed = ktime - klasttime
+ if (kelapsed > imintime) then
+ ktimesum += kelapsed
+ klasttime = ktime
+ kcycle += 1
+ endif
+ elseif (klasttime == 0) then
+ klasttime = ktime
+ endif
+
+ if (kcycle >= imax) then
+ kcycle = 0
+ kbpm = 60 / (ktimesum / imax)
+ ktimesum = 0
+ kdone = 1
+ else
+ kdone = 0
+ endif
+ xout kdone, kbpm
+endop
+
+#end
+
|