Control Surface  1.2.0
MIDI Control Surface library for Arduino
MIDI_Interface.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "MIDI_Pipes.hpp"
5 #include <Def/Def.hpp>
6 #include <Def/MIDIAddress.hpp>
8 
10 
11 constexpr auto MIDI_BAUD = 31250;
12 
13 class MIDI_Callbacks;
14 
18 template <class Derived>
19 class MIDI_Sender {
20  public:
23 
38  void send(MIDIMessageType m, Channel c, uint8_t d1, uint8_t d2,
39  Cable cable = CABLE_1);
40 
53  void send(MIDIMessageType m, Channel c, uint8_t d1, Cable cable = CABLE_1);
54 
69  void sendOnCable(MIDIMessageType m, Channel c, uint8_t d1, uint8_t d2,
70  Cable cable);
71 
84  void sendOnCable(MIDIMessageType m, Channel c, uint8_t d1, Cable cable);
85 
94  void sendOnCable(MIDIMessageType rt, Cable cable);
95 
97  void sendNoteOn(MIDIAddress address, uint8_t velocity);
99  void sendNoteOff(MIDIAddress address, uint8_t velocity);
101  void sendKP(MIDIAddress address, uint8_t pressure);
103  void sendCC(MIDIAddress address, uint8_t value);
105  void sendPC(MIDIAddress address);
107  void sendPC(MIDIChannelCN address, uint8_t value);
109  void sendCP(MIDIChannelCN address, uint8_t pressure);
111  void sendPB(MIDIChannelCN address, uint16_t value);
113  void send(ChannelMessage message);
115  void send(SysExMessage message);
117  template <size_t N>
118  void send(const uint8_t (&sysexdata)[N], Cable cable = CABLE_1) {
119  send(SysExMessage{sysexdata, N, cable});
120  }
122  void send(RealTimeMessage message);
124  void send(MIDIMessageType rt, Cable cable = CABLE_1);
125 
127 };
128 
133  public MIDI_Sender<MIDI_Interface>,
134  public AH::Updatable<MIDI_Interface> {
135  protected:
139  MIDI_Interface() = default;
140 
142 
143  public:
147  virtual ~MIDI_Interface();
148 
152  void begin() override {}
153 
158  void update() override = 0;
159 
162 
165  static MIDI_Interface *getDefault();
166 
170  void setAsDefault();
172 
175 
182  virtual void setCallbacks(MIDI_Callbacks *cb) = 0;
183 
194 
195  protected:
196  friend class MIDI_Sender<MIDI_Interface>;
200  virtual void sendImpl(uint8_t header, uint8_t d1, uint8_t d2,
201  uint8_t cn) = 0;
205  virtual void sendImpl(uint8_t header, uint8_t d1, uint8_t cn) = 0;
206 
210  virtual void sendImpl(const uint8_t *data, size_t length, uint8_t cn) = 0;
211 
215  virtual void sendImpl(uint8_t rt, uint8_t cn) = 0;
216 
217  protected:
219  void sinkMIDIfromPipe(ChannelMessage) override;
221  void sinkMIDIfromPipe(SysExMessage) override;
223  void sinkMIDIfromPipe(RealTimeMessage) override;
224 
225  private:
227 };
228 
233  protected:
243 
244  public:
247 
248  MIDI_Parser &getParser() { return parser; }
249 
252  return parser.getChannelMessage();
253  }
254 
257  return parser.getRealTimeMessage();
258  }
259 
262 
264 
265  void update() override;
266 
267  void setCallbacks(MIDI_Callbacks *cb) override { this->callbacks = cb; }
269 
270  protected:
272 
273  private:
279  virtual MIDIReadEvent read() = 0;
280 
281  bool onRealTimeMessage();
282  bool onChannelMessage();
283  bool onSysExMessage();
284 
285  protected:
288  MIDIReadEvent event = MIDIReadEvent::NO_MESSAGE;
289 };
290 
291 // LCOV_EXCL_START
296  public:
299  virtual void onChannelMessage(Parsing_MIDI_Interface &midi) { (void)midi; }
301  virtual void onSysExMessage(Parsing_MIDI_Interface &midi) { (void)midi; }
303  virtual void onRealTimeMessage(Parsing_MIDI_Interface &midi) { (void)midi; }
304 
306  virtual ~MIDI_Callbacks() = default;
307 };
308 // LCOV_EXCL_STOP
309 
311 
312 #include "MIDI_Interface.ipp"
MIDI_BAUD
constexpr auto MIDI_BAUD
Definition: MIDI_Interface.hpp:11
Channel
A type-safe class for MIDI channels.
Definition: Channel.hpp:13
CABLE_1
constexpr Cable CABLE_1
Definition: Cable.hpp:111
MIDIAddress.hpp
MIDIAddress
A type-safe utility class for saving a MIDI address consisting of a 7-bit address,...
Definition: MIDIAddress.hpp:91
MIDI_Sender::send
void send(const uint8_t(&sysexdata)[N], Cable cable=CABLE_1)
Send a MIDI System Exclusive message.
Definition: MIDI_Interface.hpp:118
MIDI_Parser::getChannelMessage
ChannelMessage getChannelMessage()
Get the latest MIDI channel message.
Definition: MIDI_Parser.hpp:25
AH::Updatable
A super class for object that have to be updated regularly.
Definition: Updatable.hpp:195
MIDI_Interface::DefaultMIDI_Interface
static MIDI_Interface * DefaultMIDI_Interface
Definition: MIDI_Interface.hpp:226
MIDI_Interface::getDefault
static MIDI_Interface * getDefault()
Return the default MIDI interface.
Definition: MIDI_Interface.cpp:14
Cable
A type-safe class for MIDI USB Cable numbers.
Definition: Cable.hpp:13
SysExMessage
Definition: MIDI_MessageTypes.hpp:138
Parsing_MIDI_Interface::parser
MIDI_Parser & parser
Definition: MIDI_Interface.hpp:286
Parsing_MIDI_Interface::getSysExMessage
SysExMessage getSysExMessage() const
Return the received system exclusive message.
Definition: MIDI_Interface.hpp:261
Updatable.hpp
Parsing_MIDI_Interface::onChannelMessage
bool onChannelMessage()
Definition: MIDI_Interface.cpp:66
Parsing_MIDI_Interface
An abstract class for MIDI interfaces.
Definition: MIDI_Interface.hpp:232
MIDI_Callbacks::onRealTimeMessage
virtual void onRealTimeMessage(Parsing_MIDI_Interface &midi)
Callback for incoming MIDI Real-Time Messages.
Definition: MIDI_Interface.hpp:303
MIDI_Parser
Definition: MIDI_Parser.hpp:22
MIDI_Sender::sendNoteOn
void sendNoteOn(MIDIAddress address, uint8_t velocity)
Send a MIDI Note On event.
Definition: MIDI_Interface.ipp:49
Def.hpp
MIDI_Sender::sendKP
void sendKP(MIDIAddress address, uint8_t pressure)
Send a MIDI Key Pressure event.
Definition: MIDI_Interface.ipp:61
MIDI_Interface::sendImpl
virtual void sendImpl(const uint8_t *data, size_t length, uint8_t cn)=0
Low-level function for sending a system exclusive MIDI message.
MIDIChannelCN
A class for saving a MIDI channel and cable number.
Definition: MIDIAddress.hpp:19
MIDI_Interface::setCallbacks
virtual void setCallbacks(MIDI_Callbacks *cb)=0
Set the callbacks that will be called when a MIDI message is received.
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
MIDI_Interface::sinkMIDIfromPipe
void sinkMIDIfromPipe(ChannelMessage) override
Accept an incoming MIDI Channel message.
Definition: MIDI_Interface.cpp:28
MIDI_Sender::sendOnCable
void sendOnCable(MIDIMessageType m, Channel c, uint8_t d1, uint8_t d2, Cable cable)
Send a 3-byte MIDI packet with cable number.
Definition: MIDI_Interface.ipp:19
MIDI_Callbacks::onSysExMessage
virtual void onSysExMessage(Parsing_MIDI_Interface &midi)
Callback for incoming MIDI System Exclusive Messages.
Definition: MIDI_Interface.hpp:301
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
MIDI_Sender::sendPC
void sendPC(MIDIAddress address)
Send a MIDI Program Change event.
Definition: MIDI_Interface.ipp:79
Parsing_MIDI_Interface::update
void update() override
Read the MIDI interface and call the callback if a message is received.
Definition: MIDI_Interface.cpp:34
TrueMIDI_SinkSource
A struct that is both a TrueMIDI_Sink and a TrueMIDI_Source.
Definition: MIDI_Pipes.hpp:501
MIDIMessageType
MIDIMessageType
Definition: MIDI_MessageTypes.hpp:21
MIDI_Sender::send
void send(MIDIMessageType m, Channel c, uint8_t d1, uint8_t d2, Cable cable=CABLE_1)
Send a 3-byte MIDI packet.
Definition: MIDI_Interface.ipp:7
Parsing_MIDI_Interface::Parsing_MIDI_Interface
Parsing_MIDI_Interface(MIDI_Parser &parser)
Construct a MIDI interface with the given parser.
Definition: MIDI_Interface.hpp:242
Parsing_MIDI_Interface::event
MIDIReadEvent event
Definition: MIDI_Interface.hpp:288
MIDI_Callbacks::onChannelMessage
virtual void onChannelMessage(Parsing_MIDI_Interface &midi)
Callback for incoming MIDI Channel Messages (notes, control change, pitch bend, etc....
Definition: MIDI_Interface.hpp:299
RealTimeMessage
Definition: MIDI_MessageTypes.hpp:173
Parsing_MIDI_Interface::callbacks
MIDI_Callbacks * callbacks
Definition: MIDI_Interface.hpp:287
MIDI_Interface::begin
void begin() override
Initialize the MIDI Interface.
Definition: MIDI_Interface.hpp:152
Parsing_MIDI_Interface::getParser
MIDI_Parser & getParser()
Definition: MIDI_Interface.hpp:248
Parsing_MIDI_Interface::onRealTimeMessage
bool onRealTimeMessage()
Definition: MIDI_Interface.cpp:57
Parsing_MIDI_Interface::dispatchMIDIEvent
bool dispatchMIDIEvent(MIDIReadEvent event)
Definition: MIDI_Interface.cpp:47
MIDI_Interface::sendImpl
virtual void sendImpl(uint8_t header, uint8_t d1, uint8_t d2, uint8_t cn)=0
Low-level function for sending a 3-byte MIDI message.
MIDI_Callbacks::~MIDI_Callbacks
virtual ~MIDI_Callbacks()=default
Destructor.
MIDI_Sender
Statically polymorphic template for classes that send MIDI messages.
Definition: MIDI_Interface.hpp:19
MIDI_Interface::MIDI_Interface
MIDI_Interface()=default
Constructor.
MIDI_Parser::getRealTimeMessage
RealTimeMessage getRealTimeMessage()
Get the latest MIDI real-time message.
Definition: MIDI_Parser.hpp:27
MIDI_Sender::sendCC
void sendCC(MIDIAddress address, uint8_t value)
Send a MIDI Control Change event.
Definition: MIDI_Interface.ipp:67
MIDI_Sender::sendPB
void sendPB(MIDIChannelCN address, uint16_t value)
Send a MIDI Pitch Bend event.
Definition: MIDI_Interface.ipp:91
Parsing_MIDI_Interface::onSysExMessage
bool onSysExMessage()
Definition: MIDI_Interface.cpp:78
MIDI_Interface::setAsDefault
void setAsDefault()
Set this MIDI interface as the default interface.
Definition: MIDI_Interface.cpp:12
ChannelMessage
Definition: MIDI_MessageTypes.hpp:72
MIDIReadEvent
MIDIReadEvent
Result of the MIDI interface read methods.
Definition: MIDI_Parser.hpp:15
MIDI_Sender::sendNoteOff
void sendNoteOff(MIDIAddress address, uint8_t velocity)
Send a MIDI Note Off event.
Definition: MIDI_Interface.ipp:55
MIDI_Interface::sendImpl
virtual void sendImpl(uint8_t rt, uint8_t cn)=0
Low-level function for sending a single-byte MIDI message.
MIDI_Interface.ipp
MIDI_Callbacks
A class for callbacks from MIDI input.
Definition: MIDI_Interface.hpp:295
MIDI_Pipes.hpp
MIDI_Interface
An abstract class for MIDI interfaces.
Definition: MIDI_Interface.hpp:134
Parsing_MIDI_Interface::setCallbacks
void setCallbacks(MIDI_Callbacks *cb) override
Set the callbacks that will be called when a MIDI message is received.
Definition: MIDI_Interface.hpp:267
Parsing_MIDI_Interface::read
virtual MIDIReadEvent read()=0
Try reading and parsing a single incoming MIDI message.
MIDI_Interface::update
void update() override=0
Read the MIDI interface and call the callback if a message is received.
MIDI_Interface::sendImpl
virtual void sendImpl(uint8_t header, uint8_t d1, uint8_t cn)=0
Low-level function for sending a 2-byte MIDI message.
MIDI_Parser::getSysExMessage
virtual SysExMessage getSysExMessage() const =0
Get the latest SysEx message.
MIDI_Sender::sendCP
void sendCP(MIDIChannelCN address, uint8_t pressure)
Send a MIDI Channel Pressure event.
Definition: MIDI_Interface.ipp:85
MIDI_Interface::~MIDI_Interface
virtual ~MIDI_Interface()
Destructor.
Definition: MIDI_Interface.cpp:5
Parsing_MIDI_Interface::getChannelMessage
ChannelMessage getChannelMessage() const
Return the received channel message.
Definition: MIDI_Interface.hpp:251
MIDI_Interface::MIDI_Interface
MIDI_Interface(MIDI_Interface &&)=default
MIDI_Parser.hpp
Parsing_MIDI_Interface::getRealTimeMessage
RealTimeMessage getRealTimeMessage() const
Return the received real-time message.
Definition: MIDI_Interface.hpp:256