diff options
-rw-r--r-- | CMakeLists.txt | 26 | ||||
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | utils/gen_adldata/CMakeLists.txt | 16 | ||||
-rw-r--r-- | utils/gen_adldata/gen_adldata.cc | 41 |
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) @@ -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 |