void WavePlayBack(uint32_t AudioFreq)
{ 
    /* note: these mallocs are NOT freed at the moment */
    sp_create(&sp);
    sp->sr = AudioFreq;

    sp_ftbl_create(sp, &ft, 8192);
    sp_gen_sine(sp, ft);

    sp_osc_create(&osc);

    sp_osc_init(sp, osc, ft, 0);
    osc->freq = 0.2f;
    osc->amp = 1.f;
    uint32_t i;

    for(i = 0; i < NOSCS; i++) {
        sp_fosc_create(&fosc[i]);
        sp_fosc_init(sp, fosc[i], ft);
        fosc[i]->freq = sp_midi2cps(scale[i]);
        fosc[i]->amp = 0.1f;
    }

    for(i = 0; i < MY_BUFSIZE; i++) {
        buf0[i] = 0;
        buf1[i] = 0;
    }

    sp_revsc_create(&revsc);
    sp_revsc_init(sp, revsc);

    /* Initialize wave player (Codec, DMA, I2C) */
    WavePlayerInit(AudioFreq);
    nextbuf = 1;

    compute_buffer(buf1, MY_BUFSIZE);
    Audio_MAL_Play((uint32_t)buf0, MY_BUFSIZE / 2);

    EVAL_AUDIO_Mute(AUDIO_MUTE_ON);
    while(1) {
        while(nextbuf == 1);
        if(please_play == 0) {
            EVAL_AUDIO_Mute(AUDIO_MUTE_OFF);
            please_play = 1;
        }
        compute_buffer(buf0, MY_BUFSIZE);
        while(nextbuf == 0);
        compute_buffer(buf1, MY_BUFSIZE);
    };

}
    void init(int channelCount, double inSampleRate) {
        channels = channelCount;

        sampleRate = float(inSampleRate);

        sp_create(&sp);
        sp->sr = sampleRate;
        sp->nchan = channels;
        sp_fosc_create(&fosc);
        sp_fosc_init(sp, fosc, ftbl);
        
        fosc->freq = 440;
        fosc->car = 1.0;
        fosc->mod = 1;
        fosc->indx = 1;
        fosc->amp = 1;
    }
    void init(int _channels, double _sampleRate) override {
        AKSoundpipeKernel::init(_channels, _sampleRate);

        sp_fosc_create(&fosc);
        sp_fosc_init(sp, fosc, ftbl);

        fosc->freq = 440;
        fosc->car = 1.0;
        fosc->mod = 1;
        fosc->indx = 1;
        fosc->amp = 1;

        baseFrequencyRamper.init();
        carrierMultiplierRamper.init();
        modulatingMultiplierRamper.init();
        modulationIndexRamper.init();
        amplitudeRamper.init();
    }