aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorVitaly Novichkov <admin@wohlnet.ru>2018-05-19 22:33:37 +0300
committerVitaly Novichkov <admin@wohlnet.ru>2018-05-19 22:33:37 +0300
commitbb4797ee68c0f12018196d3ee8caddcdcad9fe38 (patch)
tree9cd938ebf9c39366eaf53401b439fa92a14f63bc /utils
parentbed6bcb220346c622a307bf405b9a1e87fd99db5 (diff)
downloadlibADLMIDI-bb4797ee68c0f12018196d3ee8caddcdcad9fe38.tar.gz
libADLMIDI-bb4797ee68c0f12018196d3ee8caddcdcad9fe38.tar.bz2
libADLMIDI-bb4797ee68c0f12018196d3ee8caddcdcad9fe38.zip
Works and fixes
- Fixed an incorrect calculation of 4-op channels and choosing 4-op channels for 2-op only banks - Resolved trouble with automatically chosen flags because of internal confusion
Diffstat (limited to 'utils')
-rw-r--r--utils/gen_adldata/file_formats/load_ail.h1
-rw-r--r--utils/gen_adldata/file_formats/load_bisqwit.h1
-rw-r--r--utils/gen_adldata/file_formats/load_bnk.h1
-rw-r--r--utils/gen_adldata/file_formats/load_bnk2.h1
-rw-r--r--utils/gen_adldata/file_formats/load_ea.h1
-rw-r--r--utils/gen_adldata/file_formats/load_ibk.h1
-rw-r--r--utils/gen_adldata/file_formats/load_jv.h1
-rw-r--r--utils/gen_adldata/file_formats/load_op2.h1
-rw-r--r--utils/gen_adldata/file_formats/load_tmb.h1
-rw-r--r--utils/gen_adldata/file_formats/load_wopl.h5
-rw-r--r--utils/gen_adldata/gen_adldata.cc4
-rw-r--r--utils/gen_adldata/measurer.cpp25
-rw-r--r--utils/gen_adldata/progs_cache.cpp2
-rw-r--r--utils/gen_adldata/progs_cache.h4
14 files changed, 38 insertions, 11 deletions
diff --git a/utils/gen_adldata/file_formats/load_ail.h b/utils/gen_adldata/file_formats/load_ail.h
index a10ff92..e63b1d7 100644
--- a/utils/gen_adldata/file_formats/load_ail.h
+++ b/utils/gen_adldata/file_formats/load_ail.h
@@ -89,6 +89,7 @@ static bool LoadMiles(const char *fn, unsigned bank, const char *prefix)
struct ins tmp2;
tmp2.notenum = gmno < 128 ? 0 : (unsigned char)notenum;
tmp2.pseudo4op = false;
+ tmp2.real4op = (inscount > 1);
tmp2.voice2_fine_tune = 0.0;
std::string name;
if(midi_index >= 0) name = std::string(1, '\377') + MidiInsName[midi_index];
diff --git a/utils/gen_adldata/file_formats/load_bisqwit.h b/utils/gen_adldata/file_formats/load_bisqwit.h
index 015b0eb..f5f73dc 100644
--- a/utils/gen_adldata/file_formats/load_bisqwit.h
+++ b/utils/gen_adldata/file_formats/load_bisqwit.h
@@ -44,6 +44,7 @@ static bool LoadBisqwit(const char *fn, unsigned bank, const char *prefix)
(gmno < 128 ? 'M' : 'P'), gmno & 127);
tmp[1].diff = (tmp[0] != tmp[1]);
+ tmp2.real4op = tmp[1].diff;
size_t resno = InsertIns(tmp[0], tmp[1], tmp2, name, name2, (tmp[0] == tmp[1]));
SetBank(bank, gmno, resno);
}
diff --git a/utils/gen_adldata/file_formats/load_bnk.h b/utils/gen_adldata/file_formats/load_bnk.h
index 38793a7..aa7701f 100644
--- a/utils/gen_adldata/file_formats/load_bnk.h
+++ b/utils/gen_adldata/file_formats/load_bnk.h
@@ -108,6 +108,7 @@ static bool LoadBNK(const char *fn, unsigned bank, const char *prefix, bool is_f
ins tmp2;
tmp2.notenum = is_fat ? voice_num : (percussive ? usage_flag : 0);
tmp2.pseudo4op = false;
+ tmp2.real4op = false;
tmp2.voice2_fine_tune = 0.0;
if(is_fat) tmp.data[10] ^= 1;
diff --git a/utils/gen_adldata/file_formats/load_bnk2.h b/utils/gen_adldata/file_formats/load_bnk2.h
index a44b689..4772da5 100644
--- a/utils/gen_adldata/file_formats/load_bnk2.h
+++ b/utils/gen_adldata/file_formats/load_bnk2.h
@@ -86,6 +86,7 @@ static bool LoadBNK2(const char *fn, unsigned bank, const char *prefix,
ins tmp2;
tmp2.notenum = (gmno & 128) ? 35 : 0;
tmp2.pseudo4op = false;
+ tmp2.real4op = false;
tmp2.voice2_fine_tune = 0.0;
if(xxP24NNN & 8)
diff --git a/utils/gen_adldata/file_formats/load_ea.h b/utils/gen_adldata/file_formats/load_ea.h
index 86c1b54..79367d9 100644
--- a/utils/gen_adldata/file_formats/load_ea.h
+++ b/utils/gen_adldata/file_formats/load_ea.h
@@ -85,6 +85,7 @@ static bool LoadEA(const char *fn, unsigned bank, const char *prefix)
ins tmp2{};
tmp2.notenum = 0;
tmp2.pseudo4op = false;
+ tmp2.real4op = false;
std::string name;
char name2[512];
diff --git a/utils/gen_adldata/file_formats/load_ibk.h b/utils/gen_adldata/file_formats/load_ibk.h
index bc03962..12fa520 100644
--- a/utils/gen_adldata/file_formats/load_ibk.h
+++ b/utils/gen_adldata/file_formats/load_ibk.h
@@ -61,6 +61,7 @@ static bool LoadIBK(const char *fn, unsigned bank, const char *prefix, bool perc
struct ins tmp2;
tmp2.notenum = gmno < 128 ? 0 : 35;
tmp2.pseudo4op = false;
+ tmp2.real4op = false;
tmp2.voice2_fine_tune = 0.0;
size_t resno = InsertIns(tmp, tmp2, std::string(1, '\377') + name, name2);
diff --git a/utils/gen_adldata/file_formats/load_jv.h b/utils/gen_adldata/file_formats/load_jv.h
index b79832f..35caead 100644
--- a/utils/gen_adldata/file_formats/load_jv.h
+++ b/utils/gen_adldata/file_formats/load_jv.h
@@ -71,6 +71,7 @@ static bool LoadJunglevision(const char *fn, unsigned bank, const char *prefix)
struct ins tmp2;
tmp2.notenum = data[offset + 1];
tmp2.pseudo4op = false;
+ tmp2.real4op = (data[offset] != 0);
tmp2.voice2_fine_tune = 0.0;
while(tmp2.notenum && tmp2.notenum < 20)
diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h
index fc55a0e..48b7eae 100644
--- a/utils/gen_adldata/file_formats/load_op2.h
+++ b/utils/gen_adldata/file_formats/load_op2.h
@@ -108,6 +108,7 @@ static bool LoadDoom(const char *fn, unsigned bank, const char *prefix)
struct ins tmp2;
tmp2.notenum = ins.note;
tmp2.pseudo4op = false;
+ tmp2.real4op = false;
tmp2.voice2_fine_tune = 0.0;
while(tmp2.notenum && tmp2.notenum < 20)
{
diff --git a/utils/gen_adldata/file_formats/load_tmb.h b/utils/gen_adldata/file_formats/load_tmb.h
index ab1ff37..5b38433 100644
--- a/utils/gen_adldata/file_formats/load_tmb.h
+++ b/utils/gen_adldata/file_formats/load_tmb.h
@@ -50,6 +50,7 @@ static bool LoadTMB(const char *fn, unsigned bank, const char *prefix)
struct ins tmp2;
tmp2.notenum = data[offset + 11];
tmp2.pseudo4op = false;
+ tmp2.real4op = false;
tmp2.voice2_fine_tune = 0.0;
std::string name;
diff --git a/utils/gen_adldata/file_formats/load_wopl.h b/utils/gen_adldata/file_formats/load_wopl.h
index eba94e3..fe4865d 100644
--- a/utils/gen_adldata/file_formats/load_wopl.h
+++ b/utils/gen_adldata/file_formats/load_wopl.h
@@ -57,8 +57,8 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix)
uint16_t pbanks_count = toUint16BE((const uint8_t *)data.data() + 0x0f);
AdlBankSetup setup;
- setup.deepTremolo = (data[0x11] >> 0) & 0x01;
- setup.deepVibrato = (data[0x11] >> 1) & 0x01;
+ setup.deepTremolo = (data[0x11] & 0x01) != 0;
+ setup.deepVibrato = (data[0x11] & 0x02) != 0;
setup.volumeModel = (int)data[0x12];
setup.adLibPercussions = false;
setup.scaleModulators = false;
@@ -169,6 +169,7 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix)
tmp2.notenum = is_percussion ? data[offset + 38] : 0;
bool real4op = (flags & (uint8_t)WOPL_Flags::Mode_4op) != 0;
tmp2.pseudo4op = (flags & (uint8_t)WOPL_Flags::Mode_DoubleVoice) != 0;
+ tmp2.real4op = real4op && !tmp2.pseudo4op;
tmp2.voice2_fine_tune = 0;
tmp[0].diff = false;
tmp[1].diff = real4op && !tmp2.pseudo4op;
diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc
index d1a64ee..8e6418a 100644
--- a/utils/gen_adldata/gen_adldata.cc
+++ b/utils/gen_adldata/gen_adldata.cc
@@ -406,7 +406,9 @@ int main(int argc, char**argv)
}
#endif
- unsigned flags = (i->first.pseudo4op ? 1 : 0) | (info.nosound ? 2 : 0);
+ unsigned flags = (i->first.pseudo4op ? ins::Flag_Pseudo4op : 0)|
+ (i->first.real4op ? ins::Flag_Real4op : 0) |
+ (info.nosound ? ins::Flag_NoSound : 0);
std::fprintf(outFile, " {");
std::fprintf(outFile, "%4d,%4d,%3d, %d, %6" PRId64 ",%6" PRId64 ",%lf",
diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp
index 7a81379..f79277c 100644
--- a/utils/gen_adldata/measurer.cpp
+++ b/utils/gen_adldata/measurer.cpp
@@ -49,9 +49,13 @@ DurationInfo MeasureDurations(const ins &in)
OPLChipBase *opl;
- //DosBoxOPL3 db; opl = &db;
+#if !defined(ADLMIDI_DISABLE_NUKED_EMULATOR)
+ NukedOPL3 nuke; opl = &nuke;
+#elif !defined(ADLMIDI_DISABLE_DOSBOX_EMULATOR)
+ DosBoxOPL3 db; opl = &db;
+#endif
//NukedOPL3 nuke; opl = &nuke;
- NukedOPL3v174 nuke74; opl = &nuke74;
+ //NukedOPL3v174 nuke74; opl = &nuke74;
#define WRITE_REG(key, value) opl->writeReg((uint16_t)(key), (uint8_t)(value))
@@ -68,17 +72,18 @@ DurationInfo MeasureDurations(const ins &in)
const unsigned n_notes = in.insno1 == in.insno2 ? 1 : 2;
unsigned x[2];
- if(n_notes == 2 && !in.pseudo4op)
+ if(in.real4op)
{
WRITE_REG(0x105, 1);
- WRITE_REG(0x104, 1);
+ WRITE_REG(0x104, 0xFF);
}
for(unsigned n = 0; n < n_notes; ++n)
{
static const unsigned char patchdata[11] =
{0x20, 0x23, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0x40, 0x43, 0xC0};
- for(unsigned a = 0; a < 10; ++a) WRITE_REG(patchdata[a] + n * 8, id[n].data[a]);
+ for(unsigned a = 0; a < 10; ++a)
+ WRITE_REG(patchdata[a] + n * 8, id[n].data[a]);
WRITE_REG(patchdata[10] + n * 8, id[n].data[10] | 0x30);
}
@@ -88,7 +93,7 @@ DurationInfo MeasureDurations(const ins &in)
if(hertz > 131071)
{
std::fprintf(stderr, "MEASURER WARNING: Why does note %d + finetune %d produce hertz %g? \n",
- notenum, id[n].finetune, hertz);
+ notenum, id[n].finetune, hertz);
hertz = 131071;
}
x[n] = 0x2000;
@@ -115,10 +120,12 @@ DurationInfo MeasureDurations(const ins &in)
for(unsigned period = 0; period < max_on * interval; ++period)
{
stereoSampleBuf.clear();
- stereoSampleBuf.resize(samples_per_interval * 2);
+ stereoSampleBuf.resize(samples_per_interval * 2, 0);
+
opl->generate(stereoSampleBuf.data(), samples_per_interval);
double mean = 0.0;
+
for(unsigned long c = 0; c < samples_per_interval; ++c)
{
short s = stereoSampleBuf[c * 2];
@@ -155,6 +162,7 @@ DurationInfo MeasureDurations(const ins &in)
{
stereoSampleBuf.clear();
stereoSampleBuf.resize(samples_per_interval * 2);
+
opl->generate(stereoSampleBuf.data(), samples_per_interval);
double mean = 0.0;
@@ -290,6 +298,8 @@ void MeasureThreaded::LoadCache(const char *fileName)
inst.insno2 = inval;
if(std::fread(&inst.notenum, 1, 1, in) != 1)
break;
+ if(std::fread(&inst.real4op, 1, 1, in) != 1)
+ break;
if(std::fread(&inst.pseudo4op, 1, 1, in) != 1)
break;
if(std::fread(&inst.voice2_fine_tune, sizeof(double), 1, in) != 1)
@@ -418,6 +428,7 @@ void MeasureThreaded::SaveCache(const char *fileName)
outval = in.insno2;
fwrite(&outval, 1, sizeof(uint64_t), out);
fwrite(&in.notenum, 1, 1, out);
+ fwrite(&in.real4op, 1, 1, out);
fwrite(&in.pseudo4op, 1, 1, out);
fwrite(&in.voice2_fine_tune, sizeof(double), 1, out);
diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp
index a59e7b7..81bba4c 100644
--- a/utils/gen_adldata/progs_cache.cpp
+++ b/utils/gen_adldata/progs_cache.cpp
@@ -112,7 +112,7 @@ size_t InsertNoSoundIns()
{
// { 0x0F70700,0x0F70710, 0xFF,0xFF, 0x0,+0 },
insdata tmp1 = MakeNoSoundIns();
- struct ins tmp2 = { 0, 0, 0, false, 0.0 };
+ struct ins tmp2 = { 0, 0, 0, false, false, 0.0 };
return InsertIns(tmp1, tmp1, tmp2, "nosound", "");
}
diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h
index 7b4cd39..dde70ef 100644
--- a/utils/gen_adldata/progs_cache.h
+++ b/utils/gen_adldata/progs_cache.h
@@ -49,9 +49,11 @@ inline bool equal_approx(double const a, double const b)
struct ins
{
+ enum { Flag_Pseudo4op = 0x01, Flag_NoSound = 0x02, Flag_Real4op = 0x04 };
size_t insno1, insno2;
unsigned char notenum;
bool pseudo4op;
+ bool real4op;
double voice2_fine_tune;
bool operator==(const ins &b) const
@@ -60,6 +62,7 @@ struct ins
&& insno1 == b.insno1
&& insno2 == b.insno2
&& pseudo4op == b.pseudo4op
+ && real4op == real4op
&& equal_approx(voice2_fine_tune, b.voice2_fine_tune);
}
bool operator< (const ins &b) const
@@ -68,6 +71,7 @@ struct ins
if(insno2 != b.insno2) return insno2 < b.insno2;
if(notenum != b.notenum) return notenum < b.notenum;
if(pseudo4op != b.pseudo4op) return pseudo4op < b.pseudo4op;
+ if(real4op != b.real4op) return real4op < b.real4op;
if(!equal_approx(voice2_fine_tune, b.voice2_fine_tune)) return voice2_fine_tune < b.voice2_fine_tune;
return 0;
}