NScumm.Core.Audio.PCSpeakerDriver.InitNextEnvelopeState C# (CSharp) Method

InitNextEnvelopeState() private method

private InitNextEnvelopeState ( EffectEnvelope env ) : void
env NScumm.Core.Audio.SoftSynth.EffectEnvelope
return void
        void InitNextEnvelopeState(EffectEnvelope env)
        {
            byte lastState = (byte)(env.state - 1);

            short stepCount = _effectEnvStepTable[GetEffectModifier((ushort)(((env.stateTargetLevels[lastState] & 0x7F) << 5) + env.modWheelSensitivity))];
            if ((env.stateTargetLevels[lastState] & 0x80) != 0)
                stepCount = GetRandScale(stepCount);
            if (stepCount == 0)
                stepCount = 1;

            env.stateNumSteps = env.stateStepCounter = stepCount;

            short totalChange = 0;
            if (lastState != 2)
            {
                totalChange = GetEffectModLevel(env.maxLevel, (sbyte)((env.stateModWheelLevels[lastState] & 0x7F) - 31));
                if ((env.stateModWheelLevels[lastState] & 0x80) != 0)
                    totalChange = GetRandScale(totalChange);

                if (totalChange + env.startLevel > env.maxLevel)
                    totalChange = (short)(env.maxLevel - env.startLevel);
                else if (totalChange + env.startLevel < 0)
                    totalChange = (short)-env.startLevel;

                totalChange -= env.currentLevel;
            }

            env.changePerStep = (short)(totalChange / stepCount);
            if (totalChange < 0)
            {
                totalChange = (short)-totalChange;
                env.dir = -1;
            }
            else
            {
                env.dir = 1;
            }
            env.changePerStepRem = (short)(totalChange % stepCount);
            env.changeCountRem = 0;
        }