summaryrefslogtreecommitdiff
path: root/tools/mid2agb/midi.cpp
diff options
context:
space:
mode:
authorgarak <garakmon@gmail.com>2018-09-24 08:40:33 -0400
committergarak <garakmon@gmail.com>2018-09-24 08:40:33 -0400
commit72f9afcbf4a81909019f21acad0484b72ed217f6 (patch)
treebc7e9a48b8056e28403e251dab7ac64f649ad9e4 /tools/mid2agb/midi.cpp
parent3964dbd4822f1b22bbc696add7e56ff0c5b2caea (diff)
parent7ceabffc842dfdf127fd594055f895a0803f54f6 (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'tools/mid2agb/midi.cpp')
-rw-r--r--tools/mid2agb/midi.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/tools/mid2agb/midi.cpp b/tools/mid2agb/midi.cpp
index ba5dd654a..c7a4389b9 100644
--- a/tools/mid2agb/midi.cpp
+++ b/tools/mid2agb/midi.cpp
@@ -52,6 +52,7 @@ static std::int32_t s_absoluteTime;
static int s_blockCount = 0;
static int s_minNote;
static int s_maxNote;
+static int s_runningStatus;
void Seek(long offset)
{
@@ -170,6 +171,7 @@ void StartTrack()
{
Seek(s_trackDataStart);
s_absoluteTime = 0;
+ s_runningStatus = 0;
}
void SkipEventData()
@@ -181,15 +183,24 @@ void DetermineEventCategory(MidiEventCategory& category, int& typeChan, int& siz
{
typeChan = ReadInt8();
+ if (typeChan < 0x80)
+ {
+ // If data byte was found, use the running status.
+ ungetc(typeChan, g_inputFile);
+ typeChan = s_runningStatus;
+ }
+
if (typeChan == 0xFF)
{
category = MidiEventCategory::Meta;
size = 0;
+ s_runningStatus = 0;
}
else if (typeChan >= 0xF0)
{
category = MidiEventCategory::SysEx;
size = 0;
+ s_runningStatus = 0;
}
else if (typeChan >= 0x80)
{
@@ -205,6 +216,7 @@ void DetermineEventCategory(MidiEventCategory& category, int& typeChan, int& siz
size = 2;
break;
}
+ s_runningStatus = typeChan;
}
else
{
@@ -421,7 +433,10 @@ bool CheckNoteEnd(Event& event)
void FindNoteEnd(Event& event)
{
+ // Save the current file position and running status
+ // which get modified by CheckNoteEnd.
long startPos = ftell(g_inputFile);
+ int savedRunningStatus = s_runningStatus;
event.param2 = 0;
@@ -429,6 +444,7 @@ void FindNoteEnd(Event& event)
;
Seek(startPos);
+ s_runningStatus = savedRunningStatus;
}
bool ReadTrackEvent(Event& event)
@@ -884,7 +900,7 @@ void Compress(std::vector<Event>& events)
return;
}
- if (CalculateCompressionScore(events, i) >= 6)
+ if (CalculateCompressionScore(events, i) > 6)
{
CompressWholeNote(events, i);
}