Ejemplo n.º 1
0
        void UpdateEffectGenerator(EffectEnvelope s, EffectDef d)
        {
            byte f = (byte)AdvanceEffectEnvelope(s, d);

            if ((f & 1) != 0)
            {
                switch (d.type)
                {
                case 0:
                    _operator2Tl = (byte)(s.startLevel + d.phase);
                    break;

                case 13:
                    _operator1Tl = (byte)(s.startLevel + d.phase);
                    break;

                case 30:
                    d.s.modWheelState = (sbyte)d.phase;
                    break;

                case 31:
                    d.s.modWheelSensitivity = (sbyte)d.phase;
                    break;
                }
            }

            if ((f & 2) != 0)
            {
                if (d.loopRefresh != 0)
                {
                    KeyOn();
                }
            }
        }
Ejemplo n.º 2
0
        void SetupEffects(MidiChannelPcSpk chan, EffectEnvelope env, EffectDefinition def, byte flags, byte[] data, int offset)
        {
            def.phase       = 0;
            def.useModWheel = (byte)(flags & 0x40);
            env.loop        = (byte)(flags & 0x20);
            def.type        = (short)(flags & 0x1F);

            env.modWheelSensitivity = 31;
            if (def.useModWheel != 0)
            {
                env.modWheelState = (byte)(MidiChannelPcSpk.ModWheel >> 2);
            }
            else
            {
                env.modWheelState = 31;
            }

            switch (def.type)
            {
            case 0:
                env.maxLevel   = 767;
                env.startLevel = 383;
                break;

            case 1:
                env.maxLevel   = 31;
                env.startLevel = 15;
                break;

            case 2:
                env.maxLevel   = 63;
                env.startLevel = chan._out.unkB;
                break;

            case 3:
                env.maxLevel   = 63;
                env.startLevel = chan._out.unkC;
                break;

            case 4:
                env.maxLevel   = 3;
                env.startLevel = chan._instrument[4];
                break;

            case 5:
                env.maxLevel      = 62;
                env.startLevel    = 31;
                env.modWheelState = 0;
                break;

            case 6:
                env.maxLevel            = 31;
                env.startLevel          = 0;
                env.modWheelSensitivity = 0;
                break;
            }

            StartEffect(env, data, offset);
        }
