Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

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

The Synthesis ToolKit in C++ (STK)
©1995--2017 Perry R. Cook and Gary P. Scavone. All Rights Reserved.