source: examples/utils.c @ 1573b16

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5pitchshiftsamplertimestretchyinfft+
Last change on this file since 1573b16 was 2c31bb6, checked in by Paul Brossier <piem@piem.org>, 11 years ago

examples/utils.c: also print duration in seconds

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