/[svn]/linuxsampler/trunk/src/engines/gig/EGADSR.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/gig/EGADSR.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1146 by persson, Sat Feb 10 12:00:55 2007 UTC revision 1147 by persson, Tue Apr 3 17:39:52 2007 UTC
# Line 240  namespace LinuxSampler { namespace gig { Line 240  namespace LinuxSampler { namespace gig {
240              Decay1Slope = (1.347f * SustainLevel - 1.361f) / StepsLeft;              Decay1Slope = (1.347f * SustainLevel - 1.361f) / StepsLeft;
241              Coeff        = Decay1Slope * invVolume;              Coeff        = Decay1Slope * invVolume;
242              Decay1Level2 = 0.25 * invVolume;              Decay1Level2 = 0.25 * invVolume;
243              if (Level < Decay1Level2) enterDecay1Part2Stage(SampleRate);              StepsLeft = int((RTMath::Max(Decay1Level2, SustainLevel) - Level) / Coeff);
244              else StepsLeft = int((RTMath::Max(Decay1Level2, SustainLevel) - Level) / Coeff);              if (StepsLeft <= 0) enterDecay1Part2Stage(SampleRate);
245          } else {          } else {
246              if (InfiniteSustain) enterSustainStage();              if (InfiniteSustain) enterSustainStage();
247              else                 enterDecay2Stage(SampleRate);              else                 enterDecay2Stage(SampleRate);
# Line 256  namespace LinuxSampler { namespace gig { Line 256  namespace LinuxSampler { namespace gig {
256              Coeff  = exp(Decay1Slope);              Coeff  = exp(Decay1Slope);
257              Offset = ExpOffset * (1 - Coeff);              Offset = ExpOffset * (1 - Coeff);
258              StepsLeft = int(log((SustainLevel - ExpOffset) / (Level - ExpOffset)) / Decay1Slope);              StepsLeft = int(log((SustainLevel - ExpOffset) / (Level - ExpOffset)) / Decay1Slope);
259          } else {              if (StepsLeft > 0) return;
             if (InfiniteSustain) enterSustainStage();  
             else                 enterDecay2Stage(SampleRate);  
260          }          }
261            if (InfiniteSustain) enterSustainStage();
262            else                 enterDecay2Stage(SampleRate);
263      }      }
264    
265      void EGADSR::enterDecay2Stage(const uint SampleRate) {      void EGADSR::enterDecay2Stage(const uint SampleRate) {
# Line 270  namespace LinuxSampler { namespace gig { Line 270  namespace LinuxSampler { namespace gig {
270          Coeff      = (-1.03 / StepsLeft) * invVolume;          Coeff      = (-1.03 / StepsLeft) * invVolume;
271          //FIXME: do we really have to calculate 'StepsLeft' two times?          //FIXME: do we really have to calculate 'StepsLeft' two times?
272          StepsLeft  = int((CONFIG_EG_BOTTOM - Level) / Coeff);          StepsLeft  = int((CONFIG_EG_BOTTOM - Level) / Coeff);
273          if (StepsLeft == 0) enterEndStage();          if (StepsLeft <= 0) enterEndStage();
274      }      }
275    
276      void EGADSR::enterSustainStage() {      void EGADSR::enterSustainStage() {
# Line 286  namespace LinuxSampler { namespace gig { Line 286  namespace LinuxSampler { namespace gig {
286          Segment   = segment_lin;          Segment   = segment_lin;
287          StepsLeft = int((ReleaseLevel2 - Level) / ReleaseCoeff);          StepsLeft = int((ReleaseLevel2 - Level) / ReleaseCoeff);
288          Coeff     = ReleaseCoeff;          Coeff     = ReleaseCoeff;
289          if (StepsLeft == 0) enterReleasePart2Stage();          if (StepsLeft <= 0) enterReleasePart2Stage();
290      }      }
291    
292      void EGADSR::enterReleasePart2Stage() {      void EGADSR::enterReleasePart2Stage() {
# Line 295  namespace LinuxSampler { namespace gig { Line 295  namespace LinuxSampler { namespace gig {
295          StepsLeft = int(log((CONFIG_EG_BOTTOM - ExpOffset) / (Level - ExpOffset)) / ReleaseSlope);          StepsLeft = int(log((CONFIG_EG_BOTTOM - ExpOffset) / (Level - ExpOffset)) / ReleaseSlope);
296          Coeff     = ReleaseCoeff2;          Coeff     = ReleaseCoeff2;
297          Offset    = ReleaseCoeff3;          Offset    = ReleaseCoeff3;
298          if (StepsLeft == 0) enterFadeOutStage();          if (StepsLeft <= 0) enterFadeOutStage();
299      }      }
300    
301      void EGADSR::enterFadeOutStage() {      void EGADSR::enterFadeOutStage() {
# Line 303  namespace LinuxSampler { namespace gig { Line 303  namespace LinuxSampler { namespace gig {
303          Segment   = segment_lin;          Segment   = segment_lin;
304          StepsLeft = int(Level / (-FadeOutCoeff));          StepsLeft = int(Level / (-FadeOutCoeff));
305          Coeff     = FadeOutCoeff;          Coeff     = FadeOutCoeff;
306          if (StepsLeft == 0) enterEndStage();          if (StepsLeft <= 0) enterEndStage();
307      }      }
308    
309      void EGADSR::enterEndStage() {      void EGADSR::enterEndStage() {

Legend:
Removed from v.1146  
changed lines
  Added in v.1147

  ViewVC Help
Powered by ViewVC