From ae3f5afd065d852fd0896363c9bd22113981f0ec Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Sat, 27 May 2006 00:15:58 +0000 Subject: [PATCH] last 0.3.0 changes last 0.3.0 changes --- VERSION | 2 +- python/aubio/plot/__init__.py | 0 python/aubio/plot/keyboard.py | 46 ++++++++++ python/aubio/plot/notes.py | 93 ++++++++++++++++++++ python/aubio/task/__init__.py | 10 +++ python/aubio/task/notes.py | 161 ++++++++++++++++++++++++++++++++++ 6 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 python/aubio/plot/__init__.py create mode 100755 python/aubio/plot/keyboard.py create mode 100644 python/aubio/plot/notes.py create mode 100644 python/aubio/task/__init__.py create mode 100644 python/aubio/task/notes.py diff --git a/VERSION b/VERSION index 459f21d9..2741ce04 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ AUBIO_MAJOR_VERSION=0 -AUBIO_MINOR_VERSION=2 +AUBIO_MINOR_VERSION=3 AUBIO_PATCH_VERSION=0 AUBIO_VERSION_STATUS= diff --git a/python/aubio/plot/__init__.py b/python/aubio/plot/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/aubio/plot/keyboard.py b/python/aubio/plot/keyboard.py new file mode 100755 index 00000000..8fe57d9b --- /dev/null +++ b/python/aubio/plot/keyboard.py @@ -0,0 +1,46 @@ + +def draw_keyboard(firstnote = 21, lastnote = 108, y0 = 0, y1 = 1): + import Gnuplot + octaves = 10 + + # build template of white notes + scalew = 12/7. + xw_temp = [i*scalew for i in range(0,7)] + # build template of black notes + scaleb = 6/7. + xb_temp = [i*scaleb for i in [1,3,7,9,11]] + + xb,xw = [],[] + for octave in range(octaves-1): + for i in xb_temp: + curnote = i+12*octave + if curnote > firstnote-1 and curnote < lastnote+1: + xb = xb + [curnote] + for octave in range(octaves-1): + for i in xw_temp: + curnote = i+12*octave + if curnote > firstnote-1 and curnote < lastnote+1: + xw = xw + [curnote] + + xwdelta = [1/2. * scalew for i in range(len(xw))] + yw = [y0+(y1-y0)*1/2. for i in range(len(xw))] + ywdelta = [(y1-y0)*1/2. for i in range(len(xw))] + + xbdelta = [2/3. * scaleb for i in range(len(xb))] + yb = [y0+(y1-y0)*2/3. for i in range(len(xb))] + ybdelta = [(y1-y0)*1/3. for i in range(len(xb))] + + whites = Gnuplot.Data(xw,yw,xwdelta,ywdelta,with = 'boxxyerrorbars') + blacks = Gnuplot.Data(xb,yb,xbdelta,ybdelta,with = 'boxxyerrorbars fill solid') + + return blacks,whites + +if __name__ == '__main__': + from aubio.gnuplot import gnuplot_create + blacks,whites = draw_keyboard(firstnote = 21, lastnote = 108) + g = gnuplot_create('','') + #g('set style fill solid .5') + #g('set xrange [60-.5:72+.5]') + #g('set yrange [-0.1:1.1]') + + g.plot(whites,blacks) diff --git a/python/aubio/plot/notes.py b/python/aubio/plot/notes.py new file mode 100644 index 00000000..a15d3ff2 --- /dev/null +++ b/python/aubio/plot/notes.py @@ -0,0 +1,93 @@ +"""Copyright (C) 2004 Paul Brossier +print aubio.__LICENSE__ for the terms of use +""" + +__LICENSE__ = """\ + Copyright (C) 2004 Paul Brossier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +""" + +def plotnote(la,title=None) : + if la[0,:].size() == 3: + d = plotnote_withends(la, plot_title=title) + else: + # scale data if in freq (for REF.txt files) + if max(la[:,1] > 128 ): + print "scaling frequency data to midi range" + la[:,1] /= 6.875 + la[:,1] = log(la[:,1])/0.6931 + la[:,1] *= 12 + la[:,1] -= 3 + d = plotnote_withoutends(la, plot_title=title) + return d + +def plotnote_multi(lalist,title=None,fileout=None) : + d=list() + for i in range(len(lalist)): + d.append(plotnote(lalist[i], title=title)) + return d + + +def plotnote_withends(la,plot_title=None) : + import numarray + import Gnuplot, Gnuplot.funcutils + d=[] + x_widths = numarray.array(la[:,1]-la[:,0])/2. + d.append(Gnuplot.Data( + la[:,0]+x_widths, # x centers + la[:,2], # y centers + x_widths, # x errors + __notesheight*ones(len(la)), # y errors + title=plot_title,with=('boxxyerrorbars fs 3'))) + return d + + +def plotnote_withoutends(la,plot_title=None) : + """ bug: fails drawing last note """ + import numarray + import Gnuplot, Gnuplot.funcutils + d=[] + x_widths = numarray.array(la[1:,0]-la[:-1,0])/2; + d.append(Gnuplot.Data( + la[:-1,0]+x_widths, # x centers + la[:-1,1], # y centers + x_widths, # x errors + __notesheight*ones(len(la)-1), # y errors + title=plot_title,with=('boxxyerrorbars fs 3'))) + return d + +def plotnote_do(d,fileout=None): + import Gnuplot, Gnuplot.funcutils + g = Gnuplot.Gnuplot(debug=1, persist=1) + g.gnuplot('set style fill solid border 1; \ + set size ratio 1/6; \ + set boxwidth 0.9 relative; \ + set mxtics 2.5; \ + set mytics 2.5; \ + set xtics 5; \ + set ytics 1; \ + set grid xtics ytics mxtics mytics') + + g.xlabel('Time (s)') + g.ylabel('Midi pitch') + # do the plot + #g.gnuplot('set multiplot') + #for i in d: + g.plot(d[0]) + #g.gnuplot('set nomultiplot') + if fileout != None: + g.hardcopy(fileout, enhanced=1, color=0) + diff --git a/python/aubio/task/__init__.py b/python/aubio/task/__init__.py new file mode 100644 index 00000000..1c694205 --- /dev/null +++ b/python/aubio/task/__init__.py @@ -0,0 +1,10 @@ +from aubio.aubioclass import * +from aubio.task.task import task +from aubio.task.utils import * +from aubio.task.params import taskparams +from aubio.task.silence import tasksilence +from aubio.task.onset import taskonset +from aubio.task.beat import taskbeat +from aubio.task.cut import taskcut +from aubio.task.pitch import taskpitch +from aubio.task.notes import tasknotes diff --git a/python/aubio/task/notes.py b/python/aubio/task/notes.py new file mode 100644 index 00000000..a729f944 --- /dev/null +++ b/python/aubio/task/notes.py @@ -0,0 +1,161 @@ + +from aubio.task import task +from aubio.task.utils import * +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=get_onset_mode(self.params.onsetmode), + dcthreshold=self.params.dcthreshold, + derivate=self.params.derivate) + self.pitchdet = pitchdetection(mode=get_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 numarray + 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') + -- 2.26.2