aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt26
-rw-r--r--README.md2
-rw-r--r--utils/gen_adldata/CMakeLists.txt16
-rw-r--r--utils/gen_adldata/gen_adldata.cc41
4 files changed, 68 insertions, 17 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fe7db37..af6359e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -192,6 +192,7 @@ option(USE_JAVA_EMULATOR "Use JavaOPL emulator" ${DEFAULT_HEAVY_EMULATORS})
option(WITH_GENADLDATA "Build and run full rebuild of embedded banks cache" OFF)
option(WITH_GENADLDATA_COMMENTS "Enable comments in a generated embedded instruments cache file" OFF)
+set(GENADLDATA_CUSTOM_BANKLIST "" CACHE PATH "Use the custom INI file to build the database")
option(WITH_MIDIPLAY "Build also demo MIDI player" OFF)
option(MIDIPLAY_WAVE_ONLY "Build Demo MIDI player without support of real time playing. It will output into WAV only." OFF)
@@ -220,6 +221,17 @@ else()
set(ENABLE_FPIC OFF)
endif()
+if(WITH_EMBEDDED_BANKS)
+ if(NOT WITH_GENADLDATA OR "${GENADLDATA_CUSTOM_BANKLIST}" STREQUAL "")
+ set(ADLDATA_DATABASE "${libADLMIDI_SOURCE_DIR}/src/inst_db.cpp")
+ else()
+ make_directory("${CMAKE_BINARY_DIR}/instdb")
+ set(ADLDATA_DATABASE "${CMAKE_BINARY_DIR}/instdb/inst_db.cpp")
+ endif()
+else()
+ target_compile_definitions(${targetLib} PUBLIC DISABLE_EMBEDDED_BANKS)
+endif()
+
function(handle_options targetLib)
if(WITH_MIDI_SEQUENCER)
target_sources(${targetLib} PRIVATE ${libADLMIDI_SOURCE_DIR}/src/adlmidi_sequencer.cpp)
@@ -281,9 +293,13 @@ function(handle_options targetLib)
endif()
if(WITH_EMBEDDED_BANKS)
- target_sources(${targetLib} PRIVATE
- ${libADLMIDI_SOURCE_DIR}/src/inst_db.cpp
- )
+ target_sources(${targetLib} PRIVATE ${ADLDATA_DATABASE})
+ if(WITH_GENADLDATA)
+ set_property(SOURCE "${ADLDATA_DATABASE}" PROPERTY INCLUDE_DIRECTORIES "${libADLMIDI_SOURCE_DIR}/src")
+ if(NOT "${GENADLDATA_CUSTOM_BANKLIST}" STREQUAL "")
+ set_property(SOURCE "${ADLDATA_DATABASE}" PROPERTY GENERATED TRUE)
+ endif()
+ endif()
else()
target_compile_definitions(${targetLib} PUBLIC DISABLE_EMBEDDED_BANKS)
endif()
@@ -293,7 +309,9 @@ function(handle_options targetLib)
endif()
if(WITH_EMBEDDED_BANKS AND WITH_GENADLDATA AND NOT ADLMIDI_DOS)
- add_dependencies(${targetLib} gen-adldata-run)
+ if("${GENADLDATA_CUSTOM_BANKLIST}" STREQUAL "")
+ add_dependencies(${targetLib} gen-adldata-run)
+ endif()
endif()
if(WITH_HQ_RESAMPLER AND NOT ADLMIDI_DOS)
diff --git a/README.md b/README.md
index 50bedc0..b7f5627 100644
--- a/README.md
+++ b/README.md
@@ -97,6 +97,7 @@ The library is licensed under in it's parts LGPL 2.1+, GPL v2+, GPL v3+, and MIT
### Utils and extras
* **WITH_GENADLDATA** - (ON/OFF, default OFF) Build and execute the utility which will rebuild the embedded banks database (which is an adldata.cpp file).
* **WITH_GENADLDATA_COMMENTS** - (ON/OFF, default OFF) Enable comments in generated ADLDATA cache file
+* **GENADLDATA_CUSTOM_BANKLIST** - (Path) Set the absolute path to the custom INI file that declares a list of embedded banks. If not specified, the banks.ini at the repository root will be used.
* **WITH_MIDIPLAY** - (ON/OFF, default OFF) Build demo MIDI player (Requires SDL2 and also pthread on Windows with MinGW)
* **MIDIPLAY_WAVE_ONLY** - (ON/OFF, default OFF) Build Demo MIDI player without support of real time playing. It will output into WAV only.
@@ -183,6 +184,7 @@ To build that example you will need to have installed SDL2 library.
* Fixed ARM64 build on some platforms
* Improved support of the EA-MUS files (Thanks to [dashodanger](https://github.com/dashodanger))
* Fixed crash on attempt to change the volume of a blank note
+ * Added an ability to supply the custom list of embedded banks using `-DGENADLDATA_CUSTOM_BANKLIST=/path/to/ini/file.ini` argument
## 1.5.1 2022-10-31
* Added an ability to disable the automatical arpeggio
diff --git a/utils/gen_adldata/CMakeLists.txt b/utils/gen_adldata/CMakeLists.txt
index 1e6d6a5..e7ec122 100644
--- a/utils/gen_adldata/CMakeLists.txt
+++ b/utils/gen_adldata/CMakeLists.txt
@@ -92,13 +92,19 @@ if(WITH_GENADLDATA_COMMENTS)
target_compile_options(gen_adldata PUBLIC "-DADLDATA_WITH_COMMENTS")
endif()
-set(ADLDATA_DATABASE
- "${libADLMIDI_SOURCE_DIR}/src/inst_db.cpp"
-)
+if("${GENADLDATA_CUSTOM_BANKLIST}" STREQUAL "")
+ set(ADLDATA_INI_FILE "${libADLMIDI_SOURCE_DIR}/banks.ini")
+ set(ADLDATA_CACHE_FILE "${libADLMIDI_SOURCE_DIR}/fm_banks/adldata-cache.dat")
+else()
+ set(ADLDATA_INI_FILE "${GENADLDATA_CUSTOM_BANKLIST}")
+ set(ADLDATA_CACHE_FILE "${CMAKE_BINARY_DIR}/instdb/adldata-cache.dat")
+endif()
+
add_custom_target(gen-adldata-run #OUTPUT ${ADLDATA_DATABASE}
- COMMAND gen_adldata "${ADLDATA_DATABASE}"
+ COMMAND gen_adldata "${ADLDATA_INI_FILE}" "${ADLDATA_DATABASE}" "${ADLDATA_CACHE_FILE}"
WORKING_DIRECTORY ${libADLMIDI_SOURCE_DIR}
- DEPENDS gen_adldata "${libADLMIDI_SOURCE_DIR}/banks.ini"
+ DEPENDS gen_adldata
COMMENT "Running Embedded FM banks database generation"
VERBATIM
+ BYPRODUCTS "${ADLDATA_DATABASE}"
)
diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc
index 2dabd66..c6d217b 100644
--- a/utils/gen_adldata/gen_adldata.cc
+++ b/utils/gen_adldata/gen_adldata.cc
@@ -17,27 +17,45 @@
int main(int argc, char**argv)
{
- if(argc == 1)
+ if(argc < 4)
{
std::printf("Usage:\n"
"\n"
- "bin/gen_adldata src/adldata.cpp\n"
+ "bin/gen_adldata banks.ini src/inst_db.cpp adldata-cache.dat\n"
"\n");
return 1;
}
- const char *outFile_s = argv[1];
+ const char *iniFile_s = argv[1];
+ const char *outFile_s = argv[2];
+ const char *cacheFile_s = argv[3];
BanksDump db;
{
IniProcessing ini;
- if(!ini.open("banks.ini"))
+ if(!ini.open(iniFile_s))
{
- std::fprintf(stderr, "Can't open banks.ini!\n");
+ std::fprintf(stderr, "Can't open %s!\n", iniFile_s);
return 1;
}
+ std::string banksRoot(iniFile_s);
+ bool banksRootFoundSlash = true;
+
+ for(auto it = banksRoot.end() - 1; it != banksRoot.begin(); --it)
+ {
+ if(*it == '/' || *it == '\\')
+ {
+ banksRoot.erase(it, banksRoot.end());
+ banksRootFoundSlash = true;
+ break;
+ }
+ }
+
+ if(!banksRootFoundSlash)
+ banksRoot = "."; // Relative path to current directory
+
uint32_t banks_count;
ini.beginGroup("General");
ini.read("banks", banks_count, 0);
@@ -45,7 +63,7 @@ int main(int argc, char**argv)
if(!banks_count)
{
- std::fprintf(stderr, "Zero count of banks found in banks.ini!\n");
+ std::fprintf(stderr, "Zero count of banks found in %s!\n", iniFile_s);
return 1;
}
@@ -56,6 +74,7 @@ int main(int argc, char**argv)
std::fprintf(stderr, "Failed to find bank %u!\n", bank);
return 1;
}
+
std::string bank_name;
std::string filepath;
std::string filepath_d;
@@ -71,6 +90,10 @@ int main(int argc, char**argv)
ini.read("format", format, "Unknown");
ini.read("file", filepath, "");
ini.read("file-p", filepath_d, "");
+ if(!filepath.empty())
+ filepath = banksRoot + "/" + filepath;
+ if(!filepath_d.empty())
+ filepath_d = banksRoot + "/" + filepath_d;
ini.read("prefix", prefix, "");
ini.read("prefix-p", prefix_d, "");
ini.read("filter-m", filter_m, "");
@@ -167,6 +190,7 @@ int main(int argc, char**argv)
std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str());
return 1;
}
+
if(!filepath_d.empty())
{
if(!BankFormats::LoadBNK(db, filepath_d.c_str(), bank, bank_name, prefix_d.c_str(), false, true))
@@ -184,6 +208,7 @@ int main(int argc, char**argv)
std::fprintf(stderr, "Failed to load bank %u, file %s!\n", bank, filepath.c_str());
return 1;
}
+
if(!filepath_d.empty())
{
//printf("Loading %s... \n", filepath_d.c_str());
@@ -215,7 +240,7 @@ int main(int argc, char**argv)
bool dontOverride = false;
{
- measureCounter.LoadCache("fm_banks/adldata-cache.dat");
+ measureCounter.LoadCache(cacheFile_s);
measureCounter.m_cache_matches = 0;
measureCounter.m_done = 0;
measureCounter.m_total = db.instruments.size();
@@ -232,7 +257,7 @@ int main(int argc, char**argv)
{
std::printf("-- Cache data was changed, saving...\n");
std::fflush(stdout);
- measureCounter.SaveCache("fm_banks/adldata-cache.dat");
+ measureCounter.SaveCache(cacheFile_s);
dontOverride = false;
}
else