#ifndef EVORAL_MIDI_UTIL_H
#define EVORAL_MIDI_UTIL_H
+#include <iostream>
+
#include <stdint.h>
-#include <stdbool.h>
#include <string>
#include <sys/types.h>
#include <assert.h>
+
+#include "evoral/visibility.h"
#include "evoral/midi_events.h"
namespace Evoral {
return 1;
case MIDI_CMD_COMMON_SYSEX:
+ std::cerr << "event size called for sysex\n";
return -1;
}
+ std::cerr << "event size called for unknown status byte " << std::hex << (int) status << "\n";
return -1;
}
// see http://www.midi.org/techspecs/midimessages.php
if (status == MIDI_CMD_COMMON_SYSEX) {
int end;
+
for (end = 1; buffer[end] != MIDI_CMD_COMMON_SYSEX_END; end++) {
- assert((buffer[end] & 0x80) == 0);
+ if ((buffer[end] & 0x80) != 0) {
+ return -1;
+ }
}
assert(buffer[end] == MIDI_CMD_COMMON_SYSEX_END);
return end + 1;
if (size < 0 || (size_t)size != len) {
return false;
}
+ if (status < 0xf0) {
+ /* Channel messages: all start with status byte followed by
+ * non status bytes.
+ */
+ for (size_t i = 1; i < len; ++i) {
+ if ((buffer[i] & 0x80) != 0) {
+ return false; // Non-status byte has MSb set
+ }
+ }
+ }
return true;
}
-std::string midi_note_name (uint8_t noteval);
+LIBEVORAL_API std::string midi_note_name (uint8_t noteval);
} // namespace Evoral