aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/gen_adldata/file_formats/common.h18
-rw-r--r--utils/gen_adldata/gen_adldata.cc2
-rw-r--r--utils/gen_adldata/measurer.cpp137
-rw-r--r--utils/gen_adldata/measurer.h3
4 files changed, 160 insertions, 0 deletions
diff --git a/utils/gen_adldata/file_formats/common.h b/utils/gen_adldata/file_formats/common.h
index f441221..a03ca5d 100644
--- a/utils/gen_adldata/file_formats/common.h
+++ b/utils/gen_adldata/file_formats/common.h
@@ -18,6 +18,14 @@ inline int16_t toSint16BE(const uint8_t *arr)
return num;
}
+inline int16_t toSint16LE(const uint8_t *arr)
+{
+ int16_t num = *reinterpret_cast<const int8_t *>(&arr[1]);
+ num *= 1 << 8;
+ num |= static_cast<int16_t>(arr[0]) & 0x00FF;
+ return num;
+}
+
inline uint16_t toUint16LE(const uint8_t *arr)
{
uint16_t num = arr[0];
@@ -34,4 +42,14 @@ inline uint32_t toUint32LE(const uint8_t *arr)
return num;
}
+inline int32_t toSint32LE(const uint8_t *arr)
+{
+ int32_t num = *reinterpret_cast<const int8_t *>(&arr[3]);
+ num *= 1 << 24;
+ num |= (static_cast<int32_t>(arr[2]) << 16) & 0x00FF0000;
+ num |= (static_cast<int32_t>(arr[1]) << 8) & 0x0000FF00;
+ num |= static_cast<int32_t>(arr[0]) & 0x000000FF;
+ return num;
+}
+
#endif // COMMON_H
diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc
index 0aa756d..f0c1265 100644
--- a/utils/gen_adldata/gen_adldata.cc
+++ b/utils/gen_adldata/gen_adldata.cc
@@ -557,6 +557,7 @@ int main(int argc, char**argv)
std::fclose(outFile);
{
+ measureCounter.LoadCacheX("fm_banks/adldata-cache-x.dat");
measureCounter.m_durationInfo.clear();
measureCounter.m_cache_matches = 0;
measureCounter.m_done = 0;
@@ -569,6 +570,7 @@ int main(int argc, char**argv)
}
std::fflush(stdout);
measureCounter.waitAll();
+ measureCounter.SaveCacheX("fm_banks/adldata-cache-x.dat");
}
db.exportBanks(std::string(outFile_s) + "x");
diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp
index 8785254..1b49011 100644
--- a/utils/gen_adldata/measurer.cpp
+++ b/utils/gen_adldata/measurer.cpp
@@ -1,4 +1,5 @@
#include "measurer.h"
+#include "file_formats/common.h"
#include <cmath>
#ifndef M_PI
@@ -703,6 +704,8 @@ DurationInfo MeasureDurations(BanksDump &db, const BanksDump::InstrumentEntry &i
void MeasureThreaded::LoadCache(const char *fileName)
{
+ m_durationInfo.clear();
+
FILE *in = std::fopen(fileName, "rb");
if(!in)
{
@@ -930,6 +933,140 @@ void MeasureThreaded::SaveCache(const char *fileName)
std::fclose(out);
}
+void MeasureThreaded::LoadCacheX(const char *fileName)
+{
+ m_durationInfoX.clear();
+
+ FILE *in = std::fopen(fileName, "rb");
+ if(!in)
+ {
+ std::printf("Failed to load CacheX: file is not exists.\n"
+ "Complete data will be generated from scratch.\n");
+ std::fflush(stdout);
+ return;
+ }
+
+ char magic[32];
+ if(std::fread(magic, 1, 32, in) != 32)
+ {
+ std::fclose(in);
+ std::printf("Failed to load CacheX: can't read magic.\n"
+ "Complete data will be generated from scratch.\n");
+ std::fflush(stdout);
+ return;
+ }
+
+ if(std::memcmp(magic, "ADLMIDI-DURATION-CACHE-FILE-V2.0", 32) != 0)
+ {
+ std::fclose(in);
+ std::printf("Failed to load CacheX: magic missmatch.\n"
+ "Complete data will be generated from scratch.\n");
+ std::fflush(stdout);
+ return;
+ }
+
+ uint_fast32_t itemsCount;
+ uint8_t itemsCountA[4];
+ if(std::fread(itemsCountA, 1, 4, in) != 4)
+ {
+ std::fclose(in);
+ std::printf("Failed to load CacheX: can't read cache size value.\n"
+ "Complete data will be generated from scratch.\n");
+ std::fflush(stdout);
+ return;
+ }
+
+ itemsCount = static_cast<int_fast32_t>(toSint32LE(itemsCountA));
+
+ while(!std::feof(in) && itemsCount > 0)
+ {
+ OperatorsKey k;
+ DurationInfo v;
+
+ uint8_t data_k[4];
+
+ for(auto &kv : k)
+ {
+ uint8_t data[4];
+ auto ret = std::fread(data, 1, 4, in);
+ if(ret != 4)
+ {
+ std::fclose(in);
+ std::printf("Failed to load CacheX: unexpected end of file.\n"
+ "Complete data will be generated from scratch.\n");
+ std::fflush(stdout);
+ return;
+ }
+ kv = static_cast<int_fast32_t>(toSint32LE(data));
+ }
+
+ auto ret = std::fread(data_k, 1, 4, in);
+ if(ret != 4)
+ {
+ std::fclose(in);
+ std::printf("Failed to load CacheX: unexpected end of file.\n"
+ "Complete data will be generated from scratch.\n");
+ std::fflush(stdout);
+ return;
+ }
+
+ v.ms_sound_kon = static_cast<int_fast64_t>(toUint16LE(data_k + 0));
+ v.ms_sound_koff = static_cast<int_fast64_t>(toUint16LE(data_k + 2));
+
+ m_durationInfoX.insert({k, v});
+ itemsCount--;
+ }
+
+ std::printf("CacheX loaded!\n");
+ std::fflush(stdout);
+
+ std::fclose(in);
+}
+
+void MeasureThreaded::SaveCacheX(const char *fileName)
+{
+ FILE *out = std::fopen(fileName, "wb");
+ std::fprintf(out, "ADLMIDI-DURATION-CACHE-FILE-V2.0");
+
+ uint_fast32_t itemsCount = static_cast<uint_fast32_t>(m_durationInfoX.size());
+ uint8_t itemsCountA[4] =
+ {
+ static_cast<uint8_t>((itemsCount >> 0) & 0xFF),
+ static_cast<uint8_t>((itemsCount >> 8) & 0xFF),
+ static_cast<uint8_t>((itemsCount >> 16) & 0xFF),
+ static_cast<uint8_t>((itemsCount >> 24) & 0xFF)
+ };
+ std::fwrite(itemsCountA, 1, 4, out);
+
+ for(DurationInfoCacheX::iterator it = m_durationInfoX.begin(); it != m_durationInfoX.end(); it++)
+ {
+ const OperatorsKey &k = it->first;
+ const DurationInfo &v = it->second;
+
+ uint8_t data_k[4] =
+ {
+ static_cast<uint8_t>((v.ms_sound_kon >> 0) & 0xFF),
+ static_cast<uint8_t>((v.ms_sound_kon >> 8) & 0xFF),
+ static_cast<uint8_t>((v.ms_sound_koff >> 0) & 0xFF),
+ static_cast<uint8_t>((v.ms_sound_koff >> 8) & 0xFF)
+ };
+
+ for(auto &kv : k)
+ {
+ uint8_t data[4] =
+ {
+ static_cast<uint8_t>((kv >> 0) & 0xFF),
+ static_cast<uint8_t>((kv >> 8) & 0xFF),
+ static_cast<uint8_t>((kv >> 16) & 0xFF),
+ static_cast<uint8_t>((kv >> 24) & 0xFF)
+ };
+ std::fwrite(data, 1, 4, out);
+ }
+ std::fwrite(data_k, 1, 4, out);
+ }
+ std::fclose(out);
+}
+
#ifdef ADL_GENDATA_PRINT_PROGRESS
static const char* spinner = "-\\|/";
diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h
index ddc66bc..ed7810a 100644
--- a/utils/gen_adldata/measurer.h
+++ b/utils/gen_adldata/measurer.h
@@ -77,6 +77,9 @@ struct MeasureThreaded
void LoadCache(const char *fileName);
void SaveCache(const char *fileName);
+ void LoadCacheX(const char *fileName);
+ void SaveCacheX(const char *fileName);
+
struct destData
{
destData()