Add running status to mid2agb

This commit is contained in:
Diegoisawesome 2018-09-14 22:35:04 -05:00
parent b860d583e4
commit e8be47abb8
2 changed files with 26 additions and 1 deletions

View File

@ -73,6 +73,18 @@ static std::string StripExtension(std::string s)
return s; return s;
} }
static std::string StripPathAndExtension(std::string s)
{
std::size_t pos = s.find_last_of("/\\");
if (pos > 0 && pos != std::string::npos)
{
s = s.substr(pos + 1, pos);
}
return StripExtension(s);
}
static std::string GetExtension(std::string s) static std::string GetExtension(std::string s)
{ {
std::size_t pos = s.find_last_of('.'); std::size_t pos = s.find_last_of('.');
@ -206,7 +218,7 @@ int main(int argc, char** argv)
RaiseError("output filename extension is not \"s\""); RaiseError("output filename extension is not \"s\"");
if (g_asmLabel.empty()) if (g_asmLabel.empty())
g_asmLabel = StripExtension(outputFilename); g_asmLabel = StripPathAndExtension(outputFilename);
g_inputFile = std::fopen(inputFilename.c_str(), "rb"); g_inputFile = std::fopen(inputFilename.c_str(), "rb");

View File

@ -52,6 +52,7 @@ static std::int32_t s_absoluteTime;
static int s_blockCount = 0; static int s_blockCount = 0;
static int s_minNote; static int s_minNote;
static int s_maxNote; static int s_maxNote;
static int s_runningStatus = 0;
void Seek(long offset) void Seek(long offset)
{ {
@ -181,19 +182,31 @@ void DetermineEventCategory(MidiEventCategory& category, int& typeChan, int& siz
{ {
typeChan = ReadInt8(); typeChan = ReadInt8();
if (typeChan < 0x80 && s_runningStatus != 0)
{
typeChan = s_runningStatus;
Skip(-1);
}
if (typeChan == 0xFF) if (typeChan == 0xFF)
{ {
category = MidiEventCategory::Meta; category = MidiEventCategory::Meta;
size = 0; size = 0;
} }
else if (typeChan >= 0xF8)
{
category = MidiEventCategory::Invalid;
}
else if (typeChan >= 0xF0) else if (typeChan >= 0xF0)
{ {
category = MidiEventCategory::SysEx; category = MidiEventCategory::SysEx;
size = 0; size = 0;
s_runningStatus = 0;
} }
else if (typeChan >= 0x80) else if (typeChan >= 0x80)
{ {
category = MidiEventCategory::Control; category = MidiEventCategory::Control;
s_runningStatus = typeChan;
switch (typeChan >> 4) switch (typeChan >> 4)
{ {