home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / buzzmachines_massive.exe / Dev / Geoffroy Notefilter SourceCode / ADSREnveloppe.cpp next >
Encoding:
C/C++ Source or Header  |  2002-05-08  |  1.6 KB  |  88 lines

  1. // ADSREnveloppe.cpp: implementation of the ADSREnveloppe class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4.  
  5. #include "ADSREnveloppe.h"
  6.  
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10.  
  11. ADSREnveloppe::ADSREnveloppe()
  12. {
  13.     this->attackGain = 1.0f;
  14.     this->sustainGain = 0.5f;
  15.     this->releaseGain = 0.0f;
  16.     this->a = 0;
  17.     this->d = 0;
  18.     this->s = 0;
  19.     this->r = 0;
  20.     this->time = 0;
  21. }
  22.  
  23. ADSREnveloppe::~ADSREnveloppe()
  24. {
  25.  
  26. }
  27.  
  28. void ADSREnveloppe::setA(unsigned long a)
  29. {
  30.     this->a = a;
  31. }
  32.  
  33. void ADSREnveloppe::setD(unsigned long d)
  34. {
  35.     this->d = d;
  36. }
  37.  
  38. void ADSREnveloppe::setS(unsigned long s)
  39. {
  40.     this->s = s;
  41. }
  42.  
  43. void ADSREnveloppe::setR(unsigned long r)
  44. {
  45.     this->r = r;
  46. }
  47.  
  48. void ADSREnveloppe::setSustainGain(float sustain) 
  49. {
  50.     this->sustainGain = sustain;
  51. }
  52.  
  53. float ADSREnveloppe::getGain()
  54. {
  55.     // attack
  56.     if (time<a) {
  57.         return attackGain * ((float)time/(float)a);
  58.     }
  59.  
  60.     // decay
  61.     if (time>=a && time < a+d) {
  62.         return attackGain + (sustainGain-attackGain)*(((float)time-(float)a)/(float)d);
  63.     }
  64.  
  65.     // sustain
  66.     if (time>=a+d && time < a+d+s) {
  67.         return sustainGain;
  68.     }
  69.  
  70.     // release
  71.     if (time>=a+d+s && time < a+d+s+r) {
  72.         return sustainGain + (releaseGain-sustainGain)*(((float)time-((float)a+(float)d+(float)s))/(float)r);
  73.     }
  74.  
  75.     // after the release
  76.     return releaseGain;
  77. }
  78.  
  79. void ADSREnveloppe::timeGoesBy(unsigned long timeInSamples) 
  80. {
  81.     this->time += timeInSamples;
  82. }
  83.  
  84. void ADSREnveloppe::reset() 
  85. {
  86.     this->time = 0;
  87. }
  88.