public override void NoteOn(byte note, byte velocity)
{
if (!_allocated)
{
return;
}
_out.note = note;
_out.sustainNoteOff = 0;
_out.length = _instrument[0];
if (_instrument[4] < PCSpeakerDriver._outInstrumentData.Length)
{
_out.instrument = PCSpeakerDriver._outInstrumentData[_instrument[4]];
}
else
{
_out.instrument = null;
}
_out.unkA = 0;
_out.unkB = _instrument[1];
_out.unkC = _instrument[2];
_out.unkE = 0;
_out.unk60 = 0;
_out.active = 1;
// In case we get a note on event on the last active channel, we reset the
// last active channel, thus we assure the frequency is correctly set, even
// when the same note was sent.
if (_owner._lastActiveChannel == this)
{
_owner._lastActiveChannel = null;
_owner._lastActiveOut = 0;
}
_owner.UpdateNote();
_out.unkC += PCSpeakerDriver.GetEffectModifier((ushort)(_instrument[3] + ((velocity & 0xFE) << 4)));
if (_out.unkC > 63)
{
_out.unkC = 63;
}
if ((_instrument[5] & 0x80) != 0)
{
_owner.SetupEffects(this, _out.effectEnvelopeA, _out.effectDefA, _instrument[5], _instrument, 6);
}
if ((_instrument[14] & 0x80) != 0)
{
_owner.SetupEffects(this, _out.effectEnvelopeB, _out.effectDefB, _instrument[14], _instrument, 15);
}
}