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;
}
}
}