1#! /usr/bin/env python 2 3import sys 4from aubio import onset, source 5from numpy import hstack, zeros 6 7win_s = 512 # fft size 8hop_s = win_s // 2 # hop size 9 10if len(sys.argv) < 2: 11 print("Usage: %s <filename> [samplerate]" % sys.argv[0]) 12 sys.exit(1) 13 14filename = sys.argv[1] 15 16samplerate = 0 17if len( sys.argv ) > 2: samplerate = int(sys.argv[2]) 18 19s = source(filename, samplerate, hop_s) 20samplerate = s.samplerate 21o = onset("default", win_s, hop_s, samplerate) 22 23# list of onsets, in samples 24onsets = [] 25 26# storage for plotted data 27desc = [] 28tdesc = [] 29allsamples_max = zeros(0,) 30downsample = 2 # to plot n samples / hop_s 31 32# total number of frames read 33total_frames = 0 34while True: 35 samples, read = s() 36 if o(samples): 37 print("%f" % (o.get_last_s())) 38 onsets.append(o.get_last()) 39 # keep some data to plot it later 40 new_maxes = (abs(samples.reshape(hop_s//downsample, downsample))).max(axis=0) 41 allsamples_max = hstack([allsamples_max, new_maxes]) 42 desc.append(o.get_descriptor()) 43 tdesc.append(o.get_thresholded_descriptor()) 44 total_frames += read 45 if read < hop_s: break 46 47if 1: 48 # do plotting 49 import matplotlib.pyplot as plt 50 allsamples_max = (allsamples_max > 0) * allsamples_max 51 allsamples_max_times = [ float(t) * hop_s / downsample / samplerate for t in range(len(allsamples_max)) ] 52 plt1 = plt.axes([0.1, 0.75, 0.8, 0.19]) 53 plt2 = plt.axes([0.1, 0.1, 0.8, 0.65], sharex = plt1) 54 plt.rc('lines',linewidth='.8') 55 plt1.plot(allsamples_max_times, allsamples_max, '-b') 56 plt1.plot(allsamples_max_times, -allsamples_max, '-b') 57 for stamp in onsets: 58 stamp /= float(samplerate) 59 plt1.plot([stamp, stamp], [-1., 1.], '-r') 60 plt1.axis(xmin = 0., xmax = max(allsamples_max_times) ) 61 plt1.xaxis.set_visible(False) 62 plt1.yaxis.set_visible(False) 63 desc_times = [ float(t) * hop_s / samplerate for t in range(len(desc)) ] 64 desc_max = max(desc) if max(desc) != 0 else 1. 65 desc_plot = [d / desc_max for d in desc] 66 plt2.plot(desc_times, desc_plot, '-g') 67 tdesc_plot = [d / desc_max for d in tdesc] 68 for stamp in onsets: 69 stamp /= float(samplerate) 70 plt2.plot([stamp, stamp], [min(tdesc_plot), max(desc_plot)], '-r') 71 plt2.plot(desc_times, tdesc_plot, '-y') 72 plt2.axis(ymin = min(tdesc_plot), ymax = max(desc_plot)) 73 plt.xlabel('time (s)') 74 #plt.savefig('/tmp/t.png', dpi=200) 75 plt.show() 76