#pragma once #include "MIDI_Interface.hpp" #include #include "AppleMIDI/LwIPUDP.hpp" #include "AppleMIDI/vendor/AppleMIDI.h" BEGIN_CS_NAMESPACE using AppleMIDISession_t = APPLEMIDI_NAMESPACE::AppleMIDISession; struct AppleMIDIBytePuller { AppleMIDISession_t &session; bool pull(uint8_t &byte) { if (session.available() == 0) return false; byte = session.read(); return true; } }; class AppleMIDI_Interface : public MIDI_Interface { public: /// @param name Session name visible in macOS Audio MIDI Setup /// @param port AppleMIDI control port (data port = port + 1) AppleMIDI_Interface(const char *name = "PicoW", uint16_t port = 5004); void begin() override; void update() override; MIDIReadEvent read(); ChannelMessage getChannelMessage() const; SysCommonMessage getSysCommonMessage() const; RealTimeMessage getRealTimeMessage() const; SysExMessage getSysExMessage() const; /// Must be called after WiFi is connected but before begin() void setName(const char *name) { sessionName_ = name; } protected: void sendChannelMessageImpl(ChannelMessage msg) override; void sendSysCommonImpl(SysCommonMessage msg) override; void sendSysExImpl(SysExMessage msg) override; void sendRealTimeImpl(RealTimeMessage msg) override; void sendNowImpl() override {} private: #if !DISABLE_PIPES void handleStall() override { MIDI_Interface::handleStall(this); } #ifdef DEBUG_OUT const char *getName() const override { return "applemidi"; } #endif #endif void initMDNS(); AppleMIDISession_t session_; SerialMIDI_Parser parser_; const char *sessionName_; uint16_t port_; }; END_CS_NAMESPACE