aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJP Cimalando <jpcima@users.noreply.github.com>2018-07-09 00:34:14 +0200
committerJP Cimalando <jpcima@users.noreply.github.com>2018-07-09 00:34:14 +0200
commita2992e21fe70ec3f0ebf530fc501a6a3ddecdc27 (patch)
tree7f0d08d0c35a4fefd8c429f09bb8733d514a81b7
parent2a33defa5770a585f26c35ea731904859afd4ea6 (diff)
downloadlibADLMIDI-a2992e21fe70ec3f0ebf530fc501a6a3ddecdc27.tar.gz
libADLMIDI-a2992e21fe70ec3f0ebf530fc501a6a3ddecdc27.tar.bz2
libADLMIDI-a2992e21fe70ec3f0ebf530fc501a6a3ddecdc27.zip
provide XMI to MID conversion as tool
-rw-r--r--CMakeLists.txt7
-rw-r--r--utils/xmi2mid/xmi2mid.cpp74
2 files changed, 81 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5283a18..ab3e7e5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -87,6 +87,7 @@ option(MIDIPLAY_WAVE_ONLY "Build Demo MIDI player without support of real time
option(WITH_ADLMIDI2 "Build also classic ADLMIDI player [EXPERIMENTAL]" OFF)
option(WITH_VLC_PLUGIN "Build also a plugin for VLC Media Player" OFF)
option(WITH_OLD_UTILS "Build also old utilities" OFF)
+option(WITH_XMI2MID "Build a XMI to MIDI converter" OFF)
option(EXAMPLE_SDL2_AUDIO "Build also a simple SDL2 demo MIDI player" OFF)
@@ -437,6 +438,11 @@ if(WITH_ADLMIDI2)
list(APPEND libADLMIDI_INSTALLS adlmidi2)
endif()
+if(WITH_XMI2MID)
+ add_executable(xmi2mid
+ ${libADLMIDI_SOURCE_DIR}/utils/xmi2mid/xmi2mid.cpp)
+endif()
+
if(EXAMPLE_SDL2_AUDIO AND NOT MSDOS AND NOT DJGPP)
find_library(SDL2_LIBRARY SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIR})
@@ -557,4 +563,5 @@ message("MIDIPLAY_WAVE_ONLY = ${MIDIPLAY_WAVE_ONLY}")
message("WITH_ADLMIDI2 = ${WITH_ADLMIDI2}")
message("WITH_VLC_PLUGIN = ${WITH_VLC_PLUGIN}")
message("WITH_OLD_UTILS = ${WITH_OLD_UTILS}")
+message("WITH_XMI2MID = ${WITH_XMI2MID}")
message("EXAMPLE_SDL2_AUDIO = ${EXAMPLE_SDL2_AUDIO}")
diff --git a/utils/xmi2mid/xmi2mid.cpp b/utils/xmi2mid/xmi2mid.cpp
new file mode 100644
index 0000000..65d5858
--- /dev/null
+++ b/utils/xmi2mid/xmi2mid.cpp
@@ -0,0 +1,74 @@
+
+#include "cvt_xmi2mid.hpp"
+#include <stdio.h>
+#include <sys/stat.h>
+#if !defined(_WIN32)
+#include <unistd.h>
+#else
+#include <io.h>
+#define fileno(fd) _fileno(fd)
+#define isatty(fd) _isatty(fd)
+#endif
+
+int main(int argc, char *argv[])
+{
+ if(argc != 2)
+ {
+ fprintf(stderr, "Usage: xmi2mid <midi-file>\n");
+ return 1;
+ }
+
+ const char *filename = argv[1];
+
+ FILE *fh = fopen(filename, "rb");
+ if(!fh)
+ {
+ fprintf(stderr, "Error opening file.\n");
+ return 1;
+ }
+
+ struct stat st;
+ if(fstat(fileno(fh), &st) != 0)
+ {
+ fprintf(stderr, "Error reading file status.\n");
+ return 1;
+ }
+
+ size_t insize = (size_t)st.st_size;
+ if(insize > 8 * 1024 * 1024)
+ {
+ fprintf(stderr, "File too large.\n");
+ return 1;
+ }
+
+ uint8_t *filedata = new uint8_t[insize];
+ if(fread(filedata, 1, insize, fh) != insize)
+ {
+ fprintf(stderr, "Error reading file data.\n");
+ return 1;
+ }
+
+ uint8_t *xmidata = NULL;
+ uint32_t xmisize = 0;
+ if(Convert_xmi2midi(filedata, insize, &xmidata, &xmisize, XMIDI_CONVERT_NOCONVERSION) < 0)
+ {
+ fprintf(stderr, "Error converting XMI to SMF.\n");
+ return 1;
+ }
+
+ FILE *out = stdout;
+ if(isatty(fileno(out)))
+ {
+ fprintf(stderr, "Not writing SMF data on the text terminal.\n");
+ }
+ else
+ {
+ if (fwrite(xmidata, 1, xmisize, out) != xmisize || fflush(out) != 0)
+ {
+ fprintf(stderr, "Error writing SMF data.\n");
+ return 1;
+ }
+ }
+
+ return 0;
+}