#pragma once #include #include #include #include using std::vector; using std::iterator_traits; using std::sin; using std::cos; class Generator { public: virtual void getSamples(const uint16_t nSamples, float *buf) = 0; virtual ~Generator(); // disallow copy of virtual interface Generator(Generator const &) = delete; Generator &operator=(Generator const &) = delete; protected: Generator(uint32_t _sampleRate, float _frequency, float _amplitude); uint32_t sampleRate; float frequency; float amplitude; private: }; class SineGenerator : public Generator { public: SineGenerator(uint32_t _sampleRate, float _frequency, float _amplitude); void getSamples(uint16_t nSamples, float *buf) final; virtual ~SineGenerator(); private: uint32_t tick; float phaseIncr; }; class SineSynth { private: vector generators; };