ref: 919139be3e6fd5c9d515348e02966664e385b561
dir: /python.old/aubio/task/notes.py/
from aubio.task import task
from aubio.aubioclass import *
class tasknotes(task):
def __init__(self,input,output=None,params=None):
task.__init__(self,input,params=params)
self.opick = onsetpick(self.params.bufsize,
self.params.hopsize,
self.channels,
self.myvec,
self.params.threshold,
mode=self.params.onsetmode,
dcthreshold=self.params.dcthreshold,
derivate=self.params.derivate)
self.pitchdet = pitch(mode=self.params.pitchmode,
bufsize=self.params.pbufsize,
hopsize=self.params.phopsize,
channels=self.channels,
samplerate=self.srate,
omode=self.params.omode)
self.olist = []
self.ofunc = []
self.maxofunc = 0
self.last = -1000
self.oldifreq = 0
if self.params.localmin:
self.ovalist = [0., 0., 0., 0., 0.]
def __call__(self):
from aubio.median import short_find
task.__call__(self)
isonset,val = self.opick.do(self.myvec)
if (aubio_silence_detection(self.myvec(),self.params.silence)):
isonset=0
freq = -1.
else:
freq = self.pitchdet(self.myvec)
minpitch = self.params.pitchmin
maxpitch = self.params.pitchmax
if maxpitch and freq > maxpitch :
freq = -1.
elif minpitch and freq < minpitch :
freq = -1.
freq = aubio_freqtomidi(freq)
if self.params.pitchsmooth:
self.shortlist.append(freq)
self.shortlist.pop(0)
smoothfreq = short_find(self.shortlist,
len(self.shortlist)/2)
freq = smoothfreq
now = self.frameread
ifreq = int(round(freq))
if self.oldifreq == ifreq:
self.oldifreq = ifreq
else:
self.oldifreq = ifreq
ifreq = 0
# take back delay
if self.params.delay != 0.: now -= self.params.delay
if now < 0 :
now = 0
if (isonset == 1):
if self.params.mintol:
# prune doubled
if (now - self.last) > self.params.mintol:
self.last = now
return now, 1, freq, ifreq
else:
return now, 0, freq, ifreq
else:
return now, 1, freq, ifreq
else:
return now, 0, freq, ifreq
def fprint(self,foo):
print self.params.step*foo[0], foo[1], foo[2], foo[3]
def compute_all(self):
""" Compute data """
now, onset, freq, ifreq = [], [], [], []
while(self.readsize==self.params.hopsize):
n, o, f, i = self()
now.append(n*self.params.step)
onset.append(o)
freq.append(f)
ifreq.append(i)
if self.params.verbose:
self.fprint((n,o,f,i))
return now, onset, freq, ifreq
def plot(self,now,onset,freq,ifreq,oplots):
import Gnuplot
oplots.append(Gnuplot.Data(now,freq,with_='lines',
title=self.params.pitchmode))
oplots.append(Gnuplot.Data(now,ifreq,with_='lines',
title=self.params.pitchmode))
temponsets = []
for i in onset:
temponsets.append(i*1000)
oplots.append(Gnuplot.Data(now,temponsets,with_='impulses',
title=self.params.pitchmode))
def plotplot(self,wplot,oplots,outplot=None,multiplot = 0):
from aubio.gnuplot import gnuplot_init, audio_to_array, make_audio_plot
import re
import Gnuplot
# audio data
time,data = audio_to_array(self.input)
f = make_audio_plot(time,data)
# check if ground truth exists
#timet,pitcht = self.gettruth()
#if timet and pitcht:
# oplots = [Gnuplot.Data(timet,pitcht,with_='lines',
# title='ground truth')] + oplots
t = Gnuplot.Data(0,0,with_='impulses')
g = gnuplot_init(outplot)
g('set title \'%s\'' % (re.sub('.*/','',self.input)))
g('set multiplot')
# hack to align left axis
g('set lmargin 15')
# plot waveform and onsets
g('set size 1,0.3')
g('set origin 0,0.7')
g('set xrange [0:%f]' % max(time))
g('set yrange [-1:1]')
g.ylabel('amplitude')
g.plot(f)
g('unset title')
# plot onset detection function
g('set size 1,0.7')
g('set origin 0,0')
g('set xrange [0:%f]' % max(time))
g('set yrange [20:100]')
g('set key right top')
g('set noclip one')
#g('set format x ""')
#g('set log y')
#g.xlabel('time (s)')
g.ylabel('f0 (Hz)')
if multiplot:
for i in range(len(oplots)):
# plot onset detection functions
g('set size 1,%f' % (0.7/(len(oplots))))
g('set origin 0,%f' % (float(i)*0.7/(len(oplots))))
g('set xrange [0:%f]' % max(time))
g.plot(oplots[i])
else:
g.plot(*oplots)
#g('unset multiplot')