Control Surface
main
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
MIDI_Parsers
SerialMIDI_Parser.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include "
MIDI_Parser.hpp
"
4
#include "
SysExBuffer.hpp
"
5
6
BEGIN_CS_NAMESPACE
7
13
class
SerialMIDI_Parser
:
public
MIDI_Parser
{
14
public
:
15
SerialMIDI_Parser
(
bool
sysCommonCancelsRunningStatus
=
true
)
16
:
sysCommonCancelsRunningStatus
(
sysCommonCancelsRunningStatus
) {}
17
26
template
<
class
BytePuller>
27
MIDIReadEvent
pull
(BytePuller &&puller);
28
29
protected
:
31
MIDIReadEvent
feed
(uint8_t midibyte);
33
MIDIReadEvent
resume
();
34
35
#if !IGNORE_SYSEX
36
public
:
38
SysExMessage
getSysExMessage
()
const
{
39
return
{
sysexbuffer
.getBuffer(),
sysexbuffer
.getLength()};
40
}
41
42
protected
:
43
void
addSysExByte
(uint8_t data) {
sysexbuffer
.add(data); }
44
bool
hasSysExSpace
()
const
{
return
sysexbuffer
.hasSpaceLeft(); }
45
void
startSysEx
() {
sysexbuffer
.start(); }
46
void
endSysEx
() {
sysexbuffer
.end(); }
47
48
SysExBuffer
sysexbuffer
;
49
#endif
50
51
protected
:
52
MIDIReadEvent
handleRealTime
(uint8_t midiByte);
53
MIDIReadEvent
handleNonRealTimeStatus
(uint8_t midiByte);
54
MIDIReadEvent
handleStatus
(uint8_t midiByte);
55
MIDIReadEvent
handleData
(uint8_t midiByte);
56
57
protected
:
61
void
storeByte
(uint8_t midiByte) {
storedByte
= midiByte; }
64
bool
hasStoredByte
()
const
{
return
storedByte
!= 0xFF; }
66
uint8_t
popStoredByte
() {
67
uint8_t t =
storedByte
;
68
storedByte
= 0xFF;
69
return
t;
70
}
71
72
public
:
75
void
cancelRunningStatus
() {
runningHeader
= 0; }
76
77
private
:
79
bool
sysCommonCancelsRunningStatus
;
82
bool
thirdByte
=
false
;
86
uint8_t
currentHeader
= 0;
88
uint8_t
runningHeader
= 0;
90
uint8_t
storedByte
= 0xFF;
91
};
92
93
template
<
class
BytePuller>
94
inline
MIDIReadEvent
SerialMIDI_Parser::pull
(BytePuller &&puller) {
95
// First try resuming the parser, we might have a stored byte that has to
96
// be parsed first.
97
MIDIReadEvent
evt =
resume
();
98
if
(evt !=
MIDIReadEvent::NO_MESSAGE
)
99
return
evt;
100
101
// If resumption didn't produce a message, read new bytes from the input and
102
// parse them until either we get a message, or until the input runs out of
103
// new bytes.
104
uint8_t midiByte;
105
while
(puller.pull(midiByte)) {
106
evt =
feed
(midiByte);
107
if
(evt !=
MIDIReadEvent::NO_MESSAGE
)
108
return
evt;
109
}
110
return
MIDIReadEvent::NO_MESSAGE
;
111
}
112
113
END_CS_NAMESPACE
MIDIReadEvent
MIDIReadEvent
Values returned by the MIDI reading functions.
Definition
MIDIReadEvent.hpp:11
MIDIReadEvent::NO_MESSAGE
@ NO_MESSAGE
No new messages were received.
Definition
MIDIReadEvent.hpp:12
MIDI_Parser.hpp
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition
Settings/NamespaceSettings.hpp:14
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition
Settings/NamespaceSettings.hpp:11
SysExBuffer.hpp
MIDI_Parser
Base class for MIDI parsers.
Definition
MIDI_Parser.hpp:16
SerialMIDI_Parser::resume
MIDIReadEvent resume()
Resume the parser with the previously stored and unhandled byte.
Definition
SerialMIDI_Parser.cpp:212
SerialMIDI_Parser::SerialMIDI_Parser
SerialMIDI_Parser(bool sysCommonCancelsRunningStatus=true)
Definition
SerialMIDI_Parser.hpp:15
SerialMIDI_Parser::sysCommonCancelsRunningStatus
bool sysCommonCancelsRunningStatus
Accounts for running status differences between MIDI 1.0 and BLE-MIDI.
Definition
SerialMIDI_Parser.hpp:79
SerialMIDI_Parser::endSysEx
void endSysEx()
Definition
SerialMIDI_Parser.hpp:46
SerialMIDI_Parser::currentHeader
uint8_t currentHeader
Current header (not necessarily running), contains the header of the message that's currently being r...
Definition
SerialMIDI_Parser.hpp:86
SerialMIDI_Parser::sysexbuffer
SysExBuffer sysexbuffer
Definition
SerialMIDI_Parser.hpp:48
SerialMIDI_Parser::handleNonRealTimeStatus
MIDIReadEvent handleNonRealTimeStatus(uint8_t midiByte)
Definition
SerialMIDI_Parser.cpp:10
SerialMIDI_Parser::handleRealTime
MIDIReadEvent handleRealTime(uint8_t midiByte)
Definition
SerialMIDI_Parser.cpp:5
SerialMIDI_Parser::runningHeader
uint8_t runningHeader
Running status header.
Definition
SerialMIDI_Parser.hpp:88
SerialMIDI_Parser::hasStoredByte
bool hasStoredByte() const
Check whether there's a stored byte.
Definition
SerialMIDI_Parser.hpp:64
SerialMIDI_Parser::popStoredByte
uint8_t popStoredByte()
Get the stored byte. Afterwards, hasStoredByte will return false.
Definition
SerialMIDI_Parser.hpp:66
SerialMIDI_Parser::pull
MIDIReadEvent pull(BytePuller &&puller)
Parse one incoming MIDI message.
Definition
SerialMIDI_Parser.hpp:94
SerialMIDI_Parser::feed
MIDIReadEvent feed(uint8_t midibyte)
Feed a new byte to the parser.
Definition
SerialMIDI_Parser.cpp:199
SerialMIDI_Parser::storeByte
void storeByte(uint8_t midiByte)
Store a byte to parse later.
Definition
SerialMIDI_Parser.hpp:61
SerialMIDI_Parser::storedByte
uint8_t storedByte
Definition
SerialMIDI_Parser.hpp:90
SerialMIDI_Parser::handleData
MIDIReadEvent handleData(uint8_t midiByte)
Definition
SerialMIDI_Parser.cpp:96
SerialMIDI_Parser::getSysExMessage
SysExMessage getSysExMessage() const
Get the latest SysEx message.
Definition
SerialMIDI_Parser.hpp:38
SerialMIDI_Parser::thirdByte
bool thirdByte
Flag that remembers that the next data byte will be the third byte of a message.
Definition
SerialMIDI_Parser.hpp:82
SerialMIDI_Parser::startSysEx
void startSysEx()
Definition
SerialMIDI_Parser.hpp:45
SerialMIDI_Parser::hasSysExSpace
bool hasSysExSpace() const
Definition
SerialMIDI_Parser.hpp:44
SerialMIDI_Parser::addSysExByte
void addSysExByte(uint8_t data)
Definition
SerialMIDI_Parser.hpp:43
SerialMIDI_Parser::cancelRunningStatus
void cancelRunningStatus()
Clear the running status header for MIDI Channel messages.
Definition
SerialMIDI_Parser.hpp:75
SerialMIDI_Parser::handleStatus
MIDIReadEvent handleStatus(uint8_t midiByte)
Definition
SerialMIDI_Parser.cpp:85
SysExBuffer
Helper for storing the System Exclusive messages being received by a MIDI parser.
Definition
SysExBuffer.hpp:13
SysExMessage
Definition
MIDI_MessageTypes.hpp:305
Generated by
1.17.0