The Synthesis ToolKit in C++ (STK)

Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# Voicer.h

    00001 #ifndef STK_VOICER_H
    00002 #define STK_VOICER_H
    00003
    00004 #include "Instrmnt.h"
    00005 #include <vector>
    00006
    00007 namespace stk {
    00008
    00009 /***************************************************/
    00032 /***************************************************/
    00033
    00034 class Voicer : public Stk
    00035 {
    00036  public:
    00038   Voicer( StkFloat decayTime = 0.2 );
    00039
    00041
    00045   void addInstrument( Instrmnt *instrument, int group=0 );
    00046
    00048
    00053   void removeInstrument( Instrmnt *instrument );
    00054
    00056
    00064   long noteOn( StkFloat noteNumber, StkFloat amplitude, int group=0 );
    00065
    00067
    00070   void noteOff( StkFloat noteNumber, StkFloat amplitude, int group=0 );
    00071
    00073
    00076   void noteOff( long tag, StkFloat amplitude );
    00077
    00079
    00082   void setFrequency( StkFloat noteNumber, int group=0 );
    00083
    00085
    00088   void setFrequency( long tag, StkFloat noteNumber );
    00089
    00091   void pitchBend( StkFloat value, int group=0 );
    00092
    00094   void pitchBend( long tag, StkFloat value );
    00095
    00097   void controlChange( int number, StkFloat value, int group=0 );
    00098
    00100   void controlChange( long tag, int number, StkFloat value );
    00101
    00103   void silence( void );
    00104
    00106   unsigned int channelsOut( void ) const { return lastFrame_.channels(); };
    00107
    00109   const StkFrames& lastFrame( void ) const { return lastFrame_; };
    00110
    00112
    00120   StkFloat lastOut( unsigned int channel = 0 );
    00121
    00123
    00131   StkFloat tick( unsigned int channel = 0 );
    00132
    00134
    00142   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
    00143
    00144  protected:
    00145
    00146   struct Voice {
    00147     Instrmnt *instrument;
    00148     long tag;
    00149     StkFloat noteNumber;
    00150     StkFloat frequency;
    00151     int sounding;
    00152     int group;
    00153
    00154     // Default constructor.
    00155     Voice()
    00156       :instrument(0), tag(0), noteNumber(-1.0), frequency(0.0), sounding(0), group(0) {}
    00157   };
    00158
    00159   std::vector<Voice> voices_;
    00160   long tags_;
    00161   int muteTime_;
    00162   StkFrames lastFrame_;
    00163 };
    00164
    00165 inline StkFloat Voicer :: lastOut( unsigned int channel )
    00166 {
    00167 #if defined(_STK_DEBUG_)
    00168   if ( channel >= lastFrame_.channels() ) {
    00169     oStream_ << "Voicer::lastOut(): channel argument is invalid!";
    00170     handleError( StkError::FUNCTION_ARGUMENT );
    00171   }
    00172 #endif
    00173
    00174   return lastFrame_[channel];
    00175 }
    00176
    00177
    00178 inline StkFloat Voicer :: tick( unsigned int channel )
    00179 {
    00180   unsigned int j;
    00181   for ( j=0; j<lastFrame_.channels(); j++ ) lastFrame_[j] = 0.0;
    00182   for ( unsigned int i=0; i<voices_.size(); i++ ) {
    00183     if ( voices_[i].sounding != 0 ) {
    00184       voices_[i].instrument->tick();
    00185       for ( j=0; j<voices_[i].instrument->channelsOut(); j++ ) lastFrame_[j] += voices_[i].instrument->lastOut( j );
    00186     }
    00187     if ( voices_[i].sounding < 0 )
    00188       voices_[i].sounding++;
    00189     if ( voices_[i].sounding == 0 )
    00190       voices_[i].noteNumber = -1;
    00191   }
    00192
    00193   return lastFrame_[channel];
    00194 }
    00195
    00196 inline StkFrames& Voicer :: tick( StkFrames& frames, unsigned int channel )
    00197 {
    00198   unsigned int nChannels = lastFrame_.channels();
    00199 #if defined(_STK_DEBUG_)
    00200   if ( channel > frames.channels() - nChannels ) {
    00201     oStream_ << "Voicer::tick(): channel and StkFrames arguments are incompatible!";
    00202     handleError( StkError::FUNCTION_ARGUMENT );
    00203   }
    00204 #endif
    00205
    00206   StkFloat *samples = &frames[channel];
    00207   unsigned int j, hop = frames.channels() - nChannels;
    00208   for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
    00209     tick();
    00210     for ( j=0; j<nChannels; j++ )
    00211       *samples++ = lastFrame_[j];
    00212   }
    00213
    00214   return frames;
    00215 }
    00216
    00217 } // stk namespace
    00218
    00219 #endif

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