mirror of
https://github.com/thestk/stk
synced 2026-01-16 22:31:52 +00:00
Version 4.2.1
This commit is contained in:
committed by
Stephen Sinclair
parent
a6381b9d38
commit
2cbce2d8bd
89
include/BlitSquare.h
Normal file
89
include/BlitSquare.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/***************************************************/
|
||||
/*! \class BlitSquare
|
||||
\brief STK band-limited square wave class.
|
||||
|
||||
This class generates a band-limited square wave signal. It is
|
||||
derived in part from the approach reported by Stilson and Smith in
|
||||
"Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996.
|
||||
The algorithm implemented in this class uses a SincM function with
|
||||
an even M value to achieve a bipolar bandlimited impulse train.
|
||||
This signal is then integrated to achieve a square waveform. The
|
||||
integration process has an associated DC offset but that is
|
||||
subtracted off the output signal.
|
||||
|
||||
The user can specify both the fundamental frequency of the
|
||||
waveform and the number of harmonics contained in the resulting
|
||||
signal.
|
||||
|
||||
If nHarmonics is 0, then the signal will contain all harmonics up
|
||||
to half the sample rate. Note, however, that this setting may
|
||||
produce aliasing in the signal when the frequency is changing (no
|
||||
automatic modification of the number of harmonics is performed by
|
||||
the setFrequency() function).
|
||||
|
||||
Based on initial code of Robin Davies, 2005.
|
||||
Modified algorithm code by Gary Scavone, 2005.
|
||||
*/
|
||||
/***************************************************/
|
||||
|
||||
#ifndef STK_BLITSQUARE_H
|
||||
#define STK_BLITSQUARE_H
|
||||
|
||||
#include "Generator.h"
|
||||
|
||||
class BlitSquare: public Generator
|
||||
{
|
||||
public:
|
||||
//! Default constructor that initializes BLIT frequency to 220 Hz.
|
||||
BlitSquare( StkFloat frequency = 220.0 );
|
||||
|
||||
//! Class destructor.
|
||||
~BlitSquare();
|
||||
|
||||
//! Resets the oscillator state and phase to 0.
|
||||
void reset();
|
||||
|
||||
//! Set the phase of the signal.
|
||||
/*!
|
||||
Set the phase of the signal, in the range 0 to 1.
|
||||
*/
|
||||
void setPhase( StkFloat phase ) { phase_ = PI * phase; };
|
||||
|
||||
//! Get the current phase of the signal.
|
||||
/*!
|
||||
Get the phase of the signal, in the range [0 to 1.0).
|
||||
*/
|
||||
StkFloat getPhase() const { return phase_ / PI; };
|
||||
|
||||
//! Set the impulse train rate in terms of a frequency in Hz.
|
||||
void setFrequency( StkFloat frequency );
|
||||
|
||||
//! Set the number of harmonics generated in the signal.
|
||||
/*!
|
||||
This function sets the number of harmonics contained in the
|
||||
resulting signal. It is equivalent to (2 * M) + 1 in the BLIT
|
||||
algorithm. The default value of 0 sets the algorithm for maximum
|
||||
harmonic content (harmonics up to half the sample rate). This
|
||||
parameter is not checked against the current sample rate and
|
||||
fundamental frequency. Thus, aliasing can result if one or more
|
||||
harmonics for a given fundamental frequency exceeds fs / 2. This
|
||||
behavior was chosen over the potentially more problematic solution
|
||||
of automatically modifying the M parameter, which can produce
|
||||
audible clicks in the signal.
|
||||
*/
|
||||
void setHarmonics( unsigned int nHarmonics = 0 );
|
||||
|
||||
protected:
|
||||
|
||||
void updateHarmonics( void );
|
||||
StkFloat computeSample( void );
|
||||
|
||||
unsigned int nHarmonics_;
|
||||
unsigned int m_;
|
||||
StkFloat rate_;
|
||||
StkFloat phase_;
|
||||
StkFloat p_;
|
||||
StkFloat offset_;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user