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 
00057  protected:
00058 
00059   FileWvIn waves_[DRUM_POLYPHONY];
00060   OnePole  filters_[DRUM_POLYPHONY];
00061   std::vector<int> soundOrder_;
00062   std::vector<int> soundNumber_;
00063   int      nSounding_;
00064 };
00065 
00066 inline StkFloat Drummer :: tick( unsigned int )
00067 {
00068   lastFrame_[0] = 0.0;
00069   if ( nSounding_ == 0 ) return lastFrame_[0];
00070 
00071   for ( int i=0; i<DRUM_POLYPHONY; i++ ) {
00072     if ( soundOrder_[i] >= 0 ) {
00073       if ( waves_[i].isFinished() ) {
00074         // Re-order the list.
00075         for ( int j=0; j<DRUM_POLYPHONY; j++ ) {
00076           if ( soundOrder_[j] > soundOrder_[i] )
00077             soundOrder_[j] -= 1;
00078         }
00079         soundOrder_[i] = -1;
00080         nSounding_--;
00081       }
00082       else
00083         lastFrame_[0] += filters_[i].tick( waves_[i].tick() );
00084     }
00085   }
00086 
00087   return lastFrame_[0];
00088 }
00089 
00090 } // stk namespace
00091 
00092 #endif

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