Control Surface  1.2.0
MIDI Control Surface library for Arduino
MIDI_Interface.ipp
Go to the documentation of this file.
1 #include "MIDI_Interface.hpp"
2 #include <Def/CRTP.hpp>
3 
5 
6 template <class Derived>
8  uint8_t d2, Cable cable) {
9  sendOnCable(m, c, d1, d2, cable);
10 }
11 
12 template <class Derived>
14  Cable cable) {
15  sendOnCable(m, c, d1, cable);
16 }
17 
18 template <class Derived>
20  uint8_t d2, Cable cable) {
21  uint8_t mm = static_cast<uint8_t>(m);
22  uint8_t cc = c.getRaw();
23  mm &= 0xF0; // bitmask high nibble
24  mm |= 0b10000000; // set msb
25  d1 &= 0x7F; // clear msb
26  d2 &= 0x7F; // clear msb
27  CRTP(Derived).sendImpl(mm | cc, d1, d2, cable.getRaw());
28 }
29 
30 template <class Derived>
32  Cable cable) {
33  uint8_t mm = static_cast<uint8_t>(m);
34  uint8_t cc = c.getRaw();
35  mm &= 0xF0; // bitmask high nibble
36  mm |= 0b10000000; // set msb
37  d1 &= 0x7F; // clear msb
38  CRTP(Derived).sendImpl(mm | cc, d1, cable.getRaw());
39 }
40 
41 template <class Derived>
43  uint8_t rr = static_cast<uint8_t>(r);
44  rr |= 0b10000000; // set msb
45  CRTP(Derived).sendImpl(rr, cable.getRaw());
46 }
47 
48 template <class Derived>
49 void MIDI_Sender<Derived>::sendNoteOn(MIDIAddress address, uint8_t velocity) {
50  if (address)
51  sendOnCable(MIDIMessageType::NOTE_ON, address.getChannel(),
52  address.getAddress(), velocity, address.getCableNumber());
53 }
54 template <class Derived>
55 void MIDI_Sender<Derived>::sendNoteOff(MIDIAddress address, uint8_t velocity) {
56  if (address)
57  sendOnCable(MIDIMessageType::NOTE_OFF, address.getChannel(),
58  address.getAddress(), velocity, address.getCableNumber());
59 }
60 template <class Derived>
61 void MIDI_Sender<Derived>::sendKP(MIDIAddress address, uint8_t pressure) {
62  if (address)
63  sendOnCable(MIDIMessageType::KEY_PRESSURE, address.getChannel(),
64  address.getAddress(), pressure, address.getCableNumber());
65 }
66 template <class Derived>
67 void MIDI_Sender<Derived>::sendCC(MIDIAddress address, uint8_t value) {
68  if (address)
69  sendOnCable(MIDIMessageType::CONTROL_CHANGE, address.getChannel(),
70  address.getAddress(), value, address.getCableNumber());
71 }
72 template <class Derived>
73 void MIDI_Sender<Derived>::sendPC(MIDIChannelCN address, uint8_t value) {
74  if (address)
75  sendOnCable(MIDIMessageType::PROGRAM_CHANGE, address.getChannel(),
76  value, address.getCableNumber());
77 }
78 template <class Derived>
80  if (address)
81  sendOnCable(MIDIMessageType::PROGRAM_CHANGE, address.getChannel(),
82  address.getAddress(), address.getCableNumber());
83 }
84 template <class Derived>
85 void MIDI_Sender<Derived>::sendCP(MIDIChannelCN address, uint8_t pressure) {
86  if (address)
87  sendOnCable(MIDIMessageType::CHANNEL_PRESSURE, address.getChannel(),
88  pressure, address.getCableNumber());
89 }
90 template <class Derived>
91 void MIDI_Sender<Derived>::sendPB(MIDIChannelCN address, uint16_t value) {
92  if (address)
93  sendOnCable(MIDIMessageType::PITCH_BEND, address.getChannel(),
94  value & 0x7F, value >> 7, address.getCableNumber());
95 }
96 template <class Derived>
98  if (message.length) {
99  if (message.length < 2) {
100  ERROR(F("Error: invalid SysEx length"), 0x7F7F);
101  return;
102  }
103  CRTP(Derived).sendImpl(message.data, message.length, message.CN);
104  }
105 }
106 template <class Derived>
108  CRTP(Derived).sendImpl(rt, cable.getRaw());
109 }
110 
111 template <class Derived>
113  CRTP(Derived).sendImpl(message.message, message.CN);
114 }
115 
116 template <class Derived>
118  if (message.hasTwoDataBytes())
119  CRTP(Derived).sendImpl(message.header, message.data1, message.data2,
120  message.CN);
121  else
122  CRTP(Derived).sendImpl(message.header, message.data1, message.CN);
123 }
124 
Channel
A type-safe class for MIDI channels.
Definition: Channel.hpp:13
MIDIAddress
A type-safe utility class for saving a MIDI address consisting of a 7-bit address,...
Definition: MIDIAddress.hpp:91
MIDIAddress::getCableNumber
constexpr Cable getCableNumber() const
Get the cable number [CABLE_1, CABLE_16].
Definition: MIDIAddress.hpp:231
Cable
A type-safe class for MIDI USB Cable numbers.
Definition: Cable.hpp:13
MIDIChannelCN::getCableNumber
constexpr Cable getCableNumber() const
Get the cable number [CABLE_1, CABLE_16].
Definition: MIDIAddress.hpp:38
SysExMessage
Definition: MIDI_MessageTypes.hpp:138
SysExMessage::data
const uint8_t * data
Definition: MIDI_MessageTypes.hpp:156
ChannelMessage::CN
uint8_t CN
USB MIDI cable number;.
Definition: MIDI_MessageTypes.hpp:87
MIDI_Sender::sendNoteOn
void sendNoteOn(MIDIAddress address, uint8_t velocity)
Send a MIDI Note On event.
Definition: MIDI_Interface.ipp:49
MIDI_Sender::sendKP
void sendKP(MIDIAddress address, uint8_t pressure)
Send a MIDI Key Pressure event.
Definition: MIDI_Interface.ipp:61
MIDIChannelCN
A class for saving a MIDI channel and cable number.
Definition: MIDIAddress.hpp:19
CRTP.hpp
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
ChannelMessage::header
uint8_t header
MIDI status byte (message type and channel).
Definition: MIDI_MessageTypes.hpp:83
ChannelMessage::data2
uint8_t data2
First MIDI data byte.
Definition: MIDI_MessageTypes.hpp:85
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
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
ChannelMessage::hasTwoDataBytes
bool hasTwoDataBytes() const
Check whether this message has one or two data bytes.
Definition: MIDI_MessageTypes.hpp:124
MIDIChannelCN::getChannel
constexpr Channel getChannel() const
Get the channel [1, 16].
Definition: MIDIAddress.hpp:33
MIDI_Sender::sendPC
void sendPC(MIDIAddress address)
Send a MIDI Program Change event.
Definition: MIDI_Interface.ipp:79
ERROR
#define ERROR(msg, errc)
Print the error message and error code, and stop the execution if FATAL_ERRORS are enabled.
Definition: Error.hpp:42
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
CRTP
#define CRTP(Derived)
Helper for the Curiously Recurring Template Pattern.
Definition: AH/Containers/CRTP.hpp:4
RealTimeMessage
Definition: MIDI_MessageTypes.hpp:173
ChannelMessage::data1
uint8_t data1
First MIDI data byte.
Definition: MIDI_MessageTypes.hpp:84
SysExMessage::CN
uint8_t CN
Definition: MIDI_MessageTypes.hpp:158
MIDI_Notes::F
constexpr int8_t F
Definition: Notes.hpp:23
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
MIDIAddress::getAddress
constexpr uint8_t getAddress() const
Get the address [0, 127].
Definition: MIDIAddress.hpp:223
MIDIAddress::getChannel
constexpr Channel getChannel() const
Get the channel [CHANNEL_1, CHANNEL_16].
Definition: MIDIAddress.hpp:226
ChannelMessage
Definition: MIDI_MessageTypes.hpp:72
RealTimeMessage::CN
uint8_t CN
Definition: MIDI_MessageTypes.hpp:190
MIDI_Sender::sendNoteOff
void sendNoteOff(MIDIAddress address, uint8_t velocity)
Send a MIDI Note Off event.
Definition: MIDI_Interface.ipp:55
Channel::getRaw
constexpr uint8_t getRaw() const
Get the channel as an integer.
Definition: Channel.hpp:29
Cable::getRaw
constexpr uint8_t getRaw() const
Get the cable as an integer.
Definition: Cable.hpp:29
SysExMessage::length
uint8_t length
Definition: MIDI_MessageTypes.hpp:157
MIDI_Interface.hpp
RealTimeMessage::message
uint8_t message
Definition: MIDI_MessageTypes.hpp:189
MIDI_Sender::sendCP
void sendCP(MIDIChannelCN address, uint8_t pressure)
Send a MIDI Channel Pressure event.
Definition: MIDI_Interface.ipp:85