Changes in examples/aubionotes.c [ba303e8:fe87823]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
examples/aubionotes.c
rba303e8 rfe87823 19 19 */ 20 20 21 #define AUBIO_UNSTABLE 1 // for fvec_median 21 22 #include "utils.h" 22 23 #define PROG_HAS_PITCH 1 … … 26 27 #include "parse_args.h" 27 28 28 aubio_notes_t *notes; 29 uint_t lastnote = 0; 29 uint_t median = 6; 30 31 fvec_t *note_buffer; 32 fvec_t *note_buffer2; 33 34 smpl_t curnote = 0.; 35 smpl_t newnote = 0.; 36 uint_t isready = 0; 37 38 aubio_pitch_t *pitch; 39 aubio_onset_t *o; 40 fvec_t *onset; 41 fvec_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.*/ 45 void note_append (fvec_t * note_buffer, smpl_t curnote); 46 uint_t get_note (fvec_t * note_buffer, fvec_t * note_buffer2); 30 47 31 48 void process_block (fvec_t *ibuf, fvec_t *obuf) 32 49 { 33 aubio_notes_do (notes, ibuf, obuf); 34 // did we get a note off? 35 if (obuf->data[2] != 0) { 36 send_noteon(obuf->data[2], 0); 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); 37 58 } 38 // did we get a note on? 39 if (obuf->data[0] != 0) { 40 send_noteon(obuf->data[0], obuf->data[1]); 41 lastnote = (uint_t) floor(obuf->data[0]); 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 42 95 } 43 96 } … … 46 99 { 47 100 //if (verbose) outmsg("%f\n",pitch_obuf->data[0]); 101 } 102 103 void 104 note_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 114 uint_t 115 get_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); 48 122 } 49 123 … … 63 137 verbmsg ("tolerance: %f\n", pitch_tolerance); 64 138 65 notes = new_aubio_notes ("default", buffer_size, hop_size, samplerate); 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 } 66 151 67 152 examples_common_process((aubio_process_func_t)process_block, process_print); 68 153 69 154 // send a last note off 70 send_noteon ( lastnote, 0);155 send_noteon (curnote, 0); 71 156 72 del_aubio_notes (notes); 157 del_aubio_pitch (pitch); 158 if (median) { 159 del_fvec (note_buffer); 160 del_fvec (note_buffer2); 161 } 162 del_fvec (pitch_obuf); 73 163 74 164 examples_common_del();
Note: See TracChangeset
for help on using the changeset viewer.