source: python/aubio/task/notes.py @ 8a1f9a4

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5pitchshiftsamplertimestretchyinfft+
Last change on this file since 8a1f9a4 was ae3f5af, checked in by Paul Brossier <piem@altern.org>, 18 years ago

last 0.3.0 changes
last 0.3.0 changes

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