Arduino STK  4.6.2
BlitSquare.h
1 #ifndef STK_BLITSQUARE_H
2 #define STK_BLITSQUARE_H
3 
4 #include "Generator.h"
5 #include <cmath>
6 #include <limits>
7 
8 namespace stk {
9 
10 /***************************************************/
40 /***************************************************/
41 
42 class BlitSquare: public Generator
43 {
44  public:
46  BlitSquare( StkFloat frequency = 220.0 );
47 
50 
52  void reset();
53 
55 
58  void setPhase( StkFloat phase ) { phase_ = STK_PI * phase; };
59 
61 
64  StkFloat getPhase() const { return phase_ / STK_PI; };
65 
67  void setFrequency( StkFloat frequency );
68 
70 
82  void setHarmonics( unsigned int nHarmonics = 0 );
83 
85  StkFloat lastOut( void ) const { return lastFrame_[0]; };
86 
88  StkFloat tick( void );
89 
91 
98  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
99 
100  protected:
101 
102  void updateHarmonics( void );
103 
104  unsigned int nHarmonics_;
105  unsigned int m_;
106  StkFloat rate_;
107  StkFloat phase_;
108  StkFloat p_;
109  StkFloat a_;
110  StkFloat lastBlitOutput_;
111  StkFloat dcbState_;
112 };
113 
114 inline StkFloat BlitSquare :: tick( void )
115 {
116  StkFloat temp = lastBlitOutput_;
117 
118  // A fully optimized version of this would replace the two sin calls
119  // with a pair of fast sin oscillators, for which stable fast
120  // two-multiply algorithms are well known. In the spirit of STK,
121  // which favors clarity over performance, the optimization has
122  // not been made here.
123 
124  // Avoid a divide by zero, or use of a denomralized divisor
125  // at the sinc peak, which has a limiting value of 1.0.
126  StkFloat denominator = sin( phase_ );
127  if ( fabs( denominator ) < std::numeric_limits<StkFloat>::epsilon() ) {
128  // Inexact comparison safely distinguishes betwen *close to zero*, and *close to PI*.
129  if ( phase_ < 0.1f || phase_ > STK_TWO_PI - 0.1f )
130  lastBlitOutput_ = a_;
131  else
132  lastBlitOutput_ = -a_;
133  }
134  else {
135  lastBlitOutput_ = sin( m_ * phase_ );
136  lastBlitOutput_ /= p_ * denominator;
137  }
138 
139  lastBlitOutput_ += temp;
140 
141  // Now apply DC blocker.
142  lastFrame_[0] = lastBlitOutput_ - dcbState_ + 0.999 * lastFrame_[0];
143  dcbState_ = lastBlitOutput_;
144 
145  phase_ += rate_;
146  if ( phase_ >= STK_TWO_PI ) phase_ -= STK_TWO_PI;
147 
148  return lastFrame_[0];
149 }
150 
151 inline StkFrames& BlitSquare :: tick( StkFrames& frames, unsigned int channel )
152 {
153 #if defined(_STK_DEBUG_)
154  if ( channel >= frames.channels() ) {
155  oStream_ << "BlitSquare::tick(): channel and StkFrames arguments are incompatible!";
156  handleError( StkError::FUNCTION_ARGUMENT );
157  }
158 #endif
159 
160  StkFloat *samples = &frames[channel];
161  unsigned int hop = frames.channels();
162  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
163  *samples = BlitSquare::tick();
164 
165  return frames;
166 }
167 
168 } // stk namespace
169 
170 #endif
STK band-limited square wave class.
Definition: BlitSquare.h:43
StkFloat tick(void)
Compute and return one output sample.
Definition: BlitSquare.h:114
BlitSquare(StkFloat frequency=220.0)
Default constructor that initializes BLIT frequency to 220 Hz.
~BlitSquare()
Class destructor.
StkFloat lastOut(void) const
Return the last computed output value.
Definition: BlitSquare.h:85
void setFrequency(StkFloat frequency)
Set the impulse train rate in terms of a frequency in Hz.
void reset()
Resets the oscillator state and phase to 0.
void setHarmonics(unsigned int nHarmonics=0)
Set the number of harmonics generated in the signal.
StkFloat getPhase() const
Get the current phase of the signal.
Definition: BlitSquare.h:64
void setPhase(StkFloat phase)
Set the phase of the signal.
Definition: BlitSquare.h:58
STK abstract unit generator parent class.
Definition: Generator.h:21
An STK class to handle vectorized audio data.
Definition: Stk.h:287
unsigned int channels(void) const
Return the number of channels represented by the data.
Definition: Stk.h:415
unsigned int frames(void) const
Return the number of sample frames represented by the data.
Definition: Stk.h:418
static void handleError(const char *message, StkError::Type type)
Static function for error reporting and handling using c-strings.
The STK namespace.
Definition: ADSR.h:8