Changes in src/pitchdetection.c [6d4ec49:b377d04]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/pitchdetection.c
r6d4ec49 rb377d04 15 15 along with this program; if not, write to the Free Software 16 16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 17 17 */ 18 18 19 19 #include "aubio_priv.h" … … 29 29 #include "pitchdetection.h" 30 30 31 typedef smpl_t (*aubio_pitchdetection_func_t) 32 (aubio_pitchdetection_t *p, fvec_t * ibuf); 33 typedef smpl_t (*aubio_pitchdetection_conv_t) 34 (smpl_t value, uint_t srate, uint_t bufsize); 35 31 typedef smpl_t (*aubio_pitchdetection_func_t)(aubio_pitchdetection_t *p, 32 fvec_t * ibuf); 33 typedef smpl_t (*aubio_pitchdetection_conv_t)(smpl_t value,uint_t srate,uint_t bufsize); 36 34 void aubio_pitchdetection_slideblock(aubio_pitchdetection_t *p, fvec_t *ibuf); 37 35 38 smpl_t aubio_pitchdetection_mcomb (aubio_pitchdetection_t *p, fvec_t *ibuf);39 smpl_t aubio_pitchdetection_yin 40 smpl_t aubio_pitchdetection_schmitt 41 smpl_t aubio_pitchdetection_fcomb 42 smpl_t aubio_pitchdetection_yinfft 36 smpl_t aubio_pitchdetection_mcomb(aubio_pitchdetection_t *p, fvec_t * ibuf); 37 smpl_t aubio_pitchdetection_yin(aubio_pitchdetection_t *p, fvec_t *ibuf); 38 smpl_t aubio_pitchdetection_schmitt(aubio_pitchdetection_t *p, fvec_t *ibuf); 39 smpl_t aubio_pitchdetection_fcomb(aubio_pitchdetection_t *p, fvec_t *ibuf); 40 smpl_t aubio_pitchdetection_yinfft(aubio_pitchdetection_t *p, fvec_t *ibuf); 43 41 44 42 /** generic pitch detection structure */ … … 66 64 smpl_t freqconvbin(smpl_t f,uint_t srate,uint_t bufsize); 67 65 smpl_t freqconvbin(smpl_t f,uint_t srate,uint_t bufsize){ 68 return aubio_freqtobin(f,srate,bufsize);66 return aubio_freqtobin(f,srate,bufsize); 69 67 } 70 68 71 69 smpl_t freqconvmidi(smpl_t f,uint_t srate,uint_t bufsize); 72 70 smpl_t freqconvmidi(smpl_t f,uint_t srate UNUSED,uint_t bufsize UNUSED){ 73 return aubio_freqtomidi(f);71 return aubio_freqtomidi(f); 74 72 } 75 73 76 74 smpl_t freqconvpass(smpl_t f,uint_t srate,uint_t bufsize); 77 75 smpl_t freqconvpass(smpl_t f,uint_t srate UNUSED,uint_t bufsize UNUSED){ 78 return f;76 return f; 79 77 } 80 78 81 79 aubio_pitchdetection_t * new_aubio_pitchdetection(uint_t bufsize, 82 83 84 85 86 80 uint_t hopsize, 81 uint_t channels, 82 uint_t samplerate, 83 aubio_pitchdetection_type type, 84 aubio_pitchdetection_mode mode) 87 85 { 88 89 90 91 92 93 94 95 96 97 p->callback = aubio_pitchdetection_yin;98 99 100 101 102 103 104 105 p->callback = aubio_pitchdetection_mcomb;106 107 case aubio_pitch_fcomb:108 109 p->fcomb = new_aubio_pitchfcomb(bufsize,hopsize,samplerate);110 p->callback = aubio_pitchdetection_fcomb;111 break;112 case aubio_pitch_schmitt:113 114 p->schmitt = new_aubio_pitchschmitt(bufsize,samplerate);115 p->callback = aubio_pitchdetection_schmitt;116 break;117 118 119 p->yinfft = new_aubio_pitchyinfft(bufsize);120 p->callback = aubio_pitchdetection_yinfft;121 122 break;123 default:124 break;125 126 127 128 p->freqconv = freqconvpass;129 break;130 131 p->freqconv = freqconvmidi;132 break;133 134 /* bug: not implemented */135 p->freqconv = freqconvmidi;136 break;137 138 p->freqconv = freqconvbin;139 break;140 default:141 break;142 }143 86 aubio_pitchdetection_t *p = AUBIO_NEW(aubio_pitchdetection_t); 87 p->srate = samplerate; 88 p->type = type; 89 p->mode = mode; 90 p->bufsize = bufsize; 91 switch(p->type) { 92 case aubio_pitch_yin: 93 p->buf = new_fvec(bufsize,channels); 94 p->yin = new_fvec(bufsize/2,channels); 95 p->callback = aubio_pitchdetection_yin; 96 p->yinthres = 0.15; 97 break; 98 case aubio_pitch_mcomb: 99 p->pv = new_aubio_pvoc(bufsize, hopsize, channels); 100 p->fftgrain = new_cvec(bufsize, channels); 101 p->mcomb = new_aubio_pitchmcomb(bufsize,hopsize,channels,samplerate); 102 p->filter = new_aubio_cdsgn_filter(samplerate); 103 p->callback = aubio_pitchdetection_mcomb; 104 break; 105 case aubio_pitch_fcomb: 106 p->buf = new_fvec(bufsize,channels); 107 p->fcomb = new_aubio_pitchfcomb(bufsize,hopsize,samplerate); 108 p->callback = aubio_pitchdetection_fcomb; 109 break; 110 case aubio_pitch_schmitt: 111 p->buf = new_fvec(bufsize,channels); 112 p->schmitt = new_aubio_pitchschmitt(bufsize,samplerate); 113 p->callback = aubio_pitchdetection_schmitt; 114 break; 115 case aubio_pitch_yinfft: 116 p->buf = new_fvec(bufsize,channels); 117 p->yinfft = new_aubio_pitchyinfft(bufsize); 118 p->callback = aubio_pitchdetection_yinfft; 119 p->yinthres = 0.85; 120 break; 121 default: 122 break; 123 } 124 switch(p->mode) { 125 case aubio_pitchm_freq: 126 p->freqconv = freqconvpass; 127 break; 128 case aubio_pitchm_midi: 129 p->freqconv = freqconvmidi; 130 break; 131 case aubio_pitchm_cent: 132 /* bug: not implemented */ 133 p->freqconv = freqconvmidi; 134 break; 135 case aubio_pitchm_bin: 136 p->freqconv = freqconvbin; 137 break; 138 default: 139 break; 140 } 141 return p; 144 142 } 145 143 146 144 void del_aubio_pitchdetection(aubio_pitchdetection_t * p) { 147 148 149 150 151 152 153 154 155 156 157 case aubio_pitch_schmitt:158 159 del_aubio_pitchschmitt(p->schmitt);160 break;161 case aubio_pitch_fcomb:162 163 del_aubio_pitchfcomb(p->fcomb);164 break;165 case aubio_pitch_yinfft:166 167 del_aubio_pitchyinfft(p->yinfft);168 break;169 170 171 172 145 switch(p->type) { 146 case aubio_pitch_yin: 147 del_fvec(p->yin); 148 del_fvec(p->buf); 149 break; 150 case aubio_pitch_mcomb: 151 del_aubio_pvoc(p->pv); 152 del_cvec(p->fftgrain); 153 del_aubio_pitchmcomb(p->mcomb); 154 break; 155 case aubio_pitch_schmitt: 156 del_fvec(p->buf); 157 del_aubio_pitchschmitt(p->schmitt); 158 break; 159 case aubio_pitch_fcomb: 160 del_fvec(p->buf); 161 del_aubio_pitchfcomb(p->fcomb); 162 break; 163 case aubio_pitch_yinfft: 164 del_fvec(p->buf); 165 del_aubio_pitchyinfft(p->yinfft); 166 break; 167 default: 168 break; 169 } 170 AUBIO_FREE(p); 173 171 } 174 172 175 173 void aubio_pitchdetection_slideblock(aubio_pitchdetection_t *p, fvec_t *ibuf){ 176 uint_t i,j = 0, overlap_size = 0; 177 overlap_size = p->buf->length-ibuf->length; 178 for (i=0;i<p->buf->channels;i++){ 179 for (j=0;j<overlap_size;j++){ 180 p->buf->data[i][j] = p->buf->data[i][j+ibuf->length]; 181 } 182 } 183 for (i=0;i<ibuf->channels;i++){ 184 for (j=0;j<ibuf->length;j++){ 185 p->buf->data[i][j+overlap_size] = ibuf->data[i][j]; 186 } 187 } 174 uint_t i,j = 0, overlap_size = 0; 175 overlap_size = p->buf->length-ibuf->length; 176 for (i=0;i<p->buf->channels;i++){ 177 for (j=0;j<overlap_size;j++){ 178 p->buf->data[i][j] = 179 p->buf->data[i][j+ibuf->length]; 180 } 181 } 182 for (i=0;i<ibuf->channels;i++){ 183 for (j=0;j<ibuf->length;j++){ 184 p->buf->data[i][j+overlap_size] = 185 ibuf->data[i][j]; 186 } 187 } 188 188 } 189 189 190 190 void aubio_pitchdetection_set_yinthresh(aubio_pitchdetection_t *p, smpl_t thres) { 191 p->yinthres = thres;191 p->yinthres = thres; 192 192 } 193 193 194 194 smpl_t aubio_pitchdetection(aubio_pitchdetection_t *p, fvec_t * ibuf) { 195 return p->freqconv(p->callback(p,ibuf),p->srate,p->bufsize);195 return p->freqconv(p->callback(p,ibuf),p->srate,p->bufsize); 196 196 } 197 197 198 198 smpl_t aubio_pitchdetection_mcomb(aubio_pitchdetection_t *p, fvec_t *ibuf) { 199 200 201 aubio_pvoc_do(p->pv,ibuf,p->fftgrain);202 pitch = aubio_pitchmcomb_detect(p->mcomb,p->fftgrain);203 /** \bug should move the >0 check within aubio_bintofreq */204 if (pitch>0.) {205 pitch = aubio_bintofreq(pitch,p->srate,p->bufsize);206 } else {207 pitch = 0.;208 }209 return pitch;199 smpl_t pitch = 0.; 200 aubio_filter_do(p->filter,ibuf); 201 aubio_pvoc_do(p->pv,ibuf,p->fftgrain); 202 pitch = aubio_pitchmcomb_detect(p->mcomb,p->fftgrain); 203 /** \bug should move the >0 check within aubio_bintofreq */ 204 if (pitch>0.) { 205 pitch = aubio_bintofreq(pitch,p->srate,p->bufsize); 206 } else { 207 pitch = 0.; 208 } 209 return pitch; 210 210 } 211 211 212 212 smpl_t aubio_pitchdetection_yin(aubio_pitchdetection_t *p, fvec_t *ibuf) { 213 214 aubio_pitchdetection_slideblock(p,ibuf);215 pitch = aubio_pitchyin_getpitchfast(p->buf,p->yin, p->yinthres);216 if (pitch>0) {217 pitch = p->srate/(pitch+0.);218 } else {219 pitch = 0.;220 }221 return pitch;213 smpl_t pitch = 0.; 214 aubio_pitchdetection_slideblock(p,ibuf); 215 pitch = aubio_pitchyin_getpitchfast(p->buf,p->yin, p->yinthres); 216 if (pitch>0) { 217 pitch = p->srate/(pitch+0.); 218 } else { 219 pitch = 0.; 220 } 221 return pitch; 222 222 } 223 223 224 224 225 225 smpl_t aubio_pitchdetection_yinfft(aubio_pitchdetection_t *p, fvec_t *ibuf){ 226 227 228 229 if (pitch>0) {230 pitch = p->srate/(pitch+0.);231 } else {232 pitch = 0.;233 }234 226 smpl_t pitch = 0.; 227 aubio_pitchdetection_slideblock(p,ibuf); 228 pitch = aubio_pitchyinfft_detect(p->yinfft,p->buf,p->yinthres); 229 if (pitch>0) { 230 pitch = p->srate/(pitch+0.); 231 } else { 232 pitch = 0.; 233 } 234 return pitch; 235 235 } 236 236 237 237 smpl_t aubio_pitchdetection_fcomb(aubio_pitchdetection_t *p, fvec_t *ibuf){ 238 aubio_pitchdetection_slideblock(p,ibuf);239 return aubio_pitchfcomb_detect(p->fcomb,p->buf);238 aubio_pitchdetection_slideblock(p,ibuf); 239 return aubio_pitchfcomb_detect(p->fcomb,p->buf); 240 240 } 241 241 242 242 smpl_t aubio_pitchdetection_schmitt(aubio_pitchdetection_t *p, fvec_t *ibuf){ 243 aubio_pitchdetection_slideblock(p,ibuf);244 return aubio_pitchschmitt_detect(p->schmitt,p->buf);245 } 243 aubio_pitchdetection_slideblock(p,ibuf); 244 return aubio_pitchschmitt_detect(p->schmitt,p->buf); 245 }
Note: See TracChangeset
for help on using the changeset viewer.