examples/parse_args.h: miditap only for aubiotrack and aubioonset
[aubio.git] / examples / parse_args.h
index 0708c5e..191f2e9 100644 (file)
 
 */
 
+#include "config.h"
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
 extern int verbose;
 // input / output
 extern int usejack;
@@ -30,23 +36,30 @@ extern uint_t hop_size;
 // onset stuff
 extern char_t * onset_method;
 extern smpl_t onset_threshold;
+extern smpl_t onset_minioi;
 // pitch stuff
 extern char_t * pitch_method;
 extern char_t * pitch_unit;
 extern smpl_t pitch_tolerance;
+// time stuff
+extern uint_t time_format;
 // tempo stuff
 extern char_t * tempo_method;
 // more general stuff
-extern smpl_t silence;
+extern smpl_t silence_threshold;
 extern uint_t mix_input;
+// midi tap
+extern smpl_t miditap_note;
+extern smpl_t miditap_velo;
 
-typedef int (*aubio_process_func_t)(fvec_t * input, fvec_t * output);
+extern uint_t force_overwrite;
 
 // functions defined in utils.c
 extern void examples_common_init (int argc, char **argv);
 extern void examples_common_del (void);
 extern void examples_common_process (aubio_process_func_t process_func,
     aubio_print_func_t print);
+int parse_args (int argc, char **argv);
 
 // internal stuff
 extern int blocks;
@@ -56,58 +69,98 @@ extern fvec_t *obuf;
 
 const char *prog_name;
 
