#ifndef STK_SAMPLER_H #define STK_SAMPLER_H #include "Instrmnt.h" #include "ADSR.h" #include "FileLoop.h" #include "OnePole.h" namespace stk { /***************************************************/ /*! \class Sampler \brief STK sampling synthesis abstract base class. This instrument provides an ADSR envelope, a one-pole filter, and structures for an arbitrary number of attack and looped files. by Perry R. Cook and Gary P. Scavone, 1995-2011. */ /***************************************************/ class Sampler : public Instrmnt { public: //! Default constructor. Sampler( void ); //! Class destructor. virtual ~Sampler( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. virtual void setFrequency( StkFloat frequency ) = 0; //! Initiate the envelopes with a key-on event and reset the attack waves. void keyOn( void ); //! Signal a key-off event to the envelopes. void keyOff( void ); //! Stop a note with the given amplitude (speed of decay). virtual void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). virtual void controlChange( int number, StkFloat value ) = 0; //! Compute and return one output sample. virtual StkFloat tick( unsigned int channel = 0 ) = 0; //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0; protected: ADSR adsr_; std::vector attacks_; std::vector loops_; OnePole filter_; StkFloat baseFrequency_; std::vector attackRatios_; std::vector loopRatios_; StkFloat attackGain_; StkFloat loopGain_; }; } // stk namespace #endif