You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.1KB

  1. /***************************************************/
  2. /*! \class Resonate
  3. \brief STK noise driven formant filter.
  4. This instrument contains a noise source, which
  5. excites a biquad resonance filter, with volume
  6. controlled by an ADSR.
  7. Control Change Numbers:
  8. - Resonance Frequency (0-Nyquist) = 2
  9. - Pole Radii = 4
  10. - Notch Frequency (0-Nyquist) = 11
  11. - Zero Radii = 1
  12. - Envelope Gain = 128
  13. by Perry R. Cook and Gary P. Scavone, 1995--2017.
  14. */
  15. /***************************************************/
  16. #include "Resonate.h"
  17. #include "SKINImsg.h"
  18. namespace stk {
  19. Resonate :: Resonate( void )
  20. {
  21. poleFrequency_ = 4000.0;
  22. poleRadius_ = 0.95;
  23. // Set the filter parameters.
  24. filter_.setResonance( poleFrequency_, poleRadius_, true );
  25. zeroFrequency_ = 0.0;
  26. zeroRadius_ = 0.0;
  27. }
  28. Resonate :: ~Resonate( void )
  29. {
  30. }
  31. void Resonate :: noteOn( StkFloat frequency, StkFloat amplitude )
  32. {
  33. adsr_.setTarget( amplitude );
  34. this->keyOn();
  35. this->setResonance( frequency, poleRadius_ );
  36. }
  37. void Resonate :: noteOff( StkFloat amplitude )
  38. {
  39. this->keyOff();
  40. }
  41. void Resonate :: setResonance( StkFloat frequency, StkFloat radius )
  42. {
  43. if ( frequency < 0.0 ) {
  44. oStream_ << "Resonate::setResonance: frequency parameter is less than zero!";
  45. handleError( StkError::WARNING ); return;
  46. }
  47. if ( radius < 0.0 || radius >= 1.0 ) {
  48. oStream_ << "Resonate::setResonance: radius parameter is out of range!";
  49. handleError( StkError::WARNING ); return;
  50. }
  51. poleFrequency_ = frequency;
  52. poleRadius_ = radius;
  53. filter_.setResonance( poleFrequency_, poleRadius_, true );
  54. }
  55. void Resonate :: setNotch( StkFloat frequency, StkFloat radius )
  56. {
  57. if ( frequency < 0.0 ) {
  58. oStream_ << "Resonate::setNotch: frequency parameter is less than zero ... setting to 0.0!";
  59. handleError( StkError::WARNING ); return;
  60. }
  61. if ( radius < 0.0 ) {
  62. oStream_ << "Resonate::setNotch: radius parameter is less than 0.0!";
  63. handleError( StkError::WARNING ); return;
  64. }
  65. zeroFrequency_ = frequency;
  66. zeroRadius_ = radius;
  67. filter_.setNotch( zeroFrequency_, zeroRadius_ );
  68. }
  69. void Resonate :: controlChange( int number, StkFloat value )
  70. {
  71. #if defined(_STK_DEBUG_)
  72. if ( Stk::inRange( value, 0.0, 128.0 ) == false ) {
  73. oStream_ << "Resonate::controlChange: value (" << value << ") is out of range!";
  74. handleError( StkError::WARNING ); return;
  75. }
  76. #endif
  77. StkFloat normalizedValue = value * ONE_OVER_128;
  78. if (number == 2) // 2
  79. setResonance( normalizedValue * Stk::sampleRate() * 0.5, poleRadius_ );
  80. else if (number == 4) // 4
  81. setResonance( poleFrequency_, normalizedValue * 0.9999 );
  82. else if (number == 11) // 11
  83. this->setNotch( normalizedValue * Stk::sampleRate() * 0.5, zeroRadius_ );
  84. else if (number == 1)
  85. this->setNotch( zeroFrequency_, normalizedValue );
  86. else if (number == __SK_AfterTouch_Cont_) // 128
  87. adsr_.setTarget( normalizedValue );
  88. #if defined(_STK_DEBUG_)
  89. else {
  90. oStream_ << "Resonate::controlChange: undefined control number (" << number << ")!";
  91. handleError( StkError::WARNING );
  92. }
  93. #endif
  94. }
  95. } // stk namespace