Line data Source code
1 : #include "DebugMIDI_Interface.hpp"
2 : #include <AH/PrintStream/PrintStream.hpp>
3 :
4 : #include "PicoUSBInit.hpp"
5 :
6 : BEGIN_CS_NAMESPACE
7 :
8 : namespace DebugMIDIMessageNames {
9 :
10 : #ifdef PROGMEM
11 :
12 : const static char NoteOff[] PROGMEM = "Note Off ";
13 : const static char NoteOn[] PROGMEM = "Note On ";
14 : const static char KeyPressure[] PROGMEM = "Key Pressure ";
15 : const static char ControlChange[] PROGMEM = "Control Change ";
16 : const static char ProgramChange[] PROGMEM = "Program Change ";
17 : const static char ChannelPressure[] PROGMEM = "Channel Pressure ";
18 : const static char PitchBend[] PROGMEM = "Pitch Bend ";
19 :
20 : const static FlashString_t MIDIStatusTypeNames[] = {
21 : reinterpret_cast<FlashString_t>(NoteOff),
22 : reinterpret_cast<FlashString_t>(NoteOn),
23 : reinterpret_cast<FlashString_t>(KeyPressure),
24 : reinterpret_cast<FlashString_t>(ControlChange),
25 : reinterpret_cast<FlashString_t>(ProgramChange),
26 : reinterpret_cast<FlashString_t>(ChannelPressure),
27 : reinterpret_cast<FlashString_t>(PitchBend),
28 : };
29 :
30 : #else
31 :
32 : const static char *MIDIStatusTypeNames[] = {
33 : "Note Off ", "Note On ", "Key Pressure ",
34 : "Control Change ", "Program Change ", "Channel Pressure ",
35 : "Pitch Bend ",
36 : };
37 :
38 : #endif
39 :
40 : } // namespace DebugMIDIMessageNames
41 :
42 6 : MIDIReadEvent StreamDebugMIDI_Interface::read() {
43 6 : if (!ensure_usb_init(getStream()))
44 0 : return MIDIReadEvent::NO_MESSAGE;
45 6 : return parser.pull(hexstream);
46 : }
47 :
48 0 : void StreamDebugMIDI_Interface::update() {
49 0 : MIDI_Interface::updateIncoming(this);
50 0 : }
51 :
52 10 : void PrintDebugMIDI_Base::sendChannelMessageImpl(Print &stream,
53 : ChannelMessage msg) {
54 10 : if (!ensure_usb_init(stream))
55 0 : return;
56 10 : uint8_t messageType = (msg.header >> 4) - 8;
57 10 : if (messageType >= 7)
58 0 : return;
59 :
60 : DEBUG_LOCK_MUTEX
61 10 : if (prefix != nullptr)
62 0 : stream << prefix << ' ';
63 10 : if (msg.hasTwoDataBytes())
64 6 : stream << DebugMIDIMessageNames::MIDIStatusTypeNames[messageType]
65 12 : << F("Channel: ") << msg.getChannel().getOneBased()
66 6 : << F("\tData 1: 0x") << hex << msg.getData1()
67 12 : << F("\tData 2: 0x") << msg.getData2() << dec;
68 : else
69 4 : stream << DebugMIDIMessageNames::MIDIStatusTypeNames[messageType]
70 8 : << F("Channel: ") << msg.getChannel().getOneBased()
71 8 : << F("\tData 1: 0x") << hex << msg.getData1() << dec;
72 10 : if (msg.getMessageType() == msg.PitchBend)
73 1 : stream << " (" << msg.getData14bit() << ')';
74 10 : if (msg.getCable() != Cable_1)
75 10 : stream << F("\tCable: ") << msg.getCable().getOneBased();
76 10 : stream << "\r\n";
77 : }
78 :
79 1 : void PrintDebugMIDI_Base::sendSysExImpl(Print &stream, SysExMessage msg) {
80 1 : if (!ensure_usb_init(stream))
81 0 : return;
82 : DEBUG_LOCK_MUTEX
83 1 : if (prefix != nullptr)
84 0 : stream << prefix << ' ';
85 1 : stream << F("System Exclusive [") << msg.length
86 1 : << (msg.isLastChunk() ? "]\t" : "+]\t")
87 1 : << AH::HexDump(msg.data, msg.length);
88 1 : if (msg.getCable() != Cable_1)
89 1 : stream << F("\tCable: ") << msg.getCable().getOneBased();
90 1 : stream << "\r\n";
91 : }
92 :
93 4 : void PrintDebugMIDI_Base::sendSysCommonImpl(Print &stream,
94 : SysCommonMessage msg) {
95 4 : if (!ensure_usb_init(stream))
96 0 : return;
97 : DEBUG_LOCK_MUTEX
98 4 : if (prefix != nullptr)
99 0 : stream << prefix << ' ';
100 4 : stream << F("System Common ") << msg.getMessageType() << hex;
101 4 : if (msg.getNumberOfDataBytes() >= 1)
102 3 : stream << F("\tData 1: 0x") << msg.getData1();
103 4 : if (msg.getNumberOfDataBytes() >= 2)
104 1 : stream << F("\tData 2: 0x") << msg.getData2() << dec << " ("
105 1 : << msg.getData14bit() << ')';
106 : else
107 3 : stream << dec;
108 4 : if (msg.getCable() != Cable_1)
109 4 : stream << F("\tCable: ") << msg.getCable().getOneBased();
110 4 : stream << "\r\n";
111 : }
112 :
113 2 : void PrintDebugMIDI_Base::sendRealTimeImpl(Print &stream, RealTimeMessage msg) {
114 2 : if (!ensure_usb_init(stream))
115 0 : return;
116 : DEBUG_LOCK_MUTEX
117 2 : if (prefix != nullptr)
118 1 : stream << prefix << ' ';
119 2 : stream << F("Real-Time ") << msg.getMessageType();
120 2 : if (msg.getCable() != Cable_1)
121 2 : stream << F("\tCable: ") << msg.getCable().getOneBased();
122 2 : stream << "\r\n";
123 : }
124 :
125 0 : void StreamDebugMIDI_Output::sendChannelMessageImpl(ChannelMessage m) {
126 0 : PrintDebugMIDI_Base::sendChannelMessageImpl(getStream(), m);
127 0 : }
128 0 : void StreamDebugMIDI_Output::sendSysCommonImpl(SysCommonMessage m) {
129 0 : PrintDebugMIDI_Base::sendSysCommonImpl(getStream(), m);
130 0 : }
131 0 : void StreamDebugMIDI_Output::sendSysExImpl(SysExMessage m) {
132 0 : PrintDebugMIDI_Base::sendSysExImpl(getStream(), m);
133 0 : }
134 0 : void StreamDebugMIDI_Output::sendRealTimeImpl(RealTimeMessage m) {
135 0 : PrintDebugMIDI_Base::sendRealTimeImpl(getStream(), m);
136 0 : }
137 0 : void StreamDebugMIDI_Output::sendNowImpl() {
138 0 : PrintDebugMIDI_Base::sendNowImpl(getStream());
139 0 : }
140 :
141 10 : void StreamDebugMIDI_Interface::sendChannelMessageImpl(ChannelMessage m) {
142 10 : PrintDebugMIDI_Base::sendChannelMessageImpl(getStream(), m);
143 10 : }
144 4 : void StreamDebugMIDI_Interface::sendSysCommonImpl(SysCommonMessage m) {
145 4 : PrintDebugMIDI_Base::sendSysCommonImpl(getStream(), m);
146 4 : }
147 1 : void StreamDebugMIDI_Interface::sendSysExImpl(SysExMessage m) {
148 1 : PrintDebugMIDI_Base::sendSysExImpl(getStream(), m);
149 1 : }
150 2 : void StreamDebugMIDI_Interface::sendRealTimeImpl(RealTimeMessage m) {
151 2 : PrintDebugMIDI_Base::sendRealTimeImpl(getStream(), m);
152 2 : }
153 0 : void StreamDebugMIDI_Interface::sendNowImpl() {
154 0 : PrintDebugMIDI_Base::sendNowImpl(getStream());
155 0 : }
156 :
157 : END_CS_NAMESPACE
|