// 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; }
// Poly-BLEP sawtooth float blep_sawtooth(float phase, float dt) { return sawtooth(phase) - poly_blep(phase, dt); }
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; }