diff options
author | Wohlstand <admin@wohlnet.ru> | 2022-10-25 04:58:21 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2022-10-25 04:58:21 +0300 |
commit | 75608c77c064bfc5ad7bb6d378b46b104ee2a976 (patch) | |
tree | b824246c7e4c57c2602b52928f4b770f84119a18 /utils/xmi2mid | |
parent | fd46308b2771da575387c5b7e87f3c917e65a695 (diff) | |
download | libADLMIDI-75608c77c064bfc5ad7bb6d378b46b104ee2a976.tar.gz libADLMIDI-75608c77c064bfc5ad7bb6d378b46b104ee2a976.tar.bz2 libADLMIDI-75608c77c064bfc5ad7bb6d378b46b104ee2a976.zip |
xmi2mid: added an ability to explort multiple files at once
Diffstat (limited to 'utils/xmi2mid')
-rw-r--r-- | utils/xmi2mid/xmi2mid.cpp | 79 |
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; + } } } |