summaryrefslogtreecommitdiff
path: root/python/demos/demo_bpm_extract.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/demos/demo_bpm_extract.py')
-rwxr-xr-xpython/demos/demo_bpm_extract.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/python/demos/demo_bpm_extract.py b/python/demos/demo_bpm_extract.py
new file mode 100755
index 0000000..ba7fbad
--- /dev/null
+++ b/python/demos/demo_bpm_extract.py
@@ -0,0 +1,62 @@
+#! /usr/bin/env python
+
+from aubio import source, tempo
+from numpy import median, diff
+
+def get_file_bpm(path, params = None):
+ """ Calculate the beats per minute (bpm) of a given file.
+ path: path to the file
+ param: dictionary of parameters
+ """
+ if params is None:
+ params = {}
+ try:
+ win_s = params['win_s']
+ samplerate = params['samplerate']
+ hop_s = params['hop_s']
+ except KeyError:
+ """
+ # super fast
+ samplerate, win_s, hop_s = 4000, 128, 64
+ # fast
+ samplerate, win_s, hop_s = 8000, 512, 128
+ """
+ # default:
+ samplerate, win_s, hop_s = 44100, 1024, 512
+
+ s = source(path, samplerate, hop_s)
+ samplerate = s.samplerate
+ o = tempo("specdiff", win_s, hop_s, samplerate)
+ # List of beats, in samples
+ beats = []
+ # Total number of frames read
+ total_frames = 0
+
+ while True:
+ samples, read = s()
+ is_beat = o(samples)
+ if is_beat:
+ this_beat = o.get_last_s()
+ beats.append(this_beat)
+ #if o.get_confidence() > .2 and len(beats) > 2.:
+ # break
+ total_frames += read
+ if read < hop_s:
+ break
+
+ # Convert to periods and to bpm
+ if len(beats) > 1:
+ if len(beats) < 4:
+ print("few beats found in {:s}".format(path))
+ bpms = 60./diff(beats)
+ b = median(bpms)
+ else:
+ b = 0
+ print("not enough beats found in {:s}".format(path))
+ return b
+
+if __name__ == '__main__':
+ import sys
+ for f in sys.argv[1:]:
+ bpm = get_file_bpm(f)
+ print("{:6s} {:s}".format("{:2f}".format(bpm), f))