blob: 6eb0f600af0a960ee971fa300b5fd149900b4cd0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
|