diff options
Diffstat (limited to 'python/demos/demo_bpm_extract.py')
-rwxr-xr-x | python/demos/demo_bpm_extract.py | 62 |
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)) |