private void HandleInputMimData(UIntPtr dwParam1, UIntPtr dwParam2) { Channel channel; Pitch pitch; int velocity; int value; uint win32Timestamp; if (ShortMsg.IsNoteOn(dwParam1, dwParam2)) { if (NoteOn == null) { return; } ShortMsg.DecodeNoteOn(dwParam1, dwParam2, out channel, out pitch, out velocity, out win32Timestamp); NoteOn(new NoteOnMessage(this, channel, pitch, velocity, _clock?.Time ?? win32Timestamp / 1000f)); } else if (ShortMsg.IsNoteOff(dwParam1, dwParam2)) { if (NoteOff == null) { return; } ShortMsg.DecodeNoteOff(dwParam1, dwParam2, out channel, out pitch, out velocity, out win32Timestamp); NoteOff(new NoteOffMessage(this, channel, pitch, velocity, _clock?.Time ?? win32Timestamp / 1000f)); } else if (ShortMsg.IsControlChange(dwParam1, dwParam2)) { Control control; ShortMsg.DecodeControlChange(dwParam1, dwParam2, out channel, out control, out value, out win32Timestamp); var msg = new ControlChangeMessage(this, channel, control, value, _clock?.Time ?? win32Timestamp / 1000f); _nrpnWatcher.ReceivedControlChange(msg); } else if (ShortMsg.IsProgramChange(dwParam1, dwParam2)) { if (ProgramChange == null) { return; } Instrument instrument; ShortMsg.DecodeProgramChange(dwParam1, dwParam2, out channel, out instrument, out win32Timestamp); ProgramChange(new ProgramChangeMessage(this, channel, instrument, _clock?.Time ?? win32Timestamp / 1000f)); } else if (ShortMsg.IsPitchBend(dwParam1, dwParam2)) { if (PitchBend == null) { return; } ShortMsg.DecodePitchBend(dwParam1, dwParam2, out channel, out value, out win32Timestamp); PitchBend(new PitchBendMessage(this, channel, value, _clock?.Time ?? win32Timestamp / 1000f)); } }