source: examples/utils.c @ f280ebd

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

examples/: also emit midi note from aubioonset, thanks to topas-rec (closes #62)

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