예제 #1
0
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();
}
예제 #2
0
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();
}