void autotune_init(t_autotune *x,unsigned long sr) { unsigned long ti; x->fs = sr; x->aref = 440; x->fTune = x->aref; if (x->cbsize == 0) { if (x->fs >=88200) { x->cbsize = 4096; } else { x->cbsize = 2048; } } x->corrsize = x->cbsize / 2 + 1; x->pmax = 1/(float)70; // max and min periods (ms) x->pmin = 1/(float)2400; // eventually may want to bring these out as sliders x->pperiod = x->pmax; x->nmax = (unsigned long)(x->fs * x->pmax); if (x->nmax > x->corrsize) { x->nmax = x->corrsize; } x->nmin = (unsigned long)(x->fs * x->pmin); x->cbi = (float*) calloc(x->cbsize, sizeof(float)); x->cbf = (float*) calloc(x->cbsize, sizeof(float)); x->cbo = (float*) calloc(x->cbsize, sizeof(float)); //x->cbonorm = (float*) calloc(x->cbsize, sizeof(float)); x->cbiwr = 0; x->cbord = 0; x->lfophase = 0; // Initialize formant corrector x->ford = 7; // should be sufficient to capture formants x->falph = pow(0.001, (float) 80 / (x->fs)); x->flamb = -(0.8517*sqrt(atan(0.06583*x->fs))-0.1916); // or about -0.88 @ 44.1kHz x->fk = calloc(x->ford, sizeof(float)); x->fb = calloc(x->ford, sizeof(float)); x->fc = calloc(x->ford, sizeof(float)); x->frb = calloc(x->ford, sizeof(float)); x->frc = calloc(x->ford, sizeof(float)); x->fsig = calloc(x->ford, sizeof(float)); x->fsmooth = calloc(x->ford, sizeof(float)); x->fhp = 0; x->flp = 0; x->flpa = pow(0.001, (float) 10 / (x->fs)); x->fbuff = (float**) malloc((x->ford)*sizeof(float*)); for (ti=0; ti<x->ford; ti++) { x->fbuff[ti] = calloc(x->cbsize, sizeof(float)); } x->ftvec = calloc(x->ford, sizeof(float)); x->fmute = 1; x->fmutealph = pow(0.001, (float)1 / (x->fs)); // Standard raised cosine window, max height at N/2 x->hannwindow = (float*) calloc(x->cbsize, sizeof(float)); for (ti=0; ti<x->cbsize; ti++) { x->hannwindow[ti] = -0.5*cos(2*PI*ti/(x->cbsize - 1)) + 0.5; } // Generate a window with a single raised cosine from N/4 to 3N/4 x->cbwindow = (float*) calloc(x->cbsize, sizeof(float)); for (ti=0; ti<(x->cbsize / 2); ti++) { x->cbwindow[ti+x->cbsize/4] = -0.5*cos(4*PI*ti/(x->cbsize - 1)) + 0.5; } if (x->noverlap == 0) x->noverlap = 4; //fprintf(stderr,"%d %d\n", x->cbsize, x->noverlap); x->fx = fft_con(x->cbsize); x->ffttime = (float*) calloc(x->cbsize, sizeof(float)); x->fftfreqre = (float*) calloc(x->corrsize, sizeof(float)); x->fftfreqim = (float*) calloc(x->corrsize, sizeof(float)); // ---- Calculate autocorrelation of window ---- x->acwinv = (float*) calloc(x->cbsize, sizeof(float)); for (ti=0; ti<x->cbsize; ti++) { x->ffttime[ti] = x->cbwindow[ti]; } fft_forward(x->fx, x->cbwindow, x->fftfreqre, x->fftfreqim); for (ti=0; ti<x->corrsize; ti++) { x->fftfreqre[ti] = (x->fftfreqre[ti])*(x->fftfreqre[ti]) + (x->fftfreqim[ti])*(x->fftfreqim[ti]); x->fftfreqim[ti] = 0; } fft_inverse(x->fx, x->fftfreqre, x->fftfreqim, x->ffttime); for (ti=1; ti<x->cbsize; ti++) { x->acwinv[ti] = x->ffttime[ti]/x->ffttime[0]; if (x->acwinv[ti] > 0.000001) { x->acwinv[ti] = (float)1/x->acwinv[ti]; } else { x->acwinv[ti] = 0; } } x->acwinv[0] = 1; // ---- END Calculate autocorrelation of window ---- x->lrshift = 0; x->ptarget = 0; x->sptarget = 0; //x->sptarget = 0; //x->wasvoiced = 0; //x->persistamt = 0; //x->glidepersist = 100; // 100 ms glide persist x->vthresh = 0.7; // The voiced confidence (unbiased peak) threshold level // Pitch shifter initialization x->phprdd = 0.01; // Default period //x->phprd = x->phprdd; x->inphinc = (float)1/(x->phprdd * x->fs); x->phincfact = 1; x->phasein = 0; x->phaseout = 0; x->frag = (float*) calloc(x->cbsize, sizeof(float)); x->fragsize = 0; }
void AutoTalent::init(unsigned long sr) { unsigned long ti; fs = sr; aref = 440; if (fs >=88200) { cbsize = 4096; } else { cbsize = 2048; } corrsize = cbsize / 2 + 1; pmax = 1/(float)70; // max and min periods (ms) pmin = 1/(float)700; // eventually may want to bring these out as sliders pperiod = pmax; nmax = (unsigned long)(fs * pmax); if (nmax > corrsize) { nmax = corrsize; } nmin = (unsigned long)(fs * pmin); cbi = (float*) calloc(cbsize, sizeof(float)); cbo = (float*) calloc(cbsize, sizeof(float)); cbonorm = (float*) calloc(cbsize, sizeof(float)); cbiwr = 0; cbord = 0; // Standard raised cosine window, max height at N/2 hannwindow = (float*) calloc(cbsize, sizeof(float)); for (ti=0; ti<cbsize; ti++) { hannwindow[ti] = -0.5*cos(2*PI*ti/(cbsize - 1)) + 0.5; } // Generate a window with a single raised cosine from N/4 to 3N/4 cbwindow = (float*) calloc(cbsize, sizeof(float)); for (ti=0; ti<(cbsize / 2); ti++) { cbwindow[ti+cbsize/4] = -0.5*cos(4*PI*ti/(cbsize - 1)) + 0.5; } noverlap = 4; fmembvars = fft_con(cbsize); ffttime = (float*) calloc(cbsize, sizeof(float)); fftfreqre = (float*) calloc(corrsize, sizeof(float)); fftfreqim = (float*) calloc(corrsize, sizeof(float)); // ---- Calculate autocorrelation of window ---- acwinv = (float*) calloc(cbsize, sizeof(float)); for (ti=0; ti<cbsize; ti++) { ffttime[ti] = cbwindow[ti]; } fft_forward(fmembvars, cbwindow, fftfreqre, fftfreqim); for (ti=0; ti<corrsize; ti++) { fftfreqre[ti] = (fftfreqre[ti])*(fftfreqre[ti]) + (fftfreqim[ti])*(fftfreqim[ti]); fftfreqim[ti] = 0; } fft_inverse(fmembvars, fftfreqre, fftfreqim, ffttime); for (ti=1; ti<cbsize; ti++) { acwinv[ti] = ffttime[ti]/ffttime[0]; if (acwinv[ti] > 0.000001) { acwinv[ti] = (float)1/acwinv[ti]; } else { acwinv[ti] = 0; } } acwinv[0] = 1; // ---- END Calculate autocorrelation of window ---- lrshift = 0; ptarget = 0; sptarget = 0; wasvoiced = 0; persistamt = 0; glidepersist = 100; // 100 ms glide persist vthresh = 0.8; // The voiced confidence (unbiased peak) threshold level // Pitch shifter initialization phprdd = 0.01; // Default period phprd = phprdd; phinc = (float)1/(phprd * fs); phincfact = 1; phasein = 0; phaseout = 0; frag = (float*) calloc(cbsize, sizeof(float)); fragsize = 0; }
Autotalent * instantiateAutotalent(unsigned long SampleRate) { unsigned long ti; Autotalent* membvars = malloc(sizeof(Autotalent)); membvars->aref = 440; membvars->fs = SampleRate; if (SampleRate>=88200) { membvars->cbsize = 4096; } else { membvars->cbsize = 2048; } membvars->corrsize = membvars->cbsize / 2 + 1; membvars->pmax = 1/(float)70; // max and min periods (ms) membvars->pmin = 1/(float)700; // eventually may want to bring these out as sliders membvars->nmax = (unsigned long)(SampleRate * membvars->pmax); if (membvars->nmax > membvars->corrsize) { membvars->nmax = membvars->corrsize; } membvars->nmin = (unsigned long)(SampleRate * membvars->pmin); membvars->cbi = calloc(membvars->cbsize, sizeof(float)); membvars->cbf = calloc(membvars->cbsize, sizeof(float)); membvars->cbo = calloc(membvars->cbsize, sizeof(float)); membvars->cbiwr = 0; membvars->cbord = 0; membvars->lfophase = 0; // Initialize formant corrector membvars->ford = 7; // should be sufficient to capture formants membvars->falph = pow(0.001, (float) 80 / (SampleRate)); membvars->flamb = -(0.8517*sqrt(atan(0.06583*SampleRate))-0.1916); // or about -0.88 @ 44.1kHz membvars->fk = calloc(membvars->ford, sizeof(float)); membvars->fb = calloc(membvars->ford, sizeof(float)); membvars->fc = calloc(membvars->ford, sizeof(float)); membvars->frb = calloc(membvars->ford, sizeof(float)); membvars->frc = calloc(membvars->ford, sizeof(float)); membvars->fsig = calloc(membvars->ford, sizeof(float)); membvars->fsmooth = calloc(membvars->ford, sizeof(float)); membvars->fhp = 0; membvars->flp = 0; membvars->flpa = pow(0.001, (float) 10 / (SampleRate)); membvars->fbuff = (float**) malloc((membvars->ford)*sizeof(float*)); for (ti=0; ti<membvars->ford; ti++) { membvars->fbuff[ti] = calloc(membvars->cbsize, sizeof(float)); } membvars->ftvec = calloc(membvars->ford, sizeof(float)); membvars->fmute = 1; membvars->fmutealph = pow(0.001, (float)1 / (SampleRate)); // Standard raised cosine window, max height at N/2 membvars->hannwindow = calloc(membvars->cbsize, sizeof(float)); for (ti=0; ti<membvars->cbsize; ti++) { membvars->hannwindow[ti] = -0.5*cos(2*PI*ti/membvars->cbsize) + 0.5; } // Generate a window with a single raised cosine from N/4 to 3N/4 membvars->cbwindow = calloc(membvars->cbsize, sizeof(float)); for (ti=0; ti<(membvars->cbsize / 2); ti++) { membvars->cbwindow[ti+membvars->cbsize/4] = -0.5*cos(4*PI*ti/(membvars->cbsize - 1)) + 0.5; } membvars->noverlap = 4; membvars->fmembvars = fft_con(membvars->cbsize); membvars->ffttime = calloc(membvars->cbsize, sizeof(float)); membvars->fftfreqre = calloc(membvars->corrsize, sizeof(float)); membvars->fftfreqim = calloc(membvars->corrsize, sizeof(float)); // ---- Calculate autocorrelation of window ---- membvars->acwinv = calloc(membvars->cbsize, sizeof(float)); for (ti=0; ti<membvars->cbsize; ti++) { membvars->ffttime[ti] = membvars->cbwindow[ti]; } fft_forward(membvars->fmembvars, membvars->cbwindow, membvars->fftfreqre, membvars->fftfreqim); for (ti=0; ti<membvars->corrsize; ti++) { membvars->fftfreqre[ti] = (membvars->fftfreqre[ti])*(membvars->fftfreqre[ti]) + (membvars->fftfreqim[ti])*(membvars->fftfreqim[ti]); membvars->fftfreqim[ti] = 0; } fft_inverse(membvars->fmembvars, membvars->fftfreqre, membvars->fftfreqim, membvars->ffttime); for (ti=1; ti<membvars->cbsize; ti++) { membvars->acwinv[ti] = membvars->ffttime[ti]/membvars->ffttime[0]; if (membvars->acwinv[ti] > 0.000001) { membvars->acwinv[ti] = (float)1/membvars->acwinv[ti]; } else { membvars->acwinv[ti] = 0; } } membvars->acwinv[0] = 1; // ---- END Calculate autocorrelation of window ---- membvars->lrshift = 0; membvars->ptarget = 0; membvars->sptarget = 0; membvars->vthresh = 0.7; // The voiced confidence (unbiased peak) threshold level // Pitch shifter initialization membvars->phprdd = 0.01; // Default period membvars->inphinc = (float)1/(membvars->phprdd * SampleRate); membvars->phincfact = 1; membvars->phasein = 0; membvars->phaseout = 0; membvars->frag = calloc(membvars->cbsize, sizeof(float)); membvars->fragsize = 0; return membvars; }