diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-07-30 05:06:18 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-07-30 05:06:18 +0300 |
commit | b15f8552d629021c3cadef3e7afcae2fa98dad1b (patch) | |
tree | aa72effc4fb6690c73428fa26d1f8615383a6311 /src/gen_adldata/progs_cache.cpp | |
parent | fd80dc0af0617a17f4604a9a12592398476eb5ed (diff) | |
download | libADLMIDI-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.cpp | 106 |
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"); +} |