| @@ -48,25 +48,30 @@ void AudioSynthWaveformPWM::update(void) | |||
| return; | |||
| } | |||
| if (modinput) { | |||
| const uint32_t _duration = duration; | |||
| uint32_t _elapsed = elapsed; | |||
| int32_t _magnitude = magnitude; | |||
| for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | |||
| elapsed += 65536; | |||
| _elapsed += 65536; | |||
| int32_t in = modinput->data[i]; | |||
| if (magnitude < 0) in = -in; | |||
| uint32_t dur = ((uint64_t)(in + 32768) * duration) >> 15; | |||
| if (elapsed < dur) { | |||
| out = magnitude; | |||
| if (_magnitude < 0) in = -in; | |||
| uint32_t dur = ((uint64_t)(in + 32768) * _duration) >> 15; | |||
| if (_elapsed < dur) { | |||
| out = _magnitude; | |||
| } else { | |||
| int32_t e = elapsed - dur; | |||
| int32_t e = _elapsed - dur; | |||
| signed_saturate_rshift(e, 17, 0); | |||
| if (e < 0) e = 0; | |||
| else if (e > 65535) e = 65535; | |||
| elapsed = e; | |||
| _elapsed = e; | |||
| // elapsed must be 0 to 65535 | |||
| // magnitude must be -32767 to +32767 | |||
| out = magnitude - ((magnitude * elapsed * 2) >> 16); | |||
| magnitude = -magnitude; | |||
| out = _magnitude - ((_magnitude * _elapsed) >> 15); | |||
| _magnitude = -_magnitude; | |||
| } | |||
| block->data[i] = out; | |||
| } | |||
| elapsed = _elapsed; | |||
| magnitude = _magnitude; | |||
| release(modinput); | |||
| } else { | |||
| for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | |||
| @@ -77,7 +82,7 @@ void AudioSynthWaveformPWM::update(void) | |||
| elapsed -= duration; | |||
| // elapsed must be 0 to 65535 | |||
| // magnitude must be -32767 to +32767 | |||
| out = magnitude - ((magnitude * elapsed * 2) >> 16); | |||
| out = magnitude - ((magnitude * elapsed) >> 15); | |||
| magnitude = -magnitude; | |||
| } | |||
| block->data[i] = out; | |||