src/onset: use a string to set onset mode, keeping onset types enum private, update...
authorPaul Brossier <piem@piem.org>
Thu, 15 Oct 2009 15:09:34 +0000 (17:09 +0200)
committerPaul Brossier <piem@piem.org>
Thu, 15 Oct 2009 15:09:34 +0000 (17:09 +0200)
16 files changed:
examples/aubiotrack.c
examples/utils.c
examples/utils.h
plugins/puredata/aubioonset~.c
plugins/puredata/aubiotempo~.c
python/aubio/aubioclass.py
src/onset/onset.c
src/onset/onset.h
src/onset/onsetdetection.c
src/onset/onsetdetection.h
src/tempo/tempo.c
src/tempo/tempo.h
swig/aubio.i
tests/src/test-onset.c
tests/src/test-onsetdetection.c
tests/src/test-tempo.c

index 65a7a33080fa76b06e6b86214ddccf4e0b693e92..233b6b35504c711681414bfca32317523a2577e5 100644 (file)
@@ -80,7 +80,7 @@ int main(int argc, char **argv) {
   examples_common_init(argc,argv);
 
   out = new_fvec(2,channels);
-  bt  = new_aubio_tempo(type_onset,buffer_size,overlap_size,channels);
+  bt  = new_aubio_tempo(onset_mode,buffer_size,overlap_size,channels);
 
   examples_common_process(aubio_process,process_print);
 
index 3800e4cae47ce3ae187460b5d911dd630af21f36..5fc764256592b8b62a5f83e3b3c7557246aa691c 100644 (file)
@@ -45,8 +45,7 @@ int frames_delay = 0;
 
 
 /* energy,specdiff,hfc,complexdomain,phase */
-aubio_onsetdetection_type type_onset = aubio_onset_kl;
-aubio_onsetdetection_type type_onset2 = aubio_onset_complex;
+char_t * onset_mode = "default";
 smpl_t threshold = 0.3;
 smpl_t silence = -90.;
 uint_t buffer_size = 512;       //1024;
@@ -91,7 +90,6 @@ uint_t isready = 0;
 
 
 /* badly redeclare some things */
-aubio_onsetdetection_type type_onset;
 smpl_t threshold;
 smpl_t averaging;
 const char *prog_name;
@@ -163,29 +161,7 @@ parse_args (int argc, char **argv)
         usejack = 1;
         break;
       case 'O':                /*onset type */
-        if (strcmp (optarg, "energy") == 0)
-          type_onset = aubio_onset_energy;
-        else if (strcmp (optarg, "specdiff") == 0)
-          type_onset = aubio_onset_specdiff;
-        else if (strcmp (optarg, "hfc") == 0)
-          type_onset = aubio_onset_hfc;
-        else if (strcmp (optarg, "complexdomain") == 0)
-          type_onset = aubio_onset_complex;
-        else if (strcmp (optarg, "complex") == 0)
-          type_onset = aubio_onset_complex;
-        else if (strcmp (optarg, "phase") == 0)
-          type_onset = aubio_onset_phase;
-        else if (strcmp (optarg, "mkl") == 0)
-          type_onset = aubio_onset_mkl;
-        else if (strcmp (optarg, "kl") == 0)
-          type_onset = aubio_onset_kl;
-        else if (strcmp (optarg, "specflux") == 0)
-          type_onset = aubio_onset_specflux;
-        else {
-          errmsg ("unknown onset type.\n");
-          abort ();
-        }
-        usedoubled = 0;
+        onset_mode = optarg;
         break;
       case 's':                /* threshold value for onset */
         silence = (smpl_t) atof (optarg);
@@ -331,12 +307,8 @@ examples_common_init (int argc, char **argv)
   pv = new_aubio_pvoc (buffer_size, overlap_size, channels);
   /* onsets */
   parms = new_aubio_peakpicker (threshold);
-  o = new_aubio_onsetdetection (type_onset, buffer_size, channels);
+  o = new_aubio_onsetdetection (onset_mode, buffer_size, channels);
   onset = new_fvec (1, channels);
-  if (usedoubled) {
-    o2 = new_aubio_onsetdetection (type_onset2, buffer_size, channels);
-    onset2 = new_fvec (1, channels);
-  }
 
 }
 