Ejemplo n.º 3
0
        int AdvanceEffectEnvelope(EffectEnvelope s, EffectDef d)
        {
            if (s.duration != 0)
            {
                s.duration -= 17;
                if (s.duration <= 0)
                {
                    s.state = EnvelopeState.Ready;
                    return(0);
                }
            }

            int t = s.currentLevel + s.incrPerStep;

            s.incrCountRem += s.incrPerStepRem;
            if (s.incrCountRem >= s.numSteps)
            {
                s.incrCountRem -= s.numSteps;
                t += s.dir;
            }

            int retFlags = 0;

            if (t != s.currentLevel || (s.modWheelState != s.modWheelLast))
            {
                s.currentLevel = t;
                s.modWheelLast = s.modWheelState;
                t = GetEffectModLevel(t, s.modWheelState);
                if (t != d.phase)
                {
                    d.phase   = t;
                    retFlags |= 1;
                }
            }

            if ((--s.stepCounter) != 0)
            {
                return(retFlags);
            }

            if (++s.state > EnvelopeState.Releasing)
            {
                if (s.loop == 0)
                {
                    s.state = EnvelopeState.Ready;
                    return(retFlags);
                }
                s.state   = EnvelopeState.Attacking;
                retFlags |= 2;
            }

            InitNextEnvelopeState(s);

            return(retFlags);
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        void InitNextEnvelopeState(EffectEnvelope s)
        {
            byte v = s.stateTargetLevels[(int)s.state - 1];
            int  e = _effectEnvStepTable[_driver._operatorLevelTable[((v & 0x7f) << 5) + s.modWheelSensitivity]];

            if ((v & 0x80) != 0)
            {
                e = _driver.RandomValue(e);
            }

            if (e == 0)
            {
                e = 1;
            }

            s.numSteps = (ushort)(s.stepCounter = (uint)e);
            int d = 0;

            if (s.state != EnvelopeState.Sustaining)
            {
                v = s.stateModWheelLevels[(int)s.state - 1];
                e = GetEffectModLevel(s.maxLevel, (v & 0x7f) - 31);

                if ((v & 0x80) != 0)
                {
                    e = _driver.RandomValue(e);
                }

                if (e + s.startLevel > s.maxLevel)
                {
                    e = s.maxLevel - s.startLevel;
                }
                else
                {
                    if (e + s.startLevel < 0)
                    {
                        e = -s.startLevel;
                    }
                }

                d = e - s.currentLevel;
            }

            s.incrPerStep    = d / s.numSteps;
            s.dir            = (sbyte)((d < 0) ? -1 : 1);
            d               *= s.dir;
            s.incrPerStepRem = (uint)(d % s.numSteps);
            s.incrCountRem   = 0;
        }
Ejemplo n.º 6
0
 void StartEffect(EffectEnvelope s, byte[] effectData, int offset)
 {
     s.state                  = EnvelopeState.Attacking;
     s.currentLevel           = 0;
     s.modWheelLast           = 31;
     s.duration               = effectData[offset] * 63;
     s.stateTargetLevels[0]   = effectData[offset + 1];
     s.stateTargetLevels[1]   = effectData[offset + 3];
     s.stateTargetLevels[2]   = effectData[offset + 5];
     s.stateTargetLevels[3]   = effectData[offset + 6];
     s.stateModWheelLevels[0] = effectData[offset + 2];
     s.stateModWheelLevels[1] = effectData[offset + 4];
     s.stateModWheelLevels[2] = 0;
     s.stateModWheelLevels[3] = effectData[offset + 7];
     InitNextEnvelopeState(s);
 }
Ejemplo n.º 7
0
        public void SetupEffects(int index, byte flags, byte[] effectData, int offset)
        {
            ushort[] effectMaxLevel = { 0x2FF, 0x1F, 0x07, 0x3F, 0x0F, 0x0F, 0x0F, 0x03, 0x3F, 0x0F, 0x0F, 0x0F, 0x03, 0x3E, 0x1F };
            byte[]   effectType     = { 0x1D, 0x1C, 0x1B, 0x00, 0x03, 0x04, 0x07, 0x08, 0x0D, 0x10, 0x11, 0x14, 0x15, 0x1e, 0x1f, 0x00 };

            EffectEnvelope s = _effectEnvelopes[index];
            EffectDef      d = _effectDefs[index];

            d.phase               = 0;
            d.useModWheel         = (byte)(flags & 0x40);
            s.loop                = (byte)(flags & 0x20);
            d.loopRefresh         = (byte)(flags & 0x10);
            d.type                = effectType[flags & 0x0f];
            s.maxLevel            = effectMaxLevel[flags & 0x0f];
            s.modWheelSensitivity = 31;
            s.modWheelState       = (sbyte)((d.useModWheel != 0) ? _in._modWheel >> 2 : 31);

            switch (d.type)
            {
            case 0:
                s.startLevel = _operator2Tl;
                break;

            case 13:
                s.startLevel = _operator1Tl;
                break;

            case 30:
                s.startLevel      = 31;
                d.s.modWheelState = 0;
                break;

            case 31:
                s.startLevel            = 0;
                d.s.modWheelSensitivity = 0;
                break;

            default:
                s.startLevel = GetEffectStartLevel(d.type);
                break;
            }

            StartEffect(s, effectData, offset);
        }
Ejemplo n.º 8
0
        void StartEffect(EffectEnvelope env, byte[] data, int offset)
        {
            env.state        = 1;
            env.currentLevel = 0;
            env.modWheelLast = 31;
            env.duration     = (short)(data[offset + 0] * 63);

            env.stateTargetLevels[0] = data[offset + 1];
            env.stateTargetLevels[1] = data[offset + 3];
            env.stateTargetLevels[2] = data[offset + 5];
            env.stateTargetLevels[3] = data[offset + 6];

            env.stateModWheelLevels[0] = data[offset + 2];
            env.stateModWheelLevels[1] = data[offset + 4];
            env.stateModWheelLevels[2] = 0;
            env.stateModWheelLevels[3] = data[offset + 7];

            InitNextEnvelopeState(env);
        }
Ejemplo n.º 9
0
        public TownsMidiOutputChannel(MidiDriver_TOWNS driver, int chanIndex)
        {
            _driver = driver;
            _chan   = (byte)chanIndex;

            _effectEnvelopes = new EffectEnvelope[2];
            for (int i = 0; i < _effectEnvelopes.Length; i++)
            {
                _effectEnvelopes[i] = new EffectEnvelope();
            }
            _effectDefs = new EffectDef[2];
            for (int i = 0; i < _effectEnvelopes.Length; i++)
            {
                _effectDefs[i] = new EffectDef();
            }

            _effectDefs[0].s = _effectEnvelopes[1];
            _effectDefs[1].s = _effectEnvelopes[0];
        }
Ejemplo n.º 10
0
        public TownsMidiOutputChannel(MidiDriver_TOWNS driver, int chanIndex)
        {
            _driver = driver;
            _chan = (byte)chanIndex;

            _effectEnvelopes = new EffectEnvelope[2];
            for (int i = 0; i < _effectEnvelopes.Length; i++)
            {
                _effectEnvelopes[i] = new EffectEnvelope();
            }
            _effectDefs = new EffectDef[2];
            for (int i = 0; i < _effectEnvelopes.Length; i++)
            {
                _effectDefs[i] = new EffectDef();
            }

            _effectDefs[0].s = _effectEnvelopes[1];
            _effectDefs[1].s = _effectEnvelopes[0];
        }
Ejemplo n.º 11
0
        void InitNextEnvelopeState(EffectEnvelope s)
        {
            byte v = s.stateTargetLevels[(int)s.state - 1];
            int e = _effectEnvStepTable[_driver._operatorLevelTable[((v & 0x7f) << 5) + s.modWheelSensitivity]];

            if ((v & 0x80) != 0)
                e = _driver.RandomValue(e);

            if (e == 0)
                e = 1;

            s.numSteps = (ushort)(s.stepCounter = (uint)e);
            int d = 0;

            if (s.state != EnvelopeState.Sustaining)
            {
                v = s.stateModWheelLevels[(int)s.state - 1];
                e = GetEffectModLevel(s.maxLevel, (v & 0x7f) - 31);

                if ((v & 0x80) != 0)
                    e = _driver.RandomValue(e);

                if (e + s.startLevel > s.maxLevel)
                {
                    e = s.maxLevel - s.startLevel;
                }
                else
                {
                    if (e + s.startLevel < 0)
                        e = -s.startLevel;
                }

                d = e - s.currentLevel;
            }

            s.incrPerStep = d / s.numSteps;
            s.dir = (sbyte)((d < 0) ? -1 : 1);
            d *= s.dir;
            s.incrPerStepRem = (uint)(d % s.numSteps);
            s.incrCountRem = 0;
        }
Ejemplo n.º 12
0
        int AdvanceEffectEnvelope(EffectEnvelope s, EffectDef d)
        {
            if (s.duration != 0)
            {
                s.duration -= 17;
                if (s.duration <= 0)
                {
                    s.state = EnvelopeState.Ready;
                    return 0;
                }
            }

            int t = s.currentLevel + s.incrPerStep;

            s.incrCountRem += s.incrPerStepRem;
            if (s.incrCountRem >= s.numSteps)
            {
                s.incrCountRem -= s.numSteps;
                t += s.dir;
            }

            int retFlags = 0;

            if (t != s.currentLevel || (s.modWheelState != s.modWheelLast))
            {
                s.currentLevel = t;
                s.modWheelLast = s.modWheelState;
                t = GetEffectModLevel(t, s.modWheelState);
                if (t != d.phase)
                {
                    d.phase = t;
                    retFlags |= 1;
                }
            }

            if ((--s.stepCounter) != 0)
                return retFlags;

            if (++s.state > EnvelopeState.Releasing)
            {
                if (s.loop == 0)
                {
                    s.state = EnvelopeState.Ready;
                    return retFlags;
                }
                s.state = EnvelopeState.Attacking;
                retFlags |= 2;
            }

            InitNextEnvelopeState(s);

            return retFlags;
        }
Ejemplo n.º 13
0
        void UpdateEffectGenerator(EffectEnvelope s, EffectDef d)
        {
            byte f = (byte)AdvanceEffectEnvelope(s, d);

            if ((f & 1) != 0)
            {
                switch (d.type)
                {
                    case 0:
                        _operator2Tl = (byte)(s.startLevel + d.phase);
                        break;
                    case 13:
                        _operator1Tl = (byte)(s.startLevel + d.phase);
                        break;
                    case 30:
                        d.s.modWheelState = (sbyte)d.phase;
                        break;
                    case 31:
                        d.s.modWheelSensitivity = (sbyte)d.phase;
                        break;
                }
            }

            if ((f & 2) != 0)
            {
                if (d.loopRefresh != 0)
                    KeyOn();
            }
        }
Ejemplo n.º 14
0
 void StartEffect(EffectEnvelope s, byte[] effectData, int offset)
 {
     s.state = EnvelopeState.Attacking;
     s.currentLevel = 0;
     s.modWheelLast = 31;
     s.duration = effectData[offset] * 63;
     s.stateTargetLevels[0] = effectData[offset + 1];
     s.stateTargetLevels[1] = effectData[offset + 3];
     s.stateTargetLevels[2] = effectData[offset + 5];
     s.stateTargetLevels[3] = effectData[offset + 6];
     s.stateModWheelLevels[0] = effectData[offset + 2];
     s.stateModWheelLevels[1] = effectData[offset + 4];
     s.stateModWheelLevels[2] = 0;
     s.stateModWheelLevels[3] = effectData[offset + 7];
     InitNextEnvelopeState(s);
 }