source: examples/utils.c @ 466dff3

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

examples/: large refactoring, improve option management, remove old stuff, move blocking logic to jackio

  • Property mode set to 100644
File size: 4.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.
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 = -90.;
54uint_t mix_input = 0;
55
56//
57// internal memory stuff
58aubio_source_t *this_source = NULL;
59aubio_sink_t *this_sink = NULL;
60fvec_t *ibuf;
61fvec_t *obuf;
62
63/* settings */
64int blocks = 0;
65
66extern void usage (FILE * stream, int exit_code);
67extern int parse_args (int argc, char **argv);
68
69#if HAVE_JACK
70aubio_jack_t *jack_setup;
71#endif
72
73void
74examples_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
110void
111examples_common_del (void)
112{
113  del_fvec (ibuf);
114  del_fvec (obuf);
115  aubio_cleanup ();
116  fflush(stderr);
117  fflush(stdout);
118}
119
120void
121examples_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
167void
168send_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    outmsg ("%f\n", blocks * hop_size / (float) samplerate);
189  } else {
190    outmsg ("%f\t%f\t", mpitch, blocks * hop_size / (float) samplerate);
191  }
192}
193
Note: See TracBrowser for help on using the repository browser.