source: examples/utils.c @ 086a45b

feature/autosinkfeature/cnnfeature/crepefeature/crepe_orgfeature/timestretchfix/ffmpeg5
Last change on this file since 086a45b was 8f0db97, checked in by Paul Brossier <piem@piem.org>, 8 years ago

examples/utils.c: allocate note event once

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