aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2017-10-25 20:43:06 +0300
committerWohlstand <admin@wohlnet.ru>2017-10-25 20:43:06 +0300
commitbf1503ad7150820100e1b7dc83a5bcfbe42c4a1a (patch)
treec9e3011326a8be79190c3215f4cbfbac0149c009
parent3ae7b8fa172671fb7ee6fd3bca88910cc767494b (diff)
downloadlibADLMIDI-bf1503ad7150820100e1b7dc83a5bcfbe42c4a1a.tar.gz
libADLMIDI-bf1503ad7150820100e1b7dc83a5bcfbe42c4a1a.tar.bz2
libADLMIDI-bf1503ad7150820100e1b7dc83a5bcfbe42c4a1a.zip
Small re-factoring of new MIDI event classes for correctness
- MidiTrackPos renamed into MidiTrackRow - TempoMarker renamed into TempoChangePoint
-rw-r--r--src/adlmidi_midiplay.cpp22
-rw-r--r--src/adlmidi_private.hpp11
2 files changed, 17 insertions, 16 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp
index 84ff275..512936f 100644
--- a/src/adlmidi_midiplay.cpp
+++ b/src/adlmidi_midiplay.cpp
@@ -137,14 +137,14 @@ MIDIplay::MidiEvent::MidiEvent() :
{}
-MIDIplay::MidiTrackPos::MidiTrackPos() :
+MIDIplay::MidiTrackRow::MidiTrackRow() :
time(0.0),
delay(0),
absPos(0),
timeDelay(0.0)
{}
-void MIDIplay::MidiTrackPos::reset()
+void MIDIplay::MidiTrackRow::reset()
{
time = 0.0;
delay = 0;
@@ -153,7 +153,7 @@ void MIDIplay::MidiTrackPos::reset()
events.clear();
}
-void MIDIplay::MidiTrackPos::sortEvents()
+void MIDIplay::MidiTrackRow::sortEvents()
{
std::vector<MidiEvent> metas;
std::vector<MidiEvent> noteOffs;
@@ -217,7 +217,7 @@ bool MIDIplay::buildTrackData()
uint8_t *trackPtr = TrackData[tk].data();
//Time delay that follows the first event in the track
{
- MidiTrackPos evtPos;
+ MidiTrackRow evtPos;
evtPos.delay = ReadVarLenEx(&trackPtr, end, ok);
if(!ok)
{
@@ -230,7 +230,7 @@ bool MIDIplay::buildTrackData()
trackDataNew[tk].push_back(evtPos);
}
- MidiTrackPos evtPos;
+ MidiTrackRow evtPos;
do
{
event = parseEvent(&trackPtr, end, status);
@@ -289,13 +289,13 @@ bool MIDIplay::buildTrackData()
std::fflush(stdout);
#endif
- MidiTrackPos *posPrev = &(*(track.begin()));//First element
+ MidiTrackRow *posPrev = &(*(track.begin()));//First element
for(MidiTrackQueue::iterator it = track.begin(); it != track.end(); it++)
{
#ifdef DEBUG_TIME_CALCULATION
bool tempoChanged = false;
#endif
- MidiTrackPos &pos = *it;
+ MidiTrackRow &pos = *it;
if( (posPrev != &pos) && //Skip first event
(!tempos.empty()) && //Only when in-track tempo events are available
(tempo_change_index < tempos.size())
@@ -305,15 +305,15 @@ bool MIDIplay::buildTrackData()
if(tempos[tempo_change_index].absPosition <= pos.absPos)
{
//Stop points: begin point and tempo change points are before end point
- std::vector<TempoMarker> points;
+ std::vector<TempoChangePoint> points;
fraction<uint64_t> t;
- TempoMarker firstPoint = {posPrev->absPos, currentTempo};
+ TempoChangePoint firstPoint = {posPrev->absPos, currentTempo};
points.push_back(firstPoint);
//Collect tempo change points between previous and current events
do
{
- TempoMarker tempoMarker;
+ TempoChangePoint tempoMarker;
MidiEvent &tempoPoint = tempos[tempo_change_index];
tempoMarker.absPos = tempoPoint.absPosition;
tempoMarker.tempo = InvDeltaTicks * fraction<uint64_t>(ReadBEint(tempoPoint.data.data(), tempoPoint.data.size()));
@@ -345,7 +345,7 @@ bool MIDIplay::buildTrackData()
#endif
}
//Then calculate time between last tempo change point and end point
- TempoMarker tailTempo = points.back();
+ TempoChangePoint tailTempo = points.back();
uint64_t postDelay = pos.absPos - tailTempo.absPos;
t = postDelay * currentTempo;
posPrev->timeDelay += t.value();
diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp
index 83ac72e..0468ff3 100644
--- a/src/adlmidi_private.hpp
+++ b/src/adlmidi_private.hpp
@@ -372,10 +372,10 @@ private:
* Created with purpose to sort events by type in the same position
* (for example, to keep controllers always first than note on events or lower than note-off events)
*/
- class MidiTrackPos
+ class MidiTrackRow
{
public:
- MidiTrackPos();
+ MidiTrackRow();
void reset();
//! Absolute time position in seconds
double time;
@@ -393,15 +393,16 @@ private:
};
/**
- * @brief Tempo maker entry. Used in the MIDI data building function only.
+ * @brief Tempo change point entry. Used in the MIDI data building function only.
*/
- struct TempoMarker
+ struct TempoChangePoint
{
uint64_t absPos;
fraction<uint64_t> tempo;
};
+ //P.S. I declared it here instead of local in-function because C++99 can't process templates with locally-declared structures
- typedef std::list<MidiTrackPos> MidiTrackQueue;
+ typedef std::list<MidiTrackRow> MidiTrackQueue;
// Information about each track
struct PositionNew