diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-10-24 16:28:13 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-10-24 16:28:13 +0300 |
commit | 84ed75416810f62bfe115a3af1d943ea22255136 (patch) | |
tree | 550dc7ef2e1f6b9e1c36b0e8c32abad89c27c2f5 | |
parent | 74b6b02f801c1f23a0c91c5920548b239b736bc0 (diff) | |
download | libADLMIDI-84ed75416810f62bfe115a3af1d943ea22255136.tar.gz libADLMIDI-84ed75416810f62bfe115a3af1d943ea22255136.tar.bz2 libADLMIDI-84ed75416810f62bfe115a3af1d943ea22255136.zip |
More info about meta-events
-rw-r--r-- | src/adlmidi_midiplay.cpp | 29 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 26 |
2 files changed, 47 insertions, 8 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 93697a5..a110c42 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -174,7 +174,7 @@ void MIDIplay::MidiTrackPos::sortEvents() controllers.push_back(events[i]); } else - if((events[i].type == MidiEvent::T_SPECIAL) && (events[i].subtype == MidiEvent::ST_META)) + if((events[i].type == MidiEvent::T_SPECIAL) && (events[i].subtype == MidiEvent::ST_MARKER)) metas.push_back(events[i]); else anyOther.push_back(events[i]); @@ -266,7 +266,9 @@ void MIDIplay::buildTrackData() MidiTrackPos *posPrev = &track[0];//First element for(std::vector<MidiTrackPos>::iterator it = track.begin(); it != track.end(); it++) { + #ifdef DEBUG_TIME_CALCULATION bool tempoChanged = false; + #endif MidiTrackPos &pos = *it; if( (posPrev != &pos) && //Skip first event (!tempos.empty()) && //Only when in-track tempo events are available @@ -317,7 +319,9 @@ void MIDIplay::buildTrackData() //Apply next tempo currentTempo = points[j].tempo; + #ifdef DEBUG_TIME_CALCULATION tempoChanged = true; + #endif } //Then calculate time between last tempo change point and end point TempoMarker tailTempo = points.back(); @@ -1319,6 +1323,29 @@ MIDIplay::MidiEvent MIDIplay::parseEvent(uint8_t**pptr, int &status) evt.subtype = evtype; evt.data.insert(evt.data.begin(), data.begin(), data.end()); + /* TODO: Store those meta-strings separately and give ability to read them + * by external functions (to display song title and copyright in the player) */ + if(evt.subtype == MidiEvent::ST_COPYRIGHT) + { + std::string str((const char*)evt.data.data(), evt.data.size()); + std::fprintf(stdout, "Copyright: %s\n", str.c_str()); + std::fflush(stdout); + } + else + if(evt.subtype == MidiEvent::ST_SQTRKTITLE) + { + std::string str((const char*)evt.data.data(), evt.data.size()); + std::fprintf(stdout, "Sequence/Track title: %s\n", str.c_str()); + std::fflush(stdout); + } + else + if(evt.subtype == MidiEvent::ST_INSTRTITLE) + { + std::string str((const char*)evt.data.data(), evt.data.size()); + std::fprintf(stdout, "Instrument: %s\n", str.c_str()); + std::fflush(stdout); + } + if(evtype == MidiEvent::ST_ENDTRACK) status = -1; diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp index 489c1d1..4d81a91 100644 --- a/src/adlmidi_private.hpp +++ b/src/adlmidi_private.hpp @@ -324,15 +324,27 @@ private: }; enum SubTypes { - ST_UNKNOWN = 0x00, - ST_ENDTRACK = 0x2F, - ST_TEMPOCHANGE = 0x51, - ST_META = 0x06, + ST_SEQNUMBER = 0x00,//size == 2 + ST_TEXT = 0x01,//size == len + ST_COPYRIGHT = 0x02,//size == len + ST_SQTRKTITLE = 0x03,//size == len + ST_INSTRTITLE = 0x04,//size == len + ST_LYRICS = 0x05,//size == len + ST_MARKER = 0x06,//size == len + ST_CUEPOINT = 0x07,//size == len + ST_MIDICHPREFIX = 0x20,//size == 1 + + ST_ENDTRACK = 0x2F,//size == 0 + ST_TEMPOCHANGE = 0x51,//size == 3 + ST_SMPTEOFFSET = 0x54,//size == 5 + ST_TIMESIGNATURE= 0x55,//size == 4 + ST_KEYSIGNATURE = 0x59,//size == 2 + ST_SEQUENCERSPEC= 0x7F,//size == len /* Non-standard, internal ADLMIDI usage only */ - ST_LOOPSTART = 0xE1, - ST_LOOPEND = 0xE2, - ST_RAWOPL = 0xE3, + ST_LOOPSTART = 0xE1,//size == 0 + ST_LOOPEND = 0xE2,//size == 0 + ST_RAWOPL = 0xE3,//size == 0 }; //! Main type of event uint8_t type; |