index 4bf51204c61f9767fd088e30b2eaaf21a2b0fdec..3a857aa14a5f73b555c1b9948d62a929a2b596f5 100644 (file)
@@ -78,8 +78,7 @@ extern int usedoubled;
 
 
 /* energy,specdiff,hfc,complexdomain,phase */
-extern aubio_onsetdetection_type type_onset;
-extern aubio_onsetdetection_type type_onset2;
+extern char_t * onset_mode;
 extern smpl_t threshold;
 extern smpl_t silence;
 extern uint_t buffer_size;
index 2906ce30bcd53b0d1f937a4d73bf714bb66a3b3e..9236d4d7812331addfee35cf1974261217b9c1e8 100644 (file)
@@ -87,7 +87,7 @@ static void *aubioonset_tilde_new (t_floatarg f)
        x->bufsize   = 1024;
        x->hopsize   = x->bufsize / 2;
 
-       x->o = new_aubio_onsetdetection(aubio_onset_complex, x->bufsize, 1);
+       x->o = new_aubio_onsetdetection("complex", x->bufsize, 1);
        x->vec = (fvec_t *)new_fvec(x->hopsize,1);
        x->pv = (aubio_pvoc_t *)new_aubio_pvoc(x->bufsize, x->hopsize, 1);
        x->fftgrain  = (cvec_t *)new_cvec(x->bufsize,1);
index 8bc5aa442bfdc21364d0db9e05e8e66a089ee29b..32cd40120bd628588f1c61e22e611708a71342b7 100644 (file)
@@ -82,7 +82,7 @@ static void *aubiotempo_tilde_new (t_floatarg f)
   x->bufsize   = 1024;
   x->hopsize   = x->bufsize / 2;
 
-  x->t = new_aubio_tempo (aubio_onset_complex, x->bufsize, x->hopsize, 1);
+  x->t = new_aubio_tempo ("complex", x->bufsize, x->hopsize, 1);
   aubio_tempo_set_silence(x->t,x->silence);
   aubio_tempo_set_threshold(x->t,x->threshold);
   x->output = (fvec_t *)new_fvec(2,1);
index 18f6ce16d2d9bb17f4f5b3d25a015108cbe355c5..6ec95ace002c931c2abad72b6341e944c9c28c4f 100644 (file)
@@ -69,8 +69,8 @@ class pvoc:
 
 class onsetdetection:
     """ class for aubio_onsetdetection """
-    def __init__(self,type,buf,chan):
-        self.od = new_aubio_onsetdetection(type,buf,chan)
+    def __init__(self,mode,buf,chan):
+        self.od = new_aubio_onsetdetection(mode,buf,chan)
     def do(self,tc,tf):
         aubio_onsetdetection_do(self.od,tc(),tf())
     def __del__(self):
@@ -93,8 +93,8 @@ class onsetpick:
         self.myfft    = cvec(bufsize,channels)
         self.pv       = pvoc(bufsize,hopsize,channels)
         if mode in ['dual'] :
-                self.myod     = onsetdetection(aubio_onset_hfc,bufsize,channels)
-                self.myod2    = onsetdetection(aubio_onset_mkl,bufsize,channels)
+                self.myod     = onsetdetection("hfc",bufsize,channels)
+                self.myod2    = onsetdetection("mkl",bufsize,channels)
                 self.myonset  = fvec(1,channels)
                 self.myonset2 = fvec(1,channels)
         else: 
index 296aafc1b289f6b4d09494f3af0a09d3f92c22c0..b906469905cd2075e82b76344bf6bfb10ea7d9c4 100644 (file)
@@ -88,7 +88,7 @@ void aubio_onset_set_minioi(aubio_onset_t * o, uint_t minioi) {
 }
 
 /* Allocate memory for an onset detection */
-aubio_onset_t * new_aubio_onset (aubio_onsetdetection_type type_onset
+aubio_onset_t * new_aubio_onset (char_t * onset_mode
     uint_t buf_size, uint_t hop_size, uint_t channels)
 {
   aubio_onset_t * o = AUBIO_NEW(aubio_onset_t);
@@ -99,11 +99,11 @@ aubio_onset_t * new_aubio_onset (aubio_onsetdetection_type type_onset,
   o->wasonset  = 0;
   o->pv = new_aubio_pvoc(buf_size, hop_size, channels);
   o->pp = new_aubio_peakpicker(o->threshold);
-  o->od = new_aubio_onsetdetection(type_onset,buf_size,channels);
+  o->od = new_aubio_onsetdetection(onset_mode,buf_size,channels);
   o->fftgrain = new_cvec(buf_size,channels);
   o->of = new_fvec(1, channels);
   /*if (usedoubled)    {
-    o2 = new_aubio_onsetdetection(type_onset2,buffer_size,channels);
+    o2 = new_aubio_onsetdetection(onset_type2,buffer_size,channels);
     onset2 = new_fvec(1 , channels);
   }*/
   return o;
index 8e7e7e31a66edf98d5b2152abeab48907a221b53..2ec8803cfd310fb42c2c4ecf523a9095dfd96543 100644 (file)
@@ -51,7 +51,7 @@ typedef struct _aubio_onset_t aubio_onset_t;
   \param channels number of channels 
 
 */
-aubio_onset_t * new_aubio_onset (aubio_onsetdetection_type type_onset
+aubio_onset_t * new_aubio_onset (char_t * onset_mode
     uint_t buf_size, uint_t hop_size, uint_t channels);
 
 /** execute onset detection
index 62163808d019208cf09052f496f64c128f177619..d15e7e2699bcc56e3ace59287a1b8670207ea3c3 100644 (file)
@@ -123,9 +123,21 @@ void aubio_onsetdetection_mkl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec
 */
 void aubio_onsetdetection_specflux(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset);
 
+/** onsetdetection types */
+typedef enum {
+        aubio_onset_energy,         /**< energy based */          
+        aubio_onset_specdiff,       /**< spectral diff */         
+        aubio_onset_hfc,            /**< high frequency content */
+        aubio_onset_complex,        /**< complex domain */        
+        aubio_onset_phase,          /**< phase fast */            
+        aubio_onset_kl,             /**< Kullback Liebler */
+        aubio_onset_mkl,            /**< modified Kullback Liebler */
+        aubio_onset_specflux,       /**< spectral flux */
+} aubio_onsetdetection_type;
+
 /** structure to store object state */
 struct _aubio_onsetdetection_t {
-  aubio_onsetdetection_type type; /**< onset detection type */
+  aubio_onsetdetection_type onset_type; /**< onset detection type */
   /** Pointer to aubio_onsetdetection_<type> function */
   void (*funcpointer)(aubio_onsetdetection_t *o,
       cvec_t * fftgrain, fvec_t * onset);
@@ -304,11 +316,34 @@ aubio_onsetdetection_do (aubio_onsetdetection_t *o, cvec_t * fftgrain,
  * depending on the choosen type, allocate memory as needed
  */
 aubio_onsetdetection_t * 
-new_aubio_onsetdetection (aubio_onsetdetection_type type, 
+new_aubio_onsetdetection (char_t * onset_mode, 
     uint_t size, uint_t channels){
   aubio_onsetdetection_t * o = AUBIO_NEW(aubio_onsetdetection_t);
   uint_t rsize = size/2+1;
-  switch(type) {
+  aubio_onsetdetection_type onset_type;
+  if (strcmp (onset_mode, "energy") == 0)
+      onset_type = aubio_onset_energy;
+  else if (strcmp (onset_mode, "specdiff") == 0)
+      onset_type = aubio_onset_specdiff;
+  else if (strcmp (onset_mode, "hfc") == 0)
+      onset_type = aubio_onset_hfc;
+  else if (strcmp (onset_mode, "complexdomain") == 0)
+      onset_type = aubio_onset_complex;
+  else if (strcmp (onset_mode, "complex") == 0)
+      onset_type = aubio_onset_complex;
+  else if (strcmp (onset_mode, "phase") == 0)
+      onset_type = aubio_onset_phase;
+  else if (strcmp (onset_mode, "mkl") == 0)
+      onset_type = aubio_onset_mkl;
+  else if (strcmp (onset_mode, "kl") == 0)
+      onset_type = aubio_onset_kl;
+  else if (strcmp (onset_mode, "specflux") == 0)
+      onset_type = aubio_onset_specflux;
+  else {
+      AUBIO_ERR("unknown onset type.\n");
+      return NULL;
+  }
+  switch(onset_type) {
     /* for both energy and hfc, only fftgrain->norm is required */
     case aubio_onset_energy: 
       break;
@@ -347,7 +382,7 @@ new_aubio_onsetdetection (aubio_onsetdetection_type type,
    * detections on the fly. this would need getting rid of the switch
    * above and always allocate all the structure */
 
-  switch(type) {
+  switch(onset_type) {
     case aubio_onset_energy:
       o->funcpointer = aubio_onsetdetection_energy;
       break;
@@ -375,12 +410,12 @@ new_aubio_onsetdetection (aubio_onsetdetection_type type,
     default:
       break;
   }
-  o->type = type;
+  o->onset_type = onset_type;
   return o;
 }
 
 void del_aubio_onsetdetection (aubio_onsetdetection_t *o){
-  switch(o->type) {
+  switch(o->onset_type) {
     /* for both energy and hfc, only fftgrain->norm is required */
     case aubio_onset_energy: 
       break;
index 978005a16cf2f657325d65f8686dd9e142ac0a67..a1d7ec41abd06320ee53b27ad15fc9878661dfa4 100644 (file)
 extern "C" {
 #endif
 
-/** onsetdetection types */
-typedef enum {
-        aubio_onset_energy,         /**< energy based */          
-        aubio_onset_specdiff,       /**< spectral diff */         
-        aubio_onset_hfc,            /**< high frequency content */
-        aubio_onset_complex,        /**< complex domain */        
-        aubio_onset_phase,          /**< phase fast */            
-        aubio_onset_kl,             /**< Kullback Liebler */
-        aubio_onset_mkl,            /**< modified Kullback Liebler */
-        aubio_onset_specflux,       /**< spectral flux */
-} aubio_onsetdetection_type;
-
 /** onsetdetection structure */
 typedef struct _aubio_onsetdetection_t aubio_onsetdetection_t;
 /** execute onset detection function on a spectral frame 
@@ -69,7 +57,7 @@ void aubio_onsetdetection_do (aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec
   \param channels number of input channels
 
 */
-aubio_onsetdetection_t * new_aubio_onsetdetection(aubio_onsetdetection_type type, uint_t size, uint_t channels);
+aubio_onsetdetection_t * new_aubio_onsetdetection(char_t * onset_mode, uint_t buf_size, uint_t channels);
 /** deletion of an onset detection object
 
   \param o onset detection object as returned by new_aubio_onsetdetection()
index 2d949c0dcfb1abf876106a066824293019130db2..87e4404240f50e342cef82e3da3632d520628271 100644 (file)
@@ -98,7 +98,7 @@ void aubio_tempo_set_threshold(aubio_tempo_t * o, smpl_t threshold) {
 }
 
 /* Allocate memory for an tempo detection */
-aubio_tempo_t * new_aubio_tempo (aubio_onsetdetection_type type_onset
+aubio_tempo_t * new_aubio_tempo (char_t * onset_mode
     uint_t buf_size, uint_t hop_size, uint_t channels)
 {
   aubio_tempo_t * o = AUBIO_NEW(aubio_tempo_t);
@@ -113,7 +113,7 @@ aubio_tempo_t * new_aubio_tempo (aubio_onsetdetection_type type_onset,
   o->out      = new_fvec(o->step,channels);
   o->pv       = new_aubio_pvoc(buf_size, hop_size, channels);
   o->pp       = new_aubio_peakpicker(o->threshold);
-  o->od       = new_aubio_onsetdetection(type_onset,buf_size,channels);
+  o->od       = new_aubio_onsetdetection(onset_mode,buf_size,channels);
   o->of       = new_fvec(1, channels);
   o->bt       = new_aubio_beattracking(o->winlen,channels);
   /*if (usedoubled)    {
index 0c3f7721c0c4f187f75b3eca528817a722c4e464..ed3391670fff5381aa1b1a453d2a8c227cefeaeb 100644 (file)
@@ -37,7 +37,7 @@ extern "C" {
 typedef struct _aubio_tempo_t aubio_tempo_t;
 
 /** create tempo detection object */
-aubio_tempo_t * new_aubio_tempo (aubio_onsetdetection_type type_onset
+aubio_tempo_t * new_aubio_tempo (char_t * mode
     uint_t buf_size, uint_t hop_size, uint_t channels);
 
 /** execute tempo detection */
index 984c99a2d45d6132f28eae0edcd4072807c853a6..8842cce5d5d7cc16ce2e135f20a295868c9dfea7 100644 (file)
@@ -187,17 +187,7 @@ extern void del_aubio_resampler(aubio_resampler_t *s);
 %#endif /* HAVE_SAMPLERATE */
 
 /* onset detection */
-typedef enum { 
-        aubio_onset_energy, 
-        aubio_onset_specdiff, 
-        aubio_onset_hfc, 
-        aubio_onset_complex, 
-        aubio_onset_phase, 
-        aubio_onset_kl, 
-        aubio_onset_mkl, 
-        aubio_onset_specflux,
-} aubio_onsetdetection_type;
-aubio_onsetdetection_t * new_aubio_onsetdetection(aubio_onsetdetection_type type, uint_t size, uint_t channels);
+aubio_onsetdetection_t * new_aubio_onsetdetection(char * onset_mode, uint_t size, uint_t channels);
 void aubio_onsetdetection_do (aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset);
 void del_aubio_onsetdetection(aubio_onsetdetection_t *o);
 
index 370cd03b37cc31ebe528e4b899aa08be8ab9a327..93ded23ef66a0cfefd96d6e1fd6c77377154513d 100644 (file)
@@ -6,7 +6,7 @@ int main(){
         uint_t channels   = 1;                          /* number of channel */
         fvec_t * in       = new_fvec (win_s/4, channels); /* input buffer */
         fvec_t * out      = new_fvec (2, channels);     /* input buffer */
-        aubio_onset_t * onset  = new_aubio_onset(aubio_onset_complex, win_s, win_s/4, channels);
+        aubio_onset_t * onset  = new_aubio_onset("complex", win_s, win_s/4, channels);
         uint_t i = 0;
 
         while (i < 10) {
index 64a780e6d2cc4f5d8b091d15752dbfb55733b9e9..77ef7a8fabb871bf47e2cf08ec2da8360e0f8e62 100644 (file)
@@ -11,31 +11,31 @@ main ()
 
   aubio_onsetdetection_t *o;
   
-  o = new_aubio_onsetdetection (aubio_onset_energy, win_s, channels);
+  o = new_aubio_onsetdetection ("energy", win_s, channels);
   aubio_onsetdetection_do (o, in, out);
   del_aubio_onsetdetection (o);
 
-  o = new_aubio_onsetdetection (aubio_onset_specdiff, win_s, channels);
+  o = new_aubio_onsetdetection ("energy", win_s, channels);
   aubio_onsetdetection_do (o, in, out);
   del_aubio_onsetdetection (o);
 
-  o = new_aubio_onsetdetection (aubio_onset_hfc, win_s, channels);
+  o = new_aubio_onsetdetection ("hfc", win_s, channels);
   aubio_onsetdetection_do (o, in, out);
   del_aubio_onsetdetection (o);
 
-  o = new_aubio_onsetdetection (aubio_onset_complex, win_s, channels);
+  o = new_aubio_onsetdetection ("complex", win_s, channels);
   aubio_onsetdetection_do (o, in, out);
   del_aubio_onsetdetection (o);
 
-  o = new_aubio_onsetdetection (aubio_onset_phase, win_s, channels);
+  o = new_aubio_onsetdetection ("phase", win_s, channels);
   aubio_onsetdetection_do (o, in, out);
   del_aubio_onsetdetection (o);
 
-  o = new_aubio_onsetdetection (aubio_onset_kl, win_s, channels);
+  o = new_aubio_onsetdetection ("kl", win_s, channels);
   aubio_onsetdetection_do (o, in, out);
   del_aubio_onsetdetection (o);
 
-  o = new_aubio_onsetdetection (aubio_onset_mkl, win_s, channels);
+  o = new_aubio_onsetdetection ("mkl", win_s, channels);
   aubio_onsetdetection_do (o, in, out);
   del_aubio_onsetdetection (o);
 
index 0c1ee25fd36e2a39907aa15b2f9eeea6537e97de..fb4d2f3ce2e954d0994fa05eed363c3fb9710857 100644 (file)
@@ -7,7 +7,7 @@ int main(){
         uint_t channels   = 1;                          /* number of channel */
         fvec_t * in       = new_fvec (win_s, channels); /* input buffer */
         fvec_t * out      = new_fvec (2, channels);     /* input buffer */
-        aubio_tempo_t * o  = new_aubio_tempo(aubio_onset_complex, win_s, win_s/4, channels);
+        aubio_tempo_t * o  = new_aubio_tempo("complex", win_s, win_s/4, channels);
         uint_t i = 0;
 
         smpl_t curtempo, curtempoconf;