void OscilGen::convert2sine(int magtype) { REALTYPE mag[MAX_AD_HARMONICS], phase[MAX_AD_HARMONICS]; REALTYPE oscil[OSCIL_SIZE]; FFTFREQS freqs; newFFTFREQS(&freqs, OSCIL_SIZE / 2); get(oscil, -1.0); FFTwrapper *fft = new FFTwrapper(OSCIL_SIZE); fft->smps2freqs(oscil, freqs); delete (fft); REALTYPE max = 0.0; mag[0] = 0; phase[0] = 0; for(int i = 0; i < MAX_AD_HARMONICS; i++) { mag[i] = sqrt(pow(freqs.s[i + 1], 2) + pow(freqs.c[i + 1], 2.0)); phase[i] = atan2(freqs.c[i + 1], freqs.s[i + 1]); if(max < mag[i]) max = mag[i]; } if(max < 0.00001) max = 1.0; defaults(); for(int i = 0; i < MAX_AD_HARMONICS - 1; i++) { REALTYPE newmag = mag[i] / max; REALTYPE newphase = phase[i]; Phmag[i] = (int) ((newmag) * 64.0) + 64; Phphase[i] = 64 - (int) (64.0 * newphase / PI); if(Phphase[i] > 127) Phphase[i] = 127; if(Phmag[i] == 64) Phphase[i] = 64; } deleteFFTFREQS(&freqs); prepare(); }
void OscilGen::convert2sine() { float mag[MAX_AD_HARMONICS], phase[MAX_AD_HARMONICS]; float oscil[synth.oscilsize]; fft_t *freqs = new fft_t[synth.oscilsize / 2]; get(oscil, -1.0f); FFTwrapper *fft = new FFTwrapper(synth.oscilsize); fft->smps2freqs(oscil, freqs); delete (fft); normalize(freqs, synth.oscilsize); mag[0] = 0; phase[0] = 0; for(int i = 0; i < MAX_AD_HARMONICS; ++i) { mag[i] = abs(freqs, i + 1); phase[i] = arg(freqs, i + 1); } defaults(); for(int i = 0; i < MAX_AD_HARMONICS - 1; ++i) { float newmag = mag[i]; float newphase = phase[i]; Phmag[i] = (int) ((newmag) * 63.0f) + 64; Phphase[i] = 64 - (int) (64.0f * newphase / PI); if(Phphase[i] > 127) Phphase[i] = 127; if(Phmag[i] == 64) Phphase[i] = 64; } delete[] freqs; prepare(); }