/***************************************************/ /*! \class Simple \brief STK wavetable/noise instrument. This class combines a looped wave, a noise source, a biquad resonance filter, a one-pole filter, and an ADSR envelope to create some interesting sounds. Control Change Numbers: - Filter Pole Position = 2 - Noise/Pitched Cross-Fade = 4 - Envelope Rate = 11 - Gain = 128 by Perry R. Cook and Gary P. Scavone, 1995--2017. */ /***************************************************/ #include "Simple.h" #include "SKINImsg.h" namespace stk { Simple :: Simple( void ) { // Concatenate the STK rawwave path to the rawwave file loop_ = new FileLoop( (Stk::rawwavePath() + "impuls10.raw").c_str(), true ); filter_.setPole( 0.5 ); baseFrequency_ = 440.0; setFrequency( baseFrequency_ ); loopGain_ = 0.5; } Simple :: ~Simple( void ) { delete loop_; } void Simple :: keyOn( void ) { adsr_.keyOn(); } void Simple :: keyOff( void ) { adsr_.keyOff(); } void Simple :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->keyOn(); this->setFrequency( frequency ); filter_.setGain( amplitude ); } void Simple :: noteOff( StkFloat amplitude ) { this->keyOff(); } void Simple :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Simple::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif biquad_.setResonance( frequency, 0.98, true ); loop_->setFrequency( frequency ); } void Simple :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Simple::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_Breath_) // 2 filter_.setPole( 0.99 * (1.0 - (normalizedValue * 2.0)) ); else if (number == __SK_NoiseLevel_) // 4 loopGain_ = normalizedValue; else if (number == __SK_ModFrequency_) { // 11 normalizedValue /= 0.2 * Stk::sampleRate(); adsr_.setAttackRate( normalizedValue ); adsr_.setDecayRate( normalizedValue ); adsr_.setReleaseRate( normalizedValue ); } else if (number == __SK_AfterTouch_Cont_) // 128 adsr_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Simple::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace