shithub: aubio

Download patch

ref: c911b121883f3deff01e97fd5bf11a28d056f06b
parent: d47a5e19c1969a4dcf26bb7a9696609bb16b9107
author: Paul Brossier <piem@piem.org>
date: Mon Dec 2 07:40:05 EST 2013

python/demos/demo_bpm_extract.py: add simple demo to get bpm of several files

--- /dev/null
+++ b/python/demos/demo_bpm_extract.py
@@ -1,0 +1,54 @@
+#! /usr/bin/env python
+
+from aubio import source, tempo
+from numpy import median, diff
+
+def get_file_bpm(path, params = {}):
+    """ Calculate the beats per minute (bpm) of a given file.
+        path: path to the file
+        param: dictionary of parameters
+    """
+    try:
+        win_s = params['win_s']
+        samplerate = params['samplerate']
+        hop_s = params['hop_s']
+    except:
+        """
+        # 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 
+    bpms = 60./diff(beats)
+    b = median(bpms)
+    return b
+
+if __name__ == '__main__':
+    import sys
+    for f in sys.argv[1:]:
+        bpm = get_file_bpm(f)
+        print "%6s" % ("%.2f" % bpm), f