source: examples/utils.c @ df7be43

feature/autosinkfeature/constantqfeature/pitchshiftfeature/pydocstringsfeature/timestretchpitchshiftsamplertimestretchyinfft+
Last change on this file since df7be43 was df7be43, checked in by Paul Brossier <piem@piem.org>, 4 years ago

examples/parse_args.h: only parse time format string once, warn if unknown

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