Exemple #1
0
// Poly-BLEP square
float blep_square(float phase, float dt)
{
    float pwm = 0.5f;
    float value = phase < pwm ? 1.0 : -1.0;
    value += poly_blep(phase, dt);
    value -= poly_blep(fmod(phase + 1.0 - pwm, 1.0), dt);
    return value;
}
Exemple #2
0
// Poly-BLEP sawtooth
float blep_sawtooth(float phase, float dt)
{
    return sawtooth(phase) - poly_blep(phase, dt);
}
Exemple #3
0
real
osc_get_sample
    (oscillator_t   *osc
    )
{
    real two_pi = 2.0 * M_PI;
    real t = osc->phase / two_pi;
    real value = 0.0;

    switch(osc->waveform)
    {
    case SINE:
        value = sin(osc->phase);
        break;
    case SAW:
        value = (2.0 * t) - 1.0;
        value -= poly_blep(osc, t);
        break;
    case SQUARE:
        if (osc->phase < M_PI)
        {
            value = 1.0;
        }
        else
        {
            value = -1.0;
        }
        value += poly_blep(osc, t);
        value -= poly_blep(osc, fmod(t + 0.5, 1.0));
        break;
    case TRIANGLE:
        if (osc->phase < M_PI)
        {
            value = 1.0;
        }
        else
        {
            value = -1.0;
        }
        value += poly_blep(osc, t);
        value -= poly_blep(osc, fmod(t + 0.5, 1.0));
        value = value * osc->phase_increment + (1.0 - osc->phase_increment) * osc->last_output;
        break;
    case WHITE_NOISE:
        value = 2.0 *((real)rand())/RAND_MAX - 1.0;
        break;
    }

    osc->phase += osc->phase_increment;
    while (osc->phase > two_pi)
    {
        osc->phase -= two_pi;
    }

    osc->last_output = value;

    value *= osc->gain;
            
    return value;
    
    
    
}