diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/adldata.hh | 42 | ||||
-rw-r--r-- | src/adlmidi_load.cpp | 81 | ||||
-rw-r--r-- | src/adlmidi_midiplay.cpp | 45 | ||||
-rw-r--r-- | src/adlmidi_opl3.cpp | 35 | ||||
-rw-r--r-- | src/adlmidi_private.cpp | 8 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 15 |
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 { |