#include "AppleMIDI_Interface.hpp" #include "lwip/apps/mdns.h" #include "pico/cyw43_arch.h" BEGIN_CS_NAMESPACE AppleMIDI_Interface::AppleMIDI_Interface(const char *name, uint16_t port) : session_(name, port), sessionName_(name), port_(port) {} void AppleMIDI_Interface::begin() { session_.setName(sessionName_); session_.setPort(port_); session_.begin(); initMDNS(); } void AppleMIDI_Interface::initMDNS() { cyw43_arch_lwip_begin(); mdns_resp_init(); struct netif *nif = &cyw43_state.netif[CYW43_ITF_STA]; mdns_resp_add_netif(nif, sessionName_); mdns_resp_add_service(nif, sessionName_, "_apple-midi", DNSSD_PROTO_UDP, port_, nullptr, nullptr); cyw43_arch_lwip_end(); } void AppleMIDI_Interface::update() { session_.available(); MIDI_Interface::updateIncoming(this); } MIDIReadEvent AppleMIDI_Interface::read() { return parser_.pull(AppleMIDIBytePuller{session_}); } ChannelMessage AppleMIDI_Interface::getChannelMessage() const { return parser_.getChannelMessage(); } SysCommonMessage AppleMIDI_Interface::getSysCommonMessage() const { return parser_.getSysCommonMessage(); } RealTimeMessage AppleMIDI_Interface::getRealTimeMessage() const { return parser_.getRealTimeMessage(); } SysExMessage AppleMIDI_Interface::getSysExMessage() const { return parser_.getSysExMessage(); } void AppleMIDI_Interface::sendChannelMessageImpl(ChannelMessage msg) { session_.beginTransmission(MIDI_NAMESPACE::MidiType::InvalidType); session_.write(msg.header); session_.write(msg.data1); if (msg.hasTwoDataBytes()) session_.write(msg.data2); } void AppleMIDI_Interface::sendSysCommonImpl(SysCommonMessage msg) { session_.beginTransmission(MIDI_NAMESPACE::MidiType::InvalidType); session_.write(msg.header); uint8_t ndata = msg.getNumberOfDataBytes(); if (ndata >= 1) session_.write(msg.data1); if (ndata >= 2) session_.write(msg.data2); } void AppleMIDI_Interface::sendSysExImpl(SysExMessage msg) { session_.beginTransmission(MIDI_NAMESPACE::MidiType::SystemExclusive); for (uint16_t i = 0; i < msg.length; i++) session_.write(msg.data[i]); } void AppleMIDI_Interface::sendRealTimeImpl(RealTimeMessage msg) { session_.beginTransmission(MIDI_NAMESPACE::MidiType::InvalidType); session_.write(msg.message); } END_CS_NAMESPACE