aboutsummaryrefslogtreecommitdiff
path: root/src/gen_adldata
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2017-10-09 02:21:20 +0300
committerWohlstand <admin@wohlnet.ru>2017-10-09 02:21:20 +0300
commit3a1a97809d0a9b88916e5213f239fac046244241 (patch)
tree0db9d64960f0d606c09f641872edfd488d3eefd2 /src/gen_adldata
parent71841a625cede9a2b5498a7dfdc543825d2fd453 (diff)
downloadlibADLMIDI-3a1a97809d0a9b88916e5213f239fac046244241.tar.gz
libADLMIDI-3a1a97809d0a9b88916e5213f239fac046244241.tar.bz2
libADLMIDI-3a1a97809d0a9b88916e5213f239fac046244241.zip
Fixed WOPN parser to use both real 4-op and pseudo 4-op modes in same bank
Diffstat (limited to 'src/gen_adldata')
-rw-r--r--src/gen_adldata/file_formats/load_wopl.h45
-rw-r--r--src/gen_adldata/measurer.h2
2 files changed, 32 insertions, 15 deletions
diff --git a/src/gen_adldata/file_formats/load_wopl.h b/src/gen_adldata/file_formats/load_wopl.h
index 66eed1e..300a3a0 100644
--- a/src/gen_adldata/file_formats/load_wopl.h
+++ b/src/gen_adldata/file_formats/load_wopl.h
@@ -124,6 +124,8 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix)
tmp2.notenum = 0;
tmp2.pseudo4op = (flags & 0x02) != 0;
tmp2.voice2_fine_tune = 0;
+ tmp[0].diff = false;
+ tmp[1].diff = tmp2.pseudo4op;
int8_t fine_tune = (int8_t)data[offset + 37];
if(fine_tune != 0)
@@ -144,7 +146,7 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix)
char name2[512];
sprintf(name2, "%sM%u", prefix, i);
- if(!flags)
+ if((flags & 0x03) == 0)
{
size_t resno = InsertIns(tmp[0], tmp[0], tmp2, name, name2);
SetBank(bank, i, resno);
@@ -170,17 +172,31 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix)
name.resize(32);
std::memcpy(&name[0], data.data() + offset, 32);
name.resize(std::strlen(&name[0]));
-
- tmp[0].data[0] = data[offset + 42 + 5];
- tmp[0].data[1] = data[offset + 42 + 0];
- tmp[0].data[2] = data[offset + 42 + 7];
- tmp[0].data[3] = data[offset + 42 + 2];
- tmp[0].data[4] = data[offset + 42 + 8];
- tmp[0].data[5] = data[offset + 42 + 3];
- tmp[0].data[6] = data[offset + 42 + 9];
- tmp[0].data[7] = data[offset + 42 + 4];
- tmp[0].data[8] = data[offset + 42 + 6];
- tmp[0].data[9] = data[offset + 42 + 1];
+/*
+ WOPL's
+
+ 0 AM/Vib/Env/Ksr/FMult characteristics
+ 1 Key Scale Level / Total level register data
+ 2 Attack / Decay
+ 3 Systain and Release register data
+ 4 Wave form
+
+ 5 AM/Vib/Env/Ksr/FMult characteristics
+ 6 Key Scale Level / Total level register data
+ 7 Attack / Decay
+ 8 Systain and Release register data
+ 9 Wave form
+*/
+ tmp[0].data[0] = data[offset + 42 + 5];//AMVIB op1
+ tmp[0].data[1] = data[offset + 42 + 0];//AMVIB op2
+ tmp[0].data[2] = data[offset + 42 + 7];//AtDec op1
+ tmp[0].data[3] = data[offset + 42 + 2];//AtDec op2
+ tmp[0].data[4] = data[offset + 42 + 8];//SusRel op1
+ tmp[0].data[5] = data[offset + 42 + 3];//SusRel op2
+ tmp[0].data[6] = data[offset + 42 + 9];//Wave op1
+ tmp[0].data[7] = data[offset + 42 + 4];//Wave op2
+ tmp[0].data[8] = data[offset + 42 + 6];//KSL op1
+ tmp[0].data[9] = data[offset + 42 + 1];//KSL op2
tmp[0].data[10] = data[offset + 40];
tmp[1].data[0] = data[offset + 52 + 5];
@@ -197,13 +213,14 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix)
tmp[0].finetune = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 32));
tmp[1].finetune = int8_t(toSint16BE((const uint8_t *)data.data() + offset + 34));
-
uint8_t flags = data[offset + 39];
struct ins tmp2;
tmp2.notenum = data[offset + 38];
tmp2.pseudo4op = (flags & 0x02) != 0;
tmp2.voice2_fine_tune = 0;
+ tmp[0].diff = false;
+ tmp[1].diff = tmp2.pseudo4op;
int8_t fine_tune = (int8_t)data[offset + 37];
if(fine_tune != 0)
@@ -229,7 +246,7 @@ static bool LoadWopl(const char *fn, unsigned bank, const char *prefix)
char name2[512];
sprintf(name2, "%sP%u", prefix, gmno & 127);
- if(!flags)
+ if((flags & 0x03) == 0)
{
size_t resno = InsertIns(tmp[0], tmp[0], tmp2, name, name2);
SetBank(bank, gmno, resno);
diff --git a/src/gen_adldata/measurer.h b/src/gen_adldata/measurer.h
index 4e44d0e..b9ae3c6 100644
--- a/src/gen_adldata/measurer.h
+++ b/src/gen_adldata/measurer.h
@@ -57,7 +57,7 @@ struct MeasureThreaded
typedef std::map<ins, DurationInfo> DurationInfoCache;
MeasureThreaded() :
- m_semaphore(int(std::thread::hardware_concurrency())),
+ m_semaphore(int(std::thread::hardware_concurrency()) * 2),
m_done(0),
m_cache_matches(0)
{}