|
- /***************************************************/
- /*! \class Resonate
- \brief STK noise driven formant filter.
-
- This instrument contains a noise source, which
- excites a biquad resonance filter, with volume
- controlled by an ADSR.
-
- Control Change Numbers:
- - Resonance Frequency (0-Nyquist) = 2
- - Pole Radii = 4
- - Notch Frequency (0-Nyquist) = 11
- - Zero Radii = 1
- - Envelope Gain = 128
-
- by Perry R. Cook and Gary P. Scavone, 1995--2017.
- */
- /***************************************************/
-
- #include "Resonate.h"
- #include "SKINImsg.h"
-
- namespace stk {
-
- Resonate :: Resonate( void )
- {
- poleFrequency_ = 4000.0;
- poleRadius_ = 0.95;
- // Set the filter parameters.
- filter_.setResonance( poleFrequency_, poleRadius_, true );
- zeroFrequency_ = 0.0;
- zeroRadius_ = 0.0;
- }
-
- Resonate :: ~Resonate( void )
- {
- }
-
- void Resonate :: noteOn( StkFloat frequency, StkFloat amplitude )
- {
- adsr_.setTarget( amplitude );
- this->keyOn();
- this->setResonance( frequency, poleRadius_ );
- }
-
- void Resonate :: noteOff( StkFloat amplitude )
- {
- this->keyOff();
- }
-
- void Resonate :: setResonance( StkFloat frequency, StkFloat radius )
- {
- if ( frequency < 0.0 ) {
- oStream_ << "Resonate::setResonance: frequency parameter is less than zero!";
- handleError( StkError::WARNING ); return;
- }
-
- if ( radius < 0.0 || radius >= 1.0 ) {
- oStream_ << "Resonate::setResonance: radius parameter is out of range!";
- handleError( StkError::WARNING ); return;
- }
-
- poleFrequency_ = frequency;
- poleRadius_ = radius;
- filter_.setResonance( poleFrequency_, poleRadius_, true );
- }
-
- void Resonate :: setNotch( StkFloat frequency, StkFloat radius )
- {
- if ( frequency < 0.0 ) {
- oStream_ << "Resonate::setNotch: frequency parameter is less than zero ... setting to 0.0!";
- handleError( StkError::WARNING ); return;
- }
-
- if ( radius < 0.0 ) {
- oStream_ << "Resonate::setNotch: radius parameter is less than 0.0!";
- handleError( StkError::WARNING ); return;
- }
-
- zeroFrequency_ = frequency;
- zeroRadius_ = radius;
- filter_.setNotch( zeroFrequency_, zeroRadius_ );
- }
-
- void Resonate :: controlChange( int number, StkFloat value )
- {
- #if defined(_STK_DEBUG_)
- if ( Stk::inRange( value, 0.0, 128.0 ) == false ) {
- oStream_ << "Resonate::controlChange: value (" << value << ") is out of range!";
- handleError( StkError::WARNING ); return;
- }
- #endif
-
- StkFloat normalizedValue = value * ONE_OVER_128;
- if (number == 2) // 2
- setResonance( normalizedValue * Stk::sampleRate() * 0.5, poleRadius_ );
- else if (number == 4) // 4
- setResonance( poleFrequency_, normalizedValue * 0.9999 );
- else if (number == 11) // 11
- this->setNotch( normalizedValue * Stk::sampleRate() * 0.5, zeroRadius_ );
- else if (number == 1)
- this->setNotch( zeroFrequency_, normalizedValue );
- else if (number == __SK_AfterTouch_Cont_) // 128
- adsr_.setTarget( normalizedValue );
- #if defined(_STK_DEBUG_)
- else {
- oStream_ << "Resonate::controlChange: undefined control number (" << number << ")!";
- handleError( StkError::WARNING );
- }
- #endif
- }
-
- } // stk namespace
|