examples/: large refactoring, improve option management, remove old stuff, move block...
[aubio.git] / examples / aubiotrack.c
index d4b4b41..b862c2b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
+  Copyright (C) 2003-2013 Paul Brossier <piem@aubio.org>
 
   This file is part of aubio.
 
 #define PROG_HAS_TEMPO 1
 #include "parse_args.h"
 
-uint_t pos = 0;    /* frames%dspblocksize */
-aubio_tempo_t * bt = NULL;
+aubio_tempo_t * tempo;
 aubio_wavetable_t *wavetable;
-fvec_t * tempo_out = NULL;
+fvec_t * tempo_out;
 smpl_t istactus = 0;
 smpl_t isonset = 0;
 
-static int aubio_process(smpl_t **input, smpl_t **output, int nframes) {
-  unsigned int j;       /*frames*/
-  for (j=0;j<(unsigned)nframes;j++) {
-    if(usejack) {
-      /* write input to datanew */
-      fvec_write_sample(ibuf, input[0][j], pos);
-      /* put synthnew in output */
-      output[0][j] = fvec_read_sample(obuf, pos);
-    }
-    /*time for fft*/
-    if (pos == overlap_size-1) {
-      /* block loop */
-      aubio_tempo_do (bt,ibuf,tempo_out);
-      istactus = fvec_read_sample (tempo_out, 0);
-      isonset = fvec_read_sample (tempo_out, 1);
-      fvec_zeros (obuf);
-      if (istactus > 0.) {
-        aubio_wavetable_play ( wavetable );
-      } else {
-        aubio_wavetable_stop ( wavetable );
-      }
-      aubio_wavetable_do (wavetable, obuf, obuf);
-      /* end of block loop */
-      pos = -1; /* so it will be zero next j loop */
-    }
-    pos++;
+void process_block(fvec_t * ibuf, fvec_t *obuf) {
+  aubio_tempo_do (tempo, ibuf, tempo_out);
+  istactus = fvec_read_sample (tempo_out, 0);
+  isonset = fvec_read_sample (tempo_out, 1);
+  fvec_zeros (obuf);
+  if (istactus > 0.) {
+    aubio_wavetable_play ( wavetable );
+  } else {
+    aubio_wavetable_stop ( wavetable );
   }
-  return 1;
+  aubio_wavetable_do (wavetable, obuf, obuf);
 }
 
-static void process_print (void) {
-  if (sink_uri == NULL) {
-    if (istactus) {
-      outmsg("%f\n",((smpl_t)(frames*overlap_size)+(istactus-1.)*overlap_size)/(smpl_t)samplerate);
-    }
-    if (isonset && verbose)
-      outmsg(" \t \t%f\n",(frames)*overlap_size/(float)samplerate);
+void process_print (void) {
+  if (istactus) {
+    outmsg("%f\n", aubio_tempo_get_last_s(tempo) );
   }
+  //if (isonset && verbose)
+  //  outmsg(" \t \t%f\n",(blocks)*hop_size/(float)samplerate);
 }
 
 int main(int argc, char **argv) {
-  
+  // override general settings from utils.c
   buffer_size = 1024;
-  overlap_size = 512;
-  /* override default settings */
+  hop_size = 512;
+
   examples_common_init(argc,argv);
 
+  verbmsg ("using source: %s at %dHz\n", source_uri, samplerate);
+
+  verbmsg ("tempo method: %s, ", tempo_method);
+  verbmsg ("buffer_size: %d, ", buffer_size);
+  verbmsg ("hop_size: %d, ", hop_size);
+  verbmsg ("threshold: %f\n", onset_threshold);
+
   tempo_out = new_fvec(2);
-  bt = new_aubio_tempo(tempo_method,buffer_size,overlap_size, samplerate);
-  if (onset_threshold != 0.) aubio_tempo_set_threshold (bt, onset_threshold);
+  tempo = new_aubio_tempo(tempo_method, buffer_size, hop_size, samplerate);
+  if (onset_threshold != 0.) aubio_tempo_set_threshold (tempo, onset_threshold);
 
-  wavetable = new_aubio_wavetable (samplerate, overlap_size);
+  wavetable = new_aubio_wavetable (samplerate, hop_size);
   aubio_wavetable_set_freq ( wavetable, 2450.);
   //aubio_sampler_load (sampler, "/archives/sounds/woodblock.aiff");
 
-  examples_common_process(aubio_process,process_print);
+  examples_common_process((aubio_process_func_t)process_block,process_print);
 
-  del_aubio_tempo(bt);
+  del_aubio_tempo(tempo);
   del_aubio_wavetable (wavetable);
   del_fvec(tempo_out);
 
   examples_common_del();
-
-  debug("End of program.\n");
-
-  fflush(stderr);
-
   return 0;
 }