Exemplo n.º 1
0
        private void LoadEnvelopes(Sf2Region region)
        {
            //
            //mod env
            mod_env              = new EnvelopeDescriptor();
            mod_env.AttackTime   = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.AttackModulationEnvelope] / 1200.0);
            mod_env.AttackGraph  = 3;
            mod_env.DecayTime    = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.DecayModulationEnvelope] / 1200.0);
            mod_env.DelayTime    = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.DelayModulationEnvelope] / 1200.0);
            mod_env.HoldTime     = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.HoldModulationEnvelope] / 1200.0);
            mod_env.PeakLevel    = 1;
            mod_env.ReleaseTime  = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.ReleaseModulationEnvelope] / 1200.0);
            mod_env.StartLevel   = 0;
            mod_env.SustainLevel = 1f - SynthHelper.ClampS(region.Generators[(int)GeneratorEnum.SustainModulationEnvelope], (short)0, (short)1000) / 1000f;
            //checks
            if (mod_env.AttackTime < 0.001f)
            {
                mod_env.AttackTime = 0.001f;
            }
            else if (mod_env.AttackTime > 100f)
            {
                mod_env.AttackTime = 100f;
            }
            if (mod_env.DecayTime < 0.001f)
            {
                mod_env.DecayTime = 0;
            }
            else if (mod_env.DecayTime > 100f)
            {
                mod_env.DecayTime = 100f;
            }
            if (mod_env.DelayTime < 0.001f)
            {
                mod_env.DelayTime = 0;
            }
            else if (mod_env.DelayTime > 20f)
            {
                mod_env.DelayTime = 20f;
            }
            if (mod_env.HoldTime < 0.001f)
            {
                mod_env.HoldTime = 0;
            }
            else if (mod_env.HoldTime > 20f)
            {
                mod_env.HoldTime = 20f;
            }
            if (mod_env.ReleaseTime < 0.001f)
            {
                mod_env.ReleaseTime = 0.001f;
            }
            else if (mod_env.ReleaseTime > 100f)
            {
                mod_env.ReleaseTime = 100f;
            }

            //
            // volume env
            vel_env              = new EnvelopeDescriptor();
            vel_env.AttackTime   = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.AttackVolumeEnvelope] / 1200.0);
            vel_env.AttackGraph  = 3;
            vel_env.DecayTime    = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.DecayVolumeEnvelope] / 1200.0);
            vel_env.DelayTime    = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.DelayVolumeEnvelope] / 1200.0);
            vel_env.HoldTime     = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.HoldVolumeEnvelope] / 1200.0);
            vel_env.PeakLevel    = 0;
            vel_env.ReleaseTime  = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.ReleaseVolumeEnvelope] / 1200.0);
            vel_env.StartLevel   = -100;
            vel_env.SustainLevel = SynthHelper.ClampS(region.Generators[(int)GeneratorEnum.SustainVolumeEnvelope], (short)0, (short)1000) / -10f;
            // checks
            if (vel_env.AttackTime < 0.001f)
            {
                vel_env.AttackTime = 0.001f;
            }
            else if (vel_env.AttackTime > 100f)
            {
                vel_env.AttackTime = 100f;
            }
            if (vel_env.DecayTime < 0.001f)
            {
                vel_env.DecayTime = 0;
            }
            else if (vel_env.DecayTime > 100f)
            {
                vel_env.DecayTime = 100f;
            }
            if (vel_env.DelayTime < 0.001f)
            {
                vel_env.DelayTime = 0;
            }
            else if (vel_env.DelayTime > 20f)
            {
                vel_env.DelayTime = 20f;
            }
            if (vel_env.HoldTime < 0.001f)
            {
                vel_env.HoldTime = 0;
            }
            else if (vel_env.HoldTime > 20f)
            {
                vel_env.HoldTime = 20f;
            }
            if (vel_env.ReleaseTime < 0.001f)
            {
                vel_env.ReleaseTime = 0.001f;
            }
            else if (vel_env.ReleaseTime > 100f)
            {
                vel_env.ReleaseTime = 100f;
            }
        }