History

add class task, rewrite of bench-pitch add class task, rewrite of bench-pitch

Paul Brossier committed 20 years ago

Commit 00296381 parent 50791b32 files · +173 −43Browse files

Showing the changes to python (2 of 2 files). Show all

Unified · Split

2 files
  1. python/aubio/tasks.py +120 −12
  2. python/bench-pitch +53 −31
python/aubio/tasks.py+120−12
@@ -1,4 +1,5 @@
11 from aubioclass import *
2+from bench.node import bench
23
34 def get_onset_mode(nvalue):
45 """ utility function to convert a string to aubio_onsetdetection_type """
@@ -23,6 +24,21 @@ def get_onset_mode(nvalue): · 18 unmodified lines
2324 print "unknown onset detection function selected"
2425 sys.exit(1)
2526
27+def get_pitch_mode(nvalue):
28+ """ utility function to convert a string to aubio_pitchdetection_type """
29+ if nvalue == 'mcomb' :
30+ return aubio_pitch_mcomb
31+ elif nvalue == 'yin' :
32+ return aubio_pitch_yin
33+ elif nvalue == 'fcomb' :
34+ return aubio_pitch_fcomb
35+ elif nvalue == 'schmitt':
36+ return aubio_pitch_schmitt
37+ else:
38+ import sys
39+ print "error: unknown pitch detection function selected"
40+ sys.exit(1)
41+
2642 def check_onset_mode(option, opt, value, parser):
2743 """ wrapper function to convert a list of modes to
2844 aubio_onsetdetection_type """
@@ -37,18 +53,7 @@ def check_pitch_mode(option, opt, value, parser): · 8 unmodified lines
3753 nvalues = parser.rargs[0].split(',')
3854 val = []
3955 for nvalue in nvalues:
40− if nvalue == 'mcomb' :
41− val.append(aubio_pitch_mcomb)
42− elif nvalue == 'yin' :
43− val.append(aubio_pitch_yin)
44− elif nvalue == 'fcomb' :
45− val.append(aubio_pitch_fcomb)
46− elif nvalue == 'schmitt':
47− val.append(aubio_pitch_schmitt)
48− else:
49− import sys
50− print "error: unknown pitch detection function selected"
51− sys.exit(1)
56+ val.append(get_pitch_mode(nvalue))
5257 setattr(parser.values, option.dest, val)
5358
5459 def check_pitchm_mode(option, opt, value, parser):
@@ -166,6 +171,7 @@ def getsilences(filein,hopsize=512,silence=-70): · 111 unmodified lines
166171 frameread += 1
167172 return mylist
168173
174+
169175 def getpitch(filein,mode=aubio_pitch_mcomb,bufsize=1024,hopsize=512,omode=aubio_pitchm_freq,
170176 samplerate=44100.,silence=-70):
171177 frameread = 0
@@ -188,3 +194,105 @@ def getpitch(filein,mode=aubio_pitch_mcomb,bufsize=1024,hopsize=512,omode=aubio_ · 16 unmodified lines
188194 frameread += 1
189195 return mylist
190196
197+
198+class taskparams:
199+ """ default parameters for task classes """
200+ def __init__(self,input=None,output=None):
201+ self.silence = -70
202+ self.derivate = False
203+ self.localmin = False
204+ self.bufsize = 512
205+ self.hopsize = 256
206+ self.samplerate = 44100
207+ self.tol = 0.05
208+ self.step = float(self.hopsize)/float(self.samplerate)
209+ self.threshold = 0.1
210+ self.mode = 'yin'
211+ self.omode = aubio_pitchm_freq
212+
213+class task(taskparams):
214+ def __init__(self,input,output=None,params=None):
215+ """ open the input file and initialize default argument """
216+ if params == None: self.params = taskparams()
217+ else: self.params = params
218+ self.input = input
219+ self.filei = sndfile(self.input)
220+ self.srate = self.filei.samplerate()
221+ self.channels = self.filei.channels()
222+ self.output = output
223+ def compute_step(self):
224+ pass
225+ def compute_all(self):
226+ """ Compute data """
227+ mylist = []
228+ while(self.readsize==self.params.hopsize):
229+ mylist.append(self())
230+ return mylist
231+
232+ def eval(self,results):
233+ """ Eval data """
234+ pass
235+
236+ def plot(self):
237+ """ Plot data """
238+ pass
239+
240+class taskpitch(task):
241+ #def __init__(self,input,output):
242+ # pass
243+ # task.__init__(self,input)
244+ # #taskparams.__init__(self)
245+ def __init__(self,input,params=None):
246+ task.__init__(self,input,params=params)
247+ self.myvec = fvec(self.params.hopsize,self.channels)
248+ self.frameread = 0
249+ self.readsize = self.params.hopsize
250+ self.pitchdet = pitchdetection(mode=get_pitch_mode(self.params.mode),
251+ bufsize=self.params.bufsize,
252+ hopsize=self.params.hopsize,
253+ channels=self.channels,
254+ samplerate=self.srate,
255+ omode=self.params.omode)
256+
257+ def __call__(self):
258+ self.readsize = self.filei.read(self.params.hopsize,self.myvec)
259+ freq = self.pitchdet(self.myvec)
260+ #print "%.3f %.2f" % (now,freq)
261+ self.frameread += 1
262+ if (aubio_silence_detection(self.myvec(),self.params.silence)!=1):
263+ return freq
264+ else:
265+ return -1.
266+
267+ def gettruth(self):
268+ return float(self.input.split('.')[-2])
269+
270+
271+ def eval(self,results):
272+ from median import short_find
273+ self.truth = self.gettruth()
274+ num = 0
275+ sum = 0
276+ res = []
277+ for i in results:
278+ if i == -1: pass
279+ else:
280+ res.append(i)
281+ sum += i
282+ num += 1
283+ avg = aubio_freqtomidi(sum / float(num))
284+ avgdist = self.truth - avg
285+ med = aubio_freqtomidi(short_find(res,len(res)/2))
286+ meddist = self.truth - med
287+ return avgdist, meddist
288+
289+ def plot(self):
290+ from aubio.gnuplot import plot_pitch
291+ plot_pitch(self.input,
292+ pitch,
293+ samplerate=samplerate,
294+ hopsize=self.params.hopsize,
295+ outplot=options.outplot)
296+
297+
298+
python/bench-pitch+53−31
@@ -1,34 +1,56 @@
11 #! /usr/bin/python
22
3−#from conf.aubio_benchrc import *
4−from aubio.bench.config import *
53 from aubio.bench.node import *
6−import os
7−
8−datapath = "%s%s" % (DATADIR,'/pitch/isolated/piano/011pfnof')
9−respath = '/var/tmp/isolated/testing'
10−
11−MODES = 'yin', 'mcomb', 'fcomb', 'schmitt'
12−
13−# prepareresultpath
14−act_on_results(mkdir,datapath,respath,filter='d')
15−
16−def compute_data(input,output):
17− aubiocmd = "%s%s %s%s" % \
18− ("LD_LIBRARY_PATH=",LD_LIBRARY_PATH,AUBIOHOME,"/python/aubiopitch")
19− for m in MODES:
20− cmd = "%s --input \"%s\" --mode %s --verbose --units midi > \"%s--%s.txt\"" \
21− % (aubiocmd,input,m,output,m)
22− runcommand(cmd,debug=0)
23−
24−
25−# computedata
26−act_on_data(compute_data,datapath,respath,suffix='',filter='f -name \'*.wav\'')
27−
28−# gatherdata
29−#act_on_data(my_print,datapath,respath,suffix='.txt',filter='f -name \'*.wav\'')
30−# gatherthreshold
31−# gathermodes
32−# comparediffs
33−# gatherdiffs
34−
4+from aubio.tasks import *
5+
6+class benchpitch(bench):
7+
8+ def compute_file(self,input,output):
9+ filetask = self.task(input,params=self.params)
10+ computed_data = filetask.compute_all()
11+ results = filetask.eval(computed_data)
12+ self.results.append(results)
13+ truth = filetask.gettruth()
14+ #print input, results, results - float(input.split('.')[-2])
15+ self.pretty_print((self.params.mode, truth,
16+ truth - results[0], results[0],
17+ truth - results[1], results[1]))
18+
19+ def compute_data(self):
20+ self.orig, self.missed, self.merged, self.expc, \
21+ self.bad, self.doubled = 0, 0, 0, 0, 0, 0
22+ act_on_data(self.compute_file,self.datadir, \
23+ suffix='',filter='f -name \'*.wav\'')
24+
25+ def compute_results(self,truth):
26+ for i in self.results: print i
27+
28+ def run_bench(self,modes=['dual']):
29+ self.modes = modes
30+ self.pretty_print(self.titles)
31+ for mode in self.modes:
32+ self.params.mode = mode
33+ self.compute_data()
34+ #self.compute_results()
35+ #self.pretty_print(self.results)
36+
37+if __name__ == "__main__":
38+ import sys
39+ if len(sys.argv) > 1: datapath = sys.argv[1]
40+ else: print "error: a path is required"; sys.exit(1)
41+
42+ modes = ['schmitt', 'yin', 'mcomb', 'fcomb']
43+
44+ benchpitch = benchpitch(datapath)
45+ benchpitch.params = taskparams()
46+ benchpitch.task = taskpitch
47+
48+ benchpitch.titles = [ 'mode', 'thres', 'avg', 'avgdist' ]
49+ benchpitch.formats = ["%12s" , "| %6s", "| %6s", "| %6s", "| %6s", "| %6s" ]
50+ try:
51+ benchpitch.run_bench(modes=modes)
52+ except KeyboardInterrupt:
53+ print "Interrupted by user"
54+ sys.exit(1)
55+
56+ sys.exit(0)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t