aboutsummaryrefslogtreecommitdiff
path: root/src/gen_adldata/progs_cache.cpp
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2017-07-30 05:06:18 +0300
committerWohlstand <admin@wohlnet.ru>2017-07-30 05:06:18 +0300
commitb15f8552d629021c3cadef3e7afcae2fa98dad1b (patch)
treeaa72effc4fb6690c73428fa26d1f8615383a6311 /src/gen_adldata/progs_cache.cpp
parentfd80dc0af0617a17f4604a9a12592398476eb5ed (diff)
downloadlibADLMIDI-b15f8552d629021c3cadef3e7afcae2fa98dad1b.tar.gz
libADLMIDI-b15f8552d629021c3cadef3e7afcae2fa98dad1b.tar.bz2
libADLMIDI-b15f8552d629021c3cadef3e7afcae2fa98dad1b.zip
Improve gen_adldata program
- Now it caches all generated data, so, we won't have to re-calculate same - File is writing by gen_adldata nor by stdout forward - Instead of hardcoded list of banks, I made the INI file which declares list of banks to generate - Add simple validators to tell which bank is absense and can't be loaded - Split code of gen_adldata.cc into multiple files of different role
Diffstat (limited to 'src/gen_adldata/progs_cache.cpp')
-rw-r--r--src/gen_adldata/progs_cache.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/gen_adldata/progs_cache.cpp b/src/gen_adldata/progs_cache.cpp
new file mode 100644
index 0000000..4aec9be
--- /dev/null
+++ b/src/gen_adldata/progs_cache.cpp
@@ -0,0 +1,106 @@
+#include "progs_cache.h"
+
+InstrumentDataTab insdatatab;
+
+InstrumentsData instab;
+InstProgsData progs;
+
+std::vector<std::string> banknames;
+
+//unsigned maxvalues[30] = { 0 };
+
+void SetBank(unsigned bank, unsigned patch, size_t insno)
+{
+ progs[bank][patch] = insno + 1;
+}
+
+size_t InsertIns(
+ const insdata &id,
+ const insdata &id2,
+ ins &in,
+ const std::string &name,
+ const std::string &name2)
+{
+ if(true)
+ {
+ InstrumentDataTab::iterator i = insdatatab.lower_bound(id);
+
+ size_t insno = size_t(~0);
+ if(i == insdatatab.end() || i->first != id)
+ {
+ std::pair<insdata, std::pair<size_t, std::set<std::string> > > res;
+ res.first = id;
+ res.second.first = insdatatab.size();
+ if(!name.empty()) res.second.second.insert(name);
+ if(!name2.empty()) res.second.second.insert(name2);
+ insdatatab.insert(i, res);
+ insno = res.second.first;
+ }
+ else
+ {
+ if(!name.empty()) i->second.second.insert(name);
+ if(!name2.empty()) i->second.second.insert(name2);
+ insno = i->second.first;
+ }
+
+ in.insno1 = insno;
+ }
+ if(id != id2)
+ {
+ InstrumentDataTab::iterator i = insdatatab.lower_bound(id2);
+
+ size_t insno2 = size_t(~0);
+ if(i == insdatatab.end() || i->first != id2)
+ {
+ std::pair<insdata, std::pair<size_t, std::set<std::string> > > res;
+ res.first = id2;
+ res.second.first = insdatatab.size();
+ if(!name.empty()) res.second.second.insert(name);
+ if(!name2.empty()) res.second.second.insert(name2);
+ insdatatab.insert(i, res);
+ insno2 = res.second.first;
+ }
+ else
+ {
+ if(!name.empty()) i->second.second.insert(name);
+ if(!name2.empty()) i->second.second.insert(name2);
+ insno2 = i->second.first;
+ }
+ in.insno2 = insno2;
+ }
+ else
+ in.insno2 = in.insno1;
+
+
+ {
+ InstrumentsData::iterator i = instab.lower_bound(in);
+
+ size_t resno = size_t(~0);
+ if(i == instab.end() || i->first != in)
+ {
+ std::pair<ins, std::pair<size_t, std::set<std::string> > > res;
+ res.first = in;
+ res.second.first = instab.size();
+ if(!name.empty()) res.second.second.insert(name);
+ if(!name2.empty()) res.second.second.insert(name2);
+ instab.insert(i, res);
+ resno = res.second.first;
+ }
+ else
+ {
+ if(!name.empty()) i->second.second.insert(name);
+ if(!name2.empty()) i->second.second.insert(name2);
+ resno = i->second.first;
+ }
+ return resno;
+ }
+}
+
+// Create silent 'nosound' instrument
+size_t InsertNoSoundIns()
+{
+ // { 0x0F70700,0x0F70710, 0xFF,0xFF, 0x0,+0 },
+ insdata tmp1 = { {0x00, 0x10, 0x07, 0x07, 0xF7, 0xF7, 0x00, 0x00, 0xFF, 0xFF, 0x00}, 0, 0 };
+ struct ins tmp2 = { 0, 0, 0, false, 0.0 };
+ return InsertIns(tmp1, tmp1, tmp2, "nosound");
+}