summaryrefslogtreecommitdiff
path: root/tools/src/mid2agb/agb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/src/mid2agb/agb.cpp')
-rw-r--r--[-rwxr-xr-x]tools/src/mid2agb/agb.cpp504
1 files changed, 233 insertions, 271 deletions
diff --git a/tools/src/mid2agb/agb.cpp b/tools/src/mid2agb/agb.cpp
index 9e0feb8c..361f67f0 100755..100644
--- a/tools/src/mid2agb/agb.cpp
+++ b/tools/src/mid2agb/agb.cpp
@@ -42,8 +42,7 @@ static int s_memaccOp;
static int s_memaccParam1;
static int s_memaccParam2;
-void PrintAgbHeader()
-{
+void PrintAgbHeader() {
std::fprintf(g_outputFile, "\t.include \"sound/MPlayDef.s\"\n\n");
std::fprintf(g_outputFile, "\t.equ\t%s_grp, voicegroup%03u\n", g_asmLabel.c_str(), g_voiceGroup);
std::fprintf(g_outputFile, "\t.equ\t%s_pri, %u\n", g_asmLabel.c_str(), g_priority);
@@ -65,8 +64,7 @@ void PrintAgbHeader()
std::fprintf(g_outputFile, "\t.align\t2\n");
}
-void ResetTrackVars()
-{
+void ResetTrackVars() {
s_lastVelocity = -1;
s_lastNote = -1;
s_velocityChanged = false;
@@ -76,10 +74,8 @@ void ResetTrackVars()
s_inPattern = false;
}
-void PrintWait(int wait)
-{
- if (wait > 0)
- {
+void PrintWait(int wait) {
+ if (wait > 0) {
std::fprintf(g_outputFile, "\t.byte\tW%02d\n", wait);
s_velocityChanged = true;
s_noteChanged = true;
@@ -87,27 +83,20 @@ void PrintWait(int wait)
}
}
-void PrintOp(int wait, std::string name, const char *format, ...)
-{
+void PrintOp(int wait, std::string name, const char* format, ...) {
std::va_list args;
va_start(args, format);
std::fprintf(g_outputFile, "\t.byte\t\t");
- if (format != nullptr)
- {
- if (!g_compressionEnabled || s_lastOpName != name)
- {
+ if (format != nullptr) {
+ if (!g_compressionEnabled || s_lastOpName != name) {
std::fprintf(g_outputFile, "%s, ", name.c_str());
s_lastOpName = name;
- }
- else
- {
+ } else {
std::fprintf(g_outputFile, " ");
}
std::vfprintf(g_outputFile, format, args);
- }
- else
- {
+ } else {
std::fputs(name.c_str(), g_outputFile);
s_lastOpName = name;
}
@@ -119,8 +108,7 @@ void PrintOp(int wait, std::string name, const char *format, ...)
PrintWait(wait);
}
-void PrintByte(const char *format, ...)
-{
+void PrintByte(const char* format, ...) {
std::va_list args;
va_start(args, format);
std::fprintf(g_outputFile, "\t.byte\t");
@@ -132,8 +120,7 @@ void PrintByte(const char *format, ...)
va_end(args);
}
-void PrintWord(const char *format, ...)
-{
+void PrintWord(const char* format, ...) {
std::va_list args;
va_start(args, format);
std::fprintf(g_outputFile, "\t .word\t");
@@ -142,8 +129,7 @@ void PrintWord(const char *format, ...)
va_end(args);
}
-void PrintNote(const Event& event)
-{
+void PrintNote(const Event& event) {
int note = event.note;
int velocity = g_noteVelocityLUT[event.param1];
int duration = -1;
@@ -173,8 +159,7 @@ void PrintNote(const Event& event)
bool noteChanged = true;
bool velocityChanged = true;
- if (g_compressionEnabled)
- {
+ if (g_compressionEnabled) {
noteChanged = (note != s_lastNote);
velocityChanged = (velocity != s_lastVelocity);
}
@@ -184,8 +169,7 @@ void PrintNote(const Event& event)
else
s_lastOpName = "";
- if (noteChanged || velocityChanged || (gateTimeParam > 0))
- {
+ if (noteChanged || velocityChanged || (gateTimeParam > 0)) {
s_lastNote = note;
char noteBuf[16];
@@ -197,20 +181,15 @@ void PrintNote(const Event& event)
char velocityBuf[16];
- if (velocityChanged || (gateTimeParam > 0))
- {
+ if (velocityChanged || (gateTimeParam > 0)) {
s_lastVelocity = velocity;
std::snprintf(velocityBuf, sizeof(velocityBuf), ", v%03u", velocity);
- }
- else
- {
+ } else {
velocityBuf[0] = 0;
}
PrintOp(event.time, opName, "%s%s%s", noteBuf, velocityBuf, gtpBuf);
- }
- else
- {
+ } else {
PrintOp(event.time, opName, 0);
}
@@ -218,20 +197,16 @@ void PrintNote(const Event& event)
s_velocityChanged = velocityChanged;
}
-void PrintEndOfTieOp(const Event& event)
-{
+void PrintEndOfTieOp(const Event& event) {
int note = event.note;
bool noteChanged = (note != s_lastNote);
if (!noteChanged || !s_noteChanged)
s_lastOpName = "";
- if (!noteChanged && g_compressionEnabled)
- {
+ if (!noteChanged && g_compressionEnabled) {
PrintOp(event.time, "EOT ", nullptr);
- }
- else
- {
+ } else {
s_lastNote = note;
if (note >= 24)
PrintOp(event.time, "EOT ", g_noteTable[note % 12], note / 12 - 2);
@@ -242,181 +217,174 @@ void PrintEndOfTieOp(const Event& event)
s_noteChanged = noteChanged;
}
-void PrintSeqLoopLabel(const Event& event)
-{
+void PrintSeqLoopLabel(const Event& event) {
s_blockNum = event.param1 + 1;
std::fprintf(g_outputFile, "%s_%u_B%u::\n", g_asmLabel.c_str(), g_agbTrack, s_blockNum);
PrintWait(event.time);
ResetTrackVars();
}
-void PrintMemAcc(const Event& event)
-{
- switch (s_memaccOp)
- {
- case 0x00:
- PrintByte("MEMACC, mem_set, 0x%02X, %u", s_memaccParam1, event.param2);
- break;
- case 0x01:
- PrintByte("MEMACC, mem_add, 0x%02X, %u", s_memaccParam1, event.param2);
- break;
- case 0x02:
- PrintByte("MEMACC, mem_sub, 0x%02X, %u", s_memaccParam1, event.param2);
- break;
- case 0x03:
- PrintByte("MEMACC, mem_mem_set, 0x%02X, 0x%02X", s_memaccParam1, event.param2);
- break;
- case 0x04:
- PrintByte("MEMACC, mem_mem_add, 0x%02X, 0x%02X", s_memaccParam1, event.param2);
- break;
- case 0x05:
- PrintByte("MEMACC, mem_mem_sub, 0x%02X, 0x%02X", s_memaccParam1, event.param2);
- break;
- // TODO: everything else
- case 0x06:
- break;
- case 0x07:
- break;
- case 0x08:
- break;
- case 0x09:
- break;
- case 0x0A:
- break;
- case 0x0B:
- break;
- case 0x0C:
- break;
- case 0x0D:
- break;
- case 0x0E:
- break;
- case 0x0F:
- break;
- case 0x10:
- break;
- case 0x11:
- break;
- case 0x46:
- break;
- case 0x47:
- break;
- case 0x48:
- break;
- case 0x49:
- break;
- case 0x4A:
- break;
- case 0x4B:
- break;
- case 0x4C:
- break;
- case 0x4D:
- break;
- case 0x4E:
- break;
- case 0x4F:
- break;
- case 0x50:
- break;
- case 0x51:
- break;
- default:
- break;
+void PrintMemAcc(const Event& event) {
+ switch (s_memaccOp) {
+ case 0x00:
+ PrintByte("MEMACC, mem_set, 0x%02X, %u", s_memaccParam1, event.param2);
+ break;
+ case 0x01:
+ PrintByte("MEMACC, mem_add, 0x%02X, %u", s_memaccParam1, event.param2);
+ break;
+ case 0x02:
+ PrintByte("MEMACC, mem_sub, 0x%02X, %u", s_memaccParam1, event.param2);
+ break;
+ case 0x03:
+ PrintByte("MEMACC, mem_mem_set, 0x%02X, 0x%02X", s_memaccParam1, event.param2);
+ break;
+ case 0x04:
+ PrintByte("MEMACC, mem_mem_add, 0x%02X, 0x%02X", s_memaccParam1, event.param2);
+ break;
+ case 0x05:
+ PrintByte("MEMACC, mem_mem_sub, 0x%02X, 0x%02X", s_memaccParam1, event.param2);
+ break;
+ // TODO: everything else
+ case 0x06:
+ break;
+ case 0x07:
+ break;
+ case 0x08:
+ break;
+ case 0x09:
+ break;
+ case 0x0A:
+ break;
+ case 0x0B:
+ break;
+ case 0x0C:
+ break;
+ case 0x0D:
+ break;
+ case 0x0E:
+ break;
+ case 0x0F:
+ break;
+ case 0x10:
+ break;
+ case 0x11:
+ break;
+ case 0x46:
+ break;
+ case 0x47:
+ break;
+ case 0x48:
+ break;
+ case 0x49:
+ break;
+ case 0x4A:
+ break;
+ case 0x4B:
+ break;
+ case 0x4C:
+ break;
+ case 0x4D:
+ break;
+ case 0x4E:
+ break;
+ case 0x4F:
+ break;
+ case 0x50:
+ break;
+ case 0x51:
+ break;
+ default:
+ break;
}
PrintWait(event.time);
}
-void PrintExtendedOp(const Event& event)
-{
+void PrintExtendedOp(const Event& event) {
// TODO: support for other extended commands
- switch (s_extendedCommand)
- {
- case 0x08:
- PrintOp(event.time, "XCMD ", "xIECV , %u", event.param2);
- break;
- case 0x09:
- PrintOp(event.time, "XCMD ", "xIECL , %u", event.param2);
- break;
- default:
- PrintWait(event.time);
- break;
+ switch (s_extendedCommand) {
+ case 0x08:
+ PrintOp(event.time, "XCMD ", "xIECV , %u", event.param2);
+ break;
+ case 0x09:
+ PrintOp(event.time, "XCMD ", "xIECL , %u", event.param2);
+ break;
+ default:
+ PrintWait(event.time);
+ break;
}
}
-void PrintControllerOp(const Event& event)
-{
- switch (event.param1)
- {
- case 0x01:
- PrintOp(event.time, "MOD ", "%u", event.param2);
- break;
- case 0x07:
- PrintOp(event.time, "VOL ", "%u*%s_mvl/mxv", event.param2, g_asmLabel.c_str());
- break;
- case 0x0A:
- PrintOp(event.time, "PAN ", "c_v%+d", event.param2 - 64);
- break;
- case 0x0C:
- case 0x10:
- PrintMemAcc(event);
- break;
- case 0x0D:
- s_memaccOp = event.param2;
- PrintWait(event.time);
- break;
- case 0x0E:
- s_memaccParam1 = event.param2;
- PrintWait(event.time);
- break;
- case 0x0F:
- s_memaccParam2 = event.param2;
- PrintWait(event.time);
- break;
- case 0x11:
- std::fprintf(g_outputFile, "%s_%u_L%u::\n", g_asmLabel.c_str(), g_agbTrack, event.param2);
- PrintWait(event.time);
- ResetTrackVars();
- break;
- case 0x14:
- PrintOp(event.time, "BENDR ", "%u", event.param2);
- break;
- case 0x15:
- PrintOp(event.time, "LFOS ", "%u", event.param2);
- break;
- case 0x16:
- PrintOp(event.time, "MODT ", "%u", event.param2);
- break;
- case 0x18:
- PrintOp(event.time, "TUNE ", "c_v%+d", event.param2 - 64);
- break;
- case 0x1A:
- PrintOp(event.time, "LFODL ", "%u", event.param2);
- break;
- case 0x1D:
- case 0x1F:
- PrintExtendedOp(event);
- break;
- case 0x1E:
- s_extendedCommand = event.param2;
- // TODO: loop op
- break;
- case 0x21:
- case 0x27:
- PrintByte("PRIO , %u", event.param2);
- PrintWait(event.time);
- break;
- default:
- PrintWait(event.time);
- break;
+void PrintControllerOp(const Event& event) {
+ switch (event.param1) {
+ case 0x01:
+ PrintOp(event.time, "MOD ", "%u", event.param2);
+ break;
+ case 0x07:
+ PrintOp(event.time, "VOL ", "%u*%s_mvl/mxv", event.param2, g_asmLabel.c_str());
+ break;
+ case 0x0A:
+ PrintOp(event.time, "PAN ", "c_v%+d", event.param2 - 64);
+ break;
+ case 0x0C:
+ case 0x10:
+ PrintMemAcc(event);
+ break;
+ case 0x0D:
+ s_memaccOp = event.param2;
+ PrintWait(event.time);
+ break;
+ case 0x0E:
+ s_memaccParam1 = event.param2;
+ PrintWait(event.time);
+ break;
+ case 0x0F:
+ s_memaccParam2 = event.param2;
+ PrintWait(event.time);
+ break;
+ case 0x11:
+ std::fprintf(g_outputFile, "%s_%u_L%u::\n", g_asmLabel.c_str(), g_agbTrack, event.param2);
+ PrintWait(event.time);
+ ResetTrackVars();
+ break;
+ case 0x14:
+ PrintOp(event.time, "BENDR ", "%u", event.param2);
+ break;
+ case 0x15:
+ PrintOp(event.time, "LFOS ", "%u", event.param2);
+ break;
+ case 0x16:
+ PrintOp(event.time, "MODT ", "%u", event.param2);
+ break;
+ case 0x18:
+ PrintOp(event.time, "TUNE ", "c_v%+d", event.param2 - 64);
+ break;
+ case 0x1A:
+ PrintOp(event.time, "LFODL ", "%u", event.param2);
+ break;
+ case 0x1D:
+ case 0x1F:
+ PrintExtendedOp(event);
+ break;
+ case 0x1E:
+ s_extendedCommand = event.param2;
+ // TODO: loop op
+ break;
+ case 0x21:
+ case 0x27:
+ PrintByte("PRIO , %u", event.param2);
+ PrintWait(event.time);
+ break;
+ default:
+ PrintWait(event.time);
+ break;
}
}
-void PrintAgbTrack(std::vector<Event>& events)
-{
- std::fprintf(g_outputFile, "\n@**************** Track %u (Midi-Chn.%u) ****************@\n\n", g_agbTrack, g_midiChan + 1);
+void PrintAgbTrack(std::vector<Event>& events) {
+ std::fprintf(g_outputFile, "\n@**************** Track %u (Midi-Chn.%u) ****************@\n\n", g_agbTrack,
+ g_midiChan + 1);
std::fprintf(g_outputFile, "%s_%u::\n", g_asmLabel.c_str(), g_agbTrack);
int wholeNoteCount = 0;
@@ -426,13 +394,11 @@ void PrintAgbTrack(std::vector<Event>& events)
bool foundVolBeforeNote = false;
- for (const Event& event : events)
- {
+ for (const Event& event : events) {
if (event.type == EventType::Note)
break;
- if (event.type == EventType::Controller && event.param1 == 0x07)
- {
+ if (event.type == EventType::Controller && event.param1 == 0x07) {
foundVolBeforeNote = true;
break;
}
@@ -444,12 +410,10 @@ void PrintAgbTrack(std::vector<Event>& events)
PrintWait(g_initialWait);
PrintByte("KEYSH , %s_key%+d", g_asmLabel.c_str(), 0);
- for (unsigned i = 0; events[i].type != EventType::EndOfTrack; i++)
- {
+ for (unsigned i = 0; events[i].type != EventType::EndOfTrack; i++) {
const Event& event = events[i];
- if (IsPatternBoundary(event.type))
- {
+ if (IsPatternBoundary(event.type)) {
if (s_inPattern)
PrintByte("PEND");
s_inPattern = false;
@@ -458,75 +422,73 @@ void PrintAgbTrack(std::vector<Event>& events)
if (event.type == EventType::WholeNoteMark || event.type == EventType::Pattern)
std::fprintf(g_outputFile, "@ %03d ----------------------------------------\n", wholeNoteCount++);
- switch (event.type)
- {
- case EventType::Note:
- PrintNote(event);
- break;
- case EventType::EndOfTie:
- PrintEndOfTieOp(event);
- break;
- case EventType::Label:
- PrintSeqLoopLabel(event);
- break;
- case EventType::LoopEnd:
- PrintByte("GOTO");
- PrintWord("%s_%u_B%u", g_asmLabel.c_str(), g_agbTrack, loopEndBlockNum);
- //PrintSeqLoopLabel(event); // Breaks same note in EOT bgmCrenelStorm 0xDD4356
- PrintWait(event.time); // instead just print the wait
- break;
- case EventType::LoopEndBegin:
- PrintByte("GOTO");
- PrintWord("%s_%u_B%u", g_asmLabel.c_str(), g_agbTrack, loopEndBlockNum);
- PrintSeqLoopLabel(event);
- loopEndBlockNum = s_blockNum;
- break;
- case EventType::LoopBegin:
- PrintSeqLoopLabel(event);
- loopEndBlockNum = s_blockNum;
- break;
- case EventType::WholeNoteMark:
- if (event.param2 & 0x80000000)
- {
- std::fprintf(g_outputFile, "%s_%u_%03lu::\n", g_asmLabel.c_str(), g_agbTrack, (unsigned long)(event.param2 & 0x7FFFFFFF));
- ResetTrackVars();
- s_inPattern = true;
- }
- PrintWait(event.time);
- break;
- case EventType::Pattern:
- PrintByte("PATT");
- PrintWord("%s_%u_%03lu", g_asmLabel.c_str(), g_agbTrack, event.param2);
+ switch (event.type) {
+ case EventType::Note:
+ PrintNote(event);
+ break;
+ case EventType::EndOfTie:
+ PrintEndOfTieOp(event);
+ break;
+ case EventType::Label:
+ PrintSeqLoopLabel(event);
+ break;
+ case EventType::LoopEnd:
+ PrintByte("GOTO");
+ PrintWord("%s_%u_B%u", g_asmLabel.c_str(), g_agbTrack, loopEndBlockNum);
+ // PrintSeqLoopLabel(event); // Breaks same note in EOT bgmCrenelStorm 0xDD4356
+ PrintWait(event.time); // instead just print the wait
+ break;
+ case EventType::LoopEndBegin:
+ PrintByte("GOTO");
+ PrintWord("%s_%u_B%u", g_asmLabel.c_str(), g_agbTrack, loopEndBlockNum);
+ PrintSeqLoopLabel(event);
+ loopEndBlockNum = s_blockNum;
+ break;
+ case EventType::LoopBegin:
+ PrintSeqLoopLabel(event);
+ loopEndBlockNum = s_blockNum;
+ break;
+ case EventType::WholeNoteMark:
+ if (event.param2 & 0x80000000) {
+ std::fprintf(g_outputFile, "%s_%u_%03lu::\n", g_asmLabel.c_str(), g_agbTrack,
+ (unsigned long)(event.param2 & 0x7FFFFFFF));
+ ResetTrackVars();
+ s_inPattern = true;
+ }
+ PrintWait(event.time);
+ break;
+ case EventType::Pattern:
+ PrintByte("PATT");
+ PrintWord("%s_%u_%03lu", g_asmLabel.c_str(), g_agbTrack, event.param2);
+
+ while (!IsPatternBoundary(events[i + 1].type))
+ i++;
- while (!IsPatternBoundary(events[i + 1].type))
- i++;
-
- ResetTrackVars();
- break;
- case EventType::Tempo:
- PrintByte("TEMPO , %u*%s_tbs/2", 60000000 / event.param2, g_asmLabel.c_str());
- PrintWait(event.time);
- break;
- case EventType::InstrumentChange:
- PrintOp(event.time, "VOICE ", "%u", event.param1);
- break;
- case EventType::PitchBend:
- PrintOp(event.time, "BEND ", "c_v%+d", event.param2 - 64);
- break;
- case EventType::Controller:
- PrintControllerOp(event);
- break;
- default:
- PrintWait(event.time);
- break;
+ ResetTrackVars();
+ break;
+ case EventType::Tempo:
+ PrintByte("TEMPO , %u*%s_tbs/2", 60000000 / event.param2, g_asmLabel.c_str());
+ PrintWait(event.time);
+ break;
+ case EventType::InstrumentChange:
+ PrintOp(event.time, "VOICE ", "%u", event.param1);
+ break;
+ case EventType::PitchBend:
+ PrintOp(event.time, "BEND ", "c_v%+d", event.param2 - 64);
+ break;
+ case EventType::Controller:
+ PrintControllerOp(event);
+ break;
+ default:
+ PrintWait(event.time);
+ break;
}
}
PrintByte("FINE");
}
-void PrintAgbFooter()
-{
+void PrintAgbFooter() {
int trackCount = g_agbTrack - 1;
std::fprintf(g_outputFile, "\n@******************************************************@\n");