source: examples/utils.c @ ec45138

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5sampleryinfft+
Last change on this file since ec45138 was ab7212f, checked in by Paul Brossier <piem@piem.org>, 8 years ago

examples/aubioonset.c: add minioi option, in millisecond

  • Property mode set to 100644
File size: 5.6 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.
46smpl_t onset_minioi = 0.0; // will be set if != 0.
47// pitch stuff
48char_t * pitch_unit = "default";
49char_t * pitch_method = "default";
50smpl_t pitch_tolerance = 0.0; // will be set if != 0.
51// time stuff
52uint_t time_format = 0; // for "seconds", 1 for "ms", 2 for "samples"
53// tempo stuff
54char_t * tempo_method = "default";
55// more general stuff
56smpl_t silence_threshold = -90.;
57uint_t mix_input = 0;
58
59uint_t force_overwrite = 0;
60
61//
62// internal memory stuff
63aubio_source_t *this_source = NULL;
64aubio_sink_t *this_sink = NULL;
65fvec_t *ibuf;
66fvec_t *obuf;
67
68smpl_t miditap_note = 69.;
69smpl_t miditap_velo = 65.;
70
71/* settings */
72int blocks = 0;
73
74extern void usage (FILE * stream, int exit_code);
75extern int parse_args (int argc, char **argv);
76
77#if HAVE_JACK
78aubio_jack_t *jack_setup;
79#endif /* HAVE_JACK */
80
81void examples_common_init (int argc, char **argv);
82void examples_common_del (void);
83void examples_common_process (aubio_process_func_t process_func,
84    aubio_print_func_t print);
85
86void 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
128void examples_common_del (void)
129{
130  del_fvec (ibuf);
131  del_fvec (obuf);
132  aubio_cleanup ();
133  fflush(stderr);
134  fflush(stdout);
135}
136
137void 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
184void
185send_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
213void 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}
Note: See TracBrowser for help on using the repository browser.