1 | |
---|
2 | from aubio.task import task |
---|
3 | from aubio.aubioclass import * |
---|
4 | |
---|
5 | class tasknotes(task): |
---|
6 | def __init__(self,input,output=None,params=None): |
---|
7 | task.__init__(self,input,params=params) |
---|
8 | self.opick = onsetpick(self.params.bufsize, |
---|
9 | self.params.hopsize, |
---|
10 | self.channels, |
---|
11 | self.myvec, |
---|
12 | self.params.threshold, |
---|
13 | mode=self.params.onsetmode, |
---|
14 | dcthreshold=self.params.dcthreshold, |
---|
15 | derivate=self.params.derivate) |
---|
16 | self.pitchdet = pitch(mode=self.params.pitchmode, |
---|
17 | bufsize=self.params.pbufsize, |
---|
18 | hopsize=self.params.phopsize, |
---|
19 | channels=self.channels, |
---|
20 | samplerate=self.srate, |
---|
21 | omode=self.params.omode) |
---|
22 | self.olist = [] |
---|
23 | self.ofunc = [] |
---|
24 | self.maxofunc = 0 |
---|
25 | self.last = -1000 |
---|
26 | self.oldifreq = 0 |
---|
27 | if self.params.localmin: |
---|
28 | self.ovalist = [0., 0., 0., 0., 0.] |
---|
29 | |
---|
30 | def __call__(self): |
---|
31 | from aubio.median import short_find |
---|
32 | task.__call__(self) |
---|
33 | isonset,val = self.opick.do(self.myvec) |
---|
34 | if (aubio_silence_detection(self.myvec(),self.params.silence)): |
---|
35 | isonset=0 |
---|
36 | freq = -1. |
---|
37 | else: |
---|
38 | freq = self.pitchdet(self.myvec) |
---|
39 | minpitch = self.params.pitchmin |
---|
40 | maxpitch = self.params.pitchmax |
---|
41 | if maxpitch and freq > maxpitch : |
---|
42 | freq = -1. |
---|
43 | elif minpitch and freq < minpitch : |
---|
44 | freq = -1. |
---|
45 | freq = aubio_freqtomidi(freq) |
---|
46 | if self.params.pitchsmooth: |
---|
47 | self.shortlist.append(freq) |
---|
48 | self.shortlist.pop(0) |
---|
49 | smoothfreq = short_find(self.shortlist, |
---|
50 | len(self.shortlist)/2) |
---|
51 | freq = smoothfreq |
---|
52 | now = self.frameread |
---|
53 | ifreq = int(round(freq)) |
---|
54 | if self.oldifreq == ifreq: |
---|
55 | self.oldifreq = ifreq |
---|
56 | else: |
---|
57 | self.oldifreq = ifreq |
---|
58 | ifreq = 0 |
---|
59 | # take back delay |
---|
60 | if self.params.delay != 0.: now -= self.params.delay |
---|
61 | if now < 0 : |
---|
62 | now = 0 |
---|
63 | if (isonset == 1): |
---|
64 | if self.params.mintol: |
---|
65 | # prune doubled |
---|
66 | if (now - self.last) > self.params.mintol: |
---|
67 | self.last = now |
---|
68 | return now, 1, freq, ifreq |
---|
69 | else: |
---|
70 | return now, 0, freq, ifreq |
---|
71 | else: |
---|
72 | return now, 1, freq, ifreq |
---|
73 | else: |
---|
74 | return now, 0, freq, ifreq |
---|
75 | |
---|
76 | |
---|
77 | def fprint(self,foo): |
---|
78 | print self.params.step*foo[0], foo[1], foo[2], foo[3] |
---|
79 | |
---|
80 | def compute_all(self): |
---|
81 | """ Compute data """ |
---|
82 | now, onset, freq, ifreq = [], [], [], [] |
---|
83 | while(self.readsize==self.params.hopsize): |
---|
84 | n, o, f, i = self() |
---|
85 | now.append(n*self.params.step) |
---|
86 | onset.append(o) |
---|
87 | freq.append(f) |
---|
88 | ifreq.append(i) |
---|
89 | if self.params.verbose: |
---|
90 | self.fprint((n,o,f,i)) |
---|
91 | return now, onset, freq, ifreq |
---|
92 | |
---|
93 | def plot(self,now,onset,freq,ifreq,oplots): |
---|
94 | import Gnuplot |
---|
95 | |
---|
96 | oplots.append(Gnuplot.Data(now,freq,with_='lines', |
---|
97 | title=self.params.pitchmode)) |
---|
98 | oplots.append(Gnuplot.Data(now,ifreq,with_='lines', |
---|
99 | title=self.params.pitchmode)) |
---|
100 | |
---|
101 | temponsets = [] |
---|
102 | for i in onset: |
---|
103 | temponsets.append(i*1000) |
---|
104 | oplots.append(Gnuplot.Data(now,temponsets,with_='impulses', |
---|
105 | title=self.params.pitchmode)) |
---|
106 | |
---|
107 | def plotplot(self,wplot,oplots,outplot=None,multiplot = 0): |
---|
108 | from aubio.gnuplot import gnuplot_init, audio_to_array, make_audio_plot |
---|
109 | import re |
---|
110 | import Gnuplot |
---|
111 | # audio data |
---|
112 | time,data = audio_to_array(self.input) |
---|
113 | f = make_audio_plot(time,data) |
---|
114 | |
---|
115 | # check if ground truth exists |
---|
116 | #timet,pitcht = self.gettruth() |
---|
117 | #if timet and pitcht: |
---|
118 | # oplots = [Gnuplot.Data(timet,pitcht,with_='lines', |
---|
119 | # title='ground truth')] + oplots |
---|
120 | |
---|
121 | t = Gnuplot.Data(0,0,with_='impulses') |
---|
122 | |
---|
123 | g = gnuplot_init(outplot) |
---|
124 | g('set title \'%s\'' % (re.sub('.*/','',self.input))) |
---|
125 | g('set multiplot') |
---|
126 | # hack to align left axis |
---|
127 | g('set lmargin 15') |
---|
128 | # plot waveform and onsets |
---|
129 | g('set size 1,0.3') |
---|
130 | g('set origin 0,0.7') |
---|
131 | g('set xrange [0:%f]' % max(time)) |
---|
132 | g('set yrange [-1:1]') |
---|
133 | g.ylabel('amplitude') |
---|
134 | g.plot(f) |
---|
135 | g('unset title') |
---|
136 | # plot onset detection function |
---|
137 | |
---|
138 | |
---|
139 | g('set size 1,0.7') |
---|
140 | g('set origin 0,0') |
---|
141 | g('set xrange [0:%f]' % max(time)) |
---|
142 | g('set yrange [20:100]') |
---|
143 | g('set key right top') |
---|
144 | g('set noclip one') |
---|
145 | #g('set format x ""') |
---|
146 | #g('set log y') |
---|
147 | #g.xlabel('time (s)') |
---|
148 | g.ylabel('f0 (Hz)') |
---|
149 | if multiplot: |
---|
150 | for i in range(len(oplots)): |
---|
151 | # plot onset detection functions |
---|
152 | g('set size 1,%f' % (0.7/(len(oplots)))) |
---|
153 | g('set origin 0,%f' % (float(i)*0.7/(len(oplots)))) |
---|
154 | g('set xrange [0:%f]' % max(time)) |
---|
155 | g.plot(oplots[i]) |
---|
156 | else: |
---|
157 | g.plot(*oplots) |
---|
158 | #g('unset multiplot') |
---|
159 | |
---|