Control Surface  1.1.1
MIDI Control Surface library for Arduino
USBMIDI_Interface.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "MIDI_Interface.hpp"
4 #include "USBMIDI/USBMIDI.hpp"
5 #include <AH/Error/Error.hpp>
8 
10 
11 #if defined(TEENSYDUINO) && !defined(TEENSY_MIDIUSB_ENABLED)
12 #warning \
13  "Teensy: USB MIDI not enabled. Enable it from the Tools > USB Type menu."
14 #endif
15 
16 #ifndef ARDUINO
17 #include <gmock-wrapper.h>
18 #endif
19 
20 // If the main MCU has a USB connection or is a Teensy with MIDI USB type
21 #if defined(USBCON) || defined(TEENSY_MIDIUSB_ENABLED) || !defined(ARDUINO)
22 
24 
36  public:
41 
43 
44  private:
46 
47 #ifndef ARDUINO
48  public:
49  W_SUGGEST_OVERRIDE_OFF
50 
51  MOCK_METHOD5(writeUSBPacket,
52  void(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t));
53  MOCK_METHOD0(readUSBPacket, MIDIUSBPacket_t(void));
54  void flushUSB() {}
55 
56  W_SUGGEST_OVERRIDE_ON
57 
58  private:
59 #else
60  void writeUSBPacket(uint8_t cn, uint8_t cin, uint8_t d0, uint8_t d1,
61  uint8_t d2) {
62  USBMIDI::write(cn, cin, d0, d1, d2);
63  }
65  void flushUSB() { USBMIDI::flush(); }
66 #endif
67 
68  void sendImpl(uint8_t m, uint8_t c, uint8_t d1, uint8_t d2,
69  uint8_t cn) override {
70  writeUSBPacket(cn, m >> 4, // CN|CIN
71  (m | c), // status
72  d1, // data 1
73  d2); // data 2
74  flushUSB();
75  }
76 
77  void sendImpl(uint8_t m, uint8_t c, uint8_t d1, uint8_t cn) override {
78  sendImpl(m, c, d1, 0, cn);
79  }
80 
81  void sendImpl(const uint8_t *data, size_t length, uint8_t cn) override {
82  while (length > 3) {
83  writeUSBPacket(cn, 0x4, data[0], data[1], data[2]);
84  data += 3;
85  length -= 3;
86  }
87  switch (length) {
88  case 3: writeUSBPacket(cn, 0x7, data[0], data[1], data[2]); break;
89  case 2: writeUSBPacket(cn, 0x6, data[0], data[1], 0); break;
90  case 1: writeUSBPacket(cn, 0x5, data[0], 0, 0); break;
91  default: break;
92  }
93  flushUSB();
94  }
95 
96  void sendImpl(uint8_t rt, uint8_t cn) override {
97  writeUSBPacket(cn, 0xF, // CN|CIN
98  rt, // single byte
99  0, // no data
100  0); // no data
101  flushUSB();
102  }
103 
104  public:
105  MIDI_read_t read() override {
106  for (uint8_t i = 0; i < (SYSEX_BUFFER_SIZE + 2) / 3; ++i) {
107  MIDIUSBPacket_t midi_packet = readUSBPacket();
108  if (midi_packet.data[0] == 0)
109  return NO_MESSAGE;
110 
111  MIDI_read_t parseResult = parser.parse(midi_packet.data);
112 
113  if (parseResult != NO_MESSAGE)
114  return parseResult;
115  }
116  return NO_MESSAGE;
117  }
118 };
119 
121 
122 // If the main MCU doesn't have a USB connection:
123 // Fall back on Serial connection at the hardware MIDI baud rate.
124 // (Can be used with HIDUINO or USBMidiKliK.)
125 #else
126 
127 #include "SerialMIDI_Interface.hpp"
128 
130 
142  public:
147 };
148 
150 
151 #endif
152 
USBMIDI_Interface
A class for MIDI interfaces sending MIDI messages over a USB MIDI connection.
Definition: USBMIDI_Interface.hpp:35
USBMIDI_Interface::read
MIDI_read_t read() override
Definition: USBMIDI_Interface.hpp:105
MIDI_BAUD
constexpr auto MIDI_BAUD
Definition: MIDI_Interface.hpp:9
Error.hpp
Parsing_MIDI_Interface
An abstract class for MIDI interfaces.
Definition: MIDI_Interface.hpp:188
SerialMIDI_Interface.hpp
MIDI_read_t
MIDI_read_t
Definition: MIDI_Parser.hpp:29
USBMIDI.hpp
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:17
USBMIDI_Parser.hpp
USBSerialMIDI_Interface
A class for MIDI interfaces sending and receiving MIDI messages over the Serial port of the USB conne...
Definition: SerialMIDI_Interface.hpp:137
USBMIDI_Interface::flushUSB
void flushUSB()
Definition: USBMIDI_Interface.hpp:65
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
USBMIDI_Parser::parse
MIDI_read_t parse(uint8_t *packet)
Definition: USBMIDI_Parser.cpp:7
USBMIDI_Parser
Definition: USBMIDI_Parser.hpp:19
USBMIDI_Interface::MIDIUSBPacket_t
USBMIDI::MIDIUSBPacket_t MIDIUSBPacket_t
Definition: USBMIDI_Interface.hpp:42
AH::Array
An array wrapper for easy copying, comparing, and iterating.
Definition: Array.hpp:36
TeensyUSBTypes.hpp
NO_MESSAGE
Definition: MIDI_Parser.hpp:30
USBMIDI::flush
void flush()
Definition: USBMIDI_MIDIUSB.ipp:24
USBMIDI_Interface::sendImpl
void sendImpl(const uint8_t *data, size_t length, uint8_t cn) override
Low-level function for sending a system exclusive MIDI message.
Definition: USBMIDI_Interface.hpp:81
USBMIDI::MIDIUSBPacket_t
AH::Array< uint8_t, 4 > MIDIUSBPacket_t
Definition: USBMIDI.hpp:8
SYSEX_BUFFER_SIZE
constexpr size_t SYSEX_BUFFER_SIZE
The length of the maximum System Exclusive message that can be received.
Definition: Settings/Settings.hpp:54
USBMIDI_Interface::sendImpl
void sendImpl(uint8_t rt, uint8_t cn) override
Low-level function for sending a single-byte MIDI message.
Definition: USBMIDI_Interface.hpp:96
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:16
AH::Array::data
T data[N]
Definition: Array.hpp:37
USBMIDI_Interface::parser
USBMIDI_Parser parser
Definition: USBMIDI_Interface.hpp:45
USBMIDI_Interface::sendImpl
void sendImpl(uint8_t m, uint8_t c, uint8_t d1, uint8_t cn) override
Low-level function for sending a 2-byte MIDI message.
Definition: USBMIDI_Interface.hpp:77
MIDI_Interface.hpp
USBMIDI_Interface::USBMIDI_Interface
USBMIDI_Interface()
Construct a new USBMIDI_Interface.
Definition: USBMIDI_Interface.hpp:40
USBMIDI_Interface::sendImpl
void sendImpl(uint8_t m, uint8_t c, uint8_t d1, uint8_t d2, uint8_t cn) override
Low-level function for sending a 3-byte MIDI message.
Definition: USBMIDI_Interface.hpp:68
USBMIDI::read
MIDIUSBPacket_t read()
Definition: USBMIDI_MIDIUSB.ipp:8
USBMIDI_Interface::writeUSBPacket
void writeUSBPacket(uint8_t cn, uint8_t cin, uint8_t d0, uint8_t d1, uint8_t d2)
Definition: USBMIDI_Interface.hpp:60
USBMIDI::write
void write(uint8_t cn, uint8_t cin, uint8_t d0, uint8_t d1, uint8_t d2)
Definition: USBMIDI_MIDIUSB.ipp:14
USBMIDI_Interface::readUSBPacket
MIDIUSBPacket_t readUSBPacket()
Definition: USBMIDI_Interface.hpp:64