examples/aubioonset.c: add minioi option, in millisecond
[aubio.git] / examples / utils.c
1 /*
2   Copyright (C) 2003-2013 Paul Brossier <piem@aubio.org>
3
4   This file is part of aubio.
5
6   aubio is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   aubio is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with aubio.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21 /**
22
23   This file includes some tools common to all examples. Code specific to the
24   algorithm performed by each program should go in the source file of that
25   program instead.
26
27 */
28
29 #include "utils.h"
30 #ifdef HAVE_JACK
31 #include "jackio.h"
32 #endif /* HAVE_JACK */
33
34 int verbose = 0;
35 int usejack = 0;
36 // input / output
37 char_t *sink_uri = NULL;
38 char_t *source_uri = NULL;
39 // general stuff
40 uint_t samplerate = 0;
41 uint_t buffer_size = 512;
42 uint_t hop_size = 256;
43 // onset stuff
44 char_t * onset_method = "default";
45 smpl_t onset_threshold = 0.0; // will be set if != 0.
46 smpl_t onset_minioi = 0.0; // will be set if != 0.
47 // pitch stuff
48 char_t * pitch_unit = "default";
49 char_t * pitch_method = "default";
50 smpl_t pitch_tolerance = 0.0; // will be set if != 0.
51 // time stuff
52 uint_t time_format = 0; // for "seconds", 1 for "ms", 2 for "samples"
53 // tempo stuff
54 char_t * tempo_method = "default";
55 // more general stuff
56 smpl_t silence_threshold = -90.;
57 uint_t mix_input = 0;
58
59 uint_t force_overwrite = 0;
60
61 //
62 // internal memory stuff
63 aubio_source_t *this_source = NULL;
64 aubio_sink_t *this_sink = NULL;
65 fvec_t *ibuf;
66 fvec_t *obuf;
67
68 smpl_t miditap_note = 69.;
69 smpl_t miditap_velo = 65.;
70
71 /* settings */
72 int blocks = 0;
73
74 extern void usage (FILE * stream, int exit_code);
75 extern int parse_args (int argc, char **argv);
76
77 #if HAVE_JACK
78 aubio_jack_t *jack_setup;
79 #endif /* HAVE_JACK */
80
81 void examples_common_init (int argc, char **argv);
82 void examples_common_del (void);
83 void examples_common_process (aubio_process_func_t process_func,
84     aubio_print_func_t print);
85
86 void examples_common_init (int argc, char **argv)
87 {
88
89   /* parse command line arguments */
90   parse_args (argc, argv);
91
92   if (!usejack) {
93     debug ("Opening files ...\n");
94     this_source = new_aubio_source ((char_t*)source_uri, samplerate, hop_size);
95     if (this_source == NULL) {
96       errmsg ("Error: could not open input file %s\n", source_uri);
97       exit (1);
98     }
99     if (samplerate == 0) {
100       samplerate = aubio_source_get_samplerate(this_source);
101     }
102     if (sink_uri != NULL) {
103       uint_t sink_exists = (access(sink_uri, F_OK) == 0 );
104       if (!force_overwrite && sink_exists) {
105         errmsg ("Error: output file %s already exists, use -f to overwrite.\n",
106             sink_uri);
107         exit (1);
108       }
109       this_sink = new_aubio_sink ((char_t*)sink_uri, samplerate);
110       if (this_sink == NULL) {
111         errmsg ("Error: could not create output file %s\n", sink_uri);
112         exit (1);
113       }
114     }
115 #ifdef HAVE_JACK
116   } else {
117     debug ("Jack init ...\n");
118     jack_setup = new_aubio_jack (hop_size, 1, 1, 0, 1);
119     samplerate = aubio_jack_get_samplerate (jack_setup);
120     source_uri = "jack";
121 #endif /* HAVE_JACK */
122   }
123   ibuf = new_fvec (hop_size);
124   obuf = new_fvec (hop_size);
125
126 }
127
128 void examples_common_del (void)
129 {
130   del_fvec (ibuf);
131   del_fvec (obuf);
132   aubio_cleanup ();
133   fflush(stderr);
134   fflush(stdout);
135 }
136
137 void examples_common_process (aubio_process_func_t process_func,
138     aubio_print_func_t print)
139 {
140
141   uint_t read = 0;
142   if (usejack) {
143
144 #ifdef HAVE_JACK
145     debug ("Jack activation ...\n");
146     aubio_jack_activate (jack_setup, process_func);
147     debug ("Processing (Ctrl+C to quit) ...\n");
148     pause ();
149     aubio_jack_close (jack_setup);
150 #else /* HAVE_JACK */
151     usage (stderr, 1);
152     outmsg ("Compiled without jack output, exiting.\n");
153 #endif /* HAVE_JACK */
154
155   } else {
156
157     uint_t total_read = 0;
158     blocks = 0;
159
160     do {
161       aubio_source_do (this_source, ibuf, &read);
162       process_func (ibuf, obuf);
163       // print to console if verbose or no output given
164       if (verbose || sink_uri == NULL) {
165         print();
166       }
167       if (this_sink) {
168         aubio_sink_do (this_sink, obuf, hop_size);
169       }
170       blocks++;
171       total_read += read;
172     } while (read == hop_size);
173
174     verbmsg ("read %.2fs (%d samples in %d blocks of %d) from %s at %dHz\n",
175         total_read * 1. / samplerate,
176         total_read, blocks, hop_size, source_uri, samplerate);
177
178     del_aubio_source (this_source);
179     del_aubio_sink   (this_sink);
180
181   }
182 }
183
184 void
185 send_noteon (smpl_t pitch, smpl_t velo)
186 {
187 #ifdef HAVE_JACK
188   jack_midi_event_t ev;
189   ev.size = 3;
190   ev.buffer = malloc (3 * sizeof (jack_midi_data_t)); // FIXME
191   ev.time = 0;
192   if (usejack) {
193     ev.buffer[2] = velo;
194     ev.buffer[1] = pitch;
195     if (velo == 0) {
196       ev.buffer[0] = 0x80;      /* note off */
197     } else {
198       ev.buffer[0] = 0x90;      /* note on */
199     }
200     aubio_jack_midi_event_write (jack_setup, (jack_midi_event_t *) & ev);
201   } else
202 #endif
203   if (velo == 0) {
204     print_time (blocks * hop_size);
205     outmsg ("\n");
206   } else {
207     outmsg ("%f\t", pitch);
208     print_time (blocks * hop_size);
209     outmsg ("\t");
210   }
211 }
212
213 void print_time (uint_t time_in_samples) {
214   /* output times in selected format */
215   if (time_format == 2) {
216     outmsg ("%d", time_in_samples);
217   } else if (time_format == 1) {
218     outmsg ("%f", 1000. * time_in_samples / (float) samplerate);
219   } else {
220     outmsg ("%f", time_in_samples / (float) samplerate);
221   }
222 }