// WaveformModulated MULTISAW -------------------------------------
case WAVEFORM_MULTISAW:
{
int32_t sample;
uint8_t parameter_a;
uint8_t parameter_b;
parameter_a = osc_par_a; // Parameter Spread
parameter_b = osc_par_b; // Parameter Sawmix
phase_spread = (phase_increment >> 14) * parameter_a;
++phase_spread;
saw_phase_increment = phase_increment & random(0xFFFF);
for (uint8_t i = 0; i < 5; ++i)
{
saw_phase_increment += phase_spread;
state_saw.increments[i] = saw_phase_increment;
}
// Phase spread and sawmix
int32_t magnitude_a;
int32_t magnitude_b;
magnitude_a = magnitude * ((128 - parameter_b) * 0.004f);
magnitude_b = magnitude * ((1 + parameter_b) * 0.002f);
for (i = 0; i < AUDIO_BLOCK_SAMPLES; i++)
{
state_saw.data_qs_phase[0] -= state_saw.increments[1];
state_saw.data_qs_phase[1] -= state_saw.increments[2];
state_saw.data_qs_phase[2] += state_saw.increments[3];
state_saw.data_qs_phase[3] += state_saw.increments[4];
state_saw.phase[0] = phasedata[i];
state_saw.phase[1] = (state_saw.phase[0] + state_saw.data_qs_phase[0]);
state_saw.phase[2] = (state_saw.phase[1] + state_saw.data_qs_phase[1]);
state_saw.phase[3] = (state_saw.phase[2] + state_saw.data_qs_phase[2]);
state_saw.phase[4] = (state_saw.phase[3] + state_saw.data_qs_phase[3]);
sample = (signed_multiply_32x16t(magnitude_a, state_saw.phase[0]));
sample += (signed_multiply_32x16t(magnitude_b, state_saw.phase[1]));
sample += (signed_multiply_32x16t(magnitude_b, state_saw.phase[2]));
sample += (signed_multiply_32x16t(magnitude_b, state_saw.phase[3]));
sample += (signed_multiply_32x16t(magnitude_b, state_saw.phase[4]));
float sample_f;
sample_f = sample * 1.2f * DIV32768;
sample_f = 1.5f * sample_f - 0.5f * sample_f * sample_f * sample_f;
sample = (sample_f * 32768);
*bp++ = ~sample;
}
}
break;