X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fevoral%2Fevoral%2Fmidi_util.h;h=27049f5c8ae6efde239afaac588c7d0b75df068d;hb=0cd3bd4f194439a047f8ab6b7baaf38d118a1d85;hp=e290a4141d8a8cd8bf5218b2b364157f3a0ee2cf;hpb=473170200d3ce2a96b1425b6dfd57003124d8276;p=ardour.git diff --git a/libs/evoral/evoral/midi_util.h b/libs/evoral/evoral/midi_util.h index e290a4141d..27049f5c8a 100644 --- a/libs/evoral/evoral/midi_util.h +++ b/libs/evoral/evoral/midi_util.h @@ -1,16 +1,16 @@ /* This file is part of Evoral. * Copyright(C) 2008 Dave Robillard * Copyright(C) 2000-2008 Paul Davis - * + * * Evoral is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or(at your option) any later * version. - * + * * Evoral is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA @@ -21,6 +21,8 @@ #include #include +#include +#include #include #include "evoral/midi_events.h" @@ -62,7 +64,7 @@ midi_event_size(uint8_t status) case MIDI_CMD_COMMON_SENSING: case MIDI_CMD_COMMON_RESET: return 1; - + case MIDI_CMD_COMMON_SYSEX: return -1; } @@ -70,23 +72,25 @@ midi_event_size(uint8_t status) return -1; } -/** Return the size of the given event including the status byte - * (which must be the first byte in \a buffer), - * or -1 if unknown (eg sysex) +/** Return the size of the given event including the status byte, + * or -1 if event is illegal. */ static inline int -midi_event_size(uint8_t* buffer) +midi_event_size(const uint8_t* buffer) { uint8_t status = buffer[0]; - - // if we have a channel event + + // Mask off channel if applicable if (status >= 0x80 && status < 0xF0) { - status &= 0xF0; // mask off the channel + status &= 0xF0; } - + + // 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++) {} + for (end = 1; buffer[end] != MIDI_CMD_COMMON_SYSEX_END; end++) { + assert((buffer[end] & 0x80) == 0); + } assert(buffer[end] == MIDI_CMD_COMMON_SYSEX_END); return end + 1; } else { @@ -94,17 +98,24 @@ midi_event_size(uint8_t* buffer) } } -/** Return true iff the given buffer is a valid MIDI event */ +/** Return true iff the given buffer is a valid MIDI event. + * \a len must be exactly correct for the contents of \a buffer + */ static inline bool -midi_event_is_valid(uint8_t* buffer, size_t len) +midi_event_is_valid(const uint8_t* buffer, size_t len) { uint8_t status = buffer[0]; if (status < 0x80) { return false; } + const int size = midi_event_size(buffer); + if (size < 0 || (size_t)size != len) { + return false; + } return true; } +std::string midi_note_name (uint8_t noteval); } // namespace Evoral