NScumm.Core.Audio.TownsPC98_FmSynthPercussionSource.WriteReg C# (CSharp) Method

WriteReg() public method

public WriteReg ( byte address, byte value ) : void
address byte
value byte
return void
        public void WriteReg(byte address, byte value)
        {
            if (!_ready)
                return;

            byte h = (byte)(address >> 4);
            byte l = (byte)(address & 15);

            if (address > 15)
                _reg[address](value);

            if (address == 0)
            {
                if ((value & 0x80) != 0)
                {
                    //key off
                    for (int i = 0; i < 6; i++)
                    {
                        if (((value >> i) & 1) != 0)
                            _rhChan[i].active = false;
                    }
                }
                else
                {
                    //key on
                    for (int i = 0; i < 6; i++)
                    {
                        if (((value >> i) & 1) != 0)
                        {
                            RhtChannel s = _rhChan[i];
                            s.posOffset = s.startOffset;
                            s.active = true;
                            s.@out = 0;
                            s.samples[0] = s.samples[1] = 0;
                            s.decStep = 1;
                            s.decState = 0;
                        }
                    }
                }
            }
            else if (address == 1)
            {
                // total level
                _totalLevel = (byte)((value & 63) ^ 63);
                for (int i = 0; i < 6; i++)
                    RecalcOuput(_rhChan[i]);
            }
            else if (h == 0 && ((l & 8) != 0))
            {
                // instrument level
                l &= 7;
                _rhChan[l].level = (byte)((value & 0x1f) ^ 0x1f);
                RecalcOuput(_rhChan[l]);
            }
            else if ((h & 3) != 0)
            {
                l &= 7;
                if (h == 1)
                {
                    // set start offset
                    _rhChan[l].startOffset = _rhChan[l].dataOffset + ((_rhChan[l].startPosH << 8 | _rhChan[l].startPosL) << 8);
                }
                else if (h == 2)
                {
                    // set end offset
                    _rhChan[l].endOffset = _rhChan[l].dataOffset + ((_rhChan[l].endPosH << 8 | _rhChan[l].endPosL) << 8) + 255;
                }
            }
        }