From e8367d5048b6df7d16ec62a35161d846c41d8358 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sat, 7 Jul 2018 18:41:15 +0200 Subject: exception for SMF track 0 when format != 2 --- src/midi_sequencer.hpp | 2 ++ src/midi_sequencer_impl.hpp | 26 +++++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/midi_sequencer.hpp b/src/midi_sequencer.hpp index 71e06b5..8b3c4a1 100644 --- a/src/midi_sequencer.hpp +++ b/src/midi_sequencer.hpp @@ -291,6 +291,8 @@ public: private: //! Music file format type. MIDI is default. FileFormat m_format; + //! SMF format identifier. + unsigned m_smfFormat; //! Current position Position m_currentPosition; diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp index d8edbfb..a0830f0 100644 --- a/src/midi_sequencer_impl.hpp +++ b/src/midi_sequencer_impl.hpp @@ -262,6 +262,7 @@ void BW_MidiSequencer::MidiTrackRow::sortEvents(bool *noteStates) BW_MidiSequencer::BW_MidiSequencer() : m_interface(NULL), m_format(Format_MIDI), + m_smfFormat(0), m_loopEnabled(false), m_fullSongTimeLength(0.0), m_postSongWaitDelay(1.0), @@ -1145,10 +1146,19 @@ BW_MidiSequencer::MidiEvent BW_MidiSequencer::parseEvent(const uint8_t **pptr, c void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEvent &evt, int32_t &status) { - if(m_trackSolo != ~(size_t)0 && track != m_trackSolo) - return; - if(m_trackDisable[track]) - return; + if(track == 0 && m_smfFormat < 2 && evt.type == MidiEvent::T_SPECIAL && + (evt.subtype == MidiEvent::ST_TEMPOCHANGE || evt.subtype == MidiEvent::ST_TIMESIGNATURE)) + { + /* never reject track 0 timing events on SMF format != 2 + note: multi-track XMI convert to format 2 SMF */ + } + else + { + if(m_trackSolo != ~(size_t)0 && track != m_trackSolo) + return; + if(m_trackDisable[track]) + return; + } if(m_interface->onEvent) { @@ -1513,6 +1523,7 @@ bool BW_MidiSequencer::loadMIDI(FileAndMemReader &fr) const size_t headerSize = 4 + 4 + 2 + 2 + 2; // 14 char headerBuf[headerSize] = ""; size_t DeltaTicks = 192, TrackCount = 1; + unsigned Fmt = 0; riffskip: fsize = fr.read(headerBuf, 1, headerSize); @@ -1741,9 +1752,12 @@ riffskip: return false; } - /*size_t Fmt = ReadBEint(HeaderBuf + 8, 2);*/ + Fmt = (unsigned)readBEint(headerBuf + 8, 2); TrackCount = (size_t)readBEint(headerBuf + 10, 2); DeltaTicks = (size_t)readBEint(headerBuf + 12, 2); + + if(Fmt > 2) + Fmt = 1; } } @@ -1861,5 +1875,7 @@ riffskip: return false; } + m_smfFormat = Fmt; + return true; } -- cgit v1.2.3