Generates a square wave sound. Uses the same 32 bit phase accumulator as SawToothGenerator/FastIntSineGenerator: no floating point operations or sin() calls in the readSample() hot path. A square wave needs neither a sine approximation nor a lookup table - just the sign bit of the ramp - so readSample() is a single comparison, making this a good fit for MCUs without a hardware FPU (e.g. RP2040), where the previous FastSineGenerator based implementation still did a float polynomial evaluation per sample just to keep its sign.
More...
#include <CodecOpusOgg.h>
|
| | SquareWaveGenerator (float amplitude=NumberConverter::maxValueT< T >(), float phase=0.0f) |
| | SquareWaveGenerator (float amplitude=NumberConverter::maxValueT< T >(), float phase=0.0f) |
| virtual AudioInfo | audioInfo () |
| | Provides the AudioInfo.
|
| bool | begin () override |
| bool | begin () override |
| bool | begin (AudioInfo info) override |
| | Starts the processing with the provided AudioInfo.
|
| bool | begin (AudioInfo info) override |
| | Starts the processing with the provided AudioInfo.
|
| bool | begin (AudioInfo info, float frequency) |
| bool | begin (AudioInfo info, float frequency) |
| bool | begin (int channels, int sample_rate, float frequency) |
| bool | begin (int channels, int sample_rate, float frequency) |
| virtual AudioInfo | defaultConfig () |
| | Provides the default configuration.
|
| virtual void | end () |
| virtual bool | isActive () |
| | Checks if the begin method has been called - after end() isActive is false.
|
| virtual size_t | readBytes (uint8_t *data, size_t len) |
| | Provides the data as byte array with the requested number of channels.
|
| virtual T | readSample () override |
| | Provides a single sample - integer only, no float ops!
|
| virtual T | readSample () override |
| | Provides a single sample - integer only, no float ops!
|
| virtual size_t | readSamples (int16_t *data, size_t len) |
| virtual void | restart () |
| | Restarts the generator, e.g. after a play time has been defined and reached.
|
| void | setAmplitude (float amp) |
| void | setAmplitude (float amp) |
| virtual void | setAudioInfo (AudioInfo info) override |
| | Defines/updates the AudioInfo.
|
| virtual void | setAudioInfo (AudioInfo info) override |
| | Defines/updates the AudioInfo.
|
| void | setFrequency (float frequency) override |
| | Defines the frequency - the only place where float math is used.
|
| void | setFrequency (float frequency) override |
| | Defines the frequency - the only place where float math is used.
|
| void | setPhase (float phase) |
| | Defines the starting phase in radians.
|
| void | setPhase (float phase) |
| | Defines the starting phase in radians.
|
| virtual void | setPlayTime (uint32_t playMs, uint8_t upPercent=20, uint8_t downPercent=30) |
| | Defines the play time in ms and the ramp up and ramp down time in percent.
|
| virtual void | setRampTimes (uint32_t playMs, uint32_t upMs=5, uint32_t downMs=5) |
template<class T = int16_t>
class audio_tools::audio_tools::SquareWaveGenerator< T >
Generates a square wave sound. Uses the same 32 bit phase accumulator as SawToothGenerator/FastIntSineGenerator: no floating point operations or sin() calls in the readSample() hot path. A square wave needs neither a sine approximation nor a lookup table - just the sign bit of the ramp - so readSample() is a single comparison, making this a good fit for MCUs without a hardware FPU (e.g. RP2040), where the previous FastSineGenerator based implementation still did a float polynomial evaluation per sample just to keep its sign.
- Author
- Phil Schatzmann
- Copyright
- GPLv3
◆ SquareWaveGenerator() [1/2]
template<class T = int16_t>
◆ SquareWaveGenerator() [2/2]
template<class T = int16_t>
◆ applyRamp()
| int16_t applyRamp |
( |
int16_t | sample | ) |
|
|
inlineprotectedinherited |
◆ audioInfo()
◆ begin() [1/8]
template<class T = int16_t>
◆ begin() [2/8]
template<class T = int16_t>
◆ begin() [3/8]
template<class T = int16_t>
◆ begin() [4/8]
template<class T = int16_t>
◆ begin() [5/8]
template<class T = int16_t>
| bool begin |
( |
AudioInfo | info, |
|
|
float | frequency ) |
|
inline |
◆ begin() [6/8]
template<class T = int16_t>
| bool begin |
( |
AudioInfo | info, |
|
|
float | frequency ) |
|
inline |
◆ begin() [7/8]
template<class T = int16_t>
| bool begin |
( |
int | channels, |
|
|
int | sample_rate, |
|
|
float | frequency ) |
|
inline |
◆ begin() [8/8]
template<class T = int16_t>
| bool begin |
( |
int | channels, |
|
|
int | sample_rate, |
|
|
float | frequency ) |
|
inline |
◆ defaultConfig()
◆ end()
◆ isActive()
| virtual bool isActive |
( |
| ) |
|
|
inlinevirtualinherited |
Checks if the begin method has been called - after end() isActive is false.
◆ readBytes()
| virtual size_t readBytes |
( |
uint8_t * | data, |
|
|
size_t | len ) |
|
inlinevirtualinherited |
◆ readBytesFrames()
| size_t readBytesFrames |
( |
uint8_t * | buffer, |
|
|
size_t | lengthBytes, |
|
|
int | frames, |
|
|
int | channels ) |
|
inlineprotectedinherited |
◆ readBytesFromBuffer()
| size_t readBytesFromBuffer |
( |
uint8_t * | buffer, |
|
|
size_t | lengthBytes, |
|
|
int | frame_size, |
|
|
int | channels ) |
|
inlineprotectedinherited |
◆ readSample() [1/2]
template<class T = int16_t>
◆ readSample() [2/2]
template<class T = int16_t>
◆ readSamples()
| virtual size_t readSamples |
( |
int16_t * | data, |
|
|
size_t | len ) |
|
inlinevirtualinherited |
Provides the data as T array (interleaved by channel) with the requested number of samples (values, not frames)
◆ recalculatePlayTime()
| void recalculatePlayTime |
( |
| ) |
|
|
inlineprotectedinherited |
◆ restart()
Restarts the generator, e.g. after a play time has been defined and reached.
◆ setAmplitude() [1/2]
template<class T = int16_t>
| void setAmplitude |
( |
float | amp | ) |
|
|
inline |
◆ setAmplitude() [2/2]
template<class T = int16_t>
| void setAmplitude |
( |
float | amp | ) |
|
|
inline |
◆ setAudioInfo() [1/2]
template<class T = int16_t>
◆ setAudioInfo() [2/2]
template<class T = int16_t>
◆ setFrequency() [1/2]
template<class T = int16_t>
| void setFrequency |
( |
float | frequency | ) |
|
|
inlineoverridevirtual |
◆ setFrequency() [2/2]
template<class T = int16_t>
| void setFrequency |
( |
float | frequency | ) |
|
|
inlineoverridevirtual |
◆ setPhase() [1/2]
template<class T = int16_t>
| void setPhase |
( |
float | phase | ) |
|
|
inline |
Defines the starting phase in radians.
◆ setPhase() [2/2]
template<class T = int16_t>
| void setPhase |
( |
float | phase | ) |
|
|
inline |
Defines the starting phase in radians.
◆ setPlayTime()
| virtual void setPlayTime |
( |
uint32_t | playMs, |
|
|
uint8_t | upPercent = 20, |
|
|
uint8_t | downPercent = 30 ) |
|
inlinevirtualinherited |
◆ setRampTimes()
| virtual void setRampTimes |
( |
uint32_t | playMs, |
|
|
uint32_t | upMs = 5, |
|
|
uint32_t | downMs = 5 ) |
|
inlinevirtualinherited |
Alternative to setPlayTime. It sets ramp-up and ramp-down times in ms instead of percentages. If playMs == 0, it will play indefinitely. restart();begin(); starts the ramp-up and sustain as normal, but it will sustain forever. end(true) triggers a ramp-down then inactive.
◆ updatePhaseIncrement() [1/2]
template<class T = int16_t>
| void updatePhaseIncrement |
( |
| ) |
|
|
inlineprotected |
◆ updatePhaseIncrement() [2/2]
template<class T = int16_t>
| void updatePhaseIncrement |
( |
| ) |
|
|
inlineprotected |
◆ active
◆ activeWarningIssued
◆ currentSample
◆ downMs
◆ downPercent
◆ downSamples
◆ factor
◆ info
◆ m_amplitude
template<class T = int16_t>
◆ m_amplitude_i
template<class T = int16_t>
| int32_t m_amplitude_i = 32767 |
|
protected |
◆ m_frequency
template<class T = int16_t>
| volatile float m_frequency = 0.0f |
|
protected |
◆ m_phase_acc
template<class T = int16_t>
◆ m_phase_increment
template<class T = int16_t>
| uint32_t m_phase_increment = 0 |
|
protected |
◆ m_phase_offset
template<class T = int16_t>
| uint32_t m_phase_offset = 0 |
|
protected |
◆ playMs
◆ playSamples
◆ rampDownDec
◆ rampUpInc
◆ ring_buffer
◆ upMs
◆ upPercent
◆ upSamples
The documentation for this class was generated from the following files: