4 from aubio import source, pitch, freqtomidi
7 print "Usage: %s <filename> [samplerate]" % sys.argv[0]
10 filename = sys.argv[1]
13 samplerate = 44100 / downsample
14 if len( sys.argv ) > 2: samplerate = int(sys.argv[2])
16 win_s = 4096 / downsample # fft size
17 hop_s = 512 / downsample # hop size
19 s = source(filename, samplerate, hop_s)
20 samplerate = s.samplerate
24 pitch_o = pitch("yin", win_s, hop_s, samplerate)
25 pitch_o.set_unit("midi")
26 pitch_o.set_tolerance(tolerance)
31 # total number of frames read
35 pitch = pitch_o(samples)[0]
36 #pitch = int(round(pitch))
37 confidence = pitch_o.get_confidence()
38 #if confidence < 0.8: pitch = 0.
39 #print "%f %f %f" % (total_frames / float(samplerate), pitch, confidence)
41 confidences += [confidence]
43 if read < hop_s: break
48 from numpy import array, ma
49 import matplotlib.pyplot as plt
50 from demo_waveform_plot import get_waveform_plot, set_xlabels_sample2time
54 pitches = array(pitches[skip:])
55 confidences = array(confidences[skip:])
56 times = [t * hop_s for t in range(len(pitches))]
60 ax1 = fig.add_subplot(311)
61 ax1 = get_waveform_plot(filename, samplerate = samplerate, block_size = hop_s, ax = ax1)
62 plt.setp(ax1.get_xticklabels(), visible = False)
65 def array_from_text_file(filename, dtype = 'float'):
67 from numpy import array
68 filename = os.path.join(os.path.dirname(__file__), filename)
69 return array([line.split() for line in open(filename).readlines()],
72 ax2 = fig.add_subplot(312, sharex = ax1)
74 ground_truth = os.path.splitext(filename)[0] + '.f0.Corrected'
75 if os.path.isfile(ground_truth):
76 ground_truth = array_from_text_file(ground_truth)
77 true_freqs = ground_truth[:,2]
78 true_freqs = ma.masked_where(true_freqs < 2, true_freqs)
79 true_times = float(samplerate) * ground_truth[:,0]
80 ax2.plot(true_times, true_freqs, 'r')
81 ax2.axis( ymin = 0.9 * true_freqs.min(), ymax = 1.1 * true_freqs.max() )
83 ax2.plot(times, pitches, '.g')
84 # plot cleaned up pitches
85 cleaned_pitches = pitches
86 #cleaned_pitches = ma.masked_where(cleaned_pitches < 0, cleaned_pitches)
87 #cleaned_pitches = ma.masked_where(cleaned_pitches > 120, cleaned_pitches)
88 cleaned_pitches = ma.masked_where(confidences < tolerance, cleaned_pitches)
89 ax2.plot(times, cleaned_pitches, '.-')
90 #ax2.axis( ymin = 0.9 * cleaned_pitches.min(), ymax = 1.1 * cleaned_pitches.max() )
91 #ax2.axis( ymin = 55, ymax = 70 )
92 plt.setp(ax2.get_xticklabels(), visible = False)
93 ax2.set_ylabel('f0 (midi)')
96 ax3 = fig.add_subplot(313, sharex = ax1)
98 ax3.plot(times, confidences)
99 # draw a line at tolerance
100 ax3.plot(times, [tolerance]*len(confidences))
101 ax3.axis( xmin = times[0], xmax = times[-1])
102 ax3.set_ylabel('condidence')
103 set_xlabels_sample2time(ax3, times[-1], samplerate)
105 #plt.savefig(os.path.basename(filename) + '.svg')