|
|
|
/*
|
|
|
|
* AdioSynthWaveformSine_F32
|
|
|
|
*
|
|
|
|
* Created: Chip Audette (OpenAudio) Feb 2017
|
|
|
|
* Modeled on: AudioSynthWaveformSine from Teensy Audio Library
|
|
|
|
*
|
|
|
|
* Purpose: Create sine wave of given amplitude and frequency
|
|
|
|
*
|
|
|
|
* License: MIT License. Use at your own risk.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef synth_sine_f32_h_
|
|
|
|
#define synth_sine_f32_h_
|
|
|
|
|
|
|
|
#include "Arduino.h"
|
|
|
|
#include "AudioStream_F32.h"
|
|
|
|
#include "arm_math.h"
|
|
|
|
|
|
|
|
|
|
|
|
class AudioSynthWaveformSine_F32 : public AudioStream_F32
|
|
|
|
{
|
|
|
|
//GUI: inputs:0, outputs:1 //this line used for automatic generation of GUI node
|
|
|
|
public:
|
|
|
|
AudioSynthWaveformSine_F32() : AudioStream_F32(0, NULL), magnitude(16384) {}
|
|
|
|
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;
|
|
|
|
magnitude = n * 65536.0;
|
|
|
|
}
|
|
|
|
virtual void update(void);
|
|
|
|
private:
|
|
|
|
uint32_t phase_accumulator;
|
|
|
|
uint32_t phase_increment;
|
|
|
|
int32_t magnitude;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|