source: examples/utils.c @ 986131d

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5
Last change on this file since 986131d was 986131d, checked in by Eduard Müller <mueller.eduard@googlemail.com>, 7 years ago

Intel IPP support for aubio

See emuell/aubio/ intel_ipp2 for details please

  • Property mode set to 100644
File size: 5.7 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;
79jack_midi_event_t ev;
80#endif /* HAVE_JACK */
81
82void examples_common_init (int argc, char **argv);
83void examples_common_del (void);
84void examples_common_process (aubio_process_func_t process_func,
85    aubio_print_func_t print);
86
87void examples_common_init (int argc, char **argv)
88{
89  /* initialize statics */
90  aubio_init();
91
92  /* parse command line arguments */
93  parse_args (argc, argv);
94
95  if (!usejack) {
96    debug ("Opening files ...\n");
97    this_source = new_aubio_source ((char_t*)source_uri, samplerate, hop_size);
98    if (this_source == NULL) {
99      errmsg ("Error: could not open input file %s\n", source_uri);
100      exit (1);
101    }
102    if (samplerate == 0) {
103      samplerate = aubio_source_get_samplerate(this_source);
104    }
105    if (sink_uri != NULL) {
106      uint_t sink_exists = (access(sink_uri, F_OK) == 0 );
107      if (!force_overwrite && sink_exists) {
108        errmsg ("Error: output file %s already exists, use -f to overwrite.\n",
109            sink_uri);
110        exit (1);
111      }
112      this_sink = new_aubio_sink ((char_t*)sink_uri, samplerate);
113      if (this_sink == NULL) {
114        errmsg ("Error: could not create output file %s\n", sink_uri);
115        exit (1);
116      }
117    }
118#ifdef HAVE_JACK
119  } else {
120    debug ("Jack init ...\n");
121    jack_setup = new_aubio_jack (hop_size, 1, 1, 0, 1);
122    samplerate = aubio_jack_get_samplerate (jack_setup);
123    source_uri = "jack";
124#endif /* HAVE_JACK */
125  }
126  ibuf = new_fvec (hop_size);
127  obuf = new_fvec (hop_size);
128
129}
130
131void examples_common_del (void)
132{
133#ifdef HAVE_JACK
134  if (ev.buffer) free(ev.buffer);
135#endif
136  del_fvec (ibuf);
137  del_fvec (obuf);
138  aubio_cleanup ();
139  fflush(stderr);
140  fflush(stdout);
141}
142
143void examples_common_process (aubio_process_func_t process_func,
144    aubio_print_func_t print)
145{
146
147  uint_t read = 0;
148  if (usejack) {
149
150#ifdef HAVE_JACK
151    ev.size = 3;
152    ev.buffer = malloc (3 * sizeof (jack_midi_data_t));
153    ev.time = 0; // send it now
154    debug ("Jack activation ...\n");
155    aubio_jack_activate (jack_setup, process_func);
156    debug ("Processing (Ctrl+C to quit) ...\n");
157    pause ();
158    aubio_jack_close (jack_setup);
159#else /* HAVE_JACK */
160    usage (stderr, 1);
161    outmsg ("Compiled without jack output, exiting.\n");
162#endif /* HAVE_JACK */
163
164  } else {
165
166    uint_t total_read = 0;
167    blocks = 0;
168
169    do {
170      aubio_source_do (this_source, ibuf, &read);
171      process_func (ibuf, obuf);
172      // print to console if verbose or no output given
173      if (verbose || sink_uri == NULL) {
174        print();
175      }
176      if (this_sink) {
177        aubio_sink_do (this_sink, obuf, hop_size);
178      }
179      blocks++;
180      total_read += read;
181    } while (read == hop_size);
182
183    verbmsg ("read %.2fs (%d samples in %d blocks of %d) from %s at %dHz\n",
184        total_read * 1. / samplerate,
185        total_read, blocks, hop_size, source_uri, samplerate);
186
187    del_aubio_source (this_source);
188    del_aubio_sink   (this_sink);
189
190  }
191}
192
193void
194send_noteon (smpl_t pitch, smpl_t velo)
195{
196#ifdef HAVE_JACK
197  if (usejack) {
198    ev.buffer[2] = velo;
199    ev.buffer[1] = pitch;
200    if (velo == 0) {
201      ev.buffer[0] = 0x80;      /* note off */
202    } else {
203      ev.buffer[0] = 0x90;      /* note on */
204    }
205    aubio_jack_midi_event_write (jack_setup, (jack_midi_event_t *) & ev);
206  } else
207#endif
208  if (velo == 0) {
209    print_time (blocks * hop_size);
210    outmsg ("\n");
211  } else {
212    outmsg ("%f\t", pitch);
213    print_time (blocks * hop_size);
214    outmsg ("\t");
215  }
216}
217
218void print_time (uint_t time_in_samples) {
219  /* output times in selected format */
220  if (time_format == 2) {
221    outmsg ("%d", time_in_samples);
222  } else if (time_format == 1) {
223    outmsg ("%f", 1000. * time_in_samples / (float) samplerate);
224  } else {
225    outmsg ("%f", time_in_samples / (float) samplerate);
226  }
227}
Note: See TracBrowser for help on using the repository browser.