- Timestamp:
- Mar 15, 2013, 11:48:10 PM (12 years ago)
- Branches:
- feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
- Children:
- 7e9e311
- Parents:
- f5e0a54
- Location:
- src/onset
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/onset/onset.c
rf5e0a54 r35f73b8c 39 39 uint_t minioi; /**< minimum inter onset interval */ 40 40 uint_t delay; /**< constant delay, in samples, removed from detected onset times */ 41 fvec_t * wasonset; /**< number of blocks since last onset */42 41 uint_t samplerate; /**< sampling rate of the input signal */ 43 42 uint_t hop_size; /**< number of samples between two runs */ … … 51 50 { 52 51 smpl_t isonset = 0; 53 smpl_t wasonset = 0;54 52 aubio_pvoc_do (o->pv,input, o->fftgrain); 55 53 aubio_specdesc_do (o->od,o->fftgrain, o->of); 56 54 aubio_peakpicker_do(o->pp, o->of, onset); 57 55 isonset = onset->data[0]; 58 wasonset = o->wasonset->data[0];59 56 if (isonset > 0.) { 60 57 if (aubio_silence_detection(input, o->silence)==1) { 61 58 isonset = 0; 62 wasonset++;63 59 } else { 64 if (wasonset > o->minioi) {65 wasonset = 0;66 o->last_onset = o->total_frames + isonset * o->hop_size;60 uint_t new_onset = o->total_frames + isonset * o->hop_size; 61 if (o->last_onset + o->minioi < new_onset) { 62 o->last_onset = new_onset; 67 63 } else { 68 64 isonset = 0; 69 wasonset++;70 65 } 71 66 } 72 67 } else { 73 if (wasonset == -1 && aubio_silence_detection(input, o->silence) == 0) {74 //AUBIO_MSG("beginning of file is not silent, marking as onset\n",75 // wasonset, aubio_silence_detection(input, o->silence));68 // we are at the beginning of the file, and we don't find silence 69 if (o->total_frames == 0 && aubio_silence_detection(input, o->silence) == 0) { 70 //AUBIO_DBG ("beginning of file is not silent, marking as onset\n"); 76 71 isonset = o->delay / o->hop_size; 77 72 o->last_onset = o->delay; 78 wasonset = 0;79 73 } 80 wasonset++;81 74 } 82 o->wasonset->data[0] = wasonset;83 //onset->data[0] = isonset * o->hop_size - o->delay;84 75 onset->data[0] = isonset; 85 // also keep a copy of the offset for use in get_last_onset86 76 o->total_frames += o->hop_size; 87 77 return; … … 103 93 } 104 94 105 smpl_t aubio_onset_get_descriptor(aubio_onset_t * o) {106 return o->of->data[0];107 }108 109 smpl_t aubio_onset_get_thresholded_descriptor(aubio_onset_t * o) {110 fvec_t * thresholded = aubio_peakpicker_get_thresholded_input(o->pp);111 return thresholded->data[0];112 }113 114 95 uint_t aubio_onset_set_silence(aubio_onset_t * o, smpl_t silence) { 115 96 o->silence = silence; … … 124 105 125 106 uint_t aubio_onset_set_minioi(aubio_onset_t * o, uint_t minioi) { 126 o->minioi = FLOOR(minioi / 1000. * o->samplerate / o->hop_size);107 o->minioi = minioi; 127 108 return AUBIO_OK; 128 109 } … … 130 111 uint_t aubio_onset_get_minioi(aubio_onset_t * o) { 131 112 return o->minioi; 113 } 114 115 uint_t aubio_onset_set_minioi_s(aubio_onset_t * o, smpl_t minioi) { 116 return aubio_onset_set_minioi (o, minioi * o->samplerate); 117 } 118 119 smpl_t aubio_onset_get_minioi_s(aubio_onset_t * o) { 120 return aubio_onset_get_minioi (o) / (smpl_t) o->samplerate; 121 } 122 123 uint_t aubio_onset_set_minioi_ms(aubio_onset_t * o, smpl_t minioi) { 124 return aubio_onset_set_minioi_s (o, minioi / 1000.); 125 } 126 127 smpl_t aubio_onset_get_minioi_ms(aubio_onset_t * o) { 128 return aubio_onset_get_minioi_s (o) * 1000.; 132 129 } 133 130 … … 157 154 } 158 155 156 smpl_t aubio_onset_get_descriptor(aubio_onset_t * o) { 157 return o->of->data[0]; 158 } 159 160 smpl_t aubio_onset_get_thresholded_descriptor(aubio_onset_t * o) { 161 fvec_t * thresholded = aubio_peakpicker_get_thresholded_input(o->pp); 162 return thresholded->data[0]; 163 } 164 159 165 /* Allocate memory for an onset detection */ 160 166 aubio_onset_t * new_aubio_onset (char_t * onset_mode, … … 163 169 aubio_onset_t * o = AUBIO_NEW(aubio_onset_t); 164 170 /** set some default parameter */ 171 o->samplerate = samplerate; 172 o->hop_size = hop_size; 165 173 o->last_onset = 0; 166 174 o->threshold = 0.3; 167 175 o->delay = 4.3 * hop_size; 168 o->minioi = 5 ;176 o->minioi = 5 * hop_size; 169 177 o->silence = -70; 170 o->wasonset = new_fvec(1);171 o->wasonset->data[0] = -1.;172 178 o->total_frames = 0; 173 o->samplerate = samplerate; 174 o->hop_size = hop_size; 175 o->pv = new_aubio_pvoc(buf_size, hop_size); 179 o->pv = new_aubio_pvoc(buf_size, o->hop_size); 176 180 o->pp = new_aubio_peakpicker(); 177 181 aubio_peakpicker_set_threshold (o->pp, o->threshold); … … 179 183 o->fftgrain = new_cvec(buf_size); 180 184 o->of = new_fvec(1); 181 /*if (usedoubled) {182 o2 = new_aubio_specdesc(onset_type2,buffer_size);183 onset2 = new_fvec(1);184 }*/185 185 return o; 186 186 } … … 192 192 del_aubio_pvoc(o->pv); 193 193 del_fvec(o->of); 194 del_fvec(o->wasonset);195 194 del_cvec(o->fftgrain); 196 195 AUBIO_FREE(o); -
src/onset/onset.h
rf5e0a54 r35f73b8c 20 20 21 21 /** \file 22 22 23 23 Onset detection object 24 24 … … 49 49 50 50 /** create onset detection object 51 51 52 52 \param method onset detection type as specified in specdesc.h 53 53 \param buf_size buffer size for phase vocoder 54 54 \param hop_size hop size for phase vocoder 55 \param samplerate sampling rate of the input signal 56 57 */ 58 aubio_onset_t * new_aubio_onset (char_t * method, 55 \param samplerate sampling rate of the input signal 56 57 */ 58 aubio_onset_t * new_aubio_onset (char_t * method, 59 59 uint_t buf_size, uint_t hop_size, uint_t samplerate); 60 60 61 61 /** execute onset detection 62 62 63 \param o onset detection object as returned by new_aubio_onset63 \param o onset detection object as returned by ::new_aubio_onset 64 64 \param input new audio vector of length hop_size 65 \param onset output vector, 1 if onset is found, 0 otherwise 65 \param onset output vector of length 1, containing 0 if no onset was found, 66 and a value equal or greater than 1 otherwise 67 68 When no onset was detected, the first element of the output vector `onset` 69 is set to 0. 70 71 When an onset is found, the first element of the output vector `onset` is set 72 to `offset = 1 + a` where `a` is a number in the range`[0, 1]`. 73 74 The final onset detection time, in samples, can be obtained with 75 ::aubio_onset_get_last_onset. It can also be derived from `offset` as 76 follows: 77 78 \code 79 t = total_frames + offset * hop_size - delay 80 \endcode 81 82 where `total_frames` is the total number of frames processed so far, and 83 `delay` is the current delay of the onset object, as returned by 84 ::aubio_onset_get_delay. 66 85 67 86 */ … … 70 89 /** get the time of the latest onset detected, in samples 71 90 72 \param o onset detection object as returned by new_aubio_onset91 \param o onset detection object as returned by ::new_aubio_onset 73 92 74 93 */ … … 77 96 /** get the time of the latest onset detected, in seconds 78 97 79 \param o onset detection object as returned by new_aubio_onset98 \param o onset detection object as returned by ::new_aubio_onset 80 99 81 100 */ … … 84 103 /** get the time of the latest onset detected, in milliseconds 85 104 86 \param o onset detection object as returned by new_aubio_onset105 \param o onset detection object as returned by ::new_aubio_onset 87 106 88 107 */ … … 91 110 /** set onset detection silence threshold 92 111 93 \param o onset detection object as returned by new_aubio_onset112 \param o onset detection object as returned by ::new_aubio_onset 94 113 \param silence new silence detection threshold 95 114 … … 99 118 /** get onset detection function 100 119 101 \param o onset detection object as returned by new_aubio_onset120 \param o onset detection object as returned by ::new_aubio_onset 102 121 \return the current value of the descriptor 103 122 … … 107 126 /** get thresholded onset detection function 108 127 109 \param o onset detection object as returned by new_aubio_onset128 \param o onset detection object as returned by ::new_aubio_onset 110 129 \return the value of the thresholded descriptor 111 130 … … 113 132 smpl_t aubio_onset_get_thresholded_descriptor ( aubio_onset_t *o); 114 133 115 /** set onset detection peak picking threshold 116 117 \param o onset detection object as returned by new_aubio_onset134 /** set onset detection peak picking threshold 135 136 \param o onset detection object as returned by ::new_aubio_onset 118 137 \param threshold new peak-picking threshold 119 138 … … 121 140 uint_t aubio_onset_set_threshold(aubio_onset_t * o, smpl_t threshold); 122 141 123 /** set minimum inter onset interval 124 125 \param o onset detection object as returned by new_aubio_onset 142 /** set minimum inter onset interval in samples 143 144 \param o onset detection object as returned by ::new_aubio_onset 145 \param minioi minimum interval between two consecutive onsets (in 146 samples) 147 148 */ 149 uint_t aubio_onset_set_minioi(aubio_onset_t * o, uint_t minioi); 150 151 /** set minimum inter onset interval in seconds 152 153 \param o onset detection object as returned by ::new_aubio_onset 154 \param minioi minimum interval between two consecutive onsets (in 155 seconds) 156 157 */ 158 uint_t aubio_onset_set_minioi_s(aubio_onset_t * o, smpl_t minioi); 159 160 /** set minimum inter onset interval in milliseconds 161 162 \param o onset detection object as returned by ::new_aubio_onset 126 163 \param minioi minimum interval between two consecutive onsets (in 127 164 milliseconds) 128 165 129 166 */ 130 uint_t aubio_onset_set_minioi(aubio_onset_t * o, uint_t minioi); 167 uint_t aubio_onset_set_minioi_ms(aubio_onset_t * o, smpl_t minioi); 168 169 /** set minimum inter onset interval in samples 170 171 \param o onset detection object as returned by ::new_aubio_onset 172 \param delay constant system delay to take back from detection time 173 (in samples) 174 175 */ 176 uint_t aubio_onset_set_delay(aubio_onset_t * o, uint_t delay); 177 178 /** set minimum inter onset interval in seconds 179 180 \param o onset detection object as returned by ::new_aubio_onset 181 \param delay constant system delay to take back from detection time 182 (in seconds) 183 184 */ 185 uint_t aubio_onset_set_delay_s(aubio_onset_t * o, smpl_t delay); 186 187 /** set minimum inter onset interval in milliseconds 188 189 \param o onset detection object as returned by ::new_aubio_onset 190 \param delay constant system delay to take back from detection time 191 (in milliseconds) 192 193 */ 194 uint_t aubio_onset_set_delay_ms(aubio_onset_t * o, smpl_t delay); 195 196 /** get minimum inter onset interval in samples 197 198 \param o onset detection object as returned by ::new_aubio_onset 199 \return minimum interval between two consecutive onsets (in 200 samples) 201 202 */ 203 uint_t aubio_onset_get_minioi(aubio_onset_t * o); 204 205 /** get minimum inter onset interval in seconds 206 207 \param o onset detection object as returned by ::new_aubio_onset 208 \return minimum interval between two consecutive onsets (in 209 seconds) 210 211 */ 212 smpl_t aubio_onset_get_minioi_s(aubio_onset_t * o); 213 214 /** get minimum inter onset interval in milliseconds 215 216 \param o onset detection object as returned by ::new_aubio_onset 217 \return minimum interval between two consecutive onsets (in 218 milliseconds) 219 220 */ 221 smpl_t aubio_onset_get_minioi_ms(aubio_onset_t * o); 222 223 /** get minimum inter onset interval in samples 224 225 \param o onset detection object as returned by ::new_aubio_onset 226 \return constant system delay to take back from detection time 227 (in samples) 228 229 */ 230 uint_t aubio_onset_get_delay(aubio_onset_t * o); 231 232 /** get minimum inter onset interval in seconds 233 234 \param o onset detection object as returned by ::new_aubio_onset 235 \return constant system delay to take back from detection time 236 (in seconds) 237 238 */ 239 smpl_t aubio_onset_get_delay_s(aubio_onset_t * o); 240 241 /** get minimum inter onset interval in milliseconds 242 243 \param o onset detection object as returned by ::new_aubio_onset 244 \return constant system delay to take back from detection time 245 (in milliseconds) 246 247 */ 248 smpl_t aubio_onset_get_delay_ms(aubio_onset_t * o); 131 249 132 250 /** delete onset detection object 133 251 134 \param o onset detection object to delete 252 \param o onset detection object to delete 135 253 136 254 */
Note: See TracChangeset
for help on using the changeset viewer.