From 19b56b07dedfce33814935e3ab7bd343e2e37c2b Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Tue, 29 Mar 2005 15:51:44 +0000 Subject: [PATCH] updated python/aubio/aubioclass.py and python/aubiocut --- python/aubio/aubioclass.py | 113 ++++++++++++++++++++++++++++++++++--- python/aubiocut | 38 ++----------- python/aubioonset | 73 ++++++++++++++++-------- 3 files changed, 162 insertions(+), 62 deletions(-) diff --git a/python/aubio/aubioclass.py b/python/aubio/aubioclass.py index 18ffc071..a276b090 100644 --- a/python/aubio/aubioclass.py +++ b/python/aubio/aubioclass.py @@ -70,22 +70,121 @@ class peakpick: del_aubio_peakpicker(self.pp) class onsetpick: - def __init__(self,bufsize,hopsize,channels,myvec,threshold): + def __init__(self,bufsize,hopsize,channels,myvec,threshold,mode='dual'): self.myfft = cvec(bufsize,channels) self.pv = pvoc(bufsize,hopsize,channels) - self.myod = onsetdetection(hfc,bufsize,channels) - self.myod2 = onsetdetection(complexdomain,bufsize,channels) - self.myonset = fvec(1,channels) - self.myonset2 = fvec(1,channels) + if mode in [complexdomain,hfc,phase,energy,specdiff] : + self.myod = onsetdetection(mode,bufsize,channels) + self.myonset = fvec(1,channels) + else: + self.myod = onsetdetection(hfc,bufsize,channels) + self.myod2 = onsetdetection(complexdomain,bufsize,channels) + self.myonset = fvec(1,channels) + self.myonset2 = fvec(1,channels) + self.mode = mode self.pp = peakpick(float(threshold)) def do(self,myvec): self.pv.do(myvec,self.myfft) self.myod.do(self.myfft,self.myonset) - self.myod2.do(self.myfft,self.myonset2) - self.myonset.set(self.myonset.get(0,0)*self.myonset2.get(0,0),0,0) + if self.mode == 'dual': + self.myod2.do(self.myfft,self.myonset2) + self.myonset.set(self.myonset.get(0,0)*self.myonset2.get(0,0),0,0) return self.pp.do(self.myonset),self.myonset.get(0,0) +def getonsetsfunc(filein,threshold,silence,bufsize=1024,hopsize=512,mode='dual'): + #bufsize = 1024 + #hopsize = bufsize/2 + frameread = 0 + filei = sndfile(filein) + channels = filei.channels() + myvec = fvec(hopsize,channels) + readsize = filei.read(hopsize,myvec) + opick = onsetpick(bufsize,hopsize,channels,myvec,threshold,mode=mode) + mylist = list() + #ovalist = [0., 0., 0., 0., 0., 0.] + ovalist = [0., 0., 0., 0., 0.] + ofunclist = [] + while(readsize): + readsize = filei.read(hopsize,myvec) + isonset,val = opick.do(myvec) + if (aubio_silence_detection(myvec(),silence)): + isonset=0 + ovalist.append(val) + ovalist.pop(0) + ofunclist.append(val) + if (isonset == 1): + i=len(ovalist)-1 + # find local minima before peak + while ovalist[i-1] < ovalist[i] and i > 0: + i -= 1 + now = (frameread+1-i) + if now > 0 : + mylist.append(now) + else: + now = 0 + mylist.append(now) + frameread += 1 + return mylist, ofunclist + + +def getonsetscausal(filein,threshold,silence,bufsize=1024,hopsize=512,mode='dual'): + frameread = 0 + filei = sndfile(filein) + channels = filei.channels() + myvec = fvec(hopsize,channels) + readsize = filei.read(hopsize,myvec) + opick = onsetpick(bufsize,hopsize,channels,myvec,threshold,mode=mode) + mylist = list() + while(readsize): + readsize = filei.read(hopsize,myvec) + isonset,val = opick.do(myvec) + if (aubio_silence_detection(myvec(),silence)): + isonset=0 + if (isonset == 1): + now = frameread + if now > 0 : + mylist.append(now) + else: + now = 0 + mylist.append(now) + frameread += 1 + return mylist + + +def getonsets(filein,threshold=0.2,silence=-70.,bufsize=1024,hopsize=512,mode='dual'): + frameread = 0 + filei = sndfile(filein) + channels = filei.channels() + samplerate= filei.samplerate() + myvec = fvec(hopsize,channels) + readsize = filei.read(hopsize,myvec) + opick = onsetpick(bufsize,hopsize,channels,myvec,threshold,mode=mode) + mylist = list() + #ovalist = [0., 0., 0., 0., 0., 0.] + ovalist = [0., 0., 0., 0., 0.] + while(readsize): + readsize = filei.read(hopsize,myvec) + isonset,val = opick.do(myvec) + if (aubio_silence_detection(myvec(),silence)): + isonset=0 + ovalist.append(val) + ovalist.pop(0) + if (isonset == 1): + i=len(ovalist)-1 + # find local minima before peak + while ovalist[i-1] < ovalist[i] and i > 0: + i -= 1 + now = (frameread+1-i) + if now > 0 : + mylist.append(now) + else: + now = 0 + mylist.append(now) + frameread += 1 + return mylist + + class pitchpick: def __init__(self,bufsize,hopsize,channels,myvec,srate): self.myfft = cvec(bufsize,channels) diff --git a/python/aubiocut b/python/aubiocut index 19ac8a95..39188b2e 100755 --- a/python/aubiocut +++ b/python/aubiocut @@ -10,38 +10,13 @@ import sys bufsize = 1024 hopsize = bufsize/2 -def getonsets(filein,threshold): - frameread = 0 - filei = sndfile(filein) - srate = filei.samplerate() - channels = filei.channels() - myvec = fvec(hopsize,channels) - readsize = filei.read(hopsize,myvec) - opick = onsetpick(bufsize,hopsize,channels,myvec,threshold) - #newname = "%s%.8f%s" % ("/tmp/",0.0000000,filein[-4:]) - #fileo = sndfile(newname,model=filei) - mylist = list() - ovalist = [0., 0., 0., 0., 0., 0.] - while(readsize==hopsize): - readsize = filei.read(hopsize,myvec) - isonset,val = opick.do(myvec) - ovalist.append(val) - ovalist.pop(0) - if (isonset == 1): - i=len(ovalist)-1 - # find local minima - while ovalist[i-1] < ovalist[i] and i > 0: - i -= 1 - now = (frameread+1-i)*hopsize/(srate+0.) - mylist.append(now) - frameread += 1 - return mylist def cutfile(filein,onsets): frameread = 0 + zerothres = 0.002 readsize = hopsize filei = sndfile(filein) - srate = filei.samplerate() + framestep = hopsize/(filei.samplerate()+0.) channels = filei.channels() newname = "%s%f%s" % ("/tmp/",0.0000000,filein[-4:]) fileo = sndfile(newname,model=filei) @@ -49,13 +24,12 @@ def cutfile(filein,onsets): mycopy = fvec(hopsize,channels) while(readsize==hopsize): readsize = filei.read(hopsize,myvec) - now = (frameread)*hopsize/(srate+0.) # write to current file - if len(onsets) and now >= onsets[0]: + if len(onsets) and frameread >= onsets[0]: onsets.pop(0) # write up to 1st zero crossing zerocross = 0 - while ( abs( myvec.get(zerocross,0) ) > 0.002 ): + while ( abs( myvec.get(zerocross,0) ) > zerothres ): zerocross += 1 writesize = fileo.write(zerocross,myvec) fromcross = 0 @@ -66,8 +40,8 @@ def cutfile(filein,onsets): zerocross += 1 del fileo fileo = sndfile("%s%s%f%s%s" % - (filein.split(".")[0].split("/")[-1],".",now,".",filein.split(".")[-1]),model=filei) - # write after 1st zero crossing to new file + (filein.split(".")[0].split("/")[-1],".", + frameread*framestep,".",filein.split(".")[-1]),model=filei) writesize = fileo.write(fromcross,mycopy) else: writesize = fileo.write(readsize,myvec) diff --git a/python/aubioonset b/python/aubioonset index 5fc39fef..09fd918c 100755 --- a/python/aubioonset +++ b/python/aubioonset @@ -1,25 +1,52 @@ -#!/usr/bin/python +#! /usr/bin/python -def do(filein,threshold): - import aubio.aubioclass as aubio - hopsize = 512 - bufsize = 1024 - frameread = 0 - filei = aubio.sndfile(filein) - srate = filei.samplerate() - channels = filei.channels() - myvec = aubio.fvec(hopsize,channels) - readsize = filei.read(hopsize,myvec) - opick = aubio.onsetpick(bufsize,hopsize,channels,myvec,threshold) - mylist = list() - while(readsize==hopsize): - readsize = filei.read(hopsize,myvec) - isonset,val = opick.do(myvec) - if (isonset == 1): - now = (frameread-3)*hopsize/(srate+0.) - print "%.8f\t%.2f"% (now,val) - frameread += 1 +import sys +import numarray +from aubio.aubioclass import * -if __name__ == "__main__": - import sys - do(sys.argv[1],sys.argv[2]) +usage = "usage: %s [options] soundfile" % sys.argv[0] + +def parse_args(): + from optparse import OptionParser + parser = OptionParser(usage=usage) + parser.add_option("-v","--verbose", + action="store_true", dest="verbose", default=False, + help="make lots of noise") + parser.add_option("-q","--quiet", + action="store_false", dest="verbose", default=True, + help="be quiet [default]") + parser.add_option("-t","--threshold", + action="store", dest="threshold", default=0.3, + help="onset detection threshold [default=0.3]") + parser.add_option("-s","--silence", + action="store", dest="silence", default=-70, + help="silence [default=-70]") + def check_mode(option, opt, value, parser): + nvalue = parser.rargs[0] + if nvalue == 'complexdomain' : setattr(parser.values, option.dest, complexdomain) + elif nvalue == 'hfc' : setattr(parser.values, option.dest, hfc) + elif nvalue == 'phase' : setattr(parser.values, option.dest, phase) + elif nvalue == 'specdiff' : setattr(parser.values, option.dest, specdiff) + elif nvalue == 'energy' : setattr(parser.values, option.dest, energy) + elif nvalue == 'dual' : setattr(parser.values, option.dest, 'dual') + parser.add_option("-m","--mode", + action="callback", callback=check_mode, dest="mode", default='dual', + help="onsetdetection mode [default=dual]") + parser.add_option("-o","--outplot", + action="store", dest="outplot", default=None, + help="be quiet [default=None]") + (options, args) = parser.parse_args() + if not len(args): + print "no file name given\n", usage + sys.exit(1) + return options, args + +options, args = parse_args() + +filename = args[0] +threshold = float(options.threshold) +silence = float(options.silence) + +#onsets = getonsets(filename,threshold,silence,mode=options.mode) +onsets = getonsetscausal(filename,threshold,silence,mode=options.mode) +for i in onsets: print i*512./44100. -- 2.26.2