32 using T = libremidi::message_type;
37 if(d1 >= 0x80 || d2 >= 0x80)
39 const auto t = T(status & 0xF0);
40 if(t == T::NOTE_ON && d2 == 0)
57describeMidi(uint8_t status, uint8_t d1, uint8_t d2, uint32_t size,
bool aligned)
59 using T = libremidi::message_type;
61 const QString sep = aligned ? QStringLiteral(
" ") : QStringLiteral(
" ");
62 const int vw = aligned ? 3 : 0;
65 const auto line = [&](
const char* kind,
const QString& args) -> QString {
68 out = QStringLiteral(
"ch%1").arg((status & 0x0F) + 1, aligned ? 2 : 0) + sep;
70 out = QStringLiteral(
" ") + sep;
71 QString k = QString::fromLatin1(kind);
73 k = k.leftJustified(10);
79 const auto note = [&]() -> QString {
80 return QStringLiteral(
"%1 (%2)").arg(
int(d1), vw).arg(
midiNoteName(d1));
86 return line(
"Note On", note() + QStringLiteral(
" vel %1").arg(
int(d2)));
88 return line(
"Note Off", note() + QStringLiteral(
" vel %1").arg(
int(d2)));
89 case T::POLY_PRESSURE:
90 return line(
"Poly Aft.", note() + QStringLiteral(
" -> %1").arg(
int(d2)));
91 case T::CONTROL_CHANGE:
92 return line(
"CC", QStringLiteral(
"%1 -> %2").arg(
int(d1), vw).arg(
int(d2)));
93 case T::PROGRAM_CHANGE:
94 return line(
"Program", QString::number(
int(d1)).rightJustified(vw));
96 return line(
"Aftertouch", QString::number(
int(d1)).rightJustified(vw));
98 return line(
"Pitch Bend", QString::number(
int(d1) + (
int(d2) << 7) - 8192));
99 case T::SYSTEM_EXCLUSIVE:
100 return line(
"SysEx", QStringLiteral(
"%1 bytes").arg(size));
102 return line(
"Time code", QString::number(
int(d1)));
103 case T::SONG_POS_POINTER:
104 return line(
"Song pos.", QString::number(
int(d1) + (
int(d2) << 7)));
106 return line(
"Song", QString::number(
int(d1)));
107 case T::TUNE_REQUEST:
108 return line(
"Tune req.", {});
110 return line(
"Clock", {});
112 return line(
"Start", {});
114 return line(
"Continue", {});
116 return line(
"Stop", {});
117 case T::ACTIVE_SENSING:
118 return line(
"Sensing", {});
119 case T::SYSTEM_RESET:
120 return line(
"Reset", {});
123 "Invalid", QStringLiteral(
"%1 %2 %3")
124 .arg(
int(status), 2, 16, QLatin1Char(
'0'))
125 .arg(
int(d1), 2, 16, QLatin1Char(
'0'))
126 .arg(
int(d2), 2, 16, QLatin1Char(
'0')));
129 "System", QStringLiteral(
"%1 %2 %3")
130 .arg(
int(status), 2, 16, QLatin1Char(
'0'))
137inline QString
midiBytesText(uint8_t status, uint8_t d1, uint8_t d2, uint32_t size)
140 return QStringLiteral(
"SysEx %1 bytes").arg(size);
141 return QStringLiteral(
"%1 %2 %3")
142 .arg(
int(status), 2, 16, QLatin1Char(
'0'))
143 .arg(
int(d1), 2, 16, QLatin1Char(
'0'))
144 .arg(
int(d2), 2, 16, QLatin1Char(
'0'))
QString midiBytesText(uint8_t status, uint8_t d1, uint8_t d2, uint32_t size)
The bytes of a message in hexadecimal, or its size for a SysEx.
Definition MidiText.hpp:137
QString describeMidi(uint8_t status, uint8_t d1, uint8_t d2, uint32_t size, bool aligned)
Definition MidiText.hpp:57
constexpr bool isChannelMessage(libremidi::message_type t) noexcept
Whether the message belongs to a channel, as opposed to the system ones.
Definition MidiText.hpp:46
QString midiNoteName(int pitch)
The name of a MIDI note, middle C (60) being C4; "?" out of 0 to 127.
Definition MidiText.hpp:15