source: examples/aubionotes.c @ f8340e1

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5pitchshiftsamplertimestretchyinfft+
Last change on this file since f8340e1 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
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#define AUBIO_UNSTABLE 1 // for fvec_median
22#include "utils.h"
23#define PROG_HAS_PITCH 1
24#define PROG_HAS_ONSET 1
25#define PROG_HAS_JACK 1
26// TODO add PROG_HAS_OUTPUT
27#include "parse_args.h"
28
29uint_t median = 6;
30
31fvec_t *note_buffer;
32fvec_t *note_buffer2;
33
34smpl_t curnote = 0.;
35smpl_t newnote = 0.;
36uint_t isready = 0;
37
38aubio_pitch_t *pitch;
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
48void process_block (fvec_t *ibuf, fvec_t *obuf)
49{
50  smpl_t new_pitch, curlevel;
51  fvec_zeros(obuf);
52  aubio_onset_do(o, ibuf, onset);
53
54  aubio_pitch_do (pitch, ibuf, pitch_obuf);
55  new_pitch = fvec_get_sample(pitch_obuf, 0);
56  if(median){
57    note_append(note_buffer, new_pitch);
58  }
59
60  /* curlevel is negatif or 1 if silence */
61  curlevel = aubio_level_detection(ibuf, silence_threshold);
62  if (fvec_get_sample(onset, 0)) {
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;
71      } else {
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;
77      }
78    }
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
95  }
96}
97
98void process_print (void)
99{
100  //if (verbose) outmsg("%f\n",pitch_obuf->data[0]);
101}
102
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++) {
108    note_buffer->data[i] = note_buffer->data[i + 1];
109  }
110  note_buffer->data[note_buffer->length - 1] = curnote;
111  return;
112}
113
114uint_t
115get_note (fvec_t * note_buffer, fvec_t * note_buffer2)
116{
117  uint_t i;
118  for (i = 0; i < note_buffer->length; i++) {
119    note_buffer2->data[i] = note_buffer->data[i];
120  }
121  return fvec_median (note_buffer2);
122}
123
124int main(int argc, char **argv) {
125  examples_common_init(argc,argv);
126
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);
140  if (onset_threshold != 0.) aubio_onset_set_threshold (o, onset_threshold);
141  onset = new_fvec (1);
142
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);
145  pitch_obuf = new_fvec (1);
146
147  if (median) {
148      note_buffer = new_fvec (median);
149      note_buffer2 = new_fvec (median);
150  }
151
152  examples_common_process((aubio_process_func_t)process_block, process_print);
153
154  // send a last note off
155  send_noteon (curnote, 0);
156
157  del_aubio_pitch (pitch);
158  if (median) {
159      del_fvec (note_buffer);
160      del_fvec (note_buffer2);
161  }
162  del_fvec (pitch_obuf);
163
164  examples_common_del();
165  return 0;
166}
167
Note: See TracBrowser for help on using the repository browser.