source: examples/aubionotes.c @ 3f9e8e5

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

examples/: build with -Wdeclaration-after-statement

  • Property mode set to 100644
File size: 4.3 KB
RevLine 
[96fb8ad]1/*
[466dff3]2  Copyright (C) 2003-2013 Paul Brossier <piem@aubio.org>
[96fb8ad]3
[6a2478c]4  This file is part of aubio.
[96fb8ad]5
[6a2478c]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/>.
[96fb8ad]18
19*/
20
[4621cd6]21#define AUBIO_UNSTABLE 1 // for fvec_median
[96fb8ad]22#include "utils.h"
[1b25a70]23#define PROG_HAS_PITCH 1
24#define PROG_HAS_ONSET 1
[3da8187]25#define PROG_HAS_JACK 1
26// TODO add PROG_HAS_OUTPUT
[1b25a70]27#include "parse_args.h"
[96fb8ad]28
[d4c5de7]29uint_t median = 6;
30
[466dff3]31fvec_t *note_buffer;
32fvec_t *note_buffer2;
[d4c5de7]33
34smpl_t curnote = 0.;
35smpl_t newnote = 0.;
36uint_t isready = 0;
[a0fd4e4]37
[466dff3]38aubio_pitch_t *pitch;
[d4c5de7]39aubio_onset_t *o;
40fvec_t *onset;
41fvec_t *pitch_obuf;
42
43/** append new note candidate to the note_buffer and return filtered value. we
44 * need to copy the input array as fvec_median destroy its input data.*/
45void note_append (fvec_t * note_buffer, smpl_t curnote);
46uint_t get_note (fvec_t * note_buffer, fvec_t * note_buffer2);
47
[d389e23]48void process_block (fvec_t *ibuf, fvec_t *obuf)
49{
[fe87823]50  smpl_t new_pitch, curlevel;
[466dff3]51  fvec_zeros(obuf);
52  aubio_onset_do(o, ibuf, onset);
53
54  aubio_pitch_do (pitch, ibuf, pitch_obuf);
[fe87823]55  new_pitch = fvec_get_sample(pitch_obuf, 0);
[466dff3]56  if(median){
57    note_append(note_buffer, new_pitch);
58  }
[96fb8ad]59
[466dff3]60  /* curlevel is negatif or 1 if silence */
[fe87823]61  curlevel = aubio_level_detection(ibuf, silence_threshold);
[c34336e]62  if (fvec_get_sample(onset, 0)) {
[466dff3]63    /* test for silence */
64    if (curlevel == 1.) {
65      if (median) isready = 0;
66      /* send note off */
67      send_noteon(curnote,0);
68    } else {
69      if (median) {
70        isready = 1;
[96fb8ad]71      } else {
[466dff3]72        /* kill old note */
73        send_noteon(curnote,0);
74        /* get and send new one */
75        send_noteon(new_pitch,127+(int)floor(curlevel));
76        curnote = new_pitch;
[96fb8ad]77      }
78    }
[466dff3]79  } else {
80    if (median) {
81      if (isready > 0)
82        isready++;
83      if (isready == median)
84      {
85        /* kill old note */
86        send_noteon(curnote,0);
87        newnote = get_note(note_buffer, note_buffer2);
88        curnote = newnote;
89        /* get and send new one */
90        if (curnote>45){
91          send_noteon(curnote,127+(int)floor(curlevel));
92        }
93      }
94    } // if median
[96fb8ad]95  }
96}
97
[d389e23]98void process_print (void)
99{
[466dff3]100  //if (verbose) outmsg("%f\n",pitch_obuf->data[0]);
[a0fd4e4]101}
[96fb8ad]102
[d4c5de7]103void
104note_append (fvec_t * note_buffer, smpl_t curnote)
105{
106  uint_t i = 0;
107  for (i = 0; i < note_buffer->length - 1; i++) {
[4621cd6]108    note_buffer->data[i] = note_buffer->data[i + 1];
[d4c5de7]109  }
[4621cd6]110  note_buffer->data[note_buffer->length - 1] = curnote;
[d4c5de7]111  return;
112}
113
114uint_t
115get_note (fvec_t * note_buffer, fvec_t * note_buffer2)
116{
[247ce7d]117  uint_t i;
[d4c5de7]118  for (i = 0; i < note_buffer->length; i++) {
[4621cd6]119    note_buffer2->data[i] = note_buffer->data[i];
[d4c5de7]120  }
[4621cd6]121  return fvec_median (note_buffer2);
[d4c5de7]122}
123
[bd2f2ab]124int main(int argc, char **argv) {
125  examples_common_init(argc,argv);
[d4c5de7]126
[466dff3]127  verbmsg ("using source: %s at %dHz\n", source_uri, samplerate);
128
129  verbmsg ("onset method: %s, ", onset_method);
130  verbmsg ("buffer_size: %d, ", buffer_size);
131  verbmsg ("hop_size: %d, ", hop_size);
132  verbmsg ("threshold: %f\n", onset_threshold);
133
134  verbmsg ("pitch method: %s, ", pitch_method);
135  verbmsg ("buffer_size: %d, ", buffer_size * 4);
136  verbmsg ("hop_size: %d, ", hop_size);
137  verbmsg ("tolerance: %f\n", pitch_tolerance);
138
139  o = new_aubio_onset (onset_method, buffer_size, hop_size, samplerate);
[1b25a70]140  if (onset_threshold != 0.) aubio_onset_set_threshold (o, onset_threshold);
[4621cd6]141  onset = new_fvec (1);
[d4c5de7]142
[466dff3]143  pitch = new_aubio_pitch (pitch_method, buffer_size * 4, hop_size, samplerate);
144  if (pitch_tolerance != 0.) aubio_pitch_set_tolerance (pitch, pitch_tolerance);
[4621cd6]145  pitch_obuf = new_fvec (1);
[466dff3]146
[d4c5de7]147  if (median) {
[4621cd6]148      note_buffer = new_fvec (median);
149      note_buffer2 = new_fvec (median);
[d4c5de7]150  }
151
[466dff3]152  examples_common_process((aubio_process_func_t)process_block, process_print);
[d4c5de7]153
[466dff3]154  // send a last note off
[d4c5de7]155  send_noteon (curnote, 0);
[466dff3]156
157  del_aubio_pitch (pitch);
[d4c5de7]158  if (median) {
159      del_fvec (note_buffer);
160      del_fvec (note_buffer2);
161  }
162  del_fvec (pitch_obuf);
163
[bd2f2ab]164  examples_common_del();
[96fb8ad]165  return 0;
166}
167
Note: See TracBrowser for help on using the repository browser.