Arduino STK  4.6.2
BlowBotl.h
1 #ifndef STK_BLOWBOTL_H
2 #define STK_BLOWBOTL_H
3 
4 #include "Instrmnt.h"
5 #include "JetTable.h"
6 #include "BiQuad.h"
7 #include "PoleZero.h"
8 #include "Noise.h"
9 #include "ADSR.h"
10 #include "SineWave.h"
11 
12 namespace stk {
13 
14 /***************************************************/
30 /***************************************************/
31 
32 class BlowBotl : public Instrmnt
33 {
34  public:
36 
39  BlowBotl( void );
40 
42  ~BlowBotl( void );
43 
45  void clear( void );
46 
48  void setFrequency( StkFloat frequency );
49 
51  void startBlowing( StkFloat amplitude, StkFloat rate );
52 
54  void stopBlowing( StkFloat rate );
55 
57  void noteOn( StkFloat frequency, StkFloat amplitude );
58 
60  void noteOff( StkFloat amplitude );
61 
63  void controlChange( int number, StkFloat value );
64 
66  StkFloat tick( unsigned int channel = 0 );
67 
69 
76  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
77 
78  protected:
79 
80  JetTable jetTable_;
81  BiQuad resonator_;
82  PoleZero dcBlock_;
83  Noise noise_;
84  ADSR adsr_;
85  SineWave vibrato_;
86  StkFloat maxPressure_;
87  StkFloat noiseGain_;
88  StkFloat vibratoGain_;
89  StkFloat outputGain_;
90 
91 };
92 
93 inline StkFloat BlowBotl :: tick( unsigned int )
94 {
95  StkFloat breathPressure;
96  StkFloat randPressure;
97  StkFloat pressureDiff;
98 
99  // Calculate the breath pressure (envelope + vibrato)
100  breathPressure = maxPressure_ * adsr_.tick();
101  breathPressure += vibratoGain_ * vibrato_.tick();
102 
103  pressureDiff = breathPressure - resonator_.lastOut();
104 
105  randPressure = noiseGain_ * noise_.tick();
106  randPressure *= breathPressure;
107  randPressure *= (1.0 + pressureDiff);
108 
109  resonator_.tick( breathPressure + randPressure - ( jetTable_.tick( pressureDiff ) * pressureDiff ) );
110  lastFrame_[0] = 0.2 * outputGain_ * dcBlock_.tick( pressureDiff );
111 
112  return lastFrame_[0];
113 }
114 
115 inline StkFrames& BlowBotl :: tick( StkFrames& frames, unsigned int channel )
116 {
117  unsigned int nChannels = lastFrame_.channels();
118 #if defined(_STK_DEBUG_)
119  if ( channel > frames.channels() - nChannels ) {
120  oStream_ << "BlowBotl::tick(): channel and StkFrames arguments are incompatible!";
121  handleError( StkError::FUNCTION_ARGUMENT );
122  }
123 #endif
124 
125  StkFloat *samples = &frames[channel];
126  unsigned int j, hop = frames.channels() - nChannels;
127  if ( nChannels == 1 ) {
128  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
129  *samples++ = tick();
130  }
131  else {
132  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
133  *samples++ = tick();
134  for ( j=1; j<nChannels; j++ )
135  *samples++ = lastFrame_[j];
136  }
137  }
138 
139  return frames;
140 }
141 
142 } // stk namespace
143 
144 #endif
STK ADSR envelope class.
Definition: ADSR.h:27
StkFloat tick(void)
Compute and return one output sample.
Definition: ADSR.h:117
STK biquad (two-pole, two-zero) filter class.
Definition: BiQuad.h:21
StkFloat tick(StkFloat input)
Input one sample to the filter and return a reference to one output.
Definition: BiQuad.h:119
StkFloat lastOut(void) const
Return the last computed output value.
Definition: BiQuad.h:87
STK blown bottle instrument class.
Definition: BlowBotl.h:33
void noteOff(StkFloat amplitude)
Stop a note with the given amplitude (speed of decay).
void controlChange(int number, StkFloat value)
Perform the control change specified by number and value (0.0 - 128.0).
void clear(void)
Reset and clear all internal state.
StkFloat tick(unsigned int channel=0)
Compute and return one output sample.
Definition: BlowBotl.h:93
void setFrequency(StkFloat frequency)
Set instrument parameters for a particular frequency.
void stopBlowing(StkFloat rate)
Decrease breath velocity with given rate of decrease.
void startBlowing(StkFloat amplitude, StkFloat rate)
Apply breath velocity to instrument with given amplitude and rate of increase.
BlowBotl(void)
Class constructor.
~BlowBotl(void)
Class destructor.
void noteOn(StkFloat frequency, StkFloat amplitude)
Start a note with the given frequency and amplitude.
STK instrument abstract base class.
Definition: Instrmnt.h:20
STK jet table class.
Definition: JetTable.h:24
StkFloat tick(StkFloat input)
Take one sample input and map to one sample of output.
Definition: JetTable.h:54
STK noise generator.
Definition: Noise.h:22
StkFloat tick(void)
Compute and return one output sample.
Definition: Noise.h:59
STK one-pole, one-zero filter class.
Definition: PoleZero.h:22
StkFloat tick(StkFloat input)
Input one sample to the filter and return one output.
Definition: PoleZero.h:79
STK sinusoid oscillator class.
Definition: SineWave.h:26
StkFloat tick(void)
Compute and return one output sample.
Definition: SineWave.h:99
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