play KEYWORD2 | play KEYWORD2 | ||||
updateCoefs KEYWORD2 | updateCoefs KEYWORD2 | ||||
frequency KEYWORD2 | frequency KEYWORD2 | ||||
phase KEYWORD2 | |||||
amplitude KEYWORD2 | amplitude KEYWORD2 | ||||
offset KEYWORD2 | offset KEYWORD2 | ||||
resonance KEYWORD2 | resonance KEYWORD2 |
} | } | ||||
void AudioSynthWaveformSine::frequency(float f) | |||||
{ | |||||
if (f > AUDIO_SAMPLE_RATE_EXACT / 2 || f < 0.0) return; | |||||
phase_increment = (f / AUDIO_SAMPLE_RATE_EXACT) * 4294967296.0f; | |||||
} | |||||
void AudioSynthWaveformSine::update(void) | void AudioSynthWaveformSine::update(void) | ||||
{ | { | ||||
audio_block_t *block; | audio_block_t *block; | ||||
block = allocate(); | block = allocate(); | ||||
if (block) { | if (block) { | ||||
ph = phase; | |||||
ph = phase_accumulator; | |||||
inc = phase_increment; | inc = phase_increment; | ||||
for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | ||||
index = ph >> 24; | index = ph >> 24; | ||||
block->data[i] = multiply_32x32_rshift32(val1 + val2, magnitude); | block->data[i] = multiply_32x32_rshift32(val1 + val2, magnitude); | ||||
ph += inc; | ph += inc; | ||||
} | } | ||||
phase = ph; | |||||
phase_accumulator = ph; | |||||
transmit(block); | transmit(block); | ||||
release(block); | release(block); | ||||
return; | return; | ||||
} | } | ||||
phase += phase_increment * AUDIO_BLOCK_SAMPLES; | |||||
phase_accumulator += phase_increment * AUDIO_BLOCK_SAMPLES; | |||||
} | } | ||||
void AudioSynthWaveformSineModulated::frequency(float f) | |||||
{ | |||||
// maximum unmodulated carrier frequency is 11025 Hz | |||||
// input = +1.0 doubles carrier | |||||
// input = -1.0 DC output | |||||
if (f >= AUDIO_SAMPLE_RATE_EXACT / 4 || f < 0.0) return; | |||||
phase_increment = (f / AUDIO_SAMPLE_RATE_EXACT) * 4294967296.0f; | |||||
} | |||||
void AudioSynthWaveformSineModulated::update(void) | void AudioSynthWaveformSineModulated::update(void) | ||||
{ | { | ||||
audio_block_t *block, *modinput; | audio_block_t *block, *modinput; | ||||
int16_t mod; | int16_t mod; | ||||
modinput = receiveReadOnly(); | modinput = receiveReadOnly(); | ||||
ph = phase; | |||||
ph = phase_accumulator; | |||||
inc = phase_increment; | inc = phase_increment; | ||||
block = allocate(); | block = allocate(); | ||||
if (!block) { | if (!block) { | ||||
} else { | } else { | ||||
ph += phase_increment * AUDIO_BLOCK_SAMPLES; | ph += phase_increment * AUDIO_BLOCK_SAMPLES; | ||||
} | } | ||||
phase = ph; | |||||
phase_accumulator = ph; | |||||
return; | return; | ||||
} | } | ||||
if (modinput) { | if (modinput) { | ||||
} | } | ||||
release(modinput); | release(modinput); | ||||
} else { | } else { | ||||
ph = phase; | |||||
ph = phase_accumulator; | |||||
inc = phase_increment; | inc = phase_increment; | ||||
for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | ||||
index = ph >> 24; | index = ph >> 24; | ||||
ph += inc; | ph += inc; | ||||
} | } | ||||
} | } | ||||
phase = ph; | |||||
phase_accumulator = ph; | |||||
transmit(block); | transmit(block); | ||||
release(block); | release(block); | ||||
} | } | ||||
{ | { | ||||
public: | public: | ||||
AudioSynthWaveformSine() : AudioStream(0, NULL), magnitude(16384) {} | AudioSynthWaveformSine() : AudioStream(0, NULL), magnitude(16384) {} | ||||
void frequency(float freq); | |||||
void frequency(float freq) { | |||||
if (freq < 0.0) freq = 0.0; | |||||
else if (freq > AUDIO_SAMPLE_RATE_EXACT/2) freq = AUDIO_SAMPLE_RATE_EXACT/2; | |||||
phase_increment = freq * (4294967296.0 / AUDIO_SAMPLE_RATE_EXACT); | |||||
} | |||||
void phase(float angle) { | |||||
if (angle < 0.0) angle = 0.0; | |||||
else if (angle > 360.0) { | |||||
angle = angle - 360.0; | |||||
if (angle >= 360.0) return; | |||||
} | |||||
phase_accumulator = angle * (4294967296.0 / 360.0); | |||||
} | |||||
void amplitude(float n) { | void amplitude(float n) { | ||||
if (n < 0) n = 0; | if (n < 0) n = 0; | ||||
else if (n > 1.0) n = 1.0; | else if (n > 1.0) n = 1.0; | ||||
} | } | ||||
virtual void update(void); | virtual void update(void); | ||||
private: | private: | ||||
uint32_t phase; | |||||
uint32_t phase_accumulator; | |||||
uint32_t phase_increment; | uint32_t phase_increment; | ||||
int32_t magnitude; | int32_t magnitude; | ||||
}; | }; | ||||
{ | { | ||||
public: | public: | ||||
AudioSynthWaveformSineModulated() : AudioStream(1, inputQueueArray), magnitude(16384) {} | AudioSynthWaveformSineModulated() : AudioStream(1, inputQueueArray), magnitude(16384) {} | ||||
void frequency(float freq); | |||||
// maximum unmodulated carrier frequency is 11025 Hz | |||||
// input = +1.0 doubles carrier | |||||
// input = -1.0 DC output | |||||
void frequency(float freq) { | |||||
if (freq < 0.0) freq = 0.0; | |||||
else if (freq > AUDIO_SAMPLE_RATE_EXACT/4) freq = AUDIO_SAMPLE_RATE_EXACT/4; | |||||
phase_increment = freq * (4294967296.0 / AUDIO_SAMPLE_RATE_EXACT); | |||||
} | |||||
void phase(float angle) { | |||||
if (angle < 0.0) angle = 0.0; | |||||
else if (angle > 360.0) { | |||||
angle = angle - 360.0; | |||||
if (angle >= 360.0) return; | |||||
} | |||||
phase_accumulator = angle * (4294967296.0 / 360.0); | |||||
} | |||||
void amplitude(float n) { | void amplitude(float n) { | ||||
if (n < 0) n = 0; | if (n < 0) n = 0; | ||||
else if (n > 1.0) n = 1.0; | else if (n > 1.0) n = 1.0; | ||||
} | } | ||||
virtual void update(void); | virtual void update(void); | ||||
private: | private: | ||||
uint32_t phase; | |||||
uint32_t phase_accumulator; | |||||
uint32_t phase_increment; | uint32_t phase_increment; | ||||
audio_block_t *inputQueueArray[1]; | audio_block_t *inputQueueArray[1]; | ||||
int32_t magnitude; | int32_t magnitude; |
else if (t_freq > AUDIO_SAMPLE_RATE_EXACT / 2) t_freq = AUDIO_SAMPLE_RATE_EXACT / 2; | else if (t_freq > AUDIO_SAMPLE_RATE_EXACT / 2) t_freq = AUDIO_SAMPLE_RATE_EXACT / 2; | ||||
tone_incr = (t_freq * (0x80000000LL/AUDIO_SAMPLE_RATE_EXACT)) + 0.5; | tone_incr = (t_freq * (0x80000000LL/AUDIO_SAMPLE_RATE_EXACT)) + 0.5; | ||||
} | } | ||||
void phase(float angle) { | |||||
if (angle < 0.0) angle = 0.0; | |||||
else if (angle > 360.0) { | |||||
angle = angle - 360.0; | |||||
if (angle >= 360.0) return; | |||||
} | |||||
tone_phase = angle * (2147483648.0 / 360.0); | |||||
} | |||||
void amplitude(float n) { // 0 to 1.0 | void amplitude(float n) { // 0 to 1.0 | ||||
if (n < 0) n = 0; | if (n < 0) n = 0; | ||||
else if (n > 1.0) n = 1.0; | else if (n > 1.0) n = 1.0; |