// // midikeyboard.h // // MiniDexed - Dexed FM synthesizer for bare metal Raspberry Pi // Copyright (C) 2022 The MiniDexed Team // // Original author of this class: // R. Stange // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #ifndef _midikeyboard_h #define _midikeyboard_h #include "mididevice.h" #include "config.h" #include #include #include #include #include #define USB_SYSEX_BUFFER_SIZE (MAX_DX7_SYSEX_LENGTH+128) // Allow a bit spare to handle unexpected SysEx messages class CMiniDexed; class CMIDIKeyboard : public CMIDIDevice { public: static const unsigned MaxInstances = 4; public: CMIDIKeyboard (CMiniDexed *pSynthesizer, CConfig *pConfig, CUserInterface *pUI, unsigned nInstance = 0); ~CMIDIKeyboard (void); void Process (boolean bPlugAndPlayUpdated); void Send (const u8 *pMessage, size_t nLength, unsigned nCable = 0) override; private: static void MIDIPacketHandler0 (unsigned nCable, u8 *pPacket, unsigned nLength); static void MIDIPacketHandler1 (unsigned nCable, u8 *pPacket, unsigned nLength); static void MIDIPacketHandler2 (unsigned nCable, u8 *pPacket, unsigned nLength); static void MIDIPacketHandler3 (unsigned nCable, u8 *pPacket, unsigned nLength); static void DeviceRemovedHandler (CDevice *pDevice, void *pContext); void USBMIDIMessageHandler (u8 *pPacket, unsigned nLength, unsigned nCable); private: struct TSendQueueEntry { u8 *pMessage; size_t nLength; unsigned nCable; }; uint8_t m_SysEx[USB_SYSEX_BUFFER_SIZE]; unsigned m_nSysExIdx; private: unsigned m_nInstance; CString m_DeviceName; CUSBMIDIDevice * volatile m_pMIDIDevice; std::queue m_SendQueue; static CMIDIKeyboard *s_pThis[MaxInstances]; static TMIDIPacketHandler * const s_pMIDIPacketHandler[MaxInstances]; }; #endif