add Evoral::SMF::is_meta() to test for SMF meta events

These are not legal in "live" MIDI but are allowed in SMF files.
This commit is contained in:
Paul Davis 2025-08-18 16:21:57 -06:00
parent e703cf2d73
commit 785047bf47
2 changed files with 31 additions and 0 deletions

View file

@ -413,6 +413,35 @@ SMF::read_event(uint32_t* delta_t, uint32_t* bufsize, uint8_t** buf, event_id_t*
void void
SMF::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf, event_id_t note_id) SMF::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf, event_id_t note_id)
bool
SMF::is_meta (uint8_t const* buf, uint32_t size)
{
if (buf[0] == 0xff) {
switch (buf[1]) {
case 0x00: /* seq num */
case 0x01: /* text */
case 0x02: /* copyright */
case 0x03: /* track name */
case 0x04: /* instrument name */
case 0x05: /* lyric */
case 0x06: /* marker */
case 0x07: /* cue point */
case 0x20: /* channel prefix */
case 0x2f: /* end of track */
case 0x51: /* set tempo */
case 0x54: /* smpte offset */
case 0x58: /* time signature */
case 0x59: /* key signaturey */
case 0x7f: /* seq-specific */
return true;
default:
break;
}
}
return false;
}
{ {
Glib::Threads::Mutex::Lock lm (_smf_lock); Glib::Threads::Mutex::Lock lm (_smf_lock);

View file

@ -88,6 +88,8 @@ public:
uint16_t ppqn() const; uint16_t ppqn() const;
bool is_empty() const { return _empty; } bool is_empty() const { return _empty; }
static bool is_meta (uint8_t const * buf, uint32_t size);
void begin_write(); void begin_write();
void append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf, event_id_t note_id); void append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf, event_id_t note_id);
void end_write(std::string const &); void end_write(std::string const &);