[tests] add run_on_default_source_and_sink helper
[aubio.git] / examples / aubiotrack.c
index d4b4b41..d4a1de7 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.
 
 
 #include "utils.h"
 #define PROG_HAS_TEMPO 1
+#define PROG_HAS_ONSET 1
+#define PROG_HAS_SILENCE 1
+#define PROG_HAS_OUTPUT 1
+#define PROG_HAS_JACK 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;
-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++;
+fvec_t * tempo_out;
+smpl_t is_beat = 0.;
+uint_t is_silence = 0;
+
+void process_block(fvec_t * ibuf, fvec_t *obuf) {
+  aubio_tempo_do (tempo, ibuf, tempo_out);
+  is_beat = fvec_get_sample (tempo_out, 0);
+  if (silence_threshold != -90.)
+    is_silence = aubio_silence_detection(ibuf, silence_threshold);
+  if ( !usejack && ! sink_uri ) return;
+  fvec_zeros (obuf);
+  if ( is_beat && !is_silence ) {
+    aubio_wavetable_play ( wavetable );
+    /* send a midi tap (default to C0) out to the midi output */
+    if (usejack) send_noteon(miditap_note, miditap_velo);
+  } else {
+    aubio_wavetable_stop ( wavetable );
+  }
+  if (mix_input) {
+    aubio_wavetable_do (wavetable, ibuf, obuf);
+  } else {
+    aubio_wavetable_do (wavetable, obuf, obuf);
   }
-  return 1;
 }
 
-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 ( is_beat && !is_silence ) {
+    print_time (aubio_tempo_get_last (tempo));
+    outmsg ("\n");
   }
 }
 
 int main(int argc, char **argv) {
-  
+  int ret = 0;
+  // override general settings from utils.c
   buffer_size = 1024;
-  overlap_size = 512;
-  /* override default settings */
+  hop_size = 512;
+
   examples_common_init(argc,argv);
 
-  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);
+  verbmsg ("using source: %s at %dHz\n", source_uri, samplerate);
 
-  wavetable = new_aubio_wavetable (samplerate, overlap_size);
+  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);
+  tempo = new_aubio_tempo(tempo_method, buffer_size, hop_size, samplerate);
+  if (tempo == NULL) { ret = 1; goto beach; }
+  // set silence threshold very low to output beats even during silence
+  // aubio_tempo_set_silence(tempo, -1000.);
+  if (onset_threshold != 0.) aubio_tempo_set_threshold (tempo, onset_threshold);
+  if (onset_minioi != 0.) errmsg ("warning: minioio not supported yet\n");
+
+  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);
+  // send a last note off
+  if (usejack) {
+    send_noteon (miditap_note, 0);
+  }
+
+  del_aubio_tempo(tempo);
   del_aubio_wavetable (wavetable);
   del_fvec(tempo_out);
 
+beach:
   examples_common_del();
-
-  debug("End of program.\n");
-
-  fflush(stderr);
-
-  return 0;
+  return ret;
 }
-