dc273867688a8da1bb02072da9964ff76ecd0d47
[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 // pitch stuff
47 char_t * pitch_unit = "default";
48 char_t * pitch_method = "default";
49 smpl_t pitch_tolerance = 0.0; // will be set if != 0.
50 // time stuff
51 uint_t time_format = 0; // for "seconds", 1 for "ms", 2 for "samples"
52 // tempo stuff
53 char_t * tempo_method = "default";
54 // more general stuff
55 smpl_t silence_threshold = -90.;
56 uint_t mix_input = 0;
57
58 uint_t force_overwrite = 0;
59
60 //
61 // internal memory stuff
62 aubio_source_t *this_source = NULL;
63 aubio_sink_t *this_sink = NULL;
64 fvec_t *ibuf;
65 fvec_t *obuf;
66
67 smpl_t miditap_note = 69.;
68 smpl_t miditap_velo = 65.;
69
70 /* settings */
71 int blocks = 0;
72
73 extern void usage (FILE * stream, int exit_code);
74 extern int parse_args (int argc, char **argv);
75
76 #if HAVE_JACK
77 aubio_jack_t *jack_setup;
78 #endif /* HAVE_JACK */
79
80 void examples_common_init (int argc, char **argv);
81 void examples_common_del (void);
82 void examples_common_process (aubio_process_func_t process_func,
83     aubio_print_func_t print);
84
85 void examples_common_init (int argc, char **argv)
86 {
87
88   /* parse command line arguments */
89   parse_args (argc, argv);
90
91   if (!usejack) {
92     debug ("Opening files ...\n");
93     this_source = new_aubio_source ((char_t*)source_uri, samplerate, hop_size);
94     if (this_source == NULL) {
95       errmsg ("Error: could not open input file %s\n", source_uri);
96       exit (1);
97     }
98     if (samplerate == 0) {
99       samplerate = aubio_source_get_samplerate(this_source);
100     }
101     if (sink_uri != NULL) {
102       uint_t sink_exists = (access(sink_uri, F_OK) == 0 );
103       if (!force_overwrite && sink_exists) {
104         errmsg ("Error: output file %s already exists, use -f to overwrite.\n",
105             sink_uri);
106         exit (1);
107       }
108       this_sink = new_aubio_sink ((char_t*)sink_uri, samplerate);
109       if (this_sink == NULL) {
110         errmsg ("Error: could not create output file %s\n", sink_uri);
111         exit (1);
112       }
113     }
114 #ifdef HAVE_JACK
115   } else {
116     debug ("Jack init ...\n");
117     jack_setup = new_aubio_jack (hop_size, 1, 1, 0, 1);
118     samplerate = aubio_jack_get_samplerate (jack_setup);
119     source_uri = "jack";
120 #endif /* HAVE_JACK */
121   }
122   ibuf = new_fvec (hop_size);
123   obuf = new_fvec (hop_size);
124
125 }
126
127 void examples_common_del (void)
128 {
129   del_fvec (ibuf);
130   del_fvec (obuf);
131   aubio_cleanup ();
132   fflush(stderr);
133   fflush(stdout);
134 }
135
136 void examples_common_process (aubio_process_func_t process_func,
137     aubio_print_func_t print)
138 {
139
140   uint_t read = 0;
141   if (usejack) {
142
143 #ifdef HAVE_JACK
144     debug ("Jack activation ...\n");
145     aubio_jack_activate (jack_setup, process_func);
146     debug ("Processing (Ctrl+C to quit) ...\n");
147     pause ();
148     aubio_jack_close (jack_setup);
149 #else /* HAVE_JACK */
150     usage (stderr, 1);
151     outmsg ("Compiled without jack output, exiting.\n");
152 #endif /* HAVE_JACK */
153
154   } else {
155
156     uint_t total_read = 0;
157     blocks = 0;
158
159     do {
160       aubio_source_do (this_source, ibuf, &read);
161       process_func (ibuf, obuf);
162       // print to console if verbose or no output given
163       if (verbose || sink_uri == NULL) {
164         print();
165       }
166       if (this_sink) {
167         aubio_sink_do (this_sink, obuf, hop_size);
168       }
169       blocks++;
170       total_read += read;
171     } while (read == hop_size);
172
173     verbmsg ("read %.2fs (%d samples in %d blocks of %d) from %s at %dHz\n",
174         total_read * 1. / samplerate,
175         total_read, blocks, hop_size, source_uri, samplerate);
176
177     del_aubio_source (this_source);
178     del_aubio_sink   (this_sink);
179
180   }
181 }
182
183 void
184 send_noteon (smpl_t pitch, smpl_t velo)
185 {
186 #ifdef HAVE_JACK
187   jack_midi_event_t ev;
188   ev.size = 3;
189   ev.buffer = malloc (3 * sizeof (jack_midi_data_t)); // FIXME
190   ev.time = 0;
191   if (usejack) {
192     ev.buffer[2] = velo;
193     ev.buffer[1] = pitch;
194     if (velo == 0) {
195       ev.buffer[0] = 0x80;      /* note off */
196     } else {
197       ev.buffer[0] = 0x90;      /* note on */
198     }
199     aubio_jack_midi_event_write (jack_setup, (jack_midi_event_t *) & ev);
200   } else
201 #endif
202   if (velo == 0) {
203     print_time (blocks * hop_size);
204     outmsg ("\n");
205   } else {
206     outmsg ("%f\t", pitch);
207     print_time (blocks * hop_size);
208     outmsg ("\t");
209   }
210 }
211
212 void print_time (uint_t time_in_samples) {
213   /* output times in selected format */
214   if (time_format == 2) {
215     outmsg ("%d", time_in_samples);
216   } else if (time_format == 1) {
217     outmsg ("%f", 1000. * time_in_samples / (float) samplerate);
218   } else {
219     outmsg ("%f", time_in_samples / (float) samplerate);
220   }
221 }