예제 #1
0
 public void Release()
 {
     if (State != StateADSR.Stopped && State != StateADSR.Release)
     {
         State = StateADSR.Release;
         timer = 0;
     }
 }
예제 #2
0
        public double Step(double deltaTime)
        {
            if (Stopped)
            {
                return(0);
            }

            Amplitude = 1;

            if (State == StateADSR.Attack)
            {
                if (timer >= AttackTime)
                {
                    State  = StateADSR.Decay;
                    timer -= AttackTime;
                }
                else
                {
                    Amplitude = (float)(timer / AttackTime);
                }
            }

            if (State == StateADSR.Decay)
            {
                if (timer >= DecayTime)
                {
                    State = StateADSR.Sustain;
                    timer = 0;
                }
                else
                {
                    float t = (float)(timer / DecayTime);
                    Amplitude = Mathf.Lerp(1f, SustainVolume, t);
                }
            }

            if (State == StateADSR.Sustain)
            {
                Amplitude = SustainVolume;

                if (Mathf.Approximately(Amplitude, 0))
                {
                    State = StateADSR.Stopped;
                }
            }

            if (State == StateADSR.Release)
            {
                if (timer >= ReleaseTime)
                {
                    State     = StateADSR.Stopped;
                    Amplitude = 0;
                }
                else
                {
                    Amplitude = 1f - (float)(timer / ReleaseTime);
                }
            }

            timer += deltaTime;

            return(Amplitude);
        }
예제 #3
0
 public void Trigger()
 {
     timer     = 0;
     State     = StateADSR.Attack;
     Amplitude = 0;
 }