Oscillator changing pitch causing popping

Hi Thomas,

The problem is that you are destroying and recreating a new oscillator unit each time you change notes. Try creating the oscillator just once outside the loop. Then when you want to change notes, simply call DSP::setParameterFloat again. The new rate will take effect on the next mix, and there will be no pops or clicks.

#include "fmod.h"
#include "fmod.hpp"
#include <math.h>

#define twoToTheTwelfthRoot 1.059463094359295264562f
#define G2 98.00f

float freqLookup[36] = { 0 };
int timer = 0;
int iterator = 0;

FMOD::System    *system;
FMOD::Channel   *channel = 0;
FMOD::DSP       *voice;
void            *extradriverdata = 0;

int main(void)
{   
    //fill our lookup table
    for (int i = 0; i < 36; ++i)
        freqLookup[i] = G2 * powf(twoToTheTwelfthRoot, float(i));

    //create/initialize the system
    FMOD::System_Create(&system);
    system->init(32, FMOD_INIT_NORMAL, extradriverdata);

    //create/play sine wave
    system->createDSPByType(FMOD_DSP_TYPE_OSCILLATOR, &voice);
    voice->setParameterFloat(FMOD_DSP_OSCILLATOR_RATE, freqLookup[iterator]);
    system->playDSP(voice, 0, false, &channel);
    channel->setVolume(0.75f);

    while (true)
    {
        if (timer++ == 2500000)
        {
            //reset timer
            timer = 0;

            //change notes
            if (iterator++ >= 35)
                iterator = 0;

            voice->setParameterFloat(FMOD_DSP_OSCILLATOR_RATE, freqLookup[iterator]);
        }

        system->update();
    }

    //clean up oscillator
    channel->stop();
    voice->release();

    //shutdown the system
    system->release();

    return 0;
}
1 Like