History

moved out old python interface

Paul Brossier committed 13 years ago

Commit b554e411 parent a1da37f42 files · +0 −0Browse files

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

Unified · Split

42 files
  1. python.old/README +30 −0
  2. python.old/aubio/__init__.py +28 −0
  3. python.old/aubio/aubioclass.py +160 −0
  4. python.old/aubio/bench/__init__.py +0 −0
  5. python.old/aubio/bench/broadcast.py +25 −0
  6. python.old/aubio/bench/config.py +22 −0
  7. python.old/aubio/bench/node.py +224 −0
  8. python.old/aubio/bench/onset.py +303 −0
  9. python.old/aubio/gnuplot.py +222 −0
  10. python.old/aubio/median.py +69 −0
  11. python.old/aubio/onsetcompare.py +143 −0
  12. python.old/aubio/plot/__init__.py +0 −0
  13. python.old/aubio/plot/keyboard.py +46 −0
  14. python.old/aubio/plot/notes.py +90 −0
  15. python.old/aubio/task/__init__.py +9 −0
  16. python.old/aubio/task/beat.py +262 −0
  17. python.old/aubio/task/cut.py +42 −0
  18. python.old/aubio/task/notes.py +159 −0
  19. python.old/aubio/task/onset.py +220 −0
  20. python.old/aubio/task/params.py +33 −0
  21. python.old/aubio/task/pitch.py +234 −0
  22. python.old/aubio/task/silence.py +28 −0
  23. python.old/aubio/task/task.py +53 −0
  24. python.old/aubio/txtfile.py +47 −0
  25. python.old/aubio/web/__init__.py +0 −0
  26. python.old/aubio/web/browser.py +167 −0
  27. python.old/aubio/web/html.py +286 −0
  28. python.old/aubio/wscript_build +17 −0
  29. python.old/aubiocompare-onset +114 −0
  30. python.old/aubiocut +156 −0
  31. python.old/aubiodiffs-onset +86 −0
  32. python.old/aubiofilter-notes +94 −0
  33. python.old/aubionotes +79 −0
  34. python.old/aubiopitch +131 −0
  35. python.old/aubioplot-audio +31 −0
  36. python.old/aubioplot-notes +31 −0
  37. python.old/aubioplot-spec +51 −0
  38. python.old/aubioplot-yinfft +135 −0
  39. python.old/aubioweb.py +113 −0
  40. python.old/bench-cluster-test +9 −0
  41. python.old/bench-test +13 −0
  42. python.old/wscript_build +6 −0
python.old/README+30−0
@@ -0,0 +1,30 @@
1# Here you will find some examples of python scripts and some evaluation
2# routines. The python interface for libaubio is generated using Swig.
3
4# To have it working before installation, you will need to set LD_LIBRARY_PATH.
5# for instance, to run the python script from within aubio/python/, you can use
6# '. README'
7
8export LD_LIBRARY_PATH=../src/.libs:../ext/.libs
9export PYTHONPATH=aubio/.libs
10
11echo """
12
13the aubio/ directory should be organised as follow:
14
15 aubiowrapper.py,_aubiowrapper.so, aubio_wrap.c, aubio_wrap.o
16 swig generated aubio interface
17 aubioclass.py
18 human usable interface
19 plot/
20 everything required to plot
21 web/
22 tools to use aubioweb.py
23 bench/
24 tools to explore a database of sound file and run benchmarks on it
25 eval/
26 tools to evaluate the performance of aubio extractors
27 aubioweb.py
28 a hack to pipe aubio in mod_python
29
30"""
python.old/aubio/__init__.py+28−0
@@ -0,0 +1,28 @@
1"""Copyright (C) 2004 Paul Brossier <piem@altern.org>
2print aubio.__LICENSE__ for the terms of use
3"""
4
5__LICENSE__ = """\
6 Copyright (C) 2004-2009 Paul Brossier <piem@aubio.org>
7
8 This file is part of aubio.
9
10 aubio is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
14
15 aubio is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with aubio. If not, see <http://www.gnu.org/licenses/>.
22"""
23
24#from aubioclass import *
25#from onsetcompare import *
26#from median import *
27#from noteroc import *
28#from txtfile import *
python.old/aubio/aubioclass.py+160−0
@@ -0,0 +1,160 @@
1from aubiowrapper import *
2
3class fvec:
4 def __init__(self,size):
5 self.vec = new_fvec(size)
6 def __call__(self):
7 return self.vec
8 def __del__(self):
9 del_fvec(self())
10 def get(self,pos):
11 return fvec_read_sample(self(),pos)
12 def set(self,value,pos):
13 return fvec_write_sample(self(),value,pos)
14 def data(self):
15 return fvec_get_data(self())
16
17class cvec:
18 def __init__(self,size):
19 self.vec = new_cvec(size)
20 def __call__(self):
21 return self.vec
22 def __del__(self):
23 del_cvec(self())
24 def get(self,pos):
25 return self.get_norm(pos)
26 def set(self,val,pos):
27 self.set_norm(val,pos)
28 def get_norm(self,pos):
29 return cvec_read_norm(self(),pos)
30 def set_norm(self,val,pos):
31 cvec_write_norm(self(),val,pos)
32 def get_phas(self,pos):
33 return cvec_read_phas(self(),pos)
34 def set_phas(self,val,pos):
35 cvec_write_phas(self(),val,pos)
36
37class sndfile:
38 def __init__(self,filename,model=None):
39 if (model!=None):
40 self.file = new_aubio_sndfile_wo(model.file,filename)
41 else:
42 self.file = new_aubio_sndfile_ro(filename)
43 if self.file == None:
44 raise IOError, "failed opening file %s" % filename
45 def __del__(self):
46 if self.file != None: del_aubio_sndfile(self.file)
47 def info(self):
48 aubio_sndfile_info(self.file)
49 def samplerate(self):
50 return aubio_sndfile_samplerate(self.file)
51 def channels(self):
52 return aubio_sndfile_channels(self.file)
53 def read(self,nfram,vecread):
54 return aubio_sndfile_read_mono(self.file,nfram,vecread())
55 def write(self,nfram,vecwrite):
56 return aubio_sndfile_write(self.file,nfram,vecwrite())
57
58class pvoc:
59 def __init__(self,buf,hop):
60 self.pv = new_aubio_pvoc(buf,hop)
61 def __del__(self):
62 del_aubio_pvoc(self.pv)
63 def do(self,tf,tc):
64 aubio_pvoc_do(self.pv,tf(),tc())
65 def rdo(self,tc,tf):
66 aubio_pvoc_rdo(self.pv,tc(),tf())
67
68class onsetdetection:
69 """ class for aubio_specdesc """
70 def __init__(self,mode,buf):
71 self.od = new_aubio_specdesc(mode,buf)
72 def do(self,tc,tf):
73 aubio_specdesc_do(self.od,tc(),tf())
74 def __del__(self):
75 del_aubio_specdesc(self.od)
76
77class peakpick:
78 """ class for aubio_peakpicker """
79 def __init__(self,threshold=0.1):
80 self.pp = new_aubio_peakpicker()
81 self.out = new_fvec(1)
82 aubio_peakpicker_set_threshold (self.pp, threshold)
83 def do(self,fv):
84 aubio_peakpicker_do(self.pp, fv(), self.out)
85 return fvec_read_sample(self.out, 0)
86 def getval(self):
87 return aubio_peakpicker_get_adaptive_threshold(self.pp)
88 def __del__(self):
89 del_aubio_peakpicker(self.pp)
90
91class onsetpick:
92 """ superclass for aubio_pvoc + aubio_specdesc + aubio_peakpicker """
93 def __init__(self,bufsize,hopsize,myvec,threshold,mode='dual',derivate=False,dcthreshold=0):
94 self.myfft = cvec(bufsize)
95 self.pv = pvoc(bufsize,hopsize)
96 if mode in ['dual'] :
97 self.myod = onsetdetection("hfc",bufsize)
98 self.myod2 = onsetdetection("mkl",bufsize)
99 self.myonset = fvec(1)
100 self.myonset2 = fvec(1)
101 else:
102 self.myod = onsetdetection(mode,bufsize)
103 self.myonset = fvec(1)
104 self.mode = mode
105 self.pp = peakpick(float(threshold))
106 self.derivate = derivate
107 self.dcthreshold = dcthreshold
108 self.oldval = 0.
109
110 def do(self,myvec):
111 self.pv.do(myvec,self.myfft)
112 self.myod.do(self.myfft,self.myonset)
113 if self.mode == 'dual':
114 self.myod2.do(self.myfft,self.myonset2)
115 self.myonset.set(self.myonset.get(0)*self.myonset2.get(0),0)
116 if self.derivate:
117 val = self.myonset.get(0)
118 dval = val - self.oldval
119 self.oldval = val
120 if dval > 0: self.myonset.set(dval,0)
121 else: self.myonset.set(0.,0,0)
122 isonset, dval = self.pp.do(self.myonset),self.myonset.get(0)
123 if self.dcthreshold:
124 if dval < self.dcthreshold: isonset = 0
125 return isonset, dval
126
127class pitch:
128 def __init__(self,mode="mcomb",bufsize=2048,hopsize=1024,
129 samplerate=44100.,omode="freq",tolerance=0.1):
130 self.pitchp = new_aubio_pitch(mode,bufsize,hopsize,
131 samplerate)
132 self.mypitch = fvec(1)
133 aubio_pitch_set_unit(self.pitchp,omode)
134 aubio_pitch_set_tolerance(self.pitchp,tolerance)
135 #self.filt = filter(srate,"adsgn")
136 def __del__(self):
137 del_aubio_pitch(self.pitchp)
138 def __call__(self,myvec):
139 aubio_pitch_do(self.pitchp,myvec(), self.mypitch())
140 return self.mypitch.get(0)
141
142class filter:
143 def __init__(self,srate,type=None):
144 if (type=="adsgn"):
145 self.filter = new_aubio_adsgn_filter(srate)
146 def __del__(self):
147 #del_aubio_filter(self.filter)
148 pass
149 def __call__(self,myvec):
150 aubio_filter_do(self.filter,myvec())
151
152class beattracking:
153 """ class for aubio_beattracking """
154 def __init__(self,winlen,channels):
155 self.p = new_aubio_beattracking(winlen,channels)
156 def do(self,dfframe,out):
157 return aubio_beattracking_do(self.p,dfframe(),out())
158 def __del__(self):
159 del_aubio_beattracking(self.p)
160
python.old/aubio/bench/__init__.py+0−0

Empty file added.

