ref: 84e80a1e3ad363119f939b73210b4fc27f5a6218
parent: ea9817996f6ee0d056a82a28c44bd2f53242b869
author: Paul Brossier <piem@altern.org>
date: Sun Feb 26 12:34:08 EST 2006
added support for dcthres and verbose, moved task.step to tasks.params.step, updated plot functions added support for dcthres and verbose, moved task.step to tasks.params.step, updated plot functions
--- a/python/aubio/tasks.py
+++ b/python/aubio/tasks.py
@@ -200,7 +200,7 @@
self.silence = -70
self.derivate = False
self.localmin = False
- self.delay = 0.
+ self.delay = 4.
self.storefunc = False
self.bufsize = 512
self.hopsize = 256
@@ -211,7 +211,9 @@
self.threshold = 0.1
self.onsetmode = 'dual'
self.pitchmode = 'yin'
+ self.dcthreshold = -1.
self.omode = aubio_pitchm_freq
+ self.verbose = False
class task(taskparams):
""" default template class to apply tasks on a stream """
@@ -229,7 +231,7 @@
self.filei = sndfile(self.input)
self.srate = self.filei.samplerate()
self.channels = self.filei.channels()
- self.step = float(self.srate)/float(self.params.hopsize)
+ self.params.step = float(self.params.hopsize)/float(self.srate)
self.myvec = fvec(self.params.hopsize,self.channels)
self.output = output
@@ -242,8 +244,14 @@
mylist = []
while(self.readsize==self.params.hopsize):
tmp = self()
- if tmp: mylist.append(tmp)
+ if tmp:
+ mylist.append(tmp)
+ if self.params.verbose:
+ self.fprint(tmp)
return mylist
+
+ def fprint(self,foo):
+ print foo
def eval(self,results):
""" Eval data """
@@ -272,10 +280,15 @@
else: self.issilence = -1
self.wassilence = 0
if self.issilence == -1:
- return self.frameread, -1
+ return max(self.frameread-self.params.delay,0.), -1
elif self.issilence == 2:
- return self.frameread, 2
+ return max(self.frameread+self.params.delay,0.), 2
+ def fprint(self,foo):
+ print self.params.step*foo[0],
+ if foo[1] == 2: print "OFF"
+ else: print "ON"
+
class taskpitch(task):
def __init__(self,input,params=None):
task.__init__(self,input,params=params)
@@ -343,10 +356,10 @@
self.myvec,
self.params.threshold,
mode=get_onset_mode(self.params.onsetmode),
+ dcthreshold=self.params.dcthreshold,
derivate=self.params.derivate)
self.olist = []
self.ofunc = []
- self.d,self.d2 = [],[]
self.maxofunc = 0
self.last = 0
if self.params.localmin:
@@ -365,18 +378,19 @@
self.ovalist.pop(0)
if (isonset == 1):
if self.params.localmin:
- i=len(self.ovalist)-1
# find local minima before peak
+ i=len(self.ovalist)-1
while self.ovalist[i-1] < self.ovalist[i] and i > 0:
i -= 1
now = (self.frameread+1-i)
else:
now = self.frameread
+ # take back delay
if self.params.delay != 0.: now -= self.params.delay
if now < 0 :
now = 0
if self.params.mintol:
- #print now - self.last, self.params.mintol
+ # prune doubled
if (now - self.last) > self.params.mintol:
self.last = now
return now, val
@@ -384,6 +398,9 @@
return now, val
+ def fprint(self,foo):
+ print self.params.step*foo[0]
+
def eval(self,inputdata,ftru,mode='roc',vmode=''):
from txtfile import read_datafile
from onsetcompare import onset_roc, onset_diffs, onset_rocloc
@@ -413,7 +430,7 @@
self.v['l'], self.v['labs'] = \
onset_rocloc(ltru,lres,self.params.tol)
- def plot(self,onsets,ofunc):
+ def plot(self,onsets,ofunc,wplot,oplots,nplot=False):
import Gnuplot, Gnuplot.funcutils
import aubio.txtfile
import os.path
@@ -420,29 +437,40 @@
import numarray
from aubio.onsetcompare import onset_roc
+ x1,y1,y1p = [],[],[]
+ oplot = []
+
self.lenofunc = len(ofunc)
- self.maxofunc = max(max(ofunc), self.maxofunc)
+ self.maxofunc = max(ofunc)
# onset detection function
- downtime = numarray.arange(len(ofunc))/self.step
- self.d.append(Gnuplot.Data(downtime,ofunc,with='lines'))
+ downtime = numarray.arange(len(ofunc))*self.params.step
+ oplot.append(Gnuplot.Data(downtime,ofunc,with='lines',title=self.params.onsetmode))
# detected onsets
- x1 = numarray.array(onsets)/self.step
- y1 = self.maxofunc*numarray.ones(len(onsets))
- self.d.append(Gnuplot.Data(x1,y1,with='impulses'))
- self.d2.append(Gnuplot.Data(x1,-y1,with='impulses'))
+ if not nplot:
+ for i in onsets:
+ x1.append(i[0]*self.params.step)
+ y1.append(self.maxofunc)
+ y1p.append(-self.maxofunc)
+ #x1 = numarray.array(onsets)*self.params.step
+ #y1 = self.maxofunc*numarray.ones(len(onsets))
+ if x1:
+ oplot.append(Gnuplot.Data(x1,y1,with='impulses'))
+ wplot.append(Gnuplot.Data(x1,y1p,with='impulses'))
+ oplots.append(oplot)
+
# check if datafile exists truth
datafile = self.input.replace('.wav','.txt')
if datafile == self.input: datafile = ""
if not os.path.isfile(datafile):
- self.title = "truth file not found"
+ self.title = "" #"(no ground truth)"
t = Gnuplot.Data(0,0,with='impulses')
else:
t_onsets = aubio.txtfile.read_datafile(datafile)
- y2 = self.maxofunc*numarray.ones(len(t_onsets))
x2 = numarray.array(t_onsets).resize(len(t_onsets))
- self.d2.append(Gnuplot.Data(x2,y2,with='impulses'))
+ y2 = self.maxofunc*numarray.ones(len(t_onsets))
+ wplot.append(Gnuplot.Data(x2,y2,with='impulses'))
tol = 0.050
@@ -453,22 +481,36 @@
(100*float(bad+doubled)/(orig)))
- def plotplot(self,outplot=None):
+ def plotplot(self,wplot,oplot,outplot=None):
from aubio.gnuplot import gnuplot_init, audio_to_array, make_audio_plot
import re
# audio data
time,data = audio_to_array(self.input)
- self.d2.append(make_audio_plot(time,data))
+ wplot = [make_audio_plot(time,data)] + wplot
# prepare the plot
g = gnuplot_init(outplot)
- g('set title \'%s %s\'' % (re.sub('.*/','',self.input),self.title))
-
g('set multiplot')
# hack to align left axis
- g('set lmargin 15')
+ g('set lmargin 6')
+ g('set tmargin 0')
+ g('set format x ""')
+ g('set format y ""')
+ g('set noytics')
+ for i in range(len(oplot)):
+ # plot onset detection functions
+ g('set size 1,%f' % (0.7/(len(oplot))))
+ g('set origin 0,%f' % (float(i)*0.7/(len(oplot))))
+ g('set xrange [0:%f]' % (self.lenofunc*self.params.step))
+ g.plot(*oplot[i])
+
+ g('set tmargin 3')
+ g('set format x "%10.1f"')
+
+ g('set title \'%s %s\'' % (re.sub('.*/','',self.input),self.title))
+
# plot waveform and onsets
g('set size 1,0.3')
g('set origin 0,0.7')
@@ -475,19 +517,8 @@
g('set xrange [0:%f]' % max(time))
g('set yrange [-1:1]')
g.ylabel('amplitude')
- g.plot(*self.d2)
+ g.plot(*wplot)
- g('unset title')
-
- # plot onset detection function
- g('set size 1,0.7')
- g('set origin 0,0')
- g('set xrange [0:%f]' % (self.lenofunc/self.step))
- g('set yrange [0:%f]' % (self.maxofunc*1.01))
- g.xlabel('time')
- g.ylabel('onset detection value')
- g.plot(*self.d)
-
g('unset multiplot')
class taskcut(task):
@@ -497,9 +528,9 @@
"""
task.__init__(self,input,output=None,params=params)
self.newname = "%s%s%09.5f%s%s" % (self.input.split(".")[0].split("/")[-1],".",
- self.frameread/self.step,".",self.input.split(".")[-1])
- self.fileo = sndfile(self.newname,model=self.filei)
- self.myvec = fvec(self.params.hopsize,self.channels)
+ self.frameread*self.params.step,".",self.input.split(".")[-1])
+ self.fileo = sndfile(self.newname,model=self.filei)
+ self.myvec = fvec(self.params.hopsize,self.channels)
self.mycopy = fvec(self.params.hopsize,self.channels)
self.slicetimes = slicetimes
@@ -506,7 +537,7 @@
def __call__(self):
task.__call__(self)
# write to current file
- if len(self.slicetimes) and self.frameread >= self.slicetimes[0]:
+ if len(self.slicetimes) and self.frameread >= self.slicetimes[0][0]:
self.slicetimes.pop(0)
# write up to 1st zero crossing
zerocross = 0
@@ -522,7 +553,7 @@
del self.fileo
self.fileo = sndfile("%s%s%09.5f%s%s" %
(self.input.split(".")[0].split("/")[-1],".",
- self.frameread/self.step,".",self.input.split(".")[-1]),model=self.filei)
+ self.frameread*self.params.step,".",self.input.split(".")[-1]),model=self.filei)
writesize = self.fileo.write(fromcross,self.mycopy)
else:
writesize = self.fileo.write(self.readsize,self.myvec)