aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/adldata.hh42
-rw-r--r--src/adlmidi_load.cpp81
-rw-r--r--src/adlmidi_midiplay.cpp45
-rw-r--r--src/adlmidi_opl3.cpp35
-rw-r--r--src/adlmidi_private.cpp8
-rw-r--r--src/adlmidi_private.hpp15
6 files changed, 117 insertions, 109 deletions
diff --git a/src/adldata.hh b/src/adldata.hh
index e9ff00b..20cbd21 100644
--- a/src/adldata.hh
+++ b/src/adldata.hh
@@ -24,8 +24,16 @@
#ifndef ADLDATA_H
#define ADLDATA_H
+#include <string.h>
#include <stdint.h>
+#pragma pack(push, 1)
+#define ADLDATA_BYTE_COMPARABLE(T) \
+ inline bool operator==(const T &a, const T &b) \
+ { return !memcmp(&a, &b, sizeof(T)); } \
+ inline bool operator!=(const T &a, const T &b) \
+ { return !operator==(a, b); }
+
extern const struct adldata
{
uint32_t modulator_E862, carrier_E862; // See below
@@ -34,6 +42,8 @@ extern const struct adldata
int8_t finetune;
} adl[];
+ADLDATA_BYTE_COMPARABLE(struct adldata);
+enum { adlDefaultNumber = 189 };
extern const struct adlinsdata
{
@@ -46,11 +56,31 @@ extern const struct adlinsdata
uint16_t ms_sound_koff;
double voice2_fine_tune;
} adlins[];
+ADLDATA_BYTE_COMPARABLE(struct adlinsdata);
int maxAdlBanks();
extern const unsigned short banks[][256];
extern const char* const banknames[];
/**
+ * @brief Instrument data with operators included
+ */
+struct adlinsdata2
+{
+ adldata adl[2];
+ uint8_t tone;
+ uint8_t flags;
+ uint16_t ms_sound_kon; // Number of milliseconds it produces sound;
+ uint16_t ms_sound_koff;
+ double voice2_fine_tune;
+ adlinsdata2() {}
+ explicit adlinsdata2(const adlinsdata &d);
+};
+ADLDATA_BYTE_COMPARABLE(struct adlinsdata2);
+
+#undef ADLDATA_BYTE_COMPARABLE
+#pragma pack(pop)
+
+/**
* @brief Bank global setup
*/
extern const struct AdlBankSetup
@@ -62,4 +92,16 @@ extern const struct AdlBankSetup
bool scaleModulators;
} adlbanksetup[];
+/**
+ * @brief Conversion of storage formats
+ */
+inline adlinsdata2::adlinsdata2(const adlinsdata &d)
+ : tone(d.tone), flags(d.flags),
+ ms_sound_kon(d.ms_sound_kon), ms_sound_koff(d.ms_sound_koff),
+ voice2_fine_tune(d.voice2_fine_tune)
+{
+ adl[0] = ::adl[d.adlno1];
+ adl[1] = ::adl[d.adlno2];
+}
+
#endif //ADLDATA_H
diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp
index 36dbf70..e6206ea 100644
--- a/src/adlmidi_load.cpp
+++ b/src/adlmidi_load.cpp
@@ -72,59 +72,50 @@ bool MIDIplay::LoadBank(const void *data, size_t size)
return LoadBank(file);
}
-
-struct WOPL_Inst
-{
- bool fourOps;
- char padding[7];
- struct adlinsdata adlins;
- struct adldata op[2];
- uint16_t ms_sound_kon;
- uint16_t ms_sound_koff;
-};
-
-static void cvt_WOPLI_to_FMIns(WOPL_Inst &ins, WOPLInstrument &in)
+static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, WOPLInstrument &in)
{
- ins.op[0].finetune = in.note_offset1;
- ins.op[1].finetune = in.note_offset2;
-
- ins.adlins.voice2_fine_tune = 0.0;
+ ins.voice2_fine_tune = 0.0;
int8_t voice2_fine_tune = in.second_voice_detune;
if(voice2_fine_tune != 0)
{
if(voice2_fine_tune == 1)
- ins.adlins.voice2_fine_tune = 0.000025;
+ ins.voice2_fine_tune = 0.000025;
else if(voice2_fine_tune == -1)
- ins.adlins.voice2_fine_tune = -0.000025;
+ ins.voice2_fine_tune = -0.000025;
else
- ins.adlins.voice2_fine_tune = ((voice2_fine_tune * 15.625) / 1000.0);
+ ins.voice2_fine_tune = ((voice2_fine_tune * 15.625) / 1000.0);
}
- ins.adlins.tone = in.percussion_key_number;
+ ins.tone = in.percussion_key_number;
+ ins.flags = (in.inst_flags & WOPL_Ins_4op) && (in.inst_flags & WOPL_Ins_Pseudo4op) ? adlinsdata::Flag_Pseudo4op : 0;
+ ins.flags|= (in.inst_flags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0;
- ins.adlins.flags = (in.inst_flags & WOPL_Ins_4op) && (in.inst_flags & WOPL_Ins_Pseudo4op) ? adlinsdata::Flag_Pseudo4op : 0;
- ins.adlins.flags|= (in.inst_flags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0;
- ins.fourOps = (in.inst_flags & WOPL_Ins_4op) || (in.inst_flags & WOPL_Ins_Pseudo4op);
-
- ins.op[0].feedconn = in.fb_conn1_C0;
- ins.op[1].feedconn = in.fb_conn2_C0;
-
- for(size_t op = 0, slt = 0; op < 4; op++, slt++)
+ bool fourOps = (in.inst_flags & WOPL_Ins_4op) || (in.inst_flags & WOPL_Ins_Pseudo4op);
+ for(size_t op = 0, slt = 0; op < fourOps ? 4 : 2; op++, slt++)
{
- ins.op[slt].carrier_E862 =
+ ins.adl[slt].carrier_E862 =
((static_cast<uint32_t>(in.operators[op].waveform_E0) << 24) & 0xFF000000) //WaveForm
| ((static_cast<uint32_t>(in.operators[op].susrel_80) << 16) & 0x00FF0000) //SusRel
| ((static_cast<uint32_t>(in.operators[op].atdec_60) << 8) & 0x0000FF00) //AtDec
| ((static_cast<uint32_t>(in.operators[op].avekf_20) << 0) & 0x000000FF); //AVEKM
- ins.op[slt].carrier_40 = in.operators[op].ksl_l_40;//KSLL
+ ins.adl[slt].carrier_40 = in.operators[op].ksl_l_40;//KSLL
op++;
- ins.op[slt].modulator_E862 =
+ ins.adl[slt].modulator_E862 =
((static_cast<uint32_t>(in.operators[op].waveform_E0) << 24) & 0xFF000000) //WaveForm
| ((static_cast<uint32_t>(in.operators[op].susrel_80) << 16) & 0x00FF0000) //SusRel
| ((static_cast<uint32_t>(in.operators[op].atdec_60) << 8) & 0x0000FF00) //AtDec
| ((static_cast<uint32_t>(in.operators[op].avekf_20) << 0) & 0x000000FF); //AVEKM
- ins.op[slt].modulator_40 = in.operators[op].ksl_l_40;//KSLL
+ ins.adl[slt].modulator_40 = in.operators[op].ksl_l_40;//KSLL
+ }
+
+ ins.adl[0].finetune = in.note_offset1;
+ ins.adl[0].feedconn = in.fb_conn1_C0;
+ if(!fourOps)
+ ins.adl[1] = ins.adl[0];
+ else {
+ ins.adl[1].finetune = in.note_offset2;
+ ins.adl[1].feedconn = in.fb_conn2_C0;
}
ins.ms_sound_kon = in.delay_on_ms;
@@ -194,7 +185,6 @@ bool MIDIplay::LoadBank(MIDIplay::fileReader &fr)
/* TODO: Avoid memory reallocation in nearest future! */
opl.dynamic_melodic_banks.clear();
opl.dynamic_percussion_banks.clear();
- opl.dynamic_instruments.clear();
opl.dynamic_metainstruments.clear();
opl.dynamic_percussion_offset = 0;
@@ -214,23 +204,11 @@ bool MIDIplay::LoadBank(MIDIplay::fileReader &fr)
for(int j = 0; j < 128; j++)
{
- WOPL_Inst ins;
- std::memset(&ins, 0, sizeof(WOPL_Inst));
+ adlinsdata2 ins;
+ std::memset(&ins, 0, sizeof(adlinsdata2));
WOPLInstrument &inIns = slots_src_ins[ss][i].ins[j];
-
cvt_WOPLI_to_FMIns(ins, inIns);
-
- ins.adlins.ms_sound_kon = ins.ms_sound_kon;
- ins.adlins.ms_sound_koff = ins.ms_sound_koff;
- ins.adlins.adlno1 = static_cast<uint16_t>(opl.dynamic_instruments.size() | opl.DynamicInstrumentTag);
- opl.dynamic_instruments.push_back(ins.op[0]);
- ins.adlins.adlno2 = ins.adlins.adlno1;
- if(ins.fourOps)
- {
- ins.adlins.adlno2 = static_cast<uint16_t>(opl.dynamic_instruments.size() | opl.DynamicInstrumentTag);
- opl.dynamic_instruments.push_back(ins.op[1]);
- }
- opl.dynamic_metainstruments.push_back(ins.adlins);
+ opl.dynamic_metainstruments.push_back(ins);
}
}
}
@@ -424,7 +402,7 @@ riffskip:
i, InsData[0],InsData[1],InsData[2],InsData[3], InsData[4],InsData[5],InsData[6],InsData[7],
InsData[8],InsData[9],InsData[10],InsData[11], InsData[12],InsData[13],InsData[14],InsData[15]);*/
struct adldata adl;
- struct adlinsdata adlins;
+ struct adlinsdata2 adlins;
adl.modulator_E862 =
((static_cast<uint32_t>(InsData[8] & 0x07) << 24) & 0xFF000000) //WaveForm
| ((static_cast<uint32_t>(InsData[6]) << 16) & 0x00FF0000) //Sustain/Release
@@ -439,15 +417,14 @@ riffskip:
adl.carrier_40 = InsData[3];
adl.feedconn = InsData[10] & 0x0F;
adl.finetune = 0;
- adlins.adlno1 = static_cast<uint16_t>(opl.dynamic_instruments.size() | opl.DynamicInstrumentTag);
- adlins.adlno2 = adlins.adlno1;
+ adlins.adl[0] = adl;
+ adlins.adl[1] = adl;
adlins.ms_sound_kon = 1000;
adlins.ms_sound_koff = 500;
adlins.tone = 0;
adlins.flags = 0;
adlins.voice2_fine_tune = 0.0;
opl.dynamic_metainstruments.push_back(adlins);
- opl.dynamic_instruments.push_back(adl);
}
fr.seeku(mus_start, SEEK_SET);
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp
index 9ccd3f8..5f3ce57 100644
--- a/src/adlmidi_midiplay.cpp
+++ b/src/adlmidi_midiplay.cpp
@@ -1058,12 +1058,12 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
//int meta = banks[opl.AdlBank][midiins];
size_t meta = opl.GetAdlMetaNumber(midiins);
- const adlinsdata *ains = &opl.GetAdlMetaIns(meta);
+ adlinsdata2 ains = opl.GetAdlMetaIns(meta);
int16_t tone = note;
if(!isPercussion && !isXgPercussion && (bank > 0)) // For non-zero banks
{
- if(ains->flags & adlinsdata::Flag_NoSound)
+ if(ains.flags & adlinsdata::Flag_NoSound)
{
if(hooks.onDebugMessage)
{
@@ -1076,27 +1076,27 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
bank = 0;
midiins = Ch[channel].patch;
meta = opl.GetAdlMetaNumber(midiins);
- ains = &opl.GetAdlMetaIns(meta);
+ ains = opl.GetAdlMetaIns(meta);
}
}
- if(ains->tone)
+ if(ains.tone)
{
/*if(ains.tone < 20)
tone += ains.tone;
else*/
- if(ains->tone < 128)
- tone = ains->tone;
+ if(ains.tone < 128)
+ tone = ains.tone;
else
- tone -= ains->tone - 128;
+ tone -= ains.tone - 128;
}
//uint16_t i[2] = { ains.adlno1, ains.adlno2 };
- bool pseudo_4op = ains->flags & adlinsdata::Flag_Pseudo4op;
+ bool pseudo_4op = ains.flags & adlinsdata::Flag_Pseudo4op;
MIDIchannel::NoteInfo::Phys voices[MIDIchannel::NoteInfo::MaxNumPhysChans] =
{
- {0, ains->adlno1, false},
- {0, ains->adlno2, pseudo_4op}
+ {0, ains.adl[0], false},
+ {0, ains.adl[1], pseudo_4op}
};
if((opl.AdlPercussionMode == 1) && PercussionMap[midiins & 0xFF])
@@ -1104,7 +1104,7 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
if(hooks.onDebugMessage)
{
- if(!caugh_missing_instruments.count(static_cast<uint8_t>(midiins)) && (ains->flags & adlinsdata::Flag_NoSound))
+ if(!caugh_missing_instruments.count(static_cast<uint8_t>(midiins)) && (ains.flags & adlinsdata::Flag_NoSound))
{
hooks.onDebugMessage(hooks.onDebugMessage_userData, "[%i] Playing missing instrument %i", channel, midiins);
caugh_missing_instruments.insert(static_cast<uint8_t>(midiins));
@@ -1132,7 +1132,7 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
if(ccount == 1 && static_cast<int32_t>(a) == adlchannel[0]) continue;
// ^ Don't use the same channel for primary&secondary
- if(voices[0].insId == voices[1].insId || pseudo_4op/*i[0] == i[1] || pseudo_4op*/)
+ if(voices[0].ains == voices[1].ains || pseudo_4op/*i[0] == i[1] || pseudo_4op*/)
{
// Only use regular channels
uint8_t expected_mode = 0;
@@ -1440,7 +1440,7 @@ void MIDIplay::NoteUpdate(uint16_t MidCh,
const uint8_t vol = info.vol;
const int midiins = info.midiins;
const size_t insmeta = info.insmeta;
- const adlinsdata &ains = opl.GetAdlMetaIns(insmeta);
+ const adlinsdata2 ains = opl.GetAdlMetaIns(insmeta);
AdlChannel::Location my_loc;
my_loc.MidCh = MidCh;
my_loc.note = info.note;
@@ -1454,7 +1454,7 @@ void MIDIplay::NoteUpdate(uint16_t MidCh,
if(props_mask & Upd_Patch)
{
- opl.Patch(c, ins.insId);
+ opl.Patch(c, ins.ains);
AdlChannel::LocationData *d = ch[c].users_find_or_create(my_loc);
if(d) { // inserts if necessary
d->sustained = false;
@@ -1610,7 +1610,7 @@ void MIDIplay::NoteUpdate(uint16_t MidCh,
// Don't bend a sustained note
if(!d || !d->sustained)
{
- double bend = Ch[MidCh].bend + opl.GetAdlIns(ins.insId).finetune;
+ double bend = Ch[MidCh].bend + ins.ains.finetune;
double phase = 0.0;
if((ains.flags & adlinsdata::Flag_Pseudo4op) && ins.pseudo4op)
@@ -2575,7 +2575,7 @@ ADLMIDI_EXPORT void AdlInstrumentTester::DoNote(int note)
OPL3 *opl = P->opl;
if(P->adl_ins_list.empty()) FindAdlList();
const unsigned meta = P->adl_ins_list[P->ins_idx];
- const adlinsdata &ains = opl->GetAdlMetaIns(meta);
+ const adlinsdata2 ains = opl->GetAdlMetaIns(meta);
int tone = (P->cur_gm & 128) ? (P->cur_gm & 127) : (note + 50);
if(ains.tone)
@@ -2589,16 +2589,15 @@ ADLMIDI_EXPORT void AdlInstrumentTester::DoNote(int note)
tone -= ains.tone - 128;
}
double hertz = 172.00093 * std::exp(0.057762265 * (tone + 0.0));
- int i[2] = { ains.adlno1, ains.adlno2 };
int32_t adlchannel[2] = { 0, 3 };
- if(i[0] == i[1])
+ if(ains.adl[0] == ains.adl[1])
{
adlchannel[1] = -1;
adlchannel[0] = 6; // single-op
if(play->hooks.onDebugMessage)
{
play->hooks.onDebugMessage(play->hooks.onDebugMessage_userData,
- "noteon at %d(%d) for %g Hz\n", adlchannel[0], i[0], hertz);
+ "noteon at %d for %g Hz\n", adlchannel[0], hertz);
}
}
else
@@ -2606,7 +2605,7 @@ ADLMIDI_EXPORT void AdlInstrumentTester::DoNote(int note)
if(play->hooks.onDebugMessage)
{
play->hooks.onDebugMessage(play->hooks.onDebugMessage_userData,
- "noteon at %d(%d) and %d(%d) for %g Hz\n", adlchannel[0], i[0], adlchannel[1], i[1], hertz);
+ "noteon at %d and %d for %g Hz\n", adlchannel[0], adlchannel[1], hertz);
}
}
@@ -2616,7 +2615,7 @@ ADLMIDI_EXPORT void AdlInstrumentTester::DoNote(int note)
for(unsigned c = 0; c < 2; ++c)
{
if(adlchannel[c] < 0) continue;
- opl->Patch((uint16_t)adlchannel[c], (uint16_t)i[c]);
+ opl->Patch((uint16_t)adlchannel[c], ains.adl[c]);
opl->Touch_Real((uint16_t)adlchannel[c], 127 * 127 * 100);
opl->Pan((uint16_t)adlchannel[c], 0x30);
opl->NoteOn((uint16_t)adlchannel[c], hertz);
@@ -2650,7 +2649,7 @@ ADLMIDI_EXPORT void AdlInstrumentTester::NextAdl(int offset)
for(unsigned a = 0, n = P->adl_ins_list.size(); a < n; ++a)
{
const unsigned i = P->adl_ins_list[a];
- const adlinsdata &ains = opl->GetAdlMetaIns(i);
+ const adlinsdata2 ains = opl->GetAdlMetaIns(i);
char ToneIndication[8] = " ";
if(ains.tone)
@@ -2665,7 +2664,7 @@ ADLMIDI_EXPORT void AdlInstrumentTester::NextAdl(int offset)
}
std::printf("%s%s%s%u\t",
ToneIndication,
- ains.adlno1 != ains.adlno2 ? "[2]" : " ",
+ ains.adl[0] != ains.adl[1] ? "[2]" : " ",
(P->ins_idx == a) ? "->" : "\t",
i
);
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp
index 66254b6..d7dec78 100644
--- a/src/adlmidi_opl3.cpp
+++ b/src/adlmidi_opl3.cpp
@@ -130,11 +130,11 @@ static const unsigned short Channels[23] =
*/
-const adlinsdata &OPL3::GetAdlMetaIns(size_t n)
+adlinsdata2 OPL3::GetAdlMetaIns(size_t n)
{
return (n & DynamicMetaInstrumentTag) ?
dynamic_metainstruments[n & ~DynamicMetaInstrumentTag]
- : adlins[n];
+ : adlinsdata2(adlins[n]);
}
size_t OPL3::GetAdlMetaNumber(size_t midiins)
@@ -144,13 +144,6 @@ size_t OPL3::GetAdlMetaNumber(size_t midiins)
: banks[AdlBank][midiins];
}
-const adldata &OPL3::GetAdlIns(size_t insno)
-{
- return (insno & DynamicInstrumentTag)
- ? dynamic_instruments[insno & ~DynamicInstrumentTag]
- : adl[insno];
-}
-
void OPL3::setEmbeddedBank(unsigned int bank)
{
AdlBank = bank;
@@ -282,10 +275,9 @@ void OPL3::Touch_Real(unsigned c, unsigned volume, uint8_t brightness)
volume = 63;
size_t card = c / 23, cc = c % 23;
- size_t i = ins[c];
+ const adldata &adli = ins[c];
uint16_t o1 = Operators[cc * 2 + 0];
uint16_t o2 = Operators[cc * 2 + 1];
- const adldata &adli = GetAdlIns(i);
uint8_t x = adli.modulator_40, y = adli.carrier_40;
uint16_t mode = 1; // 2-op AM
@@ -295,22 +287,22 @@ void OPL3::Touch_Real(unsigned c, unsigned volume, uint8_t brightness)
}
else if(four_op_category[c] == 1 || four_op_category[c] == 2)
{
- size_t i0, i1;
+ const adldata *i0, *i1;
if(four_op_category[c] == 1)
{
- i0 = i;
- i1 = ins[c + 3];
+ i0 = &adli;
+ i1 = &ins[c + 3];
mode = 2; // 4-op xx-xx ops 1&2
}
else
{
- i0 = ins[c - 3];
- i1 = i;
+ i0 = &ins[c - 3];
+ i1 = &adli;
mode = 6; // 4-op xx-xx ops 3&4
}
- mode += (GetAdlIns(i0).feedconn & 1) + (GetAdlIns(i1).feedconn & 1) * 2;
+ mode += (i0->feedconn & 1) + (i1->feedconn & 1) * 2;
}
static const bool do_ops[10][2] =
@@ -377,14 +369,13 @@ void OPL3::Touch(unsigned c, unsigned volume) // Volume maxes at 127*127*127
}
}*/
-void OPL3::Patch(uint16_t c, size_t i)
+void OPL3::Patch(uint16_t c, const adldata &adli)
{
uint16_t card = c / 23, cc = c % 23;
static const uint8_t data[4] = {0x20, 0x60, 0x80, 0xE0};
- ins[c] = i;
+ ins[c] = adli;
uint16_t o1 = Operators[cc * 2 + 0];
uint16_t o2 = Operators[cc * 2 + 1];
- const adldata &adli = GetAdlIns(i);
unsigned x = adli.modulator_E862, y = adli.carrier_E862;
for(unsigned a = 0; a < 4; ++a, x >>= 8, y >>= 8)
@@ -400,7 +391,7 @@ void OPL3::Pan(unsigned c, unsigned value)
unsigned card = c / 23, cc = c % 23;
if(Channels[cc] != 0xFFF)
- Poke(card, 0xC0 + Channels[cc], GetAdlIns(ins[c]).feedconn | value);
+ Poke(card, 0xC0 + Channels[cc], ins[c].feedconn | value);
}
void OPL3::Silence() // Silence all OPL channels.
@@ -527,7 +518,7 @@ void OPL3::Reset(int emulator, unsigned long PCM_RATE)
#endif
NumChannels = NumCards * 23;
- ins.resize(NumChannels, 189);
+ ins.resize(NumChannels, adl[adlDefaultNumber]);
pit.resize(NumChannels, 0);
regBD.resize(NumCards, 0);
four_op_category.resize(NumChannels, 0);
diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp
index 1f3cb7d..1e62250 100644
--- a/src/adlmidi_private.cpp
+++ b/src/adlmidi_private.cpp
@@ -38,8 +38,8 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device)
{
size_t div = (a >= play->opl.dynamic_percussion_offset) ? 1 : 0;
++n_total[div];
- adlinsdata &ins = play->opl.dynamic_metainstruments[a];
- if((ins.adlno1 != ins.adlno2) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0))
+ adlinsdata2 &ins = play->opl.dynamic_metainstruments[a];
+ if((ins.adl[0] != ins.adl[1]) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0))
++n_fourop[div];
}
@@ -57,8 +57,8 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device)
if(insno == 198)
continue;
++n_total[a / 128];
- const adlinsdata &ins = adlins[insno];
- if((ins.adlno1 != ins.adlno2) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0))
+ adlinsdata2 ins(adlins[insno]);
+ if((ins.adl[0] != ins.adl[1]) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0))
++n_fourop[a / 128];
}
diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp
index 10bd517..89d3236 100644
--- a/src/adlmidi_private.hpp
+++ b/src/adlmidi_private.hpp
@@ -215,13 +215,13 @@ public:
std::vector<AdlMIDI_SPtr<OPLChipBase > > cardsOP2;
#endif
private:
- std::vector<size_t> ins; // index to adl[], cached, needed by Touch()
+ std::vector<adldata> ins; // patch data, cached, needed by Touch()
std::vector<uint8_t> pit; // value poked to B0, cached, needed by NoteOff)(
std::vector<uint8_t> regBD;
friend int adlRefreshNumCards(ADL_MIDIPlayer *device);
//! Meta information about every instrument
- std::vector<adlinsdata> dynamic_metainstruments; // Replaces adlins[] when CMF file
+ std::vector<adlinsdata2> dynamic_metainstruments; // Replaces adlins[] when CMF file
//! Raw instrument data ready to be sent to the chip
std::vector<adldata> dynamic_instruments; // Replaces adl[] when CMF file
size_t dynamic_percussion_offset;
@@ -231,9 +231,8 @@ private:
BankMap dynamic_percussion_banks;
const unsigned DynamicInstrumentTag /* = 0x8000u*/,
DynamicMetaInstrumentTag /* = 0x4000000u*/;
- const adlinsdata &GetAdlMetaIns(size_t n);
+ adlinsdata2 GetAdlMetaIns(size_t n);
size_t GetAdlMetaNumber(size_t midiins);
- const adldata &GetAdlIns(size_t insno);
public:
void setEmbeddedBank(unsigned int bank);
@@ -292,7 +291,7 @@ public:
void Touch_Real(unsigned c, unsigned volume, uint8_t brightness = 127);
//void Touch(unsigned c, unsigned volume)
- void Patch(uint16_t c, size_t i);
+ void Patch(uint16_t c, const adldata &adli);
void Pan(unsigned c, unsigned value);
void Silence();
void updateFlags();
@@ -539,18 +538,18 @@ public:
//! Destination chip channel
uint16_t chip_chan;
//! ins, inde to adl[]
- size_t insId;
+ adldata ains;
//! Is this voice must be detunable?
bool pseudo4op;
void assign(const Phys &oth)
{
- insId = oth.insId;
+ ains = oth.ains;
pseudo4op = oth.pseudo4op;
}
bool operator==(const Phys &oth) const
{
- return (insId == oth.insId) && (pseudo4op == oth.pseudo4op);
+ return (ains == oth.ains) && (pseudo4op == oth.pseudo4op);
}
bool operator!=(const Phys &oth) const
{