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