use os conditionals, update python swig and puredata external Makefiles
[aubio.git] / python / aubiocut
index 11583ef8dbcc02dc07ccc7bbd867da5d9ea1546b..7f1b4735cbe1c1b55bbf12c35b8f72d16ce35d02 100755 (executable)
@@ -5,7 +5,7 @@
 """
 
 import sys
-from aubio.aubioclass import *
+from aubio.task import *
 
 usage = "usage: %s [options] -i soundfile" % sys.argv[0]
 
@@ -15,19 +15,22 @@ def parse_args():
         parser.add_option("-i","--input",
                           action="store", dest="filename", 
                           help="input sound file")
-        parser.add_option("-m","--mode", action="callback", 
-                          callback=check_onset_mode, dest="mode", default='dual', 
+        parser.add_option("-m","--mode", 
+                         action="store", dest="mode", default='dual', 
                           help="onset detection mode [default=dual] \
                           complexdomain|hfc|phase|specdiff|energy|kl|mkl|dual")
         parser.add_option("-B","--bufsize",
                           action="store", dest="bufsize", default=512, 
-                          help="buffer size [default=1024]")
+                          help="buffer size [default=512]")
         parser.add_option("-H","--hopsize",
                           action="store", dest="hopsize", default=256, 
                           help="overlap size [default=256]")
         parser.add_option("-t","--threshold",
-                          action="store", dest="threshold", default=0.650, 
-                          help="onset peak picking threshold [default=0.650]")
+                          action="store", dest="threshold", default=0.3, 
+                          help="onset peak picking threshold [default=0.3]")
+        parser.add_option("-C","--dcthreshold",
+                          action="store", dest="dcthreshold", default=1., 
+                          help="onset peak picking DC component [default=1.]")
         parser.add_option("-s","--silence",
                           action="store", dest="silence", default=-70, 
                           help="silence threshold [default=-70]")
@@ -58,9 +61,24 @@ def parse_args():
         parser.add_option("-p","--plot",
                           action="store_true", dest="plot", default=False, 
                           help="draw plot")
+        parser.add_option("-x","--xsize",
+                          action="store", dest="xsize", default=1., 
+                          type='float', help="define xsize for plot")
+        parser.add_option("-y","--ysize",
+                          action="store", dest="ysize", default=1., 
+                          type='float', help="define ysize for plot")
+        parser.add_option("-f","--function",
+                          action="store_true", dest="func", default=False, 
+                          help="print detection function")
+        parser.add_option("-n","--no-onsets",
+                          action="store_true", dest="nplot", default=False, 
+                          help="do not plot detected onsets")
         parser.add_option("-O","--outplot",
                           action="store", dest="outplot", default=None, 
                           help="save plot to output.{ps,png}")
+        parser.add_option("-F","--spectrogram",
+                          action="store_true", dest="spectro", default=False,
+                          help="add spectrogram to the plot")
         parser.add_option("-v","--verbose",
                           action="store_true", dest="verbose", default=False,
                           help="make lots of noise [default]")
@@ -70,7 +88,7 @@ def parse_args():
         # to be implemented
         parser.add_option("-b","--beat",
                           action="store_true", dest="beat", default=False,
-                          help="NOT IMPLEMENTED output beat locations")
+                          help="output beat locations")
         (options, args) = parser.parse_args()
         if not options.filename: 
                  print "no file name given\n", usage
@@ -80,57 +98,59 @@ def parse_args():
 options, args = parse_args()
 
 filename   = options.filename
-samplerate = float(sndfile(filename).samplerate())
-hopsize    = int(options.hopsize)
-bufsize    = int(options.bufsize)
-step       = float(samplerate)/float(hopsize)
-threshold  = float(options.threshold)
-zerothres  = float(options.zerothres)
-silence    = float(options.silence)
-mintol     = float(options.mintol)*step
+params = taskparams()
+params.hopsize    = int(options.hopsize)
+params.bufsize    = int(options.bufsize)
+params.threshold  = float(options.threshold)
+params.dcthreshold = float(options.dcthreshold)
+params.zerothres  = float(options.zerothres)
+params.silence    = float(options.silence)
+params.mintol     = float(options.mintol)
+params.verbose    = options.verbose
 # default take back system delay
-if options.delay: delay = float(options.delay)
-else:             delay = 3./step
+if options.delay: params.delay = int(float(options.delay)/params.step)
 
+dotask = taskonset
 if options.beat:
-        #onsets = getbeats(filename,threshold,silence,mode=options.mode)
-        exit("not implemented yet")
+       dotask = taskbeat
 elif options.silencecut:
-        onsets = getsilences(filename,hopsize=hopsize,silence=silence)
-elif options.plot:
-        onsets, ofunc = getonsets(filename,threshold,silence,
-                mode=options.mode,localmin=options.localmin,
-                derivate=options.derivate,
-                bufsize=bufsize,hopsize=hopsize,storefunc=True)
-else:
-        onsets = getonsets(filename,threshold,silence,
-                mode=options.mode,localmin=options.localmin,
-                derivate=options.derivate,
-                bufsize=bufsize,hopsize=hopsize)
+       dotask = tasksilence
+elif options.plot or options.func: 
+       params.storefunc=True
+else:              
+       params.storefunc=False
+
+lonsets, lofunc = [], []
+wplot,oplots = [],[]
+modes = options.mode.split(',')
+for i in range(len(modes)):
+       params.onsetmode = modes[i] 
+       filetask = dotask(filename,params=params)
+       onsets = filetask.compute_all()
 
-# take back system delay
-if delay != 0:
-        for i in range(len(onsets)):
-                onsets[i] -= delay*step
+        #lonsets.append(onsets)
+       if not options.silencecut:
+               ofunc = filetask.ofunc
+               lofunc.append(ofunc)
 
-# prune doubled 
-if mintol > 0:
-        last = -2*mintol
-        newonsets = []
-        for new in onsets:
-                if (new - last > mintol): 
-                        newonsets.append(new)
-                last = new
-        onsets = newonsets
+       if options.plot:
+               if options.beat: 
+                       filetask.plot(oplots, onsets)
+               else:
+                       filetask.plot(onsets, ofunc, wplot, oplots, nplot=options.nplot)
 
-# print times in second
-if options.verbose:
-        for i in onsets: print "%f" % (i/step)
+       if options.func: 
+               for i in ofunc: 
+                       print i 
 
-if options.plot:
-        from aubio.gnuplot import plot_onsets
-        plot_onsets(filename, onsets, ofunc, 
-                samplerate=samplerate, hopsize=hopsize, outplot=options.outplot)
+if options.outplot:
+  extension = options.outplot.split('.')[-1] 
+  outplot = '.'.join(options.outplot.split('.')[:-1])
+else:
+  extension,outplot = None,None
+if options.plot: filetask.plotplot(wplot, oplots, outplot=outplot, extension=extension,
+  xsize=options.xsize,ysize=options.ysize,spectro=options.spectro)
 
 if options.cut:
-        cutfile(filename,onsets,zerothres=zerothres,bufsize=bufsize,hopsize=hopsize)
+        a = taskcut(filename,onsets,params=params)
+       a.compute_all()