|
-
-
- #include "synth_sine.h"
- #include "utility/dspinst.h"
-
-
- extern "C" {
- extern const int16_t AudioWaveformSine[257];
- }
-
-
- void AudioSynthWaveformSine::update(void)
- {
- audio_block_t *block;
- uint32_t i, ph, inc, index, scale;
- int32_t val1, val2;
-
- block = allocate();
- if (block) {
- ph = phase_accumulator;
- inc = phase_increment;
- for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
- index = ph >> 24;
- val1 = AudioWaveformSine[index];
- val2 = AudioWaveformSine[index+1];
- scale = (ph >> 8) & 0xFFFF;
- val2 *= scale;
- val1 *= 0xFFFF - scale;
-
- block->data[i] = multiply_32x32_rshift32(val1 + val2, magnitude);
- ph += inc;
- }
- phase_accumulator = ph;
- transmit(block);
- release(block);
- return;
- }
- phase_accumulator += phase_increment * AUDIO_BLOCK_SAMPLES;
- }
-
-
- void AudioSynthWaveformSineModulated::update(void)
- {
- audio_block_t *block, *modinput;
- uint32_t i, ph, inc, index, scale;
- int32_t val1, val2;
- int16_t mod;
-
- modinput = receiveReadOnly();
- ph = phase_accumulator;
- inc = phase_increment;
- block = allocate();
- if (!block) {
-
- if (modinput) {
-
- for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
- mod = modinput->data[i];
- ph += inc + (multiply_32x32_rshift32(inc, mod << 16) << 1);
- }
- release(modinput);
- } else {
- ph += phase_increment * AUDIO_BLOCK_SAMPLES;
- }
- phase_accumulator = ph;
- return;
- }
- if (modinput) {
- for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
- index = ph >> 24;
- val1 = AudioWaveformSine[index];
- val2 = AudioWaveformSine[index+1];
- scale = (ph >> 8) & 0xFFFF;
- val2 *= scale;
- val1 *= 0xFFFF - scale;
-
- block->data[i] = multiply_32x32_rshift32(val1 + val2, magnitude);
-
-
- mod = modinput->data[i];
- ph += inc + (multiply_32x32_rshift32(inc, mod << 16) << 1);
-
- }
- release(modinput);
- } else {
- ph = phase_accumulator;
- inc = phase_increment;
- for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
- index = ph >> 24;
- val1 = AudioWaveformSine[index];
- val2 = AudioWaveformSine[index+1];
- scale = (ph >> 8) & 0xFFFF;
- val2 *= scale;
- val1 *= 0xFFFF - scale;
- block->data[i] = (val1 + val2) >> 16;
- ph += inc;
- }
- }
- phase_accumulator = ph;
- transmit(block);
- release(block);
- }
-
|