-void
-usage (FILE * stream, int exit_code)
+void usage (FILE * stream, int exit_code);
+
+void usage (FILE * stream, int exit_code)
 {
+#ifdef HAVE_GETOPT_H
   fprintf (stream, "usage: %s [ options ] \n", prog_name);
   fprintf (stream,
-      "       -h      --help             display this message\n"
-      "       -v      --verbose          be verbose\n"
-#ifdef PROG_HAS_JACK
-      "       -j      --jack             use Jack\n"
-#endif
-      "       -i      --input            input type\n"
+      "       -i      --input            input file\n"
 #ifdef PROG_HAS_OUTPUT
-      "       -o      --output           output type\n"
+      "       -o      --output           output file\n"
 #endif
       "       -r      --samplerate       select samplerate\n"
+      "                 use 0 to use input source samplerate, or 32000 to force 32kHz\n"
       "       -B      --bufsize          set buffer size\n"
+      "                 number of frames to run the analysis on\n"
       "       -H      --hopsize          set hopsize\n"
+      "                 number of frames to read from source before each analysis\n"
 #ifdef PROG_HAS_ONSET
       "       -O      --onset            select onset detection algorithm\n"
+      "                 <default|energy|hfc|complex|phase|specdiff|kl|mkl|specflux>;\n"
+      "                 default=hfc\n"
       "       -t      --onset-threshold  set onset detection threshold\n"
+      "                 a value between 0.1 (more detections) and 1 (less); default=0.3\n"
+      "       -M      --minioi           set minimum inter-onset interval\n"
+      "                 a value in second; default=0.012\n"
 #endif /* PROG_HAS_ONSET */
 #ifdef PROG_HAS_PITCH
       "       -p      --pitch            select pitch detection algorithm\n"
+      "                 <default|yinfft|yin|mcomb|fcomb|schmitt>; default=yinfft\n"
       "       -u      --pitch-unit       select pitch output unit\n"
+      "                 <default|freq|hertz|Hz|midi|cent|bin>; default=freq\n"
       "       -l      --pitch-tolerance  select pitch tolerance\n"
+      "                 (yin, yinfft only) a value between 0.1 and 0.7; default=0.3\n"
 #endif /* PROG_HAS_PITCH */
+#ifdef PROG_HAS_SILENCE
       "       -s      --silence          select silence threshold\n"
+      "                 a value in dB, for instance -70, or -100; default=-90\n"
+#endif /* PROG_HAS_SILENCE */
+      "       -T      --time-format      select time values output format\n"
+      "                 (samples, ms, seconds) default=seconds\n"
 #ifdef PROG_HAS_OUTPUT
       "       -m      --mix-input        mix input signal with output signal\n"
-#endif
+      "                 input signal will be added to output synthesis\n"
+      "       -f      --force-overwrite  overwrite output file if needed\n"
+      "                 do not fail if output file already exists\n"
+#endif /* PROG_HAS_OUTPUT */
+#ifdef PROG_HAS_JACK
+      "       -j      --jack             use Jack\n"
+#if defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH)
+      "       -n      --miditap-note     MIDI note\n"
+      "       -V      --miditap-velo     MIDI velocity\n"
+#endif /* defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH) */
+#endif /* PROG_HAS_JACK */
+      "       -v      --verbose          be verbose\n"
+      "       -h      --help             display this message\n"
       );
+#else /* HAVE_GETOPT_H */
+  fprintf (stream, "warning: compiled with getopt.h, no argument parsing\n");
+  fprintf (stream, "usage: %s <filename> \n", prog_name);
+#endif /* HAVE_GETOPT_H */
   exit (exit_code);
 }
 
 int
 parse_args (int argc, char **argv)
 {
+#ifdef HAVE_GETOPT_H
   const char *options = "hv"
     "i:r:B:H:"
 #ifdef PROG_HAS_JACK
     "j"
+#if defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH)
+    "N:V:"
+#endif /* defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH) */
 #endif /* PROG_HAS_JACK */
 #ifdef PROG_HAS_OUTPUT
     "o:"
 #endif /* PROG_HAS_OUTPUT */
 #ifdef PROG_HAS_ONSET
-    "O:t:"
+    "O:t:M:"
 #endif /* PROG_HAS_ONSET */
 #ifdef PROG_HAS_PITCH
     "p:u:l:"
 #endif /* PROG_HAS_PITCH */
-    "s:m";
+    "T:"
+#ifdef PROG_HAS_SILENCE
+    "s:"
+#endif /* PROG_HAS_SILENCE */
+#ifdef PROG_HAS_OUTPUT
+    "mf"
+#endif /* PROG_HAS_OUTPUT */
+    ;
   int next_option;
   struct option long_options[] = {
     {"help",                  0, NULL, 'h'},
@@ -118,6 +171,10 @@ parse_args (int argc, char **argv)
     {"hopsize",               1, NULL, 'H'},
 #ifdef PROG_HAS_JACK
     {"jack",                  0, NULL, 'j'},
+#if defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH)
+    {"miditap-note",          1, NULL, 'n'},
+    {"miditap-velo",          1, NULL, 'V'},
+#endif /* PROG_HAS_ONSET !PROG_HAS_PITCH */
 #endif /* PROG_HAS_JACK */
 #ifdef PROG_HAS_OUTPUT
     {"output",                1, NULL, 'o'},
@@ -125,21 +182,30 @@ parse_args (int argc, char **argv)
 #ifdef PROG_HAS_ONSET
     {"onset",                 1, NULL, 'O'},
     {"onset-threshold",       1, NULL, 't'},
+    {"onset-minioi",          1, NULL, 'M'},
 #endif /* PROG_HAS_ONSET */
 #ifdef PROG_HAS_PITCH
     {"pitch",                 1, NULL, 'p'},
     {"pitch-unit",            1, NULL, 'u'},
     {"pitch-tolerance",       1, NULL, 'l'},
 #endif /* PROG_HAS_PITCH */
+#ifdef PROG_HAS_SILENCE
     {"silence",               1, NULL, 's'},
+#endif /* PROG_HAS_SILENCE */
+    {"time-format",           1, NULL, 'T'},
+#ifdef PROG_HAS_OUTPUT
     {"mix-input",             0, NULL, 'm'},
+    {"force-overwrite",       0, NULL, 'f'},
+#endif /* PROG_HAS_OUTPUT */
     {NULL,                    0, NULL, 0}
   };
+#endif /* HAVE_GETOPT_H */
   prog_name = argv[0];
   if (argc < 1) {
     usage (stderr, 1);
     return -1;
   }
+#ifdef HAVE_GETOPT_H
   do {
     next_option = getopt_long (argc, argv, options, long_options, NULL);
     switch (next_option) {
@@ -152,12 +218,21 @@ parse_args (int argc, char **argv)
       case 'j':
         usejack = 1;
         break;
+      case 'n':
+        miditap_note = atoi (optarg);
+        break;
+      case 'V':
+        miditap_velo = atoi (optarg);
+        break;
       case 'i':
         source_uri = optarg;
         break;
       case 'o':
         sink_uri = optarg;
         break;
+      case 'f':                /* force_overwrite flag */
+        force_overwrite = 1;
+        break;
       case 'r':
         samplerate = atoi (optarg);
         break;
@@ -167,12 +242,15 @@ parse_args (int argc, char **argv)
       case 'H':
         hop_size = atoi (optarg);
         break;
-      case 'O':                /*onset type */
+      case 'O':                /*onset method */
         onset_method = optarg;
         break;
       case 't':                /* threshold value for onset */
         onset_threshold = (smpl_t) atof (optarg);
         break;
+      case 'M':                /* minimum inter-onset-interval */
+        onset_minioi = (smpl_t) atof (optarg);
+        break;
       case 'p':
         pitch_method = optarg;
         break;
@@ -182,8 +260,19 @@ parse_args (int argc, char **argv)
       case 'l':
         pitch_tolerance = (smpl_t) atof (optarg);
         break;
+      case 'T':
+        if (strcmp (optarg, "samples") == 0) {
+          time_format = 2;
+        } else if (strcmp (optarg, "ms") == 0) {
+          time_format = 1;
+        } else if (strcmp (optarg, "seconds") == 0) {
+          time_format = 0;
+        } else {
+          errmsg ("Warning: did not get '%s' time-format string\n", optarg);
+        }
+        break;
       case 's':                /* silence threshold */
-        silence = (smpl_t) atof (optarg);
+        silence_threshold = (smpl_t) atof (optarg);
         break;
       case 'm':                /* mix_input flag */
         mix_input = 1;
@@ -199,6 +288,9 @@ parse_args (int argc, char **argv)
     }
   }
   while (next_option != -1);
+#else /* HAVE_GETOPT_H */
+  int optind = 1;
+#endif /* HAVE_GETOPT_H */
 
   // if unique, use the non option argument as the source
   if ( source_uri == NULL ) {
@@ -215,13 +307,35 @@ parse_args (int argc, char **argv)
 
   // if no source, show a message
   if (source_uri == NULL) {
+#ifdef PROG_HAS_JACK
 #if HAVE_JACK
     verbmsg("No input source given, using jack\n");
     usejack = 1;
 #else
     errmsg("Error: no arguments given (and no available audio input)\n");
     usage ( stderr, 1 );
-#endif
+#endif /* HAVE_JACK */
+#else
+    errmsg("Error: no arguments given\n");
+    usage ( stderr, 1 );
+#endif /* PROG_HAS_JACK */
+  }
+
+  if ((sint_t)hop_size < 1) {
+    errmsg("Error: got hop_size %d, but can not be < 1\n", hop_size);
+    usage ( stderr, 1 );
+  } else if ((sint_t)buffer_size < 2) {
+    errmsg("Error: got buffer_size %d, but can not be < 2\n", buffer_size);
+    usage ( stderr, 1 );
+  } else if ((sint_t)buffer_size < (sint_t)hop_size) {
+    errmsg("Error: hop size (%d) is larger than win size (%d)\n",
+        hop_size, buffer_size);
+    usage ( stderr, 1 );
+  }
+
+  if ((sint_t)samplerate < 0) {
+    errmsg("Error: got samplerate %d, but can not be < 0\n", samplerate);
+    usage ( stderr, 1 );
   }
 
   return 0;