ref: 98df9f419f7c3b10300eeaa57bdbb0ef12ca2d9f
parent: ead2920de5e2d9665ab79239b2103062785fdf8f
author: Paul Brossier <piem@altern.org>
date: Sat May 28 17:06:33 EDT 2005
cleaned up getonsets, merged aubioonset and aubiocut, added some options
--- a/python/aubio/aubioclass.py
+++ b/python/aubio/aubioclass.py
@@ -95,9 +95,7 @@
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
+def getonsets(filein,threshold=0.2,silence=-70.,bufsize=1024,hopsize=512,mode='dual',localmin=False,storefunc=False):
frameread = 0
filei = sndfile(filein)
channels = filei.channels()
@@ -105,47 +103,29 @@
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 = []
+ if localmin:
+ ovalist = [0., 0., 0., 0., 0.]
+ if storefunc:
+ 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 localmin:
+ ovalist.append(val)
+ ovalist.pop(0)
+ if storefunc:
+ 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)
+ if localmin:
+ i=len(ovalist)-1
+ # find local minima before peak
+ while ovalist[i-1] < ovalist[i] and i > 0:
+ i -= 1
+ now = (frameread+1-i)
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
+ now = frameread
if now > 0 :
mylist.append(now)
else:
@@ -152,39 +132,45 @@
now = 0
mylist.append(now)
frameread += 1
- return mylist
+ if storefunc: return mylist, ofunclist
+ else: 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
+def cutfile(filein,slicetimes,zerothres=0.002,bufsize=1024,hopsize=512):
+ frameread = 0
+ readsize = hopsize
+ filei = sndfile(filein)
+ framestep = hopsize/(filei.samplerate()+0.)
+ channels = filei.channels()
+ newname = "%s%f%s" % ("/tmp/",0.0000000,filein[-4:])
+ fileo = sndfile(newname,model=filei)
+ myvec = fvec(hopsize,channels)
+ mycopy = fvec(hopsize,channels)
+ while(readsize==hopsize):
+ readsize = filei.read(hopsize,myvec)
+ # write to current file
+ if len(slicetimes) and frameread >= slicetimes[0]:
+ slicetimes.pop(0)
+ # write up to 1st zero crossing
+ zerocross = 0
+ while ( abs( myvec.get(zerocross,0) ) > zerothres ):
+ zerocross += 1
+ writesize = fileo.write(zerocross,myvec)
+ fromcross = 0
+ while (zerocross < readsize):
+ for i in range(channels):
+ mycopy.set(myvec.get(zerocross,i),fromcross,i)
+ fromcross += 1
+ zerocross += 1
+ del fileo
+ fileo = sndfile("%s%s%f%s%s" %
+ (filein.split(".")[0].split("/")[-1],".",
+ frameread*framestep,".",filein.split(".")[-1]),model=filei)
+ writesize = fileo.write(fromcross,mycopy)
+ else:
+ writesize = fileo.write(readsize,myvec)
+ frameread += 1
+ del fileo
+
class pitchpick:
def __init__(self,bufsize,hopsize,channels,myvec,srate):
--- a/python/aubiocut
+++ b/python/aubiocut
@@ -1,53 +1,131 @@
-#!/usr/bin/python
+#! /usr/bin/python
""" this file was written by Paul Brossier
it is released under the GNU/GPL license.
"""
+import sys
+import numarray
from aubio.aubioclass import *
-bufsize = 1024
-hopsize = bufsize/2
+usage = "usage: %s [options] -i soundfile" % sys.argv[0]
-def cutfile(filein,slicetimes,zerothres=0.002):
- frameread = 0
- readsize = hopsize
- filei = sndfile(filein)
- framestep = hopsize/(filei.samplerate()+0.)
- channels = filei.channels()
- newname = "%s%f%s" % ("/tmp/",0.0000000,filein[-4:])
- fileo = sndfile(newname,model=filei)
- myvec = fvec(hopsize,channels)
- mycopy = fvec(hopsize,channels)
- while(readsize==hopsize):
- readsize = filei.read(hopsize,myvec)
- # write to current file
- if len(slicetimes) and frameread >= slicetimes[0]:
- slicetimes.pop(0)
- # write up to 1st zero crossing
- zerocross = 0
- while ( abs( myvec.get(zerocross,0) ) > zerothres ):
- zerocross += 1
- writesize = fileo.write(zerocross,myvec)
- fromcross = 0
- while (zerocross < readsize):
- for i in range(channels):
- mycopy.set(myvec.get(zerocross,i),fromcross,i)
- fromcross += 1
- zerocross += 1
- del fileo
- fileo = sndfile("%s%s%f%s%s" %
- (filein.split(".")[0].split("/")[-1],".",
- frameread*framestep,".",filein.split(".")[-1]),model=filei)
- writesize = fileo.write(fromcross,mycopy)
- else:
- writesize = fileo.write(readsize,myvec)
- frameread += 1
- del fileo
+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')
-import sys
-filename = sys.argv[1]
-threshold = 0.2
-if (len(sys.argv) > 2): threshold = sys.argv[2]
-onsets = getonsets(filename,threshold)
-cutfile(filename,onsets)
+def parse_args():
+ from optparse import OptionParser
+ parser = OptionParser(usage=usage)
+ parser.add_option("-i","--input",
+ action="store", dest="filename",
+ help="input sound file")
+ parser.add_option("-m","--mode", action="callback",
+ callback=check_mode, dest="mode", default='dual',
+ help="onsetdetection mode [default=dual] \
+ complexdomain|hfc|phase|specdiff|energy|dual")
+ parser.add_option("-B","--bufsize",
+ action="store", dest="bufsize", default=1024,
+ help="buffer size [default=1024]")
+ parser.add_option("-H","--hopsize",
+ action="store", dest="hopsize", default=512,
+ help="overlap size [default=512]")
+ parser.add_option("-t","--threshold",
+ action="store", dest="threshold", default=0.3,
+ help="onset peak picking threshold [default=0.3]")
+ parser.add_option("-s","--silence",
+ action="store", dest="silence", default=-70,
+ help="silence threshold [default=-70]")
+ parser.add_option("-M","--mintol",
+ action="store", dest="mintol", default=0.048,
+ help="minimum inter onset interval [default=0.048]")
+ parser.add_option("-D","--delay",
+ action="store", dest="delay", default=0.022,
+ help="number of seconds to take back [default=0.022]")
+ parser.add_option("-L","--localmin",
+ action="store_true", dest="localmin", default=False,
+ help="use local minima after peak detection")
+ parser.add_option("-c","--cut",
+ action="store_true", dest="cut", default=False,
+ help="cut input sound file at detected labels \
+ best used with option -L")
+ # to be implemented
+ # plotting functions
+ parser.add_option("-d","--derivative",
+ action="store_true", dest="derivative", default=False,
+ help="NOT IMPLEMENTED derivate onset detection function")
+ parser.add_option("-p","--plot",
+ action="store_true", dest="doplot", default=False,
+ help="NOT IMPLEMENTED draw plot")
+ parser.add_option("-O","--outplot",
+ action="store", dest="output-plot", default=None,
+ help="NOT IMPLEMENTED save plot to output.{ps,png}")
+ parser.add_option("-z","--zerocross",
+ action="store_true", dest="zerocross", default=False,
+ help="NOT IMPLEMENTED zero crossing matching")
+ parser.add_option("-b","--beat",
+ action="store_true", dest="beat", default=False,
+ help="NOT IMPLEMENTED output beat locations")
+ parser.add_option("-v","--verbose",
+ action="store_true", dest="verbose", default=False,
+ help="make lots of noise [default]")
+ parser.add_option("-q","--quiet",
+ action="store_false", dest="verbose", default=False,
+ help="be quiet")
+ (options, args) = parser.parse_args()
+ if not options.filename:
+ print "no file name given\n", usage
+ sys.exit(1)
+ return options, args
+
+options, args = parse_args()
+
+filename = options.filename
+samplerate = float(sndfile(filename).samplerate())
+hopsize = options.hopsize
+bufsize = options.bufsize
+threshold = float(options.threshold)
+silence = float(options.silence)
+mintol = float(options.mintol)*samplerate/hopsize
+delay = float(options.delay)
+
+if options.beat:
+ #onsets = getbeats(filename,threshold,silence,mode=options.mode)
+ exit("not implemented yet")
+else:
+ onsets = getonsets(filename,threshold,silence,
+ mode=options.mode,localmin=options.localmin,
+ bufsize=bufsize,hopsize=hopsize)
+
+# take back system delay
+if delay != 0:
+ for i in range(len(onsets)):
+ onsets[i] -= delay*samplerate/hopsize
+
+# prune doubled
+if mintol > 0:
+ last = -2*mintol
+ newonsets = []
+ for new in onsets:
+ if (new - last > mintol):
+ newonsets.append(new)
+ last = new
+ onsets = newonsets
+
+# print times in second
+if options.verbose:
+ for i in onsets: print "%f" % (i*hopsize/samplerate)
+
+if options.cut:
+ cutfile(filename,onsets,bufsize=bufsize,hopsize=hopsize)
--- a/python/aubioonset
+++ /dev/null
@@ -1,72 +1,0 @@
-#! /usr/bin/python
-
-import sys
-import numarray
-from aubio.aubioclass import *
-
-usage = "usage: %s [options] soundfile" % sys.argv[0]
-
-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')
-
-def parse_args():
- from optparse import OptionParser
- parser = OptionParser(usage=usage)
- parser.add_option("-m","--mode", action="callback",
- callback=check_mode, dest="mode", default='dual',
- help="onsetdetection mode [default=dual] \
- complexdomain|hfc|phase|specdiff|energy|dual")
- parser.add_option("-o","--outplot",
- action="store", dest="outplot", default=None,
- help="be quiet [default=None]")
- 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]")
- parser.add_option("-M","--mintol",
- action="store", dest="mintol", default=0.048,
- help="minimum inter onset interval [default=0.048]")
- 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]")
- (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)
-
-# print all
-#for i in onsets: print i*512./44100.
-# prune doubled
-last = -10.
-mintol = float(options.mintol)
-for i in onsets:
- new = i*512./44100.
- if (new - last > mintol): print "%f" % new
- last = new