aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/xmi2mid/xmi2mid.cpp79
1 files changed, 63 insertions, 16 deletions
diff --git a/utils/xmi2mid/xmi2mid.cpp b/utils/xmi2mid/xmi2mid.cpp
index 9442a5e..3059760 100644
--- a/utils/xmi2mid/xmi2mid.cpp
+++ b/utils/xmi2mid/xmi2mid.cpp
@@ -10,24 +10,38 @@
#define isatty(fd) _isatty(fd)
#endif
+#include <string>
+
+
int main(int argc, char *argv[])
{
int songNumber = 0;
+ bool allMode = false;
+ std::string outDir;
+ std::vector<std::vector<uint8_t > > song_buf;
- (void)Convert_xmi2midi_multi; /* Shut up the warning */
+ (void)Convert_xmi2midi; /* Shut up the warning */
- if(argc != 2 && argc != 3)
+ if(argc != 2 && argc != 3 && argc != 4)
{
- fprintf(stderr, "Usage: xmi2mid <midi-file> [song-number 0...N-1]\n");
+ fprintf(stderr, "Usage: xmi2mid <midi-file> [song-number 0...N-1] [--all <out-dir>]\n");
return 1;
}
- const char *filename = argv[1];
+ std::string filename = std::string(argv[1]);
if(argc > 2)
- songNumber = atoi(argv[2]);
+ {
+ if(!strcmp(argv[2], "--all") && argc > 3)
+ {
+ allMode = true;
+ outDir = std::string(argv[3]);
+ }
+ else
+ songNumber = atoi(argv[2]);
+ }
- FILE *fh = fopen(filename, "rb");
+ FILE *fh = fopen(filename.c_str(), "rb");
if(!fh)
{
fprintf(stderr, "Error opening file.\n");
@@ -55,26 +69,59 @@ int main(int argc, char *argv[])
return 1;
}
- uint8_t *xmidata = NULL;
- uint32_t xmisize = 0;
-
- if(Convert_xmi2midi(filedata, insize, &xmidata, &xmisize, XMIDI_CONVERT_NOCONVERSION, songNumber) < 0)
+ if(Convert_xmi2midi_multi(filedata, insize, song_buf, XMIDI_CONVERT_NOCONVERSION) < 0)
{
fprintf(stderr, "Error converting XMI to SMF.\n");
return 1;
}
- FILE *out = stdout;
- if(isatty(fileno(out)))
+ if(allMode)
{
- fprintf(stderr, "Not writing SMF data on the text terminal.\n");
+ char outFile[2048];
+ size_t len;
+ size_t ls = filename.find_last_of('/');
+
+ const char *fileName = ls != std::string::npos ? filename.c_str() + ls + 1 : NULL;
+ if(!fileName)
+ fileName = filename.c_str();
+
+ ls = filename.find_last_of('.');
+ const char *dot = ls != std::string::npos ? filename.c_str() + ls : NULL;
+
+ if(dot)
+ len = (dot - fileName);
+ else
+ len = strlen(fileName);
+
+ for(size_t i = 0; i < song_buf.size(); ++i)
+ {
+ size_t outSize = song_buf[i].size();
+ sprintf(outFile, "%s/%s-%u.mid", outDir.c_str(), std::string(fileName, len).c_str(), (unsigned)i);
+ fprintf(stderr, "Writing file %s ...\n", outFile);
+
+ FILE *out = fopen(outFile, "wb");
+ if (!out || fwrite(song_buf[i].data(), 1, outSize, out) != outSize || fflush(out) != 0)
+ {
+ fprintf(stderr, "Error writing SMF data (%u, %s).\n", (unsigned)i, outFile);
+ return 1;
+ }
+ fclose(out);
+ }
}
else
{
- if (fwrite(xmidata, 1, xmisize, out) != xmisize || fflush(out) != 0)
+ FILE *out = stdout;
+ if(isatty(fileno(out)))
+ {
+ fprintf(stderr, "Not writing SMF data on the text terminal.\n");
+ }
+ else
{
- fprintf(stderr, "Error writing SMF data.\n");
- return 1;
+ if (fwrite(song_buf[songNumber].data(), 1, song_buf[songNumber].size(), out) != song_buf[songNumber].size() || fflush(out) != 0)
+ {
+ fprintf(stderr, "Error writing SMF data.\n");
+ return 1;
+ }
}
}