Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial

# Drummer.h

    00001 #ifndef STK_DRUMMER_H
    00002 #define STK_DRUMMER_H
    00003
    00004 #include "Instrmnt.h"
    00005 #include "FileWvIn.h"
    00006 #include "OnePole.h"
    00007
    00008 namespace stk {
    00009
    00010 /***************************************************/
    00025 /***************************************************/
    00026
    00027 const int DRUM_NUMWAVES = 11;
    00028 const int DRUM_POLYPHONY = 4;
    00029
    00030 class Drummer : public Instrmnt
    00031 {
    00032  public:
    00034
    00037   Drummer( void );
    00038
    00040   ~Drummer( void );
    00041
    00043
    00049   void noteOn( StkFloat instrument, StkFloat amplitude );
    00050
    00052   void noteOff( StkFloat amplitude );
    00053
    00055   StkFloat tick( unsigned int channel = 0 );
    00056
    00058
    00065   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
    00066
    00067  protected:
    00068
    00069   FileWvIn waves_[DRUM_POLYPHONY];
    00070   OnePole  filters_[DRUM_POLYPHONY];
    00071   std::vector<int> soundOrder_;
    00072   std::vector<int> soundNumber_;
    00073   int      nSounding_;
    00074 };
    00075
    00076 inline StkFloat Drummer :: tick( unsigned int )
    00077 {
    00078   lastFrame_[0] = 0.0;
    00079   if ( nSounding_ == 0 ) return lastFrame_[0];
    00080
    00081   for ( int i=0; i<DRUM_POLYPHONY; i++ ) {
    00082     if ( soundOrder_[i] >= 0 ) {
    00083       if ( waves_[i].isFinished() ) {
    00084         // Re-order the list.
    00085         for ( int j=0; j<DRUM_POLYPHONY; j++ ) {
    00086           if ( soundOrder_[j] > soundOrder_[i] )
    00087             soundOrder_[j] -= 1;
    00088         }
    00089         soundOrder_[i] = -1;
    00090         nSounding_--;
    00091       }
    00092       else
    00093         lastFrame_[0] += filters_[i].tick( waves_[i].tick() );
    00094     }
    00095   }
    00096
    00097   return lastFrame_[0];
    00098 }
    00099
    00100 inline StkFrames& Drummer :: tick( StkFrames& frames, unsigned int channel )
    00101 {
    00102   unsigned int nChannels = lastFrame_.channels();
    00103 #if defined(_STK_DEBUG_)
    00104   if ( channel > frames.channels() - nChannels ) {
    00105     oStream_ << "Drummer::tick(): channel and StkFrames arguments are incompatible!";
    00106     handleError( StkError::FUNCTION_ARGUMENT );
    00107   }
    00108 #endif
    00109
    00110   StkFloat *samples = &frames[channel];
    00111   unsigned int j, hop = frames.channels() - nChannels;
    00112   if ( nChannels == 1 ) {
    00113     for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
    00114       *samples++ = tick();
    00115   }
    00116   else {
    00117     for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
    00118       *samples++ = tick();
    00119       for ( j=1; j<nChannels; j++ )
    00120         *samples++ = lastFrame_[j];
    00121     }
    00122   }
    00123
    00124   return frames;
    00125 }
    00126
    00127
    00128 } // stk namespace
    00129
    00130 #endif

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