@@ -43,6 +43,7 @@ stop KEYWORD2 | |||
play KEYWORD2 | |||
updateCoefs KEYWORD2 | |||
frequency KEYWORD2 | |||
phase KEYWORD2 | |||
amplitude KEYWORD2 | |||
offset KEYWORD2 | |||
resonance KEYWORD2 |
@@ -33,12 +33,6 @@ extern const int16_t AudioWaveformSine[257]; | |||
} | |||
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) | |||
{ | |||
audio_block_t *block; | |||
@@ -47,7 +41,7 @@ void AudioSynthWaveformSine::update(void) | |||
block = allocate(); | |||
if (block) { | |||
ph = phase; | |||
ph = phase_accumulator; | |||
inc = phase_increment; | |||
for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | |||
index = ph >> 24; | |||
@@ -60,26 +54,15 @@ void AudioSynthWaveformSine::update(void) | |||
block->data[i] = multiply_32x32_rshift32(val1 + val2, magnitude); | |||
ph += inc; | |||
} | |||
phase = ph; | |||
phase_accumulator = ph; | |||
transmit(block); | |||
release(block); | |||
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) | |||
{ | |||
audio_block_t *block, *modinput; | |||
@@ -88,7 +71,7 @@ void AudioSynthWaveformSineModulated::update(void) | |||
int16_t mod; | |||
modinput = receiveReadOnly(); | |||
ph = phase; | |||
ph = phase_accumulator; | |||
inc = phase_increment; | |||
block = allocate(); | |||
if (!block) { | |||
@@ -103,7 +86,7 @@ void AudioSynthWaveformSineModulated::update(void) | |||
} else { | |||
ph += phase_increment * AUDIO_BLOCK_SAMPLES; | |||
} | |||
phase = ph; | |||
phase_accumulator = ph; | |||
return; | |||
} | |||
if (modinput) { | |||
@@ -124,7 +107,7 @@ void AudioSynthWaveformSineModulated::update(void) | |||
} | |||
release(modinput); | |||
} else { | |||
ph = phase; | |||
ph = phase_accumulator; | |||
inc = phase_increment; | |||
for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | |||
index = ph >> 24; | |||
@@ -137,12 +120,9 @@ void AudioSynthWaveformSineModulated::update(void) | |||
ph += inc; | |||
} | |||
} | |||
phase = ph; | |||
phase_accumulator = ph; | |||
transmit(block); | |||
release(block); | |||
} | |||
@@ -38,7 +38,19 @@ class AudioSynthWaveformSine : public AudioStream | |||
{ | |||
public: | |||
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) { | |||
if (n < 0) n = 0; | |||
else if (n > 1.0) n = 1.0; | |||
@@ -46,7 +58,7 @@ public: | |||
} | |||
virtual void update(void); | |||
private: | |||
uint32_t phase; | |||
uint32_t phase_accumulator; | |||
uint32_t phase_increment; | |||
int32_t magnitude; | |||
}; | |||
@@ -55,7 +67,22 @@ class AudioSynthWaveformSineModulated : public AudioStream | |||
{ | |||
public: | |||
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) { | |||
if (n < 0) n = 0; | |||
else if (n > 1.0) n = 1.0; | |||
@@ -63,7 +90,7 @@ public: | |||
} | |||
virtual void update(void); | |||
private: | |||
uint32_t phase; | |||
uint32_t phase_accumulator; | |||
uint32_t phase_increment; | |||
audio_block_t *inputQueueArray[1]; | |||
int32_t magnitude; |
@@ -67,6 +67,14 @@ public: | |||
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; | |||
} | |||
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 | |||
if (n < 0) n = 0; | |||
else if (n > 1.0) n = 1.0; |