aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/adlmidi_midiplay.cpp29
-rw-r--r--src/adlmidi_private.hpp26
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;