python.old/aubio/bench/broadcast.py+25−0
@@ -0,0 +1,25 @@
1from config import *
2
3class run_broadcast:
4 def __init__(self,command,*args):
5 for host in REMOTEHOSTS:
6 command(host,args[0],args[1:])
7
8def remote_sync(host,path='',options=''):
9 optstring = ''
10 for i in options:
11 optstring = "%s %s" % (optstring,i)
12 print RSYNC_CMD,optstring,RSYNC_OPT,' --delete',
13 print '%s%s%s%s%s' % (path,'/ ',host,':',path)
14
15
16def fetch_results(host,path='',options=''):
17 optstring = ''
18 for i in options:
19 optstring = "%s %s" % (optstring,i)
20 print RSYNC_CMD,optstring,RSYNC_OPT,' --update',
21 print '%s%s%s%s%s' % (host,':',path,'/ ',path)
22
23def remote_queue(host,command,options=''):
24 print 'oarsub -p "hostname = \'',host,'\'',command
25
python.old/aubio/bench/config.py+22−0
@@ -0,0 +1,22 @@
1
2filefound = 0
3try:
4 filename = "/etc/aubio-bench.conf"
5 execfile(filename)
6 filefound = 1
7except IOError:
8 print "no system wide configuration file found in", filename
9
10try:
11 import os
12 filename = "%s%s%s" % (os.getenv('HOME'),os.sep,".aubio-bench.conf")
13 execfile(filename)
14 filefound = 1
15except IOError:
16 #print "no user configuration file found in", filename
17 pass
18
19if filefound == 0:
20 import sys
21 print "error: no configuration file found at all"
22 sys.exit(1)
python.old/aubio/bench/node.py+224−0
@@ -0,0 +1,224 @@
1from config import *
2import commands,sys
3import re
4
5def runcommand(cmd,debug=0):
6 if VERBOSE >= VERBOSE_CMD or debug: print cmd
7 if debug: return
8 status, output = commands.getstatusoutput(cmd)
9 if status == 0 or VERBOSE >= VERBOSE_OUT:
10 output = output.split('\n')
11 if VERBOSE >= VERBOSE_OUT:
12 for i in output:
13 if i: print i
14 if not status == 0:
15 print 'error:',status,output
16 print 'command returning error was',cmd
17 #sys.exit(1)
18 if output == '' or output == ['']: return
19 return output
20
21def list_files(datapath,filter='f', maxdepth = -1):
22 if not os.path.exists(datapath):
23 print
24 print "ERR: no directory %s were found" % datapath
25 sys.exit(1)
26 if maxdepth >= 0: maxstring = " -maxdepth %d " % maxdepth
27 else: maxstring = ""
28 cmd = '%s' * 6 % ('find ',datapath,maxstring,' -type ',filter, "| sort -n")
29 return runcommand(cmd)
30
31def list_wav_files(datapath,maxdepth = -1):
32 return list_files(datapath, filter="f -name '*.wav'",maxdepth = maxdepth)
33
34sndfile_filter = "f -name '*.wav' -o -name '*.aif' -o -name '*.aiff'"
35
36def list_snd_files(datapath,maxdepth = -1):
37 return list_files(datapath, filter=sndfile_filter,
38 maxdepth = maxdepth)
39
40def list_res_files(datapath,maxdepth = -1):
41 return list_files(datapath, filter="f -name '*.txt'", maxdepth = maxdepth)
42
43def list_dirs(datapath):
44 return list_files(datapath, filter="d")
45
46def mkdir(path):
47 cmd = '%s%s' % ('mkdir -p ',path)
48 return runcommand(cmd)
49
50def act_on_data (action,datapath,respath=None,suffix='.txt',filter='f',sub='\.wav$',**keywords):
51 """ execute action(datafile,resfile) on all files in datapath """
52 dirlist = list_files(datapath,filter=filter)
53 if dirlist == ['']: dirlist = []
54 if respath:
55 respath_in_datapath = re.split(datapath, respath,maxsplit=1)[1:]
56 if(respath_in_datapath and suffix == ''):
57 print 'error: respath in datapath and no suffix used'
58 for i in dirlist:
59 j = re.split(datapath, i,maxsplit=1)[1]
60 j = re.sub(sub,'',j)
61 #j = "%s%s%s"%(respath,j,suffix)
62 if respath:
63 j = "%s%s"%(respath,j)
64 if sub != '':
65 j = re.sub(sub,suffix,j)
66 else:
67 j = "%s%s" % (j,suffix)
68 action(i,j,**keywords)
69
70def act_on_results (action,datapath,respath,filter='d'):
71 """ execute action(respath) an all subdirectories in respath """
72 dirlist = list_files(datapath,filter='d')
73 respath_in_datapath = re.split(datapath, respath,maxsplit=1)[1:]
74 if(respath_in_datapath and not filter == 'd' and suffix == ''):
75 print 'warning: respath is in datapath'
76 for i in dirlist:
77 s = re.split(datapath, i ,maxsplit=1)[1]
78 action("%s%s%s"%(respath,'/',s))
79
80def act_on_files (action,listfiles,listres=None,suffix='.txt',filter='f',sub='\.wav$',**keywords):
81 """ execute action(respath) an all subdirectories in respath """
82 if listres and len(listfiles) <= len(listres):
83 for i in range(len(listfiles)):
84 action(listfiles[i],listres[i],**keywords)
85 else:
86 for i in listfiles:
87 action(i,None,**keywords)
88
89class bench:
90 """ class to run benchmarks on directories """
91 def __init__(self,datadir,resdir=None,checkres=False,checkanno=False,params=[]):
92 from aubio.task.params import taskparams
93 self.datadir = datadir
94 # path to write results path to
95 self.resdir = resdir
96 # list of annotation files
97 self.reslist = []
98 # list used to gather results
99 self.results = []
100 if not params: self.params = taskparams()
101 else: self.params = params
102 print "Checking data directory", self.datadir
103 self.checkdata()
104 if checkanno: self.checkanno()
105 if checkres: self.checkres()
106
107 def checkdata(self):
108 if os.path.isfile(self.datadir):
109 self.dirlist = os.path.dirname(self.datadir)
110 elif os.path.isdir(self.datadir):
111 self.dirlist = list_dirs(self.datadir)
112 # allow dir* matching through find commands?
113 else:
114 print "ERR: path not understood"
115 sys.exit(1)
116 print "Listing directories in data directory",
117 if self.dirlist:
118 print " (%d elements)" % len(self.dirlist)
119 else:
120 print " (0 elements)"
121 print "ERR: no directory %s were found" % self.datadir
122 sys.exit(1)
123 print "Listing sound files in data directory",
124 self.sndlist = list_snd_files(self.datadir)
125 if self.sndlist:
126 print " (%d elements)" % len(self.sndlist)
127 else:
128 print " (0 elements)"
129 print "ERR: no sound files were found in", self.datadir
130 sys.exit(1)
131
132 def checkanno(self):
133 print "Listing annotations in data directory",
134 self.reslist = list_res_files(self.datadir)
135 print " (%d elements)" % len(self.reslist)
136 #for each in self.reslist: print each
137 if not self.reslist or len(self.reslist) < len (self.sndlist):
138 print "ERR: not enough annotations"
139 return -1
140 else:
141 print "Found enough annotations"
142
143 def checkres(self):
144 print "Creating results directory"
145 act_on_results(mkdir,self.datadir,self.resdir,filter='d')
146
147 def pretty_print(self,sep='|'):
148 for i in self.printnames:
149 print self.formats[i] % self.v[i], sep,
150 print
151
152 def pretty_titles(self,sep='|'):
153 for i in self.printnames:
154 print self.formats[i] % i, sep,
155 print
156
157 def dir_exec(self):
158 """ run file_exec on every input file """
159 self.l , self.labs = [], []
160 self.v = {}
161 for i in self.valuenames:
162 self.v[i] = []
163 for i in self.valuelists:
164 self.v[i] = []
165 act_on_files(self.file_exec,self.sndlist,self.reslist, \
166 suffix='',filter=sndfile_filter)
167
168 def dir_eval(self):
169 pass
170
171 def file_gettruth(self,input):
172 """ get ground truth filenames """
173 from os.path import isfile
174 ftrulist = []
175 # search for match as filetask.input,".txt"
176 ftru = '.'.join(input.split('.')[:-1])
177 ftru = '.'.join((ftru,'txt'))
178 if isfile(ftru):
179 ftrulist.append(ftru)
180 else:
181 # search for matches for filetask.input in the list of results
182 for i in range(len(self.reslist)):
183 check = '.'.join(self.reslist[i].split('.')[:-1])
184 check = '_'.join(check.split('_')[:-1])
185 if check == '.'.join(input.split('.')[:-1]):
186 ftrulist.append(self.reslist[i])
187 return ftrulist
188
189 def file_exec(self,input,output):
190 """ create filetask, extract data, evaluate """
191 filetask = self.task(input,params=self.params)
192 computed_data = filetask.compute_all()
193 ftrulist = self.file_gettruth(filetask.input)
194 for i in ftrulist:
195 filetask.eval(computed_data,i,mode='rocloc',vmode='')
196 """ append filetask.v to self.v """
197 for i in self.valuenames:
198 self.v[i].append(filetask.v[i])
199 for j in self.valuelists:
200 if filetask.v[j]:
201 for i in range(len(filetask.v[j])):
202 self.v[j].append(filetask.v[j][i])
203
204 def file_eval(self):
205 pass
206
207 def file_plot(self):
208 pass
209
210 def dir_plot(self):
211 pass
212
213 def run_bench(self):
214 for mode in self.modes:
215 self.params.mode = mode
216 self.dir_exec()
217 self.dir_eval()
218 self.dir_plot()
219
220 def dir_eval_print(self):
221 self.dir_exec()
222 self.dir_eval()
223 self.pretty_print()
224
python.old/aubio/bench/onset.py+303−0
@@ -0,0 +1,303 @@
1
2from aubio.bench.node import *
3from os.path import dirname,basename
4
5def mmean(l):
6 return sum(l)/max(float(len(l)),1)
7
8def stdev(l):
9 smean = 0
10 if not len(l): return smean
11 lmean = mmean(l)
12 for i in l:
13 smean += (i-lmean)**2
14 smean *= 1. / len(l)
15 return smean**.5
16
17class benchonset(bench):
18
19 """ list of values to store per file """
20 valuenames = ['orig','missed','Tm','expc','bad','Td']
21 """ list of lists to store per file """
22 valuelists = ['l','labs']
23 """ list of values to print per dir """
24 printnames = [ 'mode', 'thres', 'dist', 'prec', 'recl',
25 'GD', 'FP',
26 'Torig', 'Ttrue', 'Tfp', 'Tfn', 'TTm', 'TTd',
27 'aTtrue', 'aTfp', 'aTfn', 'aTm', 'aTd',
28 'mean', 'smean', 'amean', 'samean']
29
30 """ per dir """
31 formats = {'mode': "%12s" , 'thres': "%5.4s",
32 'dist': "%5.4s", 'prec': "%5.4s", 'recl': "%5.4s",
33 'Torig': "%5.4s", 'Ttrue': "%5.4s", 'Tfp': "%5.4s", 'Tfn': "%5.4s",
34 'TTm': "%5.4s", 'TTd': "%5.4s",
35 'aTtrue':"%5.4s", 'aTfp': "%5.4s", 'aTfn': "%5.4s",
36 'aTm': "%5.4s", 'aTd': "%5.4s",
37 'mean': "%5.6s", 'smean': "%5.6s",
38 'amean': "%5.6s", 'samean': "%5.6s",
39 "GD": "%5.4s", "FP": "%5.4s",
40 "GDm": "%5.4s", "FPd": "%5.4s",
41 "bufsize": "%5.4s", "hopsize": "%5.4s",
42 "time": "%5.4s"}
43
44 def dir_eval(self):
45 """ evaluate statistical data over the directory """
46 v = self.v
47
48 v['mode'] = self.params.onsetmode
49 v['thres'] = self.params.threshold
50 v['bufsize'] = self.params.bufsize
51 v['hopsize'] = self.params.hopsize
52 v['silence'] = self.params.silence
53 v['mintol'] = self.params.mintol
54
55 v['Torig'] = sum(v['orig'])
56 v['TTm'] = sum(v['Tm'])
57 v['TTd'] = sum(v['Td'])
58 v['Texpc'] = sum(v['expc'])
59 v['Tbad'] = sum(v['bad'])
60 v['Tmissed'] = sum(v['missed'])
61 v['aTm'] = mmean(v['Tm'])
62 v['aTd'] = mmean(v['Td'])
63
64 v['mean'] = mmean(v['l'])
65 v['smean'] = stdev(v['l'])
66
67 v['amean'] = mmean(v['labs'])
68 v['samean'] = stdev(v['labs'])
69
70 # old type calculations
71 # good detection rate
72 v['GD'] = 100.*(v['Torig']-v['Tmissed']-v['TTm'])/v['Torig']
73 # false positive rate
74 v['FP'] = 100.*(v['Tbad']+v['TTd'])/v['Torig']
75 # good detection counting merged detections as good
76 v['GDm'] = 100.*(v['Torig']-v['Tmissed'])/v['Torig']
77 # false positives counting doubled as good
78 v['FPd'] = 100.*v['Tbad']/v['Torig']
79
80 # mirex type annotations
81 totaltrue = v['Texpc']-v['Tbad']-v['TTd']
82 totalfp = v['Tbad']+v['TTd']
83 totalfn = v['Tmissed']+v['TTm']
84 self.v['Ttrue'] = totaltrue
85 self.v['Tfp'] = totalfp
86 self.v['Tfn'] = totalfn
87 # average over the number of annotation files
88 N = float(len(self.reslist))
89 self.v['aTtrue'] = totaltrue/N
90 self.v['aTfp'] = totalfp/N
91 self.v['aTfn'] = totalfn/N
92
93 # F-measure
94 self.P = 100.*float(totaltrue)/max(totaltrue + totalfp,1)
95 self.R = 100.*float(totaltrue)/max(totaltrue + totalfn,1)
96 #if self.R < 0: self.R = 0
97 self.F = 2.* self.P*self.R / max(float(self.P+self.R),1)
98 self.v['dist'] = self.F
99 self.v['prec'] = self.P
100 self.v['recl'] = self.R
101
102
103 """
104 Plot functions
105 """
106
107 def plotroc(self,d,plottitle=""):
108 import Gnuplot, Gnuplot.funcutils
109 gd = []
110 fp = []
111 for i in self.vlist:
112 gd.append(i['GD'])
113 fp.append(i['FP'])
114 d.append(Gnuplot.Data(fp, gd, with_='linespoints',
115 title="%s %s" % (plottitle,i['mode']) ))
116
117 def plotplotroc(self,d,outplot=0,extension='ps'):
118 import Gnuplot, Gnuplot.funcutils
119 from sys import exit
120 g = Gnuplot.Gnuplot(debug=0, persist=1)
121 if outplot:
122 if extension == 'ps': ext, extension = '.ps' , 'postscript'
123 elif extension == 'png': ext, extension = '.png', 'png'
124 elif extension == 'svg': ext, extension = '.svg', 'svg'
125 else: exit("ERR: unknown plot extension")
126 g('set terminal %s' % extension)
127 g('set output \'roc-%s%s\'' % (outplot,ext))
128 xmax = 30 #max(fp)
129 ymin = 50
130 g('set xrange [0:%f]' % xmax)
131 g('set yrange [%f:100]' % ymin)
132 # grid set
133 g('set grid')
134 g('set xtics 0,5,%f' % xmax)
135 g('set ytics %f,5,100' % ymin)
136 g('set key 27,65')
137 #g('set format \"%g\"')
138 g.title(basename(self.datadir))
139 g.xlabel('false positives (%)')
140 g.ylabel('correct detections (%)')
141 g.plot(*d)
142
143 def plotpr(self,d,plottitle=""):
144 import Gnuplot, Gnuplot.funcutils
145 x = []
146 y = []
147 for i in self.vlist:
148 x.append(i['prec'])
149 y.append(i['recl'])
150 d.append(Gnuplot.Data(x, y, with_='linespoints',
151 title="%s %s" % (plottitle,i['mode']) ))
152
153 def plotplotpr(self,d,outplot=0,extension='ps'):
154 import Gnuplot, Gnuplot.funcutils
155 from sys import exit
156 g = Gnuplot.Gnuplot(debug=0, persist=1)
157 if outplot:
158 if extension == 'ps': ext, extension = '.ps' , 'postscript'
159 elif extension == 'png': ext, extension = '.png', 'png'
160 elif extension == 'svg': ext, extension = '.svg', 'svg'
161 else: exit("ERR: unknown plot extension")
162 g('set terminal %s' % extension)
163 g('set output \'pr-%s%s\'' % (outplot,ext))
164 g.title(basename(self.datadir))
165 g.xlabel('Recall (%)')
166 g.ylabel('Precision (%)')
167 g.plot(*d)
168
169 def plotfmeas(self,d,plottitle=""):
170 import Gnuplot, Gnuplot.funcutils
171 x,y = [],[]
172 for i in self.vlist:
173 x.append(i['thres'])
174 y.append(i['dist'])
175 d.append(Gnuplot.Data(x, y, with_='linespoints',
176 title="%s %s" % (plottitle,i['mode']) ))
177
178 def plotplotfmeas(self,d,outplot="",extension='ps', title="F-measure"):
179 import Gnuplot, Gnuplot.funcutils
180 from sys import exit
181 g = Gnuplot.Gnuplot(debug=0, persist=1)
182 if outplot:
183 if extension == 'ps': terminal = 'postscript'
184 elif extension == 'png': terminal = 'png'
185 elif extension == 'svg': terminal = 'svg'
186 else: exit("ERR: unknown plot extension")
187 g('set terminal %s' % terminal)
188 g('set output \'fmeas-%s.%s\'' % (outplot,extension))
189 g.xlabel('threshold \\delta')
190 g.ylabel('F-measure (%)')
191 g('set xrange [0:1.2]')
192 g('set yrange [0:100]')
193 g.title(basename(self.datadir))
194 # grid set
195 #g('set grid')
196 #g('set xtics 0,5,%f' % xmax)
197 #g('set ytics %f,5,100' % ymin)
198 #g('set key 27,65')
199 #g('set format \"%g\"')
200 g.plot(*d)
201
202 def plotfmeasvar(self,d,var,plottitle=""):
203 import Gnuplot, Gnuplot.funcutils
204 x,y = [],[]
205 for i in self.vlist:
206 x.append(i[var])
207 y.append(i['dist'])
208 d.append(Gnuplot.Data(x, y, with_='linespoints',
209 title="%s %s" % (plottitle,i['mode']) ))
210
211 def plotplotfmeasvar(self,d,var,outplot="",extension='ps', title="F-measure"):
212 import Gnuplot, Gnuplot.funcutils
213 from sys import exit
214 g = Gnuplot.Gnuplot(debug=0, persist=1)
215 if outplot:
216 if extension == 'ps': terminal = 'postscript'
217 elif extension == 'png': terminal = 'png'
218 elif extension == 'svg': terminal = 'svg'
219 else: exit("ERR: unknown plot extension")
220 g('set terminal %s' % terminal)
221 g('set output \'fmeas-%s.%s\'' % (outplot,extension))
222 g.xlabel(var)
223 g.ylabel('F-measure (%)')
224 #g('set xrange [0:1.2]')
225 g('set yrange [0:100]')
226 g.title(basename(self.datadir))
227 g.plot(*d)
228
229 def plotdiffs(self,d,plottitle=""):
230 import Gnuplot, Gnuplot.funcutils
231 v = self.v
232 l = v['l']
233 mean = v['mean']
234 smean = v['smean']
235 amean = v['amean']
236 samean = v['samean']
237 val = []
238 per = [0] * 100
239 for i in range(0,100):
240 val.append(i*.001-.05)
241 for j in l:
242 if abs(j-val[i]) <= 0.001:
243 per[i] += 1
244 total = v['Torig']
245 for i in range(len(per)): per[i] /= total/100.
246
247 d.append(Gnuplot.Data(val, per, with_='fsteps',
248 title="%s %s" % (plottitle,v['mode']) ))
249 #d.append('mean=%f,sigma=%f,eps(x) title \"\"'% (mean,smean))
250 #d.append('mean=%f,sigma=%f,eps(x) title \"\"'% (amean,samean))
251
252
253 def plotplotdiffs(self,d,outplot=0,extension='ps'):
254 import Gnuplot, Gnuplot.funcutils
255 from sys import exit
256 g = Gnuplot.Gnuplot(debug=0, persist=1)
257 if outplot:
258 if extension == 'ps': ext, extension = '.ps' , 'postscript'
259 elif extension == 'png': ext, extension = '.png', 'png'
260 elif extension == 'svg': ext, extension = '.svg', 'svg'
261 else: exit("ERR: unknown plot extension")
262 g('set terminal %s' % extension)
263 g('set output \'diffhist-%s%s\'' % (outplot,ext))
264 g('eps(x) = 1./(sigma*(2.*3.14159)**.5) * exp ( - ( x - mean ) ** 2. / ( 2. * sigma ** 2. ))')
265 g.title(basename(self.datadir))
266 g.xlabel('delay to hand-labelled onset (s)')
267 g.ylabel('% number of correct detections / ms ')
268 g('set xrange [-0.05:0.05]')
269 g('set yrange [0:20]')
270 g.plot(*d)
271
272
273 def plothistcat(self,d,plottitle=""):
274 import Gnuplot, Gnuplot.funcutils
275 total = v['Torig']
276 for i in range(len(per)): per[i] /= total/100.
277
278 d.append(Gnuplot.Data(val, per, with_='fsteps',
279 title="%s %s" % (plottitle,v['mode']) ))
280 #d.append('mean=%f,sigma=%f,eps(x) title \"\"'% (mean,smean))
281 #d.append('mean=%f,sigma=%f,eps(x) title \"\"'% (amean,samean))
282
283
284 def plotplothistcat(self,d,outplot=0,extension='ps'):
285 import Gnuplot, Gnuplot.funcutils
286 from sys import exit
287 g = Gnuplot.Gnuplot(debug=0, persist=1)
288 if outplot:
289 if extension == 'ps': ext, extension = '.ps' , 'postscript'
290 elif extension == 'png': ext, extension = '.png', 'png'
291 elif extension == 'svg': ext, extension = '.svg', 'svg'
292 else: exit("ERR: unknown plot extension")
293 g('set terminal %s' % extension)
294 g('set output \'diffhist-%s%s\'' % (outplot,ext))
295 g('eps(x) = 1./(sigma*(2.*3.14159)**.5) * exp ( - ( x - mean ) ** 2. / ( 2. * sigma ** 2. ))')
296 g.title(basename(self.datadir))
297 g.xlabel('delay to hand-labelled onset (s)')
298 g.ylabel('% number of correct detections / ms ')
299 g('set xrange [-0.05:0.05]')
300 g('set yrange [0:20]')
301 g.plot(*d)
302
303
python.old/aubio/gnuplot.py+222−0
@@ -0,0 +1,222 @@
1"""Copyright (C) 2004 Paul Brossier <piem@altern.org>
2print aubio.__LICENSE__ for the terms of use
3"""
4
5__LICENSE__ = """\
6 Copyright (C) 2004-2009 Paul Brossier <piem@aubio.org>
7
8 This file is part of aubio.
9
10 aubio is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
14
15 aubio is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with aubio. If not, see <http://www.gnu.org/licenses/>.
22"""
23
24
25def audio_to_array(filename):
26 import aubio.aubioclass
27 from numpy import arange
28 hopsize = 2048
29 filei = aubio.aubioclass.sndfile(filename)
30 framestep = 1/(filei.samplerate()+0.)
31 channels = filei.channels()
32 myvec = aubio.aubioclass.fvec(hopsize,channels)
33 data = []
34 readsize = hopsize
35 while (readsize==hopsize):
36 readsize = filei.read(hopsize,myvec)
37 #for i in range(channels):
38 i = 0
39 curpos = 0
40 while (curpos < readsize):
41 data.append(myvec.get(curpos,i))
42 curpos+=1
43 time = arange(len(data))*framestep
44 return time,data
45
46def plot_audio(filenames, g, options):
47 todraw = len(filenames)
48 xorig = 0.
49 xratio = 1./todraw
50 g('set multiplot;')
51 while (len(filenames)):
52 time,data = audio_to_array(filenames.pop(0))
53 if todraw==1:
54 if max(time) < 1.:
55 time = [t*1000. for t in time]
56 g.xlabel('Time (ms)')
57 else:
58 g.xlabel('Time (s)')
59 g.ylabel('Amplitude')
60 curplot = make_audio_plot(time,data)
61 g('set size %f,%f;' % (options.xsize*xratio,options.ysize) )
62 g('set origin %f,0.;' % (xorig) )
63 g('set style data lines; \
64 set yrange [-1.:1.]; \
65 set xrange [0:%f]' % time[-1])
66 g.plot(curplot)
67 xorig += options.xsize*xratio
68 g('unset multiplot;')
69
70def audio_to_spec(filename,minf = 0, maxf = 0, lowthres = -20.,
71 bufsize= 8192, hopsize = 1024):
72 from aubioclass import fvec,cvec,pvoc,sndfile
73 from math import log10
74 filei = sndfile(filename)
75 srate = float(filei.samplerate())
76 framestep = hopsize/srate
77 freqstep = srate/bufsize
78 channels = filei.channels()
79 myvec = fvec(hopsize,channels)
80 myfft = cvec(bufsize,channels)
81 pv = pvoc(bufsize,hopsize,channels)
82 data,time,freq = [],[],[]
83
84 if maxf == 0.: maxf = bufsize/2
85 else: maxf = int(maxf/freqstep)
86 if minf: minf = int(minf/freqstep)
87 else: minf = 0
88
89 for f in range(minf,maxf):
90 freq.append(f*freqstep)
91 readsize = hopsize
92 frameread = 0
93 while (readsize==hopsize):
94 readsize = filei.read(hopsize,myvec)
95 pv.do(myvec,myfft)
96 frame = []
97 i = 0 #for i in range(channels):
98 curpos = minf
99 while (curpos < maxf):
100 frame.append(max(lowthres,20.*log10(myfft.get(curpos,i)**2+0.00001)))
101 curpos+=1
102 time.append(frameread*framestep)
103 data.append(frame)
104 frameread += 1
105 # crop data if unfinished frames
106 if len(data[-1]) != len(data[0]):
107 data = data[0:-2]
108 time = time[0:-2]
109 # verify size consistency
110 assert len(data) == len(time)
111 assert len(data[0]) == len(freq)
112 return data,time,freq
113
114def plot_spec(filename, g, options):
115 import Gnuplot
116 data,time,freq = audio_to_spec(filename,
117 minf=options.minf,maxf=options.maxf,
118 bufsize=options.bufsize,hopsize=options.hopsize)
119 xorig = 0.
120 if max(time) < 1.:
121 time = [t*1000. for t in time]
122 g.xlabel('Time (ms)')
123 else:
124 g.xlabel('Time (s)')
125 if options.xsize < 0.5 and not options.log and max(time) > 1.:
126 freq = [f/1000. for f in freq]
127 options.minf /= 1000.
128 options.maxf /= 1000.
129 g.ylabel('Frequency (kHz)')
130 else:
131 g.ylabel('Frequency (Hz)')
132 g('set pm3d map')
133 g('set palette rgbformulae -25,-24,-32')
134 g('set cbtics 20')
135 #g('set colorbox horizontal')
136 g('set xrange [0.:%f]' % time[-1])
137 if options.log:
138 g('set log y')
139 g('set yrange [%f:%f]' % (max(10,options.minf),options.maxf))
140 else:
141 g('set yrange [%f:%f]' % (options.minf,options.maxf))
142 g.splot(Gnuplot.GridData(data,time,freq, binary=1))
143 #xorig += 1./todraw
144
145def downsample_audio(time,data,maxpoints=10000):
146 """ resample audio data to last only maxpoints """
147 from numpy import array, resize
148 length = len(time)
149 downsample = length/maxpoints
150 if downsample == 0: downsample = 1
151 x = resize(array(time),length)[0:-1:downsample]
152 y = resize(array(data),length)[0:-1:downsample]
153 return x,y
154
155def make_audio_plot(time,data,maxpoints=10000):
156 """ create gnuplot plot from an audio file """
157 import Gnuplot, Gnuplot.funcutils
158 x,y = downsample_audio(time,data,maxpoints=maxpoints)
159 return Gnuplot.Data(x,y,with_='lines')
160
161def make_audio_envelope(time,data,maxpoints=10000):
162 """ create gnuplot plot from an audio file """
163 from numpy import array
164 import Gnuplot, Gnuplot.funcutils
165 bufsize = 500
166 x = [i.mean() for i in resize(array(time), (len(time)/bufsize,bufsize))]
167 y = [i.mean() for i in resize(array(data), (len(time)/bufsize,bufsize))]
168 x,y = downsample_audio(x,y,maxpoints=maxpoints)
169 return Gnuplot.Data(x,y,with_='lines')
170
171def gnuplot_addargs(parser):
172 """ add common gnuplot argument to OptParser object """
173 parser.add_option("-x","--xsize",
174 action="store", dest="xsize", default=1.,
175 type='float',help="define xsize for plot")
176 parser.add_option("-y","--ysize",
177 action="store", dest="ysize", default=1.,
178 type='float',help="define ysize for plot")
179 parser.add_option("--debug",
180 action="store_true", dest="debug", default=False,
181 help="use gnuplot debug mode")
182 parser.add_option("--persist",
183 action="store_false", dest="persist", default=True,
184 help="do not use gnuplot persistant mode")
185 parser.add_option("--lmargin",
186 action="store", dest="lmargin", default=None,
187 type='int',help="define left margin for plot")
188 parser.add_option("--rmargin",
189 action="store", dest="rmargin", default=None,
190 type='int',help="define right margin for plot")
191 parser.add_option("--bmargin",
192 action="store", dest="bmargin", default=None,
193 type='int',help="define bottom margin for plot")
194 parser.add_option("--tmargin",
195 action="store", dest="tmargin", default=None,
196 type='int',help="define top margin for plot")
197 parser.add_option("-O","--outplot",
198 action="store", dest="outplot", default=None,
199 help="save plot to output.{ps,png}")
200
201def gnuplot_create(outplot='',extension='', options=None):
202 import Gnuplot
203 if options:
204 g = Gnuplot.Gnuplot(debug=options.debug, persist=options.persist)
205 else:
206 g = Gnuplot.Gnuplot(persist=1)
207 if not extension or not outplot: return g
208 if extension == 'ps': ext, extension = '.ps' , 'postscript'
209 elif extension == 'eps': ext, extension = '.eps' , 'postscript enhanced'
210 elif extension == 'epsc': ext, extension = '.eps' , 'postscript enhanced color'
211 elif extension == 'png': ext, extension = '.png', 'png'
212 elif extension == 'svg': ext, extension = '.svg', 'svg'
213 else: exit("ERR: unknown plot extension")
214 g('set terminal %s' % extension)
215 if options and options.lmargin: g('set lmargin %i' % options.lmargin)
216 if options and options.rmargin: g('set rmargin %i' % options.rmargin)
217 if options and options.bmargin: g('set bmargin %i' % options.bmargin)
218 if options and options.tmargin: g('set tmargin %i' % options.tmargin)
219 if outplot != "stdout":
220 g('set output \'%s%s\'' % (outplot,ext))
221 if options: g('set size %f,%f' % (options.xsize, options.ysize))
222 return g
python.old/aubio/median.py+69−0
@@ -0,0 +1,69 @@
1"""Copyright (C) 2004 Paul Brossier <piem@altern.org>
2print aubio.__LICENSE__ for the terms of use
3"""
4
5__LICENSE__ = """\
6 Copyright (C) 2004-2009 Paul Brossier <piem@aubio.org>
7
8 This file is part of aubio.
9
10 aubio is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
14
15 aubio is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with aubio. If not, see <http://www.gnu.org/licenses/>.
22"""
23
24"""
25original author Tim Peters
26modified by Paul Brossier <piem@altern.org>
27inspired from http://www.ics.uci.edu/~eppstein/161/python/peters-selection.py
28"""
29
30def short_find(a, rank):
31 """ find the rank-th value in sorted a """
32 # copy to b before sorting
33 b = a[:]
34 b.sort()
35 return b[rank - 1]
36
37def percental(a, rank):
38 """ Find the rank'th-smallest value in a, in worst-case linear time. """
39 n = len(a)
40 assert 1 <= rank <= n
41 if n <= 7:
42 return short_find(a, rank)
43
44 ## Find median of median-of-7's.
45 ##medians = [short_find(a[i : i+7], 4) for i in xrange(0, n-6, 7)]
46 #median = find(medians, (len(medians) + 1) // 2)
47
48 # modified to Find median
49 median = short_find([a[0], a[-1], a[n//2]], 2)
50
51 # Partition around the median.
52 # a[:i] <= median
53 # a[j+1:] >= median
54 i, j = 0, n-1
55 while i <= j:
56 while a[i] < median:
57 i += 1
58 while a[j] > median:
59 j -= 1
60 if i <= j:
61 a[i], a[j] = a[j], a[i]
62 i += 1
63 j -= 1
64
65 if rank <= i:
66 return percental(a[:i], rank)
67 else:
68 return percental(a[i:], rank - i)
69
python.old/aubio/onsetcompare.py+143−0
@@ -0,0 +1,143 @@
1"""Copyright (C) 2004 Paul Brossier <piem@altern.org>
2print aubio.__LICENSE__ for the terms of use
3"""
4
5__LICENSE__ = """\
6 Copyright (C) 2004-2009 Paul Brossier <piem@aubio.org>
7
8 This file is part of aubio.
9
10 aubio is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
14
15 aubio is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with aubio. If not, see <http://www.gnu.org/licenses/>.
22"""
23
24""" this file contains routines to compare two lists of onsets or notes.
25it somewhat implements the Receiver Operating Statistic (ROC).
26see http://en.wikipedia.org/wiki/Receiver_operating_characteristic
27"""
28
29def onset_roc(ltru, lexp, eps):
30 """ compute differences between two lists
31 orig = hits + missed + merged
32 expc = hits + bad + doubled
33 returns orig, missed, merged, expc, bad, doubled
34 """
35 orig, expc = len(ltru), len(lexp)
36 # if lexp is empty
37 if expc == 0 : return orig,orig,0,0,0,0
38 missed, bad, doubled, merged = 0, 0, 0, 0
39 # find missed and doubled ones first
40 for x in ltru:
41 correspond = 0
42 for y in lexp:
43 if abs(x-y) <= eps: correspond += 1
44 if correspond == 0: missed += 1
45 elif correspond > 1: doubled += correspond - 1
46 # then look for bad and merged ones
47 for y in lexp:
48 correspond = 0
49 for x in ltru:
50 if abs(x-y) <= eps: correspond += 1
51 if correspond == 0: bad += 1
52 elif correspond > 1: merged += correspond - 1
53 # check consistancy of the results
54 assert ( orig - missed - merged == expc - bad - doubled)
55 return orig, missed, merged, expc, bad, doubled
56
57def onset_diffs(ltru, lexp, eps):
58 """ compute differences between two lists
59 orig = hits + missed + merged
60 expc = hits + bad + doubled
61 returns orig, missed, merged, expc, bad, doubled
62 """
63 orig, expc = len(ltru), len(lexp)
64 # if lexp is empty
65 l = []
66 if expc == 0 : return l
67 # find missed and doubled ones first
68 for x in ltru:
69 correspond = 0
70 for y in lexp:
71 if abs(x-y) <= eps: l.append(y-x)
72 # return list of diffs
73 return l
74
75def onset_rocloc(ltru, lexp, eps):
76 """ compute differences between two lists
77 orig = hits + missed + merged
78 expc = hits + bad + doubled
79 returns orig, missed, merged, expc, bad, doubled
80 """
81 orig, expc = len(ltru), len(lexp)
82 l = []
83 labs = []
84 mean = 0
85 # if lexp is empty
86 if expc == 0 : return orig,orig,0,0,0,0,l,mean
87 missed, bad, doubled, merged = 0, 0, 0, 0
88 # find missed and doubled ones first
89 for x in ltru:
90 correspond = 0
91 for y in lexp:
92 if abs(x-y) <= eps: correspond += 1
93 if correspond == 0: missed += 1
94 elif correspond > 1: doubled += correspond - 1
95 # then look for bad and merged ones
96 for y in lexp:
97 correspond = 0
98 for x in ltru:
99 if abs(x-y) <= eps:
100 correspond += 1
101 l.append(y-x)
102 labs.append(abs(y-x))
103 if correspond == 0: bad += 1
104 elif correspond > 1: merged += correspond - 1
105 # check consistancy of the results
106 assert ( orig - missed - merged == expc - bad - doubled)
107 return orig, missed, merged, expc, bad, doubled, l, labs
108
109def notes_roc (la, lb, eps):
110 from numpy import transpose, add, resize
111 """ creates a matrix of size len(la)*len(lb) then look for hit and miss
112 in it within eps tolerance windows """
113 gdn,fpw,fpg,fpa,fdo,fdp = 0,0,0,0,0,0
114 m = len(la)
115 n = len(lb)
116 x = resize(la[:][0],(n,m))
117 y = transpose(resize(lb[:][0],(m,n)))
118 teps = (abs(x-y) <= eps[0])
119 x = resize(la[:][1],(n,m))
120 y = transpose(resize(lb[:][1],(m,n)))
121 tpitc = (abs(x-y) <= eps[1])
122 res = teps * tpitc
123 res = add.reduce(res,axis=0)
124 for i in range(len(res)) :
125 if res[i] > 1:
126 gdn+=1
127 fdo+=res[i]-1
128 elif res [i] == 1:
129 gdn+=1
130 fpa = n - gdn - fpa
131 return gdn,fpw,fpg,fpa,fdo,fdp
132
133def load_onsets(filename) :
134 """ load onsets targets / candidates files in arrays """
135 l = [];
136
137 f = open(filename,'ro')
138 while 1:
139 line = f.readline().split()
140 if not line : break
141 l.append(float(line[0]))
142
143 return l
python.old/aubio/plot/__init__.py+0−0

Empty file added.

python.old/aubio/plot/keyboard.py+46−0
@@ -0,0 +1,46 @@
1
2def draw_keyboard(firstnote = 21, lastnote = 108, y0 = 0, y1 = 1):
3 import Gnuplot
4 octaves = 10
5
6 # build template of white notes
7 scalew = 12/7.
8 xw_temp = [i*scalew for i in range(0,7)]
9 # build template of black notes
10 scaleb = 6/7.
11 xb_temp = [i*scaleb for i in [1,3,7,9,11]]
12
13 xb,xw = [],[]
14 for octave in range(octaves-1):
15 for i in xb_temp:
16 curnote = i+12*octave
17 if curnote > firstnote-1 and curnote < lastnote+1:
18 xb = xb + [curnote]
19 for octave in range(octaves-1):
20 for i in xw_temp:
21 curnote = i+12*octave
22 if curnote > firstnote-1 and curnote < lastnote+1:
23 xw = xw + [curnote]
24
25 xwdelta = [1/2. * scalew for i in range(len(xw))]
26 yw = [y0+(y1-y0)*1/2. for i in range(len(xw))]
27 ywdelta = [(y1-y0)*1/2. for i in range(len(xw))]
28
29 xbdelta = [2/3. * scaleb for i in range(len(xb))]
30 yb = [y0+(y1-y0)*2/3. for i in range(len(xb))]
31 ybdelta = [(y1-y0)*1/3. for i in range(len(xb))]
32
33 whites = Gnuplot.Data(xw,yw,xwdelta,ywdelta,with_ = 'boxxyerrorbars')
34 blacks = Gnuplot.Data(xb,yb,xbdelta,ybdelta,with_ = 'boxxyerrorbars fill solid')
35
36 return blacks,whites
37
38if __name__ == '__main__':
39 from aubio.gnuplot import gnuplot_create
40 blacks,whites = draw_keyboard(firstnote = 21, lastnote = 108)
41 g = gnuplot_create('','')
42 #g('set style fill solid .5')
43 #g('set xrange [60-.5:72+.5]')
44 #g('set yrange [-0.1:1.1]')
45
46 g.plot(whites,blacks)
python.old/aubio/plot/notes.py+90−0
@@ -0,0 +1,90 @@
1__LICENSE__ = """\
2 Copyright (C) 2004-2009 Paul Brossier <piem@aubio.org>
3
4 This file is part of aubio.
5
6 aubio is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 aubio is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with aubio. If not, see <http://www.gnu.org/licenses/>.
18"""
19
20def plotnote(la,title=None) :
21 if la[0,:].size() == 3:
22 d = plotnote_withends(la, plot_title=title)
23 else:
24 # scale data if in freq (for REF.txt files)
25 if max(la[:,1] > 128 ):
26 print "scaling frequency data to midi range"
27 la[:,1] /= 6.875
28 la[:,1] = log(la[:,1])/0.6931
29 la[:,1] *= 12
30 la[:,1] -= 3
31 d = plotnote_withoutends(la, plot_title=title)
32 return d
33
34def plotnote_multi(lalist,title=None,fileout=None) :
35 d=list()
36 for i in range(len(lalist)):
37 d.append(plotnote(lalist[i], title=title))
38 return d
39
40
41def plotnote_withends(la,plot_title=None) :
42 from numpy import array
43 import Gnuplot, Gnuplot.funcutils
44 d=[]
45 x_widths = array(la[:,1]-la[:,0])/2.
46 d.append(Gnuplot.Data(
47 la[:,0]+x_widths, # x centers
48 la[:,2], # y centers
49 x_widths, # x errors
50 __notesheight*ones(len(la)), # y errors
51 title=plot_title,with_=('boxxyerrorbars fs 3')))
52 return d
53
54
55def plotnote_withoutends(la,plot_title=None) :
56 """ bug: fails drawing last note """
57 from numpy import array
58 import Gnuplot, Gnuplot.funcutils
59 d=[]
60 x_widths = array(la[1:,0]-la[:-1,0])/2;
61 d.append(Gnuplot.Data(
62 la[:-1,0]+x_widths, # x centers
63 la[:-1,1], # y centers
64 x_widths, # x errors
65 __notesheight*ones(len(la)-1), # y errors
66 title=plot_title,with_=('boxxyerrorbars fs 3')))
67 return d
68
69def plotnote_do(d,fileout=None):
70 import Gnuplot, Gnuplot.funcutils
71 g = Gnuplot.Gnuplot(debug=1, persist=1)
72 g.gnuplot('set style fill solid border 1; \
73 set size ratio 1/6; \
74 set boxwidth 0.9 relative; \
75 set mxtics 2.5; \
76 set mytics 2.5; \
77 set xtics 5; \
78 set ytics 1; \
79 set grid xtics ytics mxtics mytics')
80
81 g.xlabel('Time (s)')
82 g.ylabel('Midi pitch')
83 # do the plot
84 #g.gnuplot('set multiplot')
85 #for i in d:
86 g.plot(d[0])
87 #g.gnuplot('set nomultiplot')
88 if fileout != None:
89 g.hardcopy(fileout, enhanced=1, color=0)
90
python.old/aubio/task/__init__.py+9−0
@@ -0,0 +1,9 @@
1from aubio.aubioclass import *
2from aubio.task.task import task
3from aubio.task.params import taskparams
4from aubio.task.silence import tasksilence
5from aubio.task.onset import taskonset
6from aubio.task.beat import taskbeat
7from aubio.task.cut import taskcut
8from aubio.task.pitch import taskpitch
9from aubio.task.notes import tasknotes
python.old/aubio/task/beat.py+262−0
@@ -0,0 +1,262 @@
1from aubio.aubioclass import *
2from onset import taskonset
3
4class taskbeat(taskonset):
5 def __init__(self,input,params=None,output=None):
6 """ open the input file and initialize arguments
7 parameters should be set *before* calling this method.
8 """
9 taskonset.__init__(self,input,output=None,params=params)
10 self.btwinlen = 512**2/self.params.hopsize
11 self.btstep = self.btwinlen/4
12 self.btoutput = fvec(self.btstep,self.channels)
13 self.dfframe = fvec(self.btwinlen,self.channels)
14 self.bt = beattracking(self.btwinlen,self.channels)
15 self.pos2 = 0
16 self.old = -1000
17
18 def __call__(self):
19 taskonset.__call__(self)
20 #results = taskonset.__call__(self)
21 # write to current file
22 if self.pos2 == self.btstep - 1 :
23 self.bt.do(self.dfframe,self.btoutput)
24 for i in range (self.btwinlen - self.btstep):
25 self.dfframe.set(self.dfframe.get(i+self.btstep,0),i,0)
26 for i in range(self.btwinlen - self.btstep, self.btwinlen):
27 self.dfframe.set(0,i,0)
28 self.pos2 = -1;
29 self.pos2 += 1
30 val = self.opick.pp.getval()
31 #if not results: val = 0
32 #else: val = results[1]
33 self.dfframe.set(val,self.btwinlen - self.btstep + self.pos2,0)
34 i=0
35 for i in range(1,int( self.btoutput.get(0,0) ) ):
36 if self.pos2 == self.btoutput.get(i,0) and \
37 aubio_silence_detection(self.myvec(),
38 self.params.silence)!=1:
39 now = self.frameread-0
40 period = (60 * self.params.samplerate) / ((now - self.old) * self.params.hopsize)
41 self.old = now
42 return now,period
43
44 def eval(self,results,tol=0.20,tolcontext=0.25):
45 obeats = self.gettruth()
46 etime = [result[0] for result in results]
47 otime = [obeat[0] for obeat in obeats]
48 CML_tot, CML_max, CML_start, CML_end = 0,0,0,0
49 AML_tot, AML_max, AML_start, AML_end = 0,0,0,0
50 AMLd_tot, AMLd_max, AMLd_start, AMLd_end = 0,0,0,0
51 AMLh_tot, AMLh_max, AMLh_start, AMLh_end = 0,0,0,0
52 AMLo_tot, AMLo_max, AMLo_start, AMLo_end = 0,0,0,0
53 # results iteration
54 j = 1
55 # for each annotation
56 for i in range(2,len(otime)-2):
57 if j+1 >= len(etime): break
58 count = 0
59 # look for next matching beat
60 while otime[i] > etime[j] - (otime[i] - otime[i+1])*tol:
61 if count > 0:
62 #print "spurious etime"
63 if CML_end - CML_start > CML_max:
64 CML_max = CML_end - CML_start
65 CML_start, CML_end = j, j
66 if AMLh_end - AMLh_start > AMLh_max:
67 AMLh_max = AMLh_end - AMLh_start
68 AMLh_start, AMLh_end = j, j
69 if AMLd_end - AMLd_start > AMLd_max:
70 AMLd_max = AMLd_end - AMLd_start
71 AMLd_start, AMLd_end = j, j
72 if AMLo_end - AMLo_start > AMLo_max:
73 AMLo_max = AMLo_end - AMLo_start
74 AMLo_start, AMLo_end = j, j
75 j += 1
76 count += 1
77 if j+1 >= len(etime): break
78 #print otime[i-1],etime[j-1]," ",otime[i],etime[j]," ",otime[i+1],etime[j+1]
79 prevtempo = (otime[i] - otime[i-1])
80 nexttempo = (otime[i+1] - otime[i])
81
82 current0 = (etime[j] > otime[i] - prevtempo*tol)
83 current1 = (etime[j] < otime[i] + prevtempo*tol)
84
85 # check correct tempo
86 prev0 = (etime[j-1] > otime[i-1] - prevtempo*tolcontext)
87 prev1 = (etime[j-1] < otime[i-1] + prevtempo*tolcontext)
88 next0 = (etime[j+1] > otime[i+1] - nexttempo*tolcontext)
89 next1 = (etime[j+1] < otime[i+1] + nexttempo*tolcontext)
90
91 # check for off beat
92 prevoffb0 = (etime[j-1] > otime[i-1] - prevtempo/2 - prevtempo*tolcontext)
93 prevoffb1 = (etime[j-1] < otime[i-1] - prevtempo/2 + prevtempo*tolcontext)
94 nextoffb0 = (etime[j+1] > otime[i+1] - nexttempo/2 - nexttempo*tolcontext)
95 nextoffb1 = (etime[j+1] < otime[i+1] - nexttempo/2 + nexttempo*tolcontext)
96
97 # check half tempo
98 prevhalf0 = (etime[j-1] > otime[i-1] + prevtempo - prevtempo/2*tolcontext)
99 prevhalf1 = (etime[j-1] < otime[i-1] + prevtempo + prevtempo/2*tolcontext)
100 nexthalf0 = (etime[j+1] > otime[i+1] - nexttempo - nexttempo/2*tolcontext)
101 nexthalf1 = (etime[j+1] < otime[i+1] - nexttempo + nexttempo/2*tolcontext)
102
103 # check double tempo
104 prevdoub0 = (etime[j-1] > otime[i-1] - prevtempo - prevtempo*2*tolcontext)
105 prevdoub1 = (etime[j-1] < otime[i-1] - prevtempo + prevtempo*2*tolcontext)
106 nextdoub0 = (etime[j+1] > otime[i+1] + nexttempo - nexttempo*2*tolcontext)
107 nextdoub1 = (etime[j+1] < otime[i+1] + nexttempo + nexttempo*2*tolcontext)
108
109 if current0 and current1 and prev0 and prev1 and next0 and next1:
110 #print "YES!"
111 CML_end = j
112 CML_tot += 1
113 else:
114 if CML_end - CML_start > CML_max:
115 CML_max = CML_end - CML_start
116 CML_start, CML_end = j, j
117 if current0 and current1 and prevhalf0 and prevhalf1 and nexthalf0 and nexthalf1:
118 AMLh_end = j
119 AMLh_tot += 1
120 else:
121 if AMLh_end - AMLh_start > AMLh_max:
122 AMLh_max = AMLh_end - AMLh_start
123 AMLh_start, AMLh_end = j, j
124 if current0 and current1 and prevdoub0 and prevdoub1 and nextdoub0 and nextdoub1:
125 AMLd_end = j
126 AMLd_tot += 1
127 else:
128 if AMLd_end - AMLd_start > AMLd_max:
129 AMLd_max = AMLd_end - AMLd_start
130 AMLd_start, AMLd_end = j, j
131 if current0 and current1 and prevoffb0 and prevoffb1 and nextoffb0 and nextoffb1:
132 AMLo_end = j
133 AMLo_tot += 1
134 else:
135 if AMLo_end - AMLo_start > AMLo_max:
136 AMLo_max = AMLo_end - AMLo_start
137 AMLo_start, AMLo_end = j, j
138 # look for next matching beat
139 count = 0
140 while otime[i] > etime[j] - (otime[i] - otime[i+1])*tolcontext:
141 j += 1
142 if count > 0:
143 #print "spurious etime"
144 start = j
145 count += 1
146 total = float(len(otime))
147 CML_tot /= total
148 AMLh_tot /= total
149 AMLd_tot /= total
150 AMLo_tot /= total
151 CML_cont = CML_max/total
152 AMLh_cont = AMLh_max/total
153 AMLd_cont = AMLd_max/total
154 AMLo_cont = AMLo_max/total
155 return CML_cont, CML_tot, AMLh_cont, AMLh_tot, AMLd_cont, AMLd_tot, AMLo_cont, AMLo_tot
156
157# for i in allfreq:
158# freq.append(float(i) / 2. / N * samplerate )
159# while freq[i]>freqs[j]:
160# j += 1
161# a0 = weight[j-1]
162# a1 = weight[j]
163# f0 = freqs[j-1]
164# f1 = freqs[j]
165# if f0!=0:
166# iweight.append((a1-a0)/(f1-f0)*freq[i] + (a0 - (a1 - a0)/(f1/f0 -1.)))
167# else:
168# iweight.append((a1-a0)/(f1-f0)*freq[i] + a0)
169# while freq[i]>freqs[j]:
170# j += 1
171
172 def eval2(self,results,tol=0.2):
173 truth = self.gettruth()
174 obeats = [i[0] for i in truth]
175 ebeats = [i[0]*self.params.step for i in results]
176 NP = max(len(obeats), len(ebeats))
177 N = int(round(max(max(obeats), max(ebeats))*100.)+100)
178 W = int(round(tol*100.*60./median([i[1] for i in truth], len(truth)/2)))
179 ofunc = [0 for i in range(N+W)]
180 efunc = [0 for i in range(N+W)]
181 for i in obeats: ofunc[int(round(i*100.)+W)] = 1
182 for i in ebeats: efunc[int(round(i*100.)+W)] = 1
183 assert len(obeats) == sum(ofunc)
184 autocor = 0; m =0
185 for m in range (-W, W):
186 for i in range(W,N):
187 autocor += ofunc[i] * efunc[i-m]
188 autocor /= float(NP)
189 return autocor
190
191 def evaluation(self,results,tol=0.2,start=5.):
192
193 """ beat tracking evaluation function
194
195 computes P-score of experimental results (ebeats)
196 against ground truth annotations (obeats) """
197
198 from aubio.median import short_find as median
199 truth = self.gettruth()
200 ebeats = [i[0]*self.params.step for i in results]
201 obeats = [i[0] for i in truth]
202
203 # trim anything found before start
204 while obeats[0] < start: obeats.pop(0)
205 while ebeats[0] < start: ebeats.pop(0)
206 # maximum number of beats found
207 NP = max(len(obeats), len(ebeats))
208 # length of ofunc and efunc vector
209 N = int(round(max(max(obeats), max(ebeats))*100.)+100)
210 # compute W median of ground truth tempi
211 tempi = []
212 for i in range(1,len(obeats)): tempi.append(obeats[i]-obeats[i-1])
213 W = int(round(tol*100.*median(tempi,len(tempi)/2)))
214 # build ofunc and efunc functions, starting with W zeros
215 ofunc = [0 for i in range(N+W)]
216 efunc = [0 for i in range(N+W)]
217 for i in obeats: ofunc[int(round(i*100.)+W)] = 1
218 for i in ebeats: efunc[int(round(i*100.)+W)] = 1
219 # optional: make sure we didn't miss any beats
220 assert len(obeats) == sum(ofunc)
221 assert len(ebeats) == sum(efunc)
222 # compute auto correlation
223 autocor = 0; m =0
224 for m in range (-W, W):
225 for i in range(W,N):
226 autocor += ofunc[i] * efunc[i-m]
227 autocor /= float(NP)
228 return autocor
229
230 def gettruth(self):
231 import os.path
232 from aubio.txtfile import read_datafile
233 datafile = self.input.replace('.wav','.txt')
234 if not os.path.isfile(datafile):
235 print "no ground truth "
236 return False,False
237 else:
238 values = read_datafile(datafile,depth=0)
239 old = -1000
240 for i in range(len(values)):
241 now = values[i]
242 period = 60 / (now - old)
243 old = now
244 values[i] = [now,period]
245 return values
246
247
248 def plot(self,oplots,results):
249 import Gnuplot
250 oplots.append(Gnuplot.Data(results,with_='linespoints',title="auto"))
251
252 def plotplot(self,wplot,oplots,outplot=None,extension=None,xsize=1.,ysize=1.,spectro=False):
253 import Gnuplot
254 from aubio.gnuplot import gnuplot_create, audio_to_array, make_audio_plot
255 import re
256 # audio data
257 #time,data = audio_to_array(self.input)
258 #f = make_audio_plot(time,data)
259
260 g = gnuplot_create(outplot=outplot, extension=extension)
261 oplots = [Gnuplot.Data(self.gettruth(),with_='linespoints',title="orig")] + oplots
262 g.plot(*oplots)
python.old/aubio/task/cut.py+42−0
@@ -0,0 +1,42 @@
1from task import task
2from aubio.aubioclass import *
3
4class taskcut(task):
5 def __init__(self,input,slicetimes,params=None,output=None):
6 """ open the input file and initialize arguments
7 parameters should be set *before* calling this method.
8 """
9 from os.path import basename,splitext
10 task.__init__(self,input,output=None,params=params)
11 self.soundoutbase, self.soundoutext = splitext(basename(self.input))
12 self.newname = "%s%s%09.5f%s%s" % (self.soundoutbase,".",
13 self.frameread*self.params.step,".",self.soundoutext)
14 self.fileo = sndfile(self.newname,model=self.filei)
15 self.myvec = fvec(self.params.hopsize,self.channels)
16 self.mycopy = fvec(self.params.hopsize,self.channels)
17 self.slicetimes = slicetimes
18
19 def __call__(self):
20 task.__call__(self)
21 # write to current file
22 if len(self.slicetimes) and self.frameread >= self.slicetimes[0][0]:
23 self.slicetimes.pop(0)
24 # write up to 1st zero crossing
25 zerocross = 0
26 while ( abs( self.myvec.get(zerocross,0) ) > self.params.zerothres ):
27 zerocross += 1
28 writesize = self.fileo.write(zerocross,self.myvec)
29 fromcross = 0
30 while (zerocross < self.readsize):
31 for i in range(self.channels):
32 self.mycopy.set(self.myvec.get(zerocross,i),fromcross,i)
33 fromcross += 1
34 zerocross += 1
35 del self.fileo
36 self.fileo = sndfile("%s%s%09.5f%s%s" % (self.soundoutbase,".",
37 self.frameread*self.params.step,".",self.soundoutext),model=self.filei)
38 writesize = self.fileo.write(fromcross,self.mycopy)
39 else:
40 writesize = self.fileo.write(self.readsize,self.myvec)
41
42
python.old/aubio/task/notes.py+159−0
@@ -0,0 +1,159 @@
1
2from aubio.task import task
3from aubio.aubioclass import *
4
5class 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
python.old/aubio/task/onset.py+220−0
@@ -0,0 +1,220 @@
1from aubio.task.task import task
2from aubio.aubioclass import *
3
4class taskonset(task):
5 def __init__(self,input,output=None,params=None):
6 """ open the input file and initialize arguments
7 parameters should be set *before* calling this method.
8 """
9 task.__init__(self,input,params=params)
10 self.opick = onsetpick(self.params.bufsize,
11 self.params.hopsize,
12 self.myvec,
13 self.params.threshold,
14 mode=self.params.onsetmode,
15 dcthreshold=self.params.dcthreshold,
16 derivate=self.params.derivate)
17 self.olist = []
18 self.ofunc = []
19 self.maxofunc = 0
20 self.last = 0
21 if self.params.localmin:
22 self.ovalist = [0., 0., 0., 0., 0.]
23
24 def __call__(self):
25 task.__call__(self)
26 isonset,val = self.opick.do(self.myvec)
27 if (aubio_silence_detection(self.myvec(),self.params.silence)):
28 isonset=0
29 if self.params.storefunc:
30 self.ofunc.append(val)
31 if self.params.localmin:
32 if val > 0: self.ovalist.append(val)
33 else: self.ovalist.append(0)
34 self.ovalist.pop(0)
35 if (isonset > 0.):
36 if self.params.localmin:
37 # find local minima before peak
38 i=len(self.ovalist)-1
39 while self.ovalist[i-1] < self.ovalist[i] and i > 0:
40 i -= 1
41 now = (self.frameread+1-i)
42 else:
43 now = self.frameread
44 # take back delay
45 if self.params.delay != 0.: now -= self.params.delay
46 if now < 0 :
47 now = 0
48 if self.params.mintol:
49 # prune doubled
50 if (now - self.last) > self.params.mintol:
51 self.last = now
52 return now, val
53 else:
54 return now, val
55
56
57 def fprint(self,foo):
58 print self.params.step*foo[0]
59
60 def eval(self,inputdata,ftru,mode='roc',vmode=''):
61 from aubio.txtfile import read_datafile
62 from aubio.onsetcompare import onset_roc, onset_diffs, onset_rocloc
63 ltru = read_datafile(ftru,depth=0)
64 lres = []
65 for i in range(len(inputdata)): lres.append(inputdata[i][0]*self.params.step)
66 if vmode=='verbose':
67 print "Running with mode %s" % self.params.onsetmode,
68 print " and threshold %f" % self.params.threshold,
69 print " on file", self.input
70 #print ltru; print lres
71 if mode == 'local':
72 l = onset_diffs(ltru,lres,self.params.tol)
73 mean = 0
74 for i in l: mean += i
75 if len(l): mean = "%.3f" % (mean/len(l))
76 else: mean = "?0"
77 return l, mean
78 elif mode == 'roc':
79 self.orig, self.missed, self.merged, \
80 self.expc, self.bad, self.doubled = \
81 onset_roc(ltru,lres,self.params.tol)
82 elif mode == 'rocloc':
83 self.v = {}
84 self.v['orig'], self.v['missed'], self.v['Tm'], \
85 self.v['expc'], self.v['bad'], self.v['Td'], \
86 self.v['l'], self.v['labs'] = \
87 onset_rocloc(ltru,lres,self.params.tol)
88
89 def plot(self,onsets,ofunc,wplot,oplots,nplot=False):
90 import Gnuplot, Gnuplot.funcutils
91 import aubio.txtfile
92 import os.path
93 from numpy import arange, array, ones
94 from aubio.onsetcompare import onset_roc
95
96 x1,y1,y1p = [],[],[]
97 oplot = []
98 if self.params.onsetmode in ('mkl','kl'): ofunc[0:10] = [0] * 10
99
100 self.lenofunc = len(ofunc)
101 self.maxofunc = max(ofunc)
102 # onset detection function
103 downtime = arange(len(ofunc))*self.params.step
104 oplot.append(Gnuplot.Data(downtime,ofunc,with_='lines',title=self.params.onsetmode))
105
106 # detected onsets
107 if not nplot:
108 for i in onsets:
109 x1.append(i[0]*self.params.step)
110 y1.append(self.maxofunc)
111 y1p.append(-self.maxofunc)
112 #x1 = array(onsets)*self.params.step
113 #y1 = self.maxofunc*ones(len(onsets))
114 if x1:
115 oplot.append(Gnuplot.Data(x1,y1,with_='impulses'))
116 wplot.append(Gnuplot.Data(x1,y1p,with_='impulses'))
117
118 oplots.append((oplot,self.params.onsetmode,self.maxofunc))
119
120 # check if ground truth datafile exists
121 datafile = self.input.replace('.wav','.txt')
122 if datafile == self.input: datafile = ""
123 if not os.path.isfile(datafile):
124 self.title = "" #"(no ground truth)"
125 else:
126 t_onsets = aubio.txtfile.read_datafile(datafile)
127 x2 = array(t_onsets).resize(len(t_onsets))
128 y2 = self.maxofunc*ones(len(t_onsets))
129 wplot.append(Gnuplot.Data(x2,y2,with_='impulses'))
130
131 tol = 0.050
132
133 orig, missed, merged, expc, bad, doubled = \
134 onset_roc(x2,x1,tol)
135 self.title = "GD %2.3f%% FP %2.3f%%" % \
136 ((100*float(orig-missed-merged)/(orig)),
137 (100*float(bad+doubled)/(orig)))
138
139
140 def plotplot(self,wplot,oplots,outplot=None,extension=None,xsize=1.,ysize=1.,spectro=False):
141 from aubio.gnuplot import gnuplot_create, audio_to_array, make_audio_plot, audio_to_spec
142 import re
143 # prepare the plot
144 g = gnuplot_create(outplot=outplot, extension=extension)
145 g('set title \'%s\'' % (re.sub('.*/','',self.input)))
146 if spectro:
147 g('set size %f,%f' % (xsize,1.3*ysize) )
148 else:
149 g('set size %f,%f' % (xsize,ysize) )
150 g('set multiplot')
151
152 # hack to align left axis
153 g('set lmargin 3')
154 g('set rmargin 6')
155
156 if spectro:
157 import Gnuplot
158 minf = 50
159 maxf = 500
160 data,time,freq = audio_to_spec(self.input,minf=minf,maxf=maxf)
161 g('set size %f,%f' % (1.24*xsize , 0.34*ysize) )
162 g('set origin %f,%f' % (-0.12,0.65*ysize))
163 g('set xrange [0.:%f]' % time[-1])
164 g('set yrange [%f:%f]' % (minf,maxf))
165 g('set pm3d map')
166 g('unset colorbox')
167 g('set lmargin 0')
168 g('set rmargin 0')
169 g('set tmargin 0')
170 g('set palette rgbformulae -25,-24,-32')
171 g.xlabel('time (s)',offset=(0,1.))
172 g.ylabel('freq (Hz)')
173 g('set origin 0,%f' % (1.0*ysize) )
174 g('set format x "%1.1f"')
175 #if log:
176 # g('set yrange [%f:%f]' % (max(10,minf),maxf))
177 # g('set log y')
178 g.splot(Gnuplot.GridData(data,time,freq, binary=1, title=''))
179 else:
180 # plot waveform and onsets
181 time,data = audio_to_array(self.input)
182 wplot = [make_audio_plot(time,data)] + wplot
183 g('set origin 0,%f' % (0.7*ysize) )
184 g('set size %f,%f' % (xsize,0.3*ysize))
185 g('set format y "%1f"')
186 g('set xrange [0:%f]' % max(time))
187 g('set yrange [-1:1]')
188 g('set noytics')
189 g('set y2tics -1,1')
190 g.xlabel('time (s)',offset=(0,0.7))
191 g.ylabel('amplitude')
192 g.plot(*wplot)
193
194 # default settings for next plots
195 g('unset title')
196 g('set format x ""')
197 g('set format y "%3e"')
198 g('set tmargin 0')
199 g.xlabel('')
200
201 N = len(oplots)
202 y = 0.7*ysize # the vertical proportion of the plot taken by onset functions
203 delta = 0.035 # the constant part of y taken by last plot label and data
204 for i in range(N):
205 # plot onset detection functions
206 g('set size %f,%f' % ( xsize, (y-delta)/N))
207 g('set origin 0,%f' % ((N-i-1)*(y-delta)/N + delta ))
208 g('set nokey')
209 g('set xrange [0:%f]' % (self.lenofunc*self.params.step))
210 g('set yrange [0:%f]' % (1.1*oplots[i][2]))
211 g('set y2tics ("0" 0, "%d" %d)' % (round(oplots[i][2]),round(oplots[i][2])))
212 g.ylabel(oplots[i][1])
213 if i == N-1:
214 g('set size %f,%f' % ( xsize, (y-delta)/N + delta ) )
215 g('set origin 0,0')
216 g.xlabel('time (s)', offset=(0,0.7))
217 g('set format x')
218 g.plot(*oplots[i][0])
219
220 g('unset multiplot')
python.old/aubio/task/params.py+33−0
@@ -0,0 +1,33 @@
1
2class taskparams(object):
3 """ default parameters for task classes """
4 def __init__(self,input=None,output=None):
5 self.silence = -90
6 self.derivate = False
7 self.localmin = False
8 self.delay = 4.
9 self.storefunc = False
10 self.bufsize = 512
11 self.hopsize = 256
12 self.pbufsize = 2048
13 self.phopsize = 512
14 self.samplerate = 44100
15 self.tol = 0.05
16 self.mintol = 0.0
17 self.step = float(self.hopsize)/float(self.samplerate)
18 self.threshold = 0.1
19 self.onsetmode = 'dual'
20 self.pitchmode = 'yin'
21 # best threshold for yin monophonic Mirex04 (depth of f0)
22 self.yinthresh = 0.15
23 # best thresh for yinfft monophonic Mirex04 (tradeoff sil/gd)
24 # also best param for yinfft polyphonic Mirex04
25 self.yinfftthresh = 0.85
26 self.pitchsmooth = 0
27 self.pitchmin=20.
28 self.pitchmax=20000.
29 self.pitchdelay = -0.5
30 self.dcthreshold = -1.
31 self.omode = "freq"
32 self.verbose = False
33
python.old/aubio/task/pitch.py+234−0
@@ -0,0 +1,234 @@
1from aubio.task.task import task
2from aubio.task.silence import tasksilence
3from aubio.aubioclass import *
4
5class taskpitch(task):
6 def __init__(self,input,params=None):
7 task.__init__(self,input,params=params)
8 self.shortlist = [0. for i in range(self.params.pitchsmooth)]
9 if self.params.pitchmode == 'yin':
10 tolerance = self.params.yinthresh
11 elif self.params.pitchmode == 'yinfft':
12 tolerance = self.params.yinfftthresh
13 else:
14 tolerance = 0.
15 self.pitchdet = pitch(mode=self.params.pitchmode,
16 bufsize=self.params.bufsize,
17 hopsize=self.params.hopsize,
18 samplerate=self.srate,
19 omode=self.params.omode,
20 tolerance = tolerance)
21
22 def __call__(self):
23 from aubio.median import short_find
24 task.__call__(self)
25 if (aubio_silence_detection(self.myvec(),self.params.silence)==1):
26 freq = -1.
27 else:
28 freq = self.pitchdet(self.myvec)
29 minpitch = self.params.pitchmin
30 maxpitch = self.params.pitchmax
31 if maxpitch and freq > maxpitch :
32 freq = -1.
33 elif minpitch and freq < minpitch :
34 freq = -1.
35 if self.params.pitchsmooth:
36 self.shortlist.append(freq)
37 self.shortlist.pop(0)
38 smoothfreq = short_find(self.shortlist,
39 len(self.shortlist)/2)
40 return smoothfreq
41 else:
42 return freq
43
44 def compute_all(self):
45 """ Compute data """
46 mylist = []
47 while(self.readsize==self.params.hopsize):
48 freq = self()
49 mylist.append(freq)
50 if self.params.verbose:
51 self.fprint("%s\t%s" % (self.frameread*self.params.step,freq))
52 return mylist
53
54 def gettruth(self):
55 """ extract ground truth array in frequency """
56 import os.path
57 """ from wavfile.txt """
58 datafile = self.input.replace('.wav','.txt')
59 if datafile == self.input: datafile = ""
60 """ from file.<midinote>.wav """
61 # FIXME very weak check
62 floatpit = self.input.split('.')[-2]
63 if not os.path.isfile(datafile) and len(self.input.split('.')) < 3:
64 print "no ground truth "
65 return False,False
66 elif floatpit:
67 try:
68 self.truth = float(floatpit)
69 #print "ground truth found in filename:", self.truth
70 tasksil = tasksilence(self.input,params=self.params)
71 time,pitch =[],[]
72 while(tasksil.readsize==tasksil.params.hopsize):
73 tasksil()
74 time.append(tasksil.params.step*(tasksil.frameread))
75 if not tasksil.issilence:
76 pitch.append(self.truth)
77 else:
78 pitch.append(-1.)
79 return time,pitch
80 except ValueError:
81 # FIXME very weak check
82 if not os.path.isfile(datafile):
83 print "no ground truth found"
84 return 0,0
85 else:
86 from aubio.txtfile import read_datafile
87 values = read_datafile(datafile)
88 time, pitch = [], []
89 for i in range(len(values)):
90 time.append(values[i][0])
91 if values[i][1] == 0.0:
92 pitch.append(-1.)
93 else:
94 pitch.append(aubio_freqtomidi(values[i][1]))
95 return time,pitch
96
97 def oldeval(self,results):
98 def mmean(l):
99 return sum(l)/max(float(len(l)),1)
100
101 from aubio.median import percental
102 timet,pitcht = self.gettruth()
103 res = []
104 for i in results:
105 #print i,self.truth
106 if i <= 0: pass
107 else: res.append(self.truth-i)
108 if not res or len(res) < 3:
109 avg = self.truth; med = self.truth
110 else:
111 avg = mmean(res)
112 med = percental(res,len(res)/2)
113 return self.truth, self.truth-med, self.truth-avg
114
115 def eval(self,pitch,tol=0.5):
116 timet,pitcht = self.gettruth()
117 pitch = [aubio_freqtomidi(i) for i in pitch]
118 for i in range(len(pitch)):
119 if pitch[i] == "nan" or pitch[i] == -1:
120 pitch[i] = -1
121 time = [ (i+self.params.pitchdelay)*self.params.step for i in range(len(pitch)) ]
122 #print len(timet),len(pitcht)
123 #print len(time),len(pitch)
124 if len(timet) != len(time):
125 time = time[1:len(timet)+1]
126 pitch = pitch[1:len(pitcht)+1]
127 #pitcht = [aubio_freqtomidi(i) for i in pitcht]
128 for i in range(len(pitcht)):
129 if pitcht[i] == "nan" or pitcht[i] == "-inf" or pitcht[i] == -1:
130 pitcht[i] = -1
131 assert len(timet) == len(time)
132 assert len(pitcht) == len(pitch)
133 osil, esil, opit, epit, echr = 0, 0, 0, 0, 0
134 for i in range(len(pitcht)):
135 if pitcht[i] == -1: # currently silent
136 osil += 1 # count a silence
137 if pitch[i] <= 0. or pitch[i] == "nan":
138 esil += 1 # found a silence
139 else:
140 opit +=1
141 if abs(pitcht[i] - pitch[i]) < tol:
142 epit += 1
143 echr += 1
144 elif abs(pitcht[i] - pitch[i]) % 12. < tol:
145 echr += 1
146 #else:
147 # print timet[i], pitcht[i], time[i], pitch[i]
148 #print "origsilence", "foundsilence", "origpitch", "foundpitch", "orig pitchroma", "found pitchchroma"
149 #print 100.*esil/float(osil), 100.*epit/float(opit), 100.*echr/float(opit)
150 return osil, esil, opit, epit, echr
151
152 def plot(self,pitch,wplot,oplots,titles,outplot=None):
153 import Gnuplot
154
155 time = [ (i+self.params.pitchdelay)*self.params.step for i in range(len(pitch)) ]
156 pitch = [aubio_freqtomidi(i) for i in pitch]
157 oplots.append(Gnuplot.Data(time,pitch,with_='lines',
158 title=self.params.pitchmode))
159 titles.append(self.params.pitchmode)
160
161
162 def plotplot(self,wplot,oplots,titles,outplot=None,extension=None,xsize=1.,ysize=1.,multiplot = 1, midi = 1, truth = 1):
163 from aubio.gnuplot import gnuplot_create , audio_to_array, make_audio_plot
164 import re
165 import Gnuplot
166
167 # check if ground truth exists
168 if truth:
169 timet,pitcht = self.gettruth()
170 if timet and pitcht:
171 oplots = [Gnuplot.Data(timet,pitcht,with_='lines',
172 title='ground truth')] + oplots
173
174 g = gnuplot_create(outplot=outplot, extension=extension)
175 g('set title \'%s\'' % (re.sub('.*/','',self.input)))
176 g('set size %f,%f' % (xsize,ysize) )
177 g('set multiplot')
178 # hack to align left axis
179 g('set lmargin 4')
180 g('set rmargin 4')
181 # plot waveform
182 time,data = audio_to_array(self.input)
183 wplot = [make_audio_plot(time,data)]
184 g('set origin 0,%f' % (0.7*ysize) )
185 g('set size %f,%f' % (xsize,0.3*ysize))
186 #g('set format y "%1f"')
187 g('set xrange [0:%f]' % max(time))
188 g('set yrange [-1:1]')
189 g('set noytics')
190 g('set y2tics -1,1')
191 g.xlabel('time (s)',offset=(0,0.7))
192 g.ylabel('amplitude')
193 g.plot(*wplot)
194
195 # default settings for next plots
196 g('unset title')
197 g('set format x ""')
198 g('set format y "%3e"')
199 g('set tmargin 0')
200 g.xlabel('')
201 g('set noclip one')
202
203 if not midi:
204 g('set log y')
205 #g.xlabel('time (s)')
206 g.ylabel('f0 (Hz)')
207 g('set yrange [100:%f]' % self.params.pitchmax)
208 else:
209 g.ylabel('midi')
210 g('set yrange [%f:%f]' % (aubio_freqtomidi(self.params.pitchmin), aubio_freqtomidi(self.params.pitchmax)))
211 g('set y2tics %f,%f' % (round(aubio_freqtomidi(self.params.pitchmin)+.5),12))
212
213 if multiplot:
214 N = len(oplots)
215 y = 0.7*ysize # the vertical proportion of the plot taken by onset functions
216 delta = 0.035 # the constant part of y taken by last plot label and data
217 for i in range(N):
218 # plot pitch detection functions
219 g('set size %f,%f' % ( xsize, (y-delta)/N))
220 g('set origin 0,%f' % ((N-i-1)*(y-delta)/N + delta ))
221 g('set nokey')
222 g('set xrange [0:%f]' % max(time))
223 g.ylabel(titles[i])
224 if i == N-1:
225 g('set size %f,%f' % (xsize, (y-delta)/N + delta ) )
226 g('set origin 0,0')
227 g.xlabel('time (s)', offset=(0,0.7))
228 g('set format x')
229 g.plot(oplots[i])
230 else:
231 g('set key right top')
232 g.plot(*oplots)
233 g('unset multiplot')
234
python.old/aubio/task/silence.py+28−0
@@ -0,0 +1,28 @@
1from aubio.task.task import task
2from aubio.aubioclass import *
3
4class tasksilence(task):
5 wassilence = 1
6 issilence = 1
7 def __call__(self):
8 task.__call__(self)
9 if (aubio_silence_detection(self.myvec(),self.params.silence)==1):
10 if self.wassilence == 1: self.issilence = 1
11 else: self.issilence = 2
12 self.wassilence = 1
13 else:
14 if self.wassilence <= 0: self.issilence = 0
15 else: self.issilence = -1
16 self.wassilence = 0
17 if self.issilence == -1:
18 return max(self.frameread-self.params.delay,0.), -1
19 elif self.issilence == 2:
20 return max(self.frameread+self.params.delay,0.), 2
21
22 def fprint(self,foo):
23 print self.params.step*foo[0],
24 if foo[1] == 2: print "OFF"
25 else: print "ON"
26
27
28
python.old/aubio/task/task.py+53−0
@@ -0,0 +1,53 @@
1from aubio.aubioclass import *
2from params import taskparams
3
4class task(taskparams):
5 """ default template class to apply tasks on a stream """
6 def __init__(self,input,output=None,params=None):
7 """ open the input file and initialize default argument
8 parameters should be set *before* calling this method.
9 """
10 import time
11 self.tic = time.time()
12 if params == None: self.params = taskparams()
13 else: self.params = params
14 self.frameread = 0
15 self.readsize = self.params.hopsize
16 self.input = input
17 self.filei = sndfile(self.input)
18 self.srate = self.filei.samplerate()
19 self.params.step = float(self.params.hopsize)/float(self.srate)
20 self.myvec = fvec(self.params.hopsize)
21 self.output = output
22
23 def __call__(self):
24 self.readsize = self.filei.read(self.params.hopsize,self.myvec)
25 self.frameread += 1
26
27 def compute_all(self):
28 """ Compute data """
29 mylist = []
30 while(self.readsize==self.params.hopsize):
31 tmp = self()
32 if tmp:
33 mylist.append(tmp)
34 if self.params.verbose:
35 self.fprint(tmp)
36 return mylist
37
38 def fprint(self,foo):
39 print foo
40
41 def eval(self,results):
42 """ Eval data """
43 pass
44
45 def plot(self):
46 """ Plot data """
47 pass
48
49 def time(self):
50 import time
51 #print "CPU time is now %f seconds," % time.clock(),
52 #print "task execution took %f seconds" % (time.time() - self.tic)
53 return time.time() - self.tic
python.old/aubio/txtfile.py+47−0
@@ -0,0 +1,47 @@
1"""Copyright (C) 2004 Paul Brossier <piem@altern.org>
2print aubio.__LICENSE__ for the terms of use
3"""
4
5__LICENSE__ = """\
6 Copyright (C) 2004-2009 Paul Brossier <piem@aubio.org>
7
8 This file is part of aubio.
9
10 aubio is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
14
15 aubio is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with aubio. If not, see <http://www.gnu.org/licenses/>.
22"""
23
24def read_datafile(filename,depth=-1):
25 """read list data from a text file (columns of float)"""
26 if filename == '--' or filename == '-':
27 import sys
28 fres = sys.stdin
29 else:
30 fres = open(filename,'ro')
31 l = []
32 while 1:
33 tmp = fres.readline()
34 if not tmp : break
35 else: tmp = tmp.split()
36 if depth > 0:
37 for i in range(min(depth,len(tmp))):
38 tmp[i] = float(tmp[i])
39 l.append(tmp)
40 elif depth == 0:
41 l.append(float(tmp[0]))
42 else:
43 for i in range(len(tmp)):
44 tmp[i] = float(tmp[i])
45 l.append(tmp)
46 return l
47
python.old/aubio/web/__init__.py+0−0

Empty file added.

python.old/aubio/web/browser.py+167−0
@@ -0,0 +1,167 @@
1 #
2 # Copyright 2004 Apache Software Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License"); you
5 # may not use this file except in compliance with the License. You
6 # may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13 # implied. See the License for the specific language governing
14 # permissions and limitations under the License.
15 #
16 # Originally developed by Gregory Trubetskoy.
17 #
18 # $Id: publisher.py,v 1.36 2004/02/16 19:47:27 grisha Exp $
19
20"""
21 This handler is conceputally similar to Zope's ZPublisher, except
22 that it:
23
24 1. Is written specifically for mod_python and is therefore much faster
25 2. Does not require objects to have a documentation string
26 3. Passes all arguments as simply string
27 4. Does not try to match Python errors to HTTP errors
28 5. Does not give special meaning to '.' and '..'.
29
30 This is a modified version of mod_python.publisher.handler Only the first
31 directory argument is matched, the rest is left for path_info. A default
32 one must be provided.
33
34"""
35
36from mod_python import apache
37from mod_python import util
38from mod_python.publisher import resolve_object,process_auth,imp_suffixes
39
40import sys
41import os
42import re
43
44from types import *
45
46def configure_handler(req,default):
47
48 req.allow_methods(["GET", "POST"])
49 if req.method not in ["GET", "POST"]:
50 raise apache.SERVER_RETURN, apache.HTTP_METHOD_NOT_ALLOWED
51
52 func_path = ""
53 if req.path_info:
54 func_path = req.path_info[1:] # skip first /
55 #func_path = func_path.replace("/", ".")
56 #if func_path[-1:] == ".":
57 # func_path = func_path[:-1]
58 # changed: only keep the first directory
59 func_path = re.sub('/.*','',func_path)
60
61 # default to 'index' if no path_info was given
62 if not func_path:
63 func_path = "index"
64
65 # if any part of the path begins with "_", abort
66 if func_path[0] == '_' or func_path.count("._"):
67 raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
68
69 ## import the script
70 path, module_name = os.path.split(req.filename)
71 if not module_name:
72 module_name = "index"
73
74 # get rid of the suffix
75 # explanation: Suffixes that will get stripped off
76 # are those that were specified as an argument to the
77 # AddHandler directive. Everything else will be considered
78 # a package.module rather than module.suffix
79 exts = req.get_addhandler_exts()
80 if not exts:
81 # this is SetHandler, make an exception for Python suffixes
82 exts = imp_suffixes
83 if req.extension: # this exists if we're running in a | .ext handler
84 exts += req.extension[1:]
85 if exts:
86 suffixes = exts.strip().split()
87 exp = "\\." + "$|\\.".join(suffixes)
88 suff_matcher = re.compile(exp) # python caches these, so its fast
89 module_name = suff_matcher.sub("", module_name)
90
91 # import module (or reload if needed)
92 # the [path] argument tells import_module not to allow modules whose
93 # full path is not in [path] or below.
94 config = req.get_config()
95 autoreload=int(config.get("PythonAutoReload", 1))
96 log=int(config.get("PythonDebug", 0))
97 try:
98 module = apache.import_module(module_name,
99 autoreload=autoreload,
100 log=log,
101 path=[path])
102 except ImportError:
103 et, ev, etb = sys.exc_info()
104 # try again, using default module, perhaps this is a
105 # /directory/function (as opposed to /directory/module/function)
106 func_path = module_name
107 module_name = "index"
108 try:
109 module = apache.import_module(module_name,
110 autoreload=autoreload,
111 log=log,
112 path=[path])
113 except ImportError:
114 # raise the original exception
115 raise et, ev, etb
116
117 # does it have an __auth__?
118 realm, user, passwd = process_auth(req, module)
119
120 # resolve the object ('traverse')
121 try:
122 object = resolve_object(req, module, func_path, realm, user, passwd)
123 except AttributeError:
124 # changed, return the default path instead
125 #raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
126 object = default
127 # not callable, a class or an unbound method
128 if (not callable(object) or
129 type(object) is ClassType or
130 (hasattr(object, 'im_self') and not object.im_self)):
131
132 result = str(object)
133
134 else:
135 # callable, (but not a class or unbound method)
136
137 # process input, if any
138 req.form = util.FieldStorage(req, keep_blank_values=1)
139
140 result = util.apply_fs_data(object, req.form, req=req)
141
142 if result or req.bytes_sent > 0 or req.next:
143
144 if result is None:
145 result = ""
146 else:
147 result = str(result)
148
149 # unless content_type was manually set, we will attempt
150 # to guess it
151 if not req._content_type_set:
152 # make an attempt to guess content-type
153 if result[:100].strip()[:6].lower() == '<html>' \
154 or result.find('</') > 0:
155 req.content_type = 'text/html'
156 else:
157 req.content_type = 'text/plain'
158
159 if req.method != "HEAD":
160 req.write(result)
161 else:
162 req.write("")
163 return apache.OK
164 else:
165 req.log_error("mod_python.publisher: %s returned nothing." % `object`)
166 return apache.HTTP_INTERNAL_SERVER_ERROR
167
python.old/aubio/web/html.py+286−0
@@ -0,0 +1,286 @@
1from aubio.bench.node import *
2
3def parse_args(req):
4 req.basehref = BASEHREF
5 req.datadir = DATADIR
6 if req.path_info: path_info = req.path_info
7 else: path_info = '/'
8 location = re.sub('^/show_[a-z0-9]*/','',path_info)
9 location = re.sub('^/play_[a-z0-9]*/','',location)
10 location = re.sub('^/index/','',location)
11 location = re.sub('^/','',location)
12 location = re.sub('/$','',location)
13 datapath = "%s/%s" % (DATADIR,location)
14 respath = "%s/%s" % (DATADIR,location)
15 last = re.sub('/$','',location)
16 last = last.split('/')[-1]
17 first = path_info.split('/')[1]
18 # store some of this in the mp_request
19 req.location, req.datapath, req.respath = location, datapath, respath
20 req.first, req.last = first, last
21
22 if location:
23 if not (os.path.isfile(datapath) or
24 os.path.isdir(datapath) or
25 location in ['feedback','email']):
26 # the path was not understood
27 from mod_python import apache
28 req.write("<html> path not found %s</html>" % (datapath))
29 raise apache.SERVER_RETURN, apache.OK
30 #from mod_python import apache
31 #raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
32
33def navigation(req):
34 """ main html navigation header """
35 from mod_python import psp
36 req.content_type = "text/html"
37 parse_args(req)
38 datapath = req.datapath
39 location = req.location
40
41 # deal with session
42 if req.sess.is_new():
43 msg = "<b>Welcome %s</b><br>" % req.sess['login']
44 else:
45 msg = "<b>Welcome back %s</b><br>" % req.sess['login']
46
47 # start writing
48 tmpl = psp.PSP(req, filename='header.tmpl')
49 tmpl.run(vars = { 'title': "aubioweb / %s / %s" % (req.first,location),
50 'basehref': '/~piem/',
51 'message': msg,
52 'action': req.first})
53
54 req.write("<h2>Content of ")
55 print_link(req,"","/")
56 y = location.split('/')
57 for i in range(len(y)-1):
58 print_link(req,"/".join(y[:i+1]),y[i])
59 req.write(" / ")
60 req.write("%s</h2>\n" % y[-1])
61
62 a = {'show_info' : 'info',
63 'show_sound': 'waveform',
64 'show_onset': 'onset',
65 'index' : 'index',
66 'show_pitch': 'pitch',
67 'play_m3u': 'stream (m3u/ogg)',
68 'play_ogg': 'save (ogg)',
69 'play_wav': 'save (wav)',
70 }
71
72 # print task lists (only remaining tasks)
73 print_link(req,re.sub('%s.*'%req.last,'',location),"go up")
74 akeys = a.keys(); akeys.sort();
75 curkey = req.first
76 for akey in akeys:
77 if akey != curkey:
78 req.write(":: ")
79 print_link(req,"/".join((akey,location)),a[akey])
80 else:
81 req.write(":: ")
82 req.write("<b>%s</b>" % a[akey])
83 req.write("<br>")
84
85 # list the content of the directories
86 listdir,listfiles = [],[]
87 if os.path.isdir(datapath):
88 listfiles = list_snd_files(datapath)
89 listdir = list_dirs(datapath)
90 listdir.pop(0) # kick the current dir
91 elif os.path.isfile(datapath):
92 listfiles = [datapath]
93 listdir = [re.sub(req.last,'',location)]
94
95 link_list(req,listdir,title="Subdirectories")
96 link_list(req,listfiles,title="Files")
97
98def footer(req):
99 """ html navigation footer """
100 from mod_python import psp
101 tmpl = psp.PSP(req, filename='footer.tmpl')
102 tmpl.run(vars = { 'time': -req.mtime+req.request_time })
103
104def apply_on_data(req, func,**keywords):
105 # bug: hardcoded snd file filter
106 act_on_data(func,req.datapath,req.respath,
107 filter="f -maxdepth 1 -name '*.wav' -o -name '*.aif'",**keywords)
108
109def print_link(req,target,name,basehref=BASEHREF):
110 req.write("<a href='%s/%s'>%s</a>\n" % (basehref,target,name))
111
112def print_img(req,target,name='',basehref=BASEHREF):
113 if name == '': name = target
114 req.write("<img src='%s/%s' alt='%s' title='%s'>\n" % (basehref,target,name,name))
115
116def link_list(req,targetlist,basehref=BASEHREF,title=None):
117 if len(targetlist) > 1:
118 if title: req.write("<h3>%s</h3>"%title)
119 req.write('<ul>')
120 for i in targetlist:
121 s = re.split('%s/'%DATADIR,i,maxsplit=1)[1]
122 if s:
123 req.write('<li>')
124 print_link(req,s,s)
125 req.write('</li>')
126 req.write('</ul>')
127
128def print_list(req,list):
129 req.write("<pre>\n")
130 for i in list: req.write("%s\n" % i)
131 req.write("</pre>\n")
132
133def print_command(req,command):
134 req.write("<h4>%s</h4>\n" % re.sub('%%','%',command))
135 def print_runcommand(input,output):
136 cmd = re.sub('(%)?%i','%s' % input, command)
137 cmd = re.sub('(%)?%o','%s' % output, cmd)
138 print_list(req,runcommand(cmd))
139 apply_on_data(req,print_runcommand)
140
141def datapath_to_location(input):
142 location = re.sub(DATADIR,'',input)
143 return re.sub('^/*','',location)
144
145## drawing hacks
146def draw_func(req,func):
147 import re
148 req.content_type = "image/png"
149 # build location (strip the func_path, add DATADIR)
150 location = re.sub('^/draw_[a-z]*/','%s/'%DATADIR,req.path_info)
151 location = re.sub('.png$','',location)
152 if not os.path.isfile(location):
153 from mod_python import apache
154 raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
155 # replace location in func
156 cmd = re.sub('(%)?%i','%s' % location, func)
157 # add PYTHONPATH at the beginning,
158 cmd = "%s%s 2> /dev/null" % (PYTHONPATH,cmd)
159 for each in runcommand(cmd):
160 req.write("%s\n"%each)
161
162def show_task(req,task):
163 def show_task_file(input,output,task):
164 location = datapath_to_location(input)
165 print_img(req,"draw_%s/%s" % (task,location))
166 navigation(req)
167 req.write("<h3>%s</h3>\n" % task)
168 apply_on_data(req,show_task_file,task=task)
169 footer(req)
170
171## waveform_foo
172def draw_sound(req):
173 draw_func(req,"aubioplot-audio %%i stdout 2> /dev/null")
174
175def show_sound(req):
176 show_task(req,"sound")
177
178## pitch foo
179def draw_pitch(req,threshold='0.3'):
180 draw_func(req,"aubiopitch -i %%i -p -m schmitt,yin,fcomb,mcomb -t %s -O stdout" % threshold)
181
182def show_pitch(req):
183 show_task(req,"pitch")
184
185## onset foo
186def draw_onset(req,threshold='0.3'):
187 draw_func(req,"aubiocut -i %%i -p -m complex -t %s -O stdout" % threshold)
188
189def show_onset(req,threshold='0.3',details=''):
190 def onset_file(input,output):
191 location = datapath_to_location(input)
192 print_img(req,"draw_onset/%s?threshold=%s"%(location,threshold))
193 print_link(req,"?threshold=%s" % (float(threshold)-0.1),"-")
194 req.write("%s\n" % threshold)
195 print_link(req,"?threshold=%s" % (float(threshold)+0.1),"+")
196 # bug: hardcoded sndfile extension
197 anote = re.sub('\.wav$','.txt',input)
198 if anote == input: anote = ""
199 res = get_extract(input,threshold)
200 if os.path.isfile(anote):
201 tru = get_anote(anote)
202 print_list(req,get_results(tru,res,0.05))
203 else:
204 req.write("no ground truth found<br>\n")
205 if details:
206 req.write("<h4>Extraction</h4>\n")
207 print_list(req,res)
208 else:
209 req.write("<a href='%s/show_onset/%s?details=yes&amp;threshold=%s'>details</a><br>\n" %
210 (req.basehref,location,threshold))
211 if details and os.path.isfile(anote):
212 req.write("<h4>Computed differences</h4>\n")
213 ldiffs = get_diffs(tru,res,0.05)
214 print_list(req,ldiffs)
215 req.write("<h4>Annotations</h4>\n")
216 print_list(req,tru)
217 navigation(req)
218 req.write("<h3>Onset</h3>\n")
219 apply_on_data(req,onset_file)
220 footer(req)
221
222def get_anote(anote):
223 import aubio.onsetcompare
224 # FIXME: should import with txtfile.read_datafile
225 return aubio.onsetcompare.load_onsets(anote)
226
227def get_diffs(anote,extract,tol):
228 import aubio.onsetcompare
229 return aubio.onsetcompare.onset_diffs(anote,extract,tol)
230
231def get_extract(datapath,threshold='0.3'):
232 cmd = "%saubiocut -v -m complex -t %s -i %s" % (PYTHONPATH,threshold,datapath)
233 lo = runcommand(cmd)
234 for i in range(len(lo)): lo[i] = float(lo[i])
235 return lo
236
237def get_results(anote,extract,tol):
238 import aubio.onsetcompare
239 orig, missed, merged, expc, bad, doubled = aubio.onsetcompare.onset_roc(anote,extract,tol)
240 s =("GD %2.8f\t" % (100*float(orig-missed-merged)/(orig)),
241 "FP %2.8f\t" % (100*float(bad+doubled)/(orig)) ,
242 "GD-merged %2.8f\t" % (100*float(orig-missed)/(orig)) ,
243 "FP-pruned %2.8f\t" % (100*float(bad)/(orig)) )
244 return s
245
246# play m3u foo
247def play_m3u(req):
248 def show_task_file(input,output,task):
249 location = datapath_to_location(input)
250 req.write("http://%s%s/play_ogg/%s\n" % (HOSTNAME,BASEHREF,re.sub("play_m3u",task,location)))
251 req.content_type = "audio/mpegurl"
252 parse_args(req)
253 apply_on_data(req,show_task_file,task="play_ogg")
254
255# play wav foo
256def play_wav(req):
257 req.content_type = "audio/x-wav"
258 func = "cat %%i"
259 # build location (strip the func_path, add DATADIR)
260 location = re.sub('^/play_wav/','%s/'%DATADIR,req.path_info)
261 if not os.path.isfile(location):
262 from mod_python import apache
263 raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
264 # replace location in func
265 cmd = re.sub('(%)?%i','%s' % location, func)
266 # add PYTHONPATH at the beginning,
267 cmd = "%s 2> /dev/null" % cmd
268 for each in runcommand(cmd):
269 req.write("%s\n"%each)
270
271# play ogg foo
272def play_ogg(req):
273 req.content_type = "application/ogg"
274 func = "oggenc -o - %%i"
275 # build location (strip the func_path, add DATADIR)
276 location = re.sub('^/play_ogg/','%s/'%DATADIR,req.path_info)
277 location = re.sub('.ogg$','',location)
278 if not os.path.isfile(location):
279 from mod_python import apache
280 raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
281 # replace location in func
282 cmd = re.sub('(%)?%i','%s' % location, func)
283 # add PYTHONPATH at the beginning,
284 cmd = "%s 2> /dev/null" % cmd
285 for each in runcommand(cmd):
286 req.write("%s\n"%each)
python.old/aubio/wscript_build+17−0
@@ -0,0 +1,17 @@
1# vim:set syntax=python:
2
3pyaubio = ctx.new_task_gen(name = 'python-aubio',
4 features = 'c cshlib pyext',
5 source = '../../swig/aubio.i',
6 add_objects = 'sndfileio',
7 target = '_aubiowrapper',
8 use = ['aubio'],
9 uselib = ['SNDFILE'],
10 swig_flags = '-python -Wall',
11 includes = '. ../../src ../../examples')
12pyaubio.install_path = '${PYTHONDIR}/${PACKAGE}'
13
14# install python files
15ctx.install_files('${PYTHONDIR}/${PACKAGE}/', ctx.path.ant_glob('**/*.py'))
16# install swig generated python file
17ctx.install_files('${PYTHONDIR}/${PACKAGE}/', '../../swig/aubiowrapper.py')
python.old/aubiocompare-onset+114−0
@@ -0,0 +1,114 @@
1#! /usr/bin/python
2
3"""Copyright (C) 2004 Paul Brossier <piem@altern.org>
4
5print aubio.__LICENSE__ for the terms of use
6
7or see LICENSE.txt in the aubio installation directory.
8"""
9__LICENSE__ = """\
10 Copyright (C) 2004-2009 Paul Brossier <piem@aubio.org>
11
12 This file is part of aubio.
13
14 aubio is free software: you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 aubio is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with aubio. If not, see <http://www.gnu.org/licenses/>.
26"""
27
28
29__HELP__ = """\
30# required arguments
31 -c targetfilename
32 -o detectfilename
33(both must be text files with 1 time a line expressed in seconds)
34
35# optional arguments
36 -D <delay> delay in seconds
37 -v verbose mode
38 -d debug mode
39
40# output
41results:number of correct detections
42 number of incorrect detections
43 number of doubled detections
44 number of total detections
45 number of total targets
46
47# example:
48$ aubioonset-comp -c checked-onsets.txt -o handlab-onsets.txt -v
49( gd fp dd ) tot / real
50( 5 4 0 ) 9 / 9
5155.5555555556 %GD 44.4444444444 %FP 0.0 %OD
52
53# bugs
54does not scale to very long lists
55"""
56
57import sys
58from aubio.onsetcompare import onset_roc, onset_diffs
59from aubio.txtfile import read_datafile
60
61# default values
62fileo=None;filec=None;vmode=None;dmode=None;delay=0.
63# default tolerance is 50 ms
64#tol = 0.050
65tol = 0.048
66# default mode is onset
67mode = 'onset'
68
69while len(sys.argv) >=2:
70 option = sys.argv[1]; del sys.argv[1]
71 if option == '-h': print __HELP__; sys.exit()
72 if option == '-o': fileo = sys.argv[1]; del sys.argv[1]
73 if option == '-c': filec = sys.argv[1]; del sys.argv[1]
74 if option == '-v': vmode = 'verbose'
75 if option == '-d': dmode = 'debug'
76 if option == '-D': delay = float(sys.argv[1]); del sys.argv[1]
77 if option == '-tol': tol = float(sys.argv[1]); del sys.argv[1]
78 if option == '-l': mode = 'localisation'
79
80# arguments required
81if (not fileo) or (not filec):
82 print 'wrong set of arguments. use \'-h\' for help'
83 sys.exit('error: needs at least \'-c targets.txt -o detected.txt\'')
84
85# load files
86ltru, lres = read_datafile(fileo,depth=0),read_datafile(filec,depth=0)
87
88# delay onsets as required with -D
89if delay:
90 for i in range(len(lres)):
91 lres[i] = lres[i] + delay
92# compute errors types
93if mode == 'localisation':
94 l = onset_diffs(ltru,lres,tol)
95 for i in l: print "%.3f" % i
96else:
97 orig, missed, merged, expc, bad, doubled = onset_roc(ltru,lres,tol)
98
99 # print results
100 #print "orig, missed, merged, expc, bad, doubled:"
101 if vmode=='verbose':
102 print "orig", orig
103 print "expc", expc
104 print "missed",missed
105 print "merged", merged
106 print "bad", bad
107 print "doubled", doubled
108 print "correct", orig-missed-merged
109 print "GD %2.8f\t" % (100*float(orig-missed-merged)/(orig)),
110 print "FP %2.8f\t" % (100*float(bad+doubled)/(orig)) ,
111 print "GD-merged %2.8f\t" % (100*float(orig-missed)/(orig)) ,
112 print "FP-pruned %2.8f\t" % (100*float(bad)/(orig))
113 else:
114 print orig, missed, merged, expc, bad, doubled
python.old/aubiocut+156−0
@@ -0,0 +1,156 @@
1#! /usr/bin/python
2
3""" this file was written by Paul Brossier
4 it is released under the GNU/GPL license.
5"""
6
7import sys
8from aubio.task import *
9
10usage = "usage: %s [options] -i soundfile" % sys.argv[0]
11
12def parse_args():
13 from optparse import OptionParser
14 parser = OptionParser(usage=usage)
15 parser.add_option("-i","--input",
16 action="store", dest="filename",
17 help="input sound file")
18 parser.add_option("-m","--mode",
19 action="store", dest="mode", default='dual',
20 help="onset detection mode [default=dual] \
21 complexdomain|hfc|phase|specdiff|energy|kl|mkl|dual")
22 parser.add_option("-B","--bufsize",
23 action="store", dest="bufsize", default=512,
24 help="buffer size [default=512]")
25 parser.add_option("-H","--hopsize",
26 action="store", dest="hopsize", default=256,
27 help="overlap size [default=256]")
28 parser.add_option("-t","--threshold",
29 action="store", dest="threshold", default=0.3,
30 help="onset peak picking threshold [default=0.3]")
31 parser.add_option("-C","--dcthreshold",
32 action="store", dest="dcthreshold", default=1.,
33 help="onset peak picking DC component [default=1.]")
34 parser.add_option("-s","--silence",
35 action="store", dest="silence", default=-70,
36 help="silence threshold [default=-70]")
37 parser.add_option("-M","--mintol",
38 action="store", dest="mintol", default=0.048,
39 help="minimum inter onset interval [default=0.048]")
40 parser.add_option("-D","--delay",
41 action="store", dest="delay",
42 help="number of seconds to take back [default=system]\
43 default system delay is 3*hopsize/samplerate")
44 parser.add_option("-L","--localmin",
45 action="store_true", dest="localmin", default=False,
46 help="use local minima after peak detection")
47 parser.add_option("-c","--cut",
48 action="store_true", dest="cut", default=False,
49 help="cut input sound file at detected labels \
50 best used with option -L")
51 parser.add_option("-d","--derivate",
52 action="store_true", dest="derivate", default=False,
53 help="derivate onset detection function")
54 parser.add_option("-S","--silencecut",
55 action="store_true", dest="silencecut", default=False,
56 help="outputs silence locations")
57 parser.add_option("-z","--zerocross",
58 action="store", dest="zerothres", default=0.008,
59 help="zero-crossing threshold for slicing [default=0.00008]")
60 # plotting functions
61 parser.add_option("-p","--plot",
62 action="store_true", dest="plot", default=False,
63 help="draw plot")
64 parser.add_option("-x","--xsize",
65 action="store", dest="xsize", default=1.,
66 type='float', help="define xsize for plot")
67 parser.add_option("-y","--ysize",
68 action="store", dest="ysize", default=1.,
69 type='float', help="define ysize for plot")
70 parser.add_option("-f","--function",
71 action="store_true", dest="func", default=False,
72 help="print detection function")
73 parser.add_option("-n","--no-onsets",
74 action="store_true", dest="nplot", default=False,
75 help="do not plot detected onsets")
76 parser.add_option("-O","--outplot",
77 action="store", dest="outplot", default=None,
78 help="save plot to output.{ps,png}")
79 parser.add_option("-F","--spectrogram",
80 action="store_true", dest="spectro", default=False,
81 help="add spectrogram to the plot")
82 parser.add_option("-v","--verbose",
83 action="store_true", dest="verbose", default=True,
84 help="make lots of noise [default]")
85 parser.add_option("-q","--quiet",
86 action="store_false", dest="verbose", default=True,
87 help="be quiet")
88 # to be implemented
89 parser.add_option("-b","--beat",
90 action="store_true", dest="beat", default=False,
91 help="output beat locations")
92 (options, args) = parser.parse_args()
93 if not options.filename:
94 print "no file name given\n", usage
95 sys.exit(1)
96 return options, args
97
98options, args = parse_args()
99
100filename = options.filename
101params = taskparams()
102params.hopsize = int(options.hopsize)
103params.bufsize = int(options.bufsize)
104params.threshold = float(options.threshold)
105params.dcthreshold = float(options.dcthreshold)
106params.zerothres = float(options.zerothres)
107params.silence = float(options.silence)
108params.mintol = float(options.mintol)
109params.verbose = options.verbose
110# default take back system delay
111if options.delay: params.delay = int(float(options.delay)/params.step)
112
113dotask = taskonset
114if options.beat:
115 dotask = taskbeat
116elif options.silencecut:
117 dotask = tasksilence
118elif options.plot or options.func:
119 params.storefunc=True
120else:
121 params.storefunc=False
122
123lonsets, lofunc = [], []
124wplot,oplots = [],[]
125modes = options.mode.split(',')
126for i in range(len(modes)):
127 params.onsetmode = modes[i]
128 filetask = dotask(filename,params=params)
129 onsets = filetask.compute_all()
130
131 #lonsets.append(onsets)
132 if not options.silencecut:
133 ofunc = filetask.ofunc
134 lofunc.append(ofunc)
135
136 if options.plot:
137 if options.beat:
138 filetask.plot(oplots, onsets)
139 else:
140 filetask.plot(onsets, ofunc, wplot, oplots, nplot=options.nplot)
141
142 if options.func:
143 for i in ofunc:
144 print i
145
146if options.outplot:
147 extension = options.outplot.split('.')[-1]
148 outplot = '.'.join(options.outplot.split('.')[:-1])
149else:
150 extension,outplot = None,None
151if options.plot: filetask.plotplot(wplot, oplots, outplot=outplot, extension=extension,
152 xsize=options.xsize,ysize=options.ysize,spectro=options.spectro)
153
154if options.cut:
155 a = taskcut(filename,onsets,params=params)
156 a.compute_all()
python.old/aubiodiffs-onset+86−0
@@ -0,0 +1,86 @@
1#! /usr/bin/python
2
3__LICENSE__ = """\
4 Copyright (C) 2004-2009 Paul Brossier <piem@aubio.org>
5
6 This file is part of aubio.
7
8 aubio is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 aubio is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with aubio. If not, see <http://www.gnu.org/licenses/>.
20"""
21
22__HELP__ = """\
23# required arguments
24 -c targetfilename
25 -o detectfilename
26(both must be text files with 1 time a line expressed in seconds)
27
28# optional arguments
29 -D <delay> delay in seconds
30 -v verbose mode
31 -d debug mode
32
33# output
34results:number of correct detections
35 number of incorrect detections
36 number of doubled detections
37 number of total detections
38 number of total targets
39
40# example:
41$ aubioonset-comp -c checked-onsets.txt -o handlab-onsets.txt -v
42( gd fp dd ) tot / real
43( 5 4 0 ) 9 / 9
4455.5555555556 %GD 44.4444444444 %FP 0.0 %OD
45
46# bugs
47does not scale to very long lists
48"""
49
50import sys
51from aubio.onsetcompare import onset_diffs
52from aubio.txtfile import read_datafile
53
54# default values
55fileo=None;filec=None;vmode=None;dmode=None;delay=0.
56# default tolerance is 50 ms
57#tol = 0.050
58tol = 0.048
59
60while len(sys.argv) >=2:
61 option = sys.argv[1]; del sys.argv[1]
62 if option == '-h': print __HELP__; sys.exit()
63 if option == '-o': fileo = sys.argv[1]; del sys.argv[1]
64 if option == '-c': filec = sys.argv[1]; del sys.argv[1]
65 if option == '-v': vmode = 'verbose'
66 if option == '-d': dmode = 'debug'
67 if option == '-D': delay = float(sys.argv[1]); del sys.argv[1]
68 if option == '-tol': tol = float(sys.argv[1]); del sys.argv[1]
69
70# arguments required
71if (not fileo) or (not filec):
72 print 'wrong set of arguments. use \'-h\' for help'
73 sys.exit('error: needs at least \'-c targets.txt -o detected.txt\'')
74
75# load files
76ltru, lres = read_datafile(fileo,depth=0),read_datafile(filec,depth=0)
77
78# delay onsets as required with -D
79if delay:
80 for i in range(len(lres)):
81 lres[i] = lres[i] + delay
82# compute errors types
83l = onset_diffs(ltru,lres,tol)
84# print with 1ms precision
85for i in l: print "%.3f" % float(i)
86
python.old/aubiofilter-notes+94−0
@@ -0,0 +1,94 @@
1#!/usr/bin/python
2
3""" this file is used to get filter the (old) output format of aubionotes """
4
5# default parameters
6__eps = [0.250,0.50] # minimum length, pitch tolerance (ms,midipitch)
7__plot = 0 # -P (command line switch)
8__delay = 0.0 # -D <value> (fixed delay for score alignement)
9__winlength = 10 # -w <value> (window length for pitch estimation in frames)
10
11import getopt
12import sys
13
14def parse_args (sysargs):
15 from getopt import gnu_getopt
16 shortopts ='i:o:t:p:w:D:P:'
17 longopts =('input=','output=','tolpitch=','toltime=','winlength=','delay','plot=')
18 args,tmp = gnu_getopt(sysargs,shortopts,longopts)
19 assert len(args) > 1
20 plot = __plot
21 delay = __delay
22 eps = __eps
23 winlength = __winlength
24 plot = __plot
25 fileout = '/tmp/testprint.ps'
26 args.sort()
27 for i in range(len(args)): # a bad way
28 if args[i][0] == '-i' or args[i][0] == '--input':
29 fileorg = args[i][1]
30 if args[i][0] == '-o' or args[i][0] == '--output':
31 fileerr = args[i][1]
32 if args[i][0] == '-t' or args[i][0] == '--toltime':
33 eps[0] = float(args[i][1])
34 if args[i][0] == '-p' or args[i][0] == '--tolpitch':
35 eps[1] = float(args[i][1])
36 if args[i][0] == '-D' or args[i][0] == '--delay':
37 delay = float(args[i][1])
38 if args[i][0] == '-w' or args[i][0] == '--winlength':
39 winlength = int(args[i][1])
40 if args[i][0] == '-P' or args[i][0] == '--plot':
41 plot = 1
42 fileout = args[i][1]
43 return fileorg,fileerr,eps,winlength,plot,delay,fileout
44
45def usage():
46 print __file__, "with at least some arguments"
47
48def main():
49 try:
50 opts,args = getopt.getopt(sys.argv[1:],
51 "hvo:i:p:P",
52 ["help", "output=", "verbose", "input=", "plot="])
53 except getopt.GetoptError:
54 usage()
55 sys.exit(2)
56
57 input = None
58 output = None
59 verbose = False
60 winlength = __winlength
61 plot = __plot
62 eps = __eps
63
64 for o, a in opts:
65 if o in ("-v", "--verbose"):
66 verbose = True
67 if o in ("-h", "--help"):
68 usage()
69 sys.exit(2)
70 if o in ("--output"):
71 output = a
72 if o in ("-i", "--input"):
73 input = a
74 if o in ("-P", "--plot"):
75 plot = 1
76
77 assert input != None and input != "", "no input file"
78
79 from aubio import notefilter,txtfile,gnuplot
80 """ load midi and raw data """
81 from numpy import array
82 notelist = array(txtfile.read_datafile(input))
83 """ filter it out """
84 notelist_filtered = notefilter.segraw_onsets4(notelist,winlength,eps)
85 if verbose == 1 :
86 for a,b in notelist_filtered:
87 print a,b
88 """ plot results """
89 if plot == 1 :
90 gnuplot.plotnote(notelist_filtered,title=input,fileout=output)
91
92if __name__ == "__main__":
93 main()
94
python.old/aubionotes+79−0
@@ -0,0 +1,79 @@
1#!/usr/bin/python
2
3def do(filein,threshold):
4
5 import aubio.aubioclass
6 import aubio.median
7 from math import floor
8 hopsize = 512
9 bufsize = 4096
10 channels = 1
11 frameread = 0
12 silthres = -80.
13 filei = aubio.aubioclass.sndfile(filein)
14 srate = filei.samplerate()
15 myvec = aubio.aubioclass.fvec(hopsize,channels)
16 readsize = filei.read(hopsize,myvec)
17 ppick = aubio.aubioclass.pitchpick(bufsize,hopsize,channels,myvec,srate)
18 opick = aubio.aubioclass.onsetpick(bufsize,hopsize,channels,myvec,threshold)
19 mylist = list()
20
21 wassilence = 0
22 lastpitch = 0
23 starttime = 0
24 while(readsize==hopsize):
25 readsize = filei.read(hopsize,myvec)
26 val = ppick.do(myvec)
27 midival = aubio.aubioclass.bintomidi(val,srate,bufsize)
28 isonset,onset = opick.do(myvec)
29 now = (frameread)*hopsize/(srate+0.)
30 issilence = aubio.aubioclass.aubio_silence_detection(myvec.vec,silthres)
31
32 estmidival = 0
33 if (issilence == 1):
34 if (wassilence == 0):
35 #outputnow
36 endtime = (frameread-3)*hopsize/(srate+0.)
37 if len(mylist) > 5 :
38 estmidival = aubio.median.percental(mylist,len(mylist)/2)
39 print "sil", starttime, endtime, estmidival
40 #resetnow
41 mylist = list()
42 else:
43 wassilence = 1
44 else:
45 if isonset == 1:
46 if (wassilence == 0):
47 #outputnow
48 endtime = (frameread-3)*hopsize/(srate+0.)
49 #estmidival = aubio.median.percental(around(array(mylist)),len(mylist)//2)
50 if len(mylist) > 5 :
51 estmidival = aubio.median.percental(mylist,len(mylist)/2)
52 print starttime, endtime, estmidival
53 #resetnow
54 mylist = list()
55 #store start time
56 starttime = (frameread-3)*hopsize/(srate+0.)
57 else:
58 """
59 if(listfull):
60 #outputnow
61 endtime = (frameread-3)*hopsize/(srate+0.)
62 print starttime, endtime, estimmidival
63 else:
64 """
65 #bufferize
66 if midival > 50 and midival < 75:
67 mylist.append(floor(midival))
68 wassilence = 0
69
70
71 #elif( midival > 45 ):
72 # mylist.append(( now , midival+12 ))
73 #mylist.append(toappend)
74 frameread += 1
75
76
77if __name__ == "__main__":
78 import sys
79 do(sys.argv[1],sys.argv[2])
python.old/aubiopitch+131−0
@@ -0,0 +1,131 @@
1#!/usr/bin/python
2
3""" this file was written by Paul Brossier
4 it is released under the GNU/GPL license.
5"""
6
7import sys
8from aubio.task import *
9
10usage = "usage: %s [options] -i soundfile" % sys.argv[0]
11
12
13def parse_args():
14 from optparse import OptionParser
15 parser = OptionParser(usage=usage)
16 parser.add_option("-i","--input",
17 action="store", dest="filename",
18 help="input sound file")
19 parser.add_option("-m","--mode",
20 action="store", dest="mode", default='yinfft',
21 help="pitch detection mode [default=mcomb] \
22 mcomb|yin|fcomb|schmitt")
23 parser.add_option("-u","--units",
24 action="store", dest="omode", default="freq",
25 help="output pitch in units [default=Hz] \
26 freq|midi|cent|bin")
27 parser.add_option("-B","--bufsize",
28 action="store", dest="bufsize", default=None,
29 help="buffer size [default=2048]")
30 parser.add_option("-H","--hopsize",
31 action="store", dest="hopsize", default=None,
32 help="overlap size [default=512]")
33 parser.add_option("-t","--threshold",
34 action="store", dest="threshold", default=0.1,
35 help="pitch threshold (for yin) [default=0.1]")
36 parser.add_option("-s","--silence",
37 action="store", dest="silence", default=-70,
38 help="silence threshold [default=-70]")
39 parser.add_option("-D","--delay",
40 action="store", dest="delay",
41 help="number of seconds frames to take back [default=0]")
42 parser.add_option("-S","--smoothing",
43 action="store", dest="smoothing", default=False,
44 help="use a median filter of N frames [default=0]")
45 parser.add_option("-M","--maximum",
46 action="store", dest="pitchmax", default=False,
47 help="maximum pitch value to look for (Hz) [default=20000]")
48 parser.add_option("-l","--minimum",
49 action="store", dest="pitchmin", default=False,
50 help="minimum pitch value to look for (Hz) [default=20]")
51 # to be implemented
52 parser.add_option("-n","--note",
53 action="store_true", dest="note", default=False,
54 help="NOT IMPLEMENTED output notes")
55 # plotting functions
56 parser.add_option("-T","--plottruth",
57 action="store_true", dest="plottruth", default=False,
58 help="draw plot of the ground truth pitch track")
59 parser.add_option("-p","--plot",
60 action="store_true", dest="plot", default=False,
61 help="draw plot of the pitch track")
62 parser.add_option("-x","--xsize",
63 action="store", dest="xsize", default=1.,
64 type='float', help="define xsize for plot")
65 parser.add_option("-y","--ysize",
66 action="store", dest="ysize", default=1.,
67 type='float', help="define ysize for plot")
68 parser.add_option("-O","--outplot",
69 action="store", dest="outplot", default=None,
70 help="save the plot to output.{ps,png,svg} instead of displaying it")
71 parser.add_option("-v","--verbose",
72 action="store_true", dest="verbose", default=True,
73 help="make lots of noise")
74 parser.add_option("-q","--quiet",
75 action="store_false", dest="verbose", default=True,
76 help="be quiet")
77 (options, args) = parser.parse_args()
78 if not options.bufsize:
79 if options.mode == "yin": options.bufsize = 1024
80 if options.mode == "schmitt": options.bufsize = 2048
81 if options.mode == "mcomb": options.bufsize = 4096
82 if options.mode == "fcomb": options.bufsize = 4096
83 else: options.bufsize = 2048
84 if not options.hopsize:
85 options.hopsize = float(options.bufsize) / 2
86 if not options.filename:
87 print "no file name given\n", usage
88 sys.exit(1)
89 return options, args
90
91options, args = parse_args()
92
93#print options.bufsize, options.hopsize
94
95filename = options.filename
96params = taskparams()
97params.samplerate = float(sndfile(filename).samplerate())
98params.hopsize = int(options.hopsize)
99params.bufsize = int(options.bufsize)
100params.step = params.samplerate/float(params.hopsize)
101params.yinthresh = float(options.threshold)
102params.silence = float(options.silence)
103params.verbose = options.verbose
104if options.smoothing: params.pitchsmooth = int(options.smoothing)
105if options.pitchmax: params.pitchmax = int(options.pitchmax)
106if options.pitchmin: params.pitchmin = int(options.pitchmin)
107#mintol = float(options.mintol)*step
108# default take back system delay
109if options.delay: params.pitchdelay = float(options.delay)
110
111if options.note:
112 exit("not implemented yet")
113
114wplot,oplots,titles = [],[],[]
115modes = options.mode.split(',')
116for i in range(len(modes)):
117 pitch = []
118 params.pitchmode = modes[i]
119 filetask = taskpitch(filename,params=params)
120 pitch = filetask.compute_all()
121 #print filetask.eval(pitch[i])
122 if options.plot: filetask.plot(pitch,wplot,oplots,titles)
123
124if options.outplot:
125 extension = options.outplot.split('.')[-1]
126 outplot = '.'.join(options.outplot.split('.')[:-1])
127else:
128 extension,outplot = None,None
129if options.plot:
130 filetask.plotplot(wplot,oplots,titles,outplot=outplot,extension=extension,
131 xsize=options.xsize,ysize=options.ysize,truth=options.plottruth)
python.old/aubioplot-audio+31−0
@@ -0,0 +1,31 @@
1#!/usr/bin/python
2
3import sys
4from aubio.gnuplot import gnuplot_create,gnuplot_addargs,plot_audio
5
6usage = "usage: %s [options] -i soundfile" % sys.argv[0]
7
8def parse_args():
9 from optparse import OptionParser
10 parser = OptionParser(usage=usage)
11 parser.add_option("-i","--input",
12 action="store", dest="filename",
13 help="input sound file")
14 gnuplot_addargs(parser)
15 (options, args) = parser.parse_args()
16 if not options.filename:
17 print "no file name given\n", usage
18 sys.exit(1)
19 return options, args
20
21options, args = parse_args()
22
23if options.outplot:
24 extension = options.outplot.split('.')[-1]
25 outplot = '.'.join(options.outplot.split('.')[:-1])
26else:
27 extension = ''
28 outplot = None
29
30g = gnuplot_create(outplot,extension,options)
31plot_audio(options.filename.split(','), g, options)
python.old/aubioplot-notes+31−0
@@ -0,0 +1,31 @@
1#!/usr/bin/python
2
3def parse_args (sysargs):
4 from getopt import gnu_getopt
5 shortopts ='i:o:'
6 longopts =('input=','output=')
7 args,tmp = gnu_getopt(sysargs,shortopts,longopts)
8 args.sort()
9 filein,fileout= None,None
10 for i in range(len(args)): # a bad way
11 if args[i][0] == '-i' or args[i][0] == '--input':
12 filein = args[i][1]
13 if args[i][0] == '-o' or args[i][0] == '--output':
14 fileout = args[i][1]
15 assert filein != None, 'precise filein'
16 return filein,fileout
17
18def main (sysargs) :
19 from aubio.txtfile import read_datafile
20 from aubio.gnuplot import plotnote,plotnote_do
21 from numpy import array
22 filein,fileout = parse_args(sysargs)
23 #print 'checking', fileerr, 'against', fileorg
24 """ load midi and raw data """
25 d = plotnote(array(read_datafile(filein)),title=filein)
26 plotnote_do(d,fileout=fileout)
27
28if __name__ == "__main__":
29 import sys
30 main(sys.argv[1:])
31
python.old/aubioplot-spec+51−0
@@ -0,0 +1,51 @@
1#! /usr/bin/python
2
3""" this file was written by Paul Brossier
4 it is released under the GNU/GPL license.
5"""
6
7import sys
8from aubio.gnuplot import gnuplot_create,gnuplot_addargs,plot_spec
9
10usage = "usage: %s [options] -i soundfile" % sys.argv[0]
11
12def parse_args():
13 from optparse import OptionParser
14 parser = OptionParser(usage=usage)
15 parser.add_option("-i","--input",
16 action="store", dest="filename",
17 help="input sound file")
18 parser.add_option("-M","--maxf",
19 action="store", dest="maxf", default=10000.,
20 type='float',help="higher frequency limit")
21 parser.add_option("-L","--minf",
22 action="store", dest="minf", default=0.,
23 type='float',help="lower frequency limit")
24 parser.add_option("-l","--log",
25 action="store_true", dest="log", default=False,
26 help="plot on a logarithmic scale")
27 parser.add_option("-B","--bufsize", type='int',
28 action="store", dest="bufsize", default=8192,
29 help="buffer size [default=8192]")
30 parser.add_option("-H","--hopsize", type='int',
31 action="store", dest="hopsize", default=1024,
32 help="overlap size [default=1024]")
33 gnuplot_addargs(parser)
34 (options, args) = parser.parse_args()
35 if not options.filename:
36 print "no file name given\n", usage
37 sys.exit(1)
38 return options, args
39
40options, args = parse_args()
41filename = options.filename
42
43if options.outplot:
44 extension = options.outplot.split('.')[-1]
45 outplot = '.'.join(options.outplot.split('.')[:-1])
46else:
47 extension = ''
48 outplot = None
49
50g = gnuplot_create(outplot,extension,options)
51plot_spec(filename, g, options)
python.old/aubioplot-yinfft+135−0
@@ -0,0 +1,135 @@
1#! /usr/bin/python
2
3""" this file was written by Paul Brossier
4 it is released under the GNU/GPL license.
5"""
6
7import sys,time
8from aubio.task import task,taskparams
9from aubio.aubioclass import fvec
10from aubio.gnuplot import gnuplot_create
11from aubio.aubiowrapper import *
12
13usage = "usage: %s [options] -i soundfile" % sys.argv[0]
14
15def parse_args():
16 from optparse import OptionParser
17 parser = OptionParser(usage=usage)
18 parser.add_option("-i","--input",
19 action="store", dest="filename",
20 help="input sound file")
21 parser.add_option("-n","--printframe",
22 action="store", dest="printframe", default=-1,
23 help="make a plot of the n_th frame")
24 parser.add_option("-x","--xsize",
25 action="store", dest="xsize", default=1.,
26 help="define xsize for plot")
27 parser.add_option("-y","--ysize",
28 action="store", dest="ysize", default=1.,
29 help="define ysize for plot")
30 parser.add_option("-O","--outplot",
31 action="store", dest="outplot", default=None,
32 help="save plot to output.{ps,png}")
33 (options, args) = parser.parse_args()
34 if not options.filename:
35 print "no file name given\n", usage
36 sys.exit(1)
37 return options, args
38
39def plotdata(x,y,plottitle="",**keyw):
40 import Gnuplot
41 return Gnuplot.Data(x, y, title="%s" % plottitle,**keyw)
42
43options, args = parse_args()
44filename = options.filename
45xsize = float(options.xsize)
46ysize = float(options.ysize)*2
47
48printframe = int(options.printframe)
49if printframe == -1:
50 print "Will wait for ^D to skip to next plot"
51 print "Press enter before to print to file"
52
53
54g = gnuplot_create()
55params = taskparams()
56params.hopsize = 2048 # 512
57params.bufsize = params.hopsize #2048
58taskfile = task(filename,params=params)
59
60yin = fvec(params.bufsize/2,1)
61
62t = [i for i in range(params.bufsize)]
63a = [0 for i in range(params.bufsize)]
64
65while (taskfile.readsize == params.hopsize):
66 taskfile()
67
68 n = [i for i in range(params.bufsize/2)]
69 a = [taskfile.myvec.get(i,0) for i in range(params.hopsize/2)]
70 aubio_pitchyin_diff(taskfile.myvec(),yin()) # compute d[t]
71 c = [yin.get(i,0) for i in range(params.bufsize/2)]
72 aubio_pitchyin_getcum(yin()) # compute d'[t]
73 y = [yin.get(i,0) for i in range(params.bufsize/2)]
74 thresh = [0.1 for i in range(params.bufsize/2)]
75 #t.append((i/float(params.hopsize)+taskfile.frameread)*params.step),t.pop(0)
76 d = [plotdata(n,a,plottitle="signal", with_='lines'),
77 plotdata(n,c,plottitle="d[t]",axes='x1y2', with_='lines lt 1'),
78 plotdata(n,y,plottitle="d'[t]",axes='x1y1', with_='lines lt 2'),
79 plotdata(n,thresh,plottitle="threshold",axes='x1y1', with_='lines lt 3')]
80 #g('set xrange [%f:%f]' % (t[0],t[-1]))
81 #time.sleep(.2)
82 g.reset()
83 g('set yrange [-1:3]')
84 g('set xrange [0:%d]' % (params.bufsize/2))
85 g('set title \"%s\"' % "Example of period detection using YIN")
86 if printframe == -1:
87 g.replot(*d)
88 a = sys.stdin.read()
89 if a == "\n" or printframe == taskfile.frameread:
90 from os.path import basename
91 outplot = "_".join([basename(sys.argv[0]),'_'.join(basename(filename).split('.')),"%d" % taskfile.frameread])
92 print outplot
93 f = gnuplot_create(outplot=outplot,extension='ps')
94 f('set size %f,%f;' % (xsize,ysize) )
95 f('set lmargin %f' % (15*xsize))
96 f('set rmargin %f' % (10*xsize))
97 #f('set title \"%s\"' % "Example of period detection using YIN")
98 f('set multiplot')
99 f.ylabel('amplitude',offset=(+.5,0))
100 f.xlabel('time (samples)')
101 f('set size %f,%f;' % (xsize,ysize*0.4) )
102 f('set orig %f,%f;' % (0,ysize*0.6) )
103 sigmax = max(abs(min(a)),abs(max(a)))
104 f('set yrange [%f:%f]' % (-1.3*sigmax,1.3*sigmax))
105 f('set xrange [0:%d]' % (params.bufsize/2))
106 f.plot(d[0])
107
108 f.ylabel('')
109 f.xlabel('lag (samples)')
110 f('set bmargin %f' % (4*ysize))
111 f('set size %f,%f;' % (xsize,ysize*0.6) )
112 f('set orig %f,%f;' % (0,0) )
113 f('set autoscale')
114 f('set xrange [0:%d]' % (params.bufsize/2))
115 f('set notitle')
116 f('set y2tics')
117 f('set ytics nomirror')
118 f('set noytics')
119 f('set key right')
120 f.plot(d[1])
121
122 f.ylabel('amplitude')
123 f.xlabel('')
124 f('set y2tics nomirror')
125 f('set ytics nomirror')
126 f('set noy2tics')
127 f('set noxtics')
128 f('set ytics')
129 f('set key left')
130 f.plot(d[2],d[3])
131 #f('set yrange [-1:3]')
132 #f.plot(*d)
133 print "saved plot", outplot, 'ps'
134 elif printframe < taskfile.frameread:
135 break
python.old/aubioweb.py+113−0
@@ -0,0 +1,113 @@
1#!/usr/bin/python
2
3doc = """
4This script works with mod_python to browse a collection of annotated wav files
5and results.
6
7you will need to have at least the following packages need to be installed (the
8name of the command line tool is precised in parenthesis):
9
10libapache-mod-python (apache2 prefered)
11sndfile-programs (sndfile-info)
12vorbis-tools (oggenc)
13python-gnuplot
14python-numpy
15
16Try the command line tools in aubio/python to test your installation.
17
18NOTE: this script is probably horribly insecure.
19
20example configuration for apache to put in your preferred virtual host.
21
22<Directory /home/piem/public_html/aubioweb>
23 # Minimal config
24 AddHandler mod_python .py
25 # Disable these in production
26 PythonDebug On
27 PythonAutoReload on
28 # Default handler in url
29 PythonHandler aubioweb
30 ## Authentication stuff (optional)
31 #PythonAuthenHandler aubioweb
32 #AuthType Basic
33 #AuthName "Restricted Area"
34 #require valid-user
35 # make default listing
36 DirectoryIndex aubioweb/
37</Directory>
38
39"""
40
41from aubio.web.html import *
42
43def handler(req):
44 from aubio.web.browser import *
45 from mod_python import Session
46 req.sess = Session.Session(req)
47 req.sess['login']='new aubio user'
48 req.sess.save()
49 return configure_handler(req,index)
50
51def index(req,threshold='0.3'):
52 navigation(req)
53 print_command(req,"sfinfo %%i")
54 return footer(req)
55
56def show_info(req,verbose=''):
57 navigation(req)
58 print_command(req,"sndfile-info %%i")
59 return footer(req)
60
61def feedback(req):
62 navigation(req)
63 req.write("""
64 Please provide feedback below:
65 <p>
66 <form action="/~piem/aubioweb/email" method="POST">
67 Name: <input type="text" name="name"><br>
68 Email: <input type="text" name="email"><br>
69 Comment: <textarea name="comment" rows=4 cols=20></textarea><br>
70 <input type="submit">
71 </form>
72 """)
73
74WEBMASTER='piem@calabaza'
75SMTP_SERVER='localhost'
76
77def email(req,name,email,comment):
78 import smtplib
79 # make sure the user provided all the parameters
80 if not (name and email and comment):
81 return "A required parameter is missing, \
82 please go back and correct the error"
83 # create the message text
84 msg = """\
85From: %s
86Subject: feedback
87To: %s
88
89I have the following comment:
90
91%s
92
93Thank You,
94
95%s
96
97""" % (email, WEBMASTER, comment, name)
98 # send it out
99 conn = smtplib.SMTP(SMTP_SERVER)
100 try:
101 conn.sendmail(email, [WEBMASTER], msg)
102 except smtplib.SMTPSenderRefused:
103 return """<html>please provide a valid email</html>"""
104
105 conn.quit()
106 # provide feedback to the user
107 s = """\
108<html>
109Dear %s,<br>
110Thank You for your kind comments, we
111will get back to you shortly.
112</html>""" % name
113 return s
python.old/bench-cluster-test+9−0
@@ -0,0 +1,9 @@
1#! /usr/bin/python
2
3from aubio.bench.broadcast import *
4
5run_broadcast(remote_sync,'/home/testing')
6run_broadcast(remote_sync,'/home/testing','-n')
7run_broadcast(fetch_results,'/home/testing','-n')
8
9run_broadcast(remote_queue,'echo coucou')
python.old/bench-test+13−0
@@ -0,0 +1,13 @@
1#! /usr/bin/python
2
3from aubio.bench.node import *
4
5datapath = '/var/www'
6respath = '/var/tmp'
7
8def my_print(input,output):
9 cmd = "%s %s %s" % ("time sleep 0.3; echo",input,output)
10 return runcommand(cmd,debug=0)
11
12act_on_results(mkdir,datapath,respath,filter='d')
13act_on_data(my_print,datapath,respath,suffix='.txt')
python.old/wscript_build+6−0
@@ -0,0 +1,6 @@
1# vim:set syntax=python:
2
3ctx.add_subdirs('aubio')
4# install headers
5for file in ['aubiocut', 'aubiopitch']:
6 ctx.install_as('${PREFIX}/bin/' + file, file, chmod = 0755)

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