From 0c1b3519b6724d22b64db2cdc91c3b0f44579ca8 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sun, 6 May 2018 22:41:04 +0300 Subject: Fixed inability to load another custom bank! Damn, this is so silly: Data of new bank data was added to tail of old data as I forgot to clean up that crap before to fill with a new data, damn! (#83) --- src/adlmidi_load.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index 703f34a..36dbf70 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -194,6 +194,9 @@ 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; opl.setEmbeddedBank(m_setup.AdlBank); -- cgit v1.2.3 From 9b478615e7f0cd73c360fd289b05db52b5f730f1 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Wed, 16 May 2018 01:31:18 +0200 Subject: storing adldata and adlinsdata in unified structures --- src/adlmidi_load.cpp | 81 +++++++++++++++++++--------------------------------- 1 file changed, 29 insertions(+), 52 deletions(-) (limited to 'src/adlmidi_load.cpp') 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(in.operators[op].waveform_E0) << 24) & 0xFF000000) //WaveForm | ((static_cast(in.operators[op].susrel_80) << 16) & 0x00FF0000) //SusRel | ((static_cast(in.operators[op].atdec_60) << 8) & 0x0000FF00) //AtDec | ((static_cast(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(in.operators[op].waveform_E0) << 24) & 0xFF000000) //WaveForm | ((static_cast(in.operators[op].susrel_80) << 16) & 0x00FF0000) //SusRel | ((static_cast(in.operators[op].atdec_60) << 8) & 0x0000FF00) //AtDec | ((static_cast(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(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(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(InsData[8] & 0x07) << 24) & 0xFF000000) //WaveForm | ((static_cast(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(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); -- cgit v1.2.3 From 2b76bdb9b96dcbaaa5fb80e33a264298178e8f10 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Wed, 16 May 2018 19:29:23 +0200 Subject: fix the operators loop in WOPL converter --- src/adlmidi_load.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index e6206ea..e524fe3 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -91,7 +91,7 @@ static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, WOPLInstrument &in) ins.flags|= (in.inst_flags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0; 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++) + for(size_t op = 0, slt = 0; op < (fourOps ? 4 : 2); op++, slt++) { ins.adl[slt].carrier_E862 = ((static_cast(in.operators[op].waveform_E0) << 24) & 0xFF000000) //WaveForm -- cgit v1.2.3 From bb4797ee68c0f12018196d3ee8caddcdcad9fe38 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sat, 19 May 2018 22:33:37 +0300 Subject: 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 --- src/adlmidi_load.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index e524fe3..bd38620 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -88,6 +88,7 @@ static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, WOPLInstrument &in) 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_4op) && ((in.inst_flags & WOPL_Ins_Pseudo4op) == 0) ? adlinsdata::Flag_Real4op : 0; ins.flags|= (in.inst_flags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0; bool fourOps = (in.inst_flags & WOPL_Ins_4op) || (in.inst_flags & WOPL_Ins_Pseudo4op); @@ -178,9 +179,14 @@ bool MIDIplay::LoadBank(MIDIplay::fileReader &fr) } } - m_setup.HighTremoloMode = (wopl->opl_flags & WOPL_FLAG_DEEP_TREMOLO) != 0; - m_setup.HighVibratoMode = (wopl->opl_flags & WOPL_FLAG_DEEP_VIBRATO) != 0; - m_setup.VolumeModel = wopl->volume_model; + opl.dynamic_bank_setup.adLibPercussions = false; + opl.dynamic_bank_setup.scaleModulators = false; + opl.dynamic_bank_setup.deepTremolo = (wopl->opl_flags & WOPL_FLAG_DEEP_TREMOLO) != 0; + opl.dynamic_bank_setup.deepVibrato = (wopl->opl_flags & WOPL_FLAG_DEEP_VIBRATO) != 0; + opl.dynamic_bank_setup.volumeModel = wopl->volume_model; + m_setup.HighTremoloMode = -1; + m_setup.HighVibratoMode = -1; + m_setup.VolumeModel = ADLMIDI_VolumeModels::ADLMIDI_VolumeModel_AUTO; /* TODO: Avoid memory reallocation in nearest future! */ opl.dynamic_melodic_banks.clear(); -- cgit v1.2.3 From f545d69e3384e235828580e3f3e64aa959435478 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sun, 20 May 2018 02:07:05 +0300 Subject: Polishing default tempo for MIDI files are lacks the tempo event #91 --- src/adlmidi_load.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index bd38620..3e833c3 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -517,11 +517,8 @@ riffskip: TrackData.clear(); TrackData.resize(TrackCount, std::vector()); - //CurrentPosition.track.clear(); - //CurrentPosition.track.resize(TrackCount); InvDeltaTicks = fraction(1, 1000000l * static_cast(DeltaTicks)); - //Tempo = 1000000l * InvDeltaTicks; - Tempo = fraction(1, static_cast(DeltaTicks)); + Tempo = fraction(1, static_cast(DeltaTicks) / 2); static const unsigned char EndTag[4] = {0xFF, 0x2F, 0x00, 0x00}; size_t totalGotten = 0; -- cgit v1.2.3 From 30bd206493e8b2dae81e99cffb22266bd3029d3d Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sun, 20 May 2018 02:21:56 +0300 Subject: TRUE fix of the default MIDI tempo #91 --- src/adlmidi_load.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index 3e833c3..35fba3b 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -518,7 +518,7 @@ riffskip: TrackData.clear(); TrackData.resize(TrackCount, std::vector()); InvDeltaTicks = fraction(1, 1000000l * static_cast(DeltaTicks)); - Tempo = fraction(1, static_cast(DeltaTicks) / 2); + Tempo = fraction(1, static_cast(DeltaTicks) * 2); static const unsigned char EndTag[4] = {0xFF, 0x2F, 0x00, 0x00}; size_t totalGotten = 0; -- cgit v1.2.3 From 56c0cd7f2439898080df2e0a8129b72d2d85ca70 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Thu, 31 May 2018 02:05:58 +0300 Subject: Small polishing of volume model and CMF/RSXX tempo - Removed "Logarithmic volumes" flag as volume models concept successfuly serves this task. "Logarithmic volumes" flag is useless when we have volume models. - Fixed "too fast" tempo while playing CMF and EA-MUS (aka RSXX) files --- src/adlmidi_load.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index 35fba3b..0c2fe48 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -438,10 +438,9 @@ riffskip: DeltaTicks = (size_t)ticks; opl.AdlBank = ~0u; // Ignore AdlBank number, use dynamic banks instead //std::printf("CMF deltas %u ticks %u, basictempo = %u\n", deltas, ticks, basictempo); - opl.LogarithmicVolumes = true; opl.AdlPercussionMode = true; opl.m_musicMode = OPL3::MODE_CMF; - opl.m_volumeScale = OPL3::VOLUME_CMF; + opl.m_volumeScale = OPL3::VOLUME_NATIVE; } else { @@ -456,10 +455,9 @@ riffskip: fr.seek(0x7D, SEEK_SET); TrackCount = 1; DeltaTicks = 60; - opl.LogarithmicVolumes = true; //opl.CartoonersVolumes = true; opl.m_musicMode = OPL3::MODE_RSXX; - opl.m_volumeScale = OPL3::VOLUME_CMF; + opl.m_volumeScale = OPL3::VOLUME_NATIVE; } } @@ -518,7 +516,10 @@ riffskip: TrackData.clear(); TrackData.resize(TrackCount, std::vector()); InvDeltaTicks = fraction(1, 1000000l * static_cast(DeltaTicks)); - Tempo = fraction(1, static_cast(DeltaTicks) * 2); + if(is_CMF || is_RSXX) + Tempo = fraction(1, static_cast(DeltaTicks)); + else + Tempo = fraction(1, static_cast(DeltaTicks) * 2); static const unsigned char EndTag[4] = {0xFF, 0x2F, 0x00, 0x00}; size_t totalGotten = 0; -- cgit v1.2.3 From 9c168b421e90bf34c5f32541965eb3ee555f4bd6 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Fri, 1 Jun 2018 02:08:46 +0300 Subject: Fix the build on OpenWatcom [the full-working compiling still not working yet due bug on OW side] --- src/adlmidi_load.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index 0c2fe48..54899c0 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -186,7 +186,7 @@ bool MIDIplay::LoadBank(MIDIplay::fileReader &fr) opl.dynamic_bank_setup.volumeModel = wopl->volume_model; m_setup.HighTremoloMode = -1; m_setup.HighVibratoMode = -1; - m_setup.VolumeModel = ADLMIDI_VolumeModels::ADLMIDI_VolumeModel_AUTO; + m_setup.VolumeModel = ADLMIDI_VolumeModel_AUTO; /* TODO: Avoid memory reallocation in nearest future! */ opl.dynamic_melodic_banks.clear(); -- cgit v1.2.3 From c4ed5cf15e64a84129865a58b5063ef0e73f0bcf Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Wed, 16 May 2018 14:27:04 +0200 Subject: bank storage inside dynamic map --- src/adlmidi_load.cpp | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index 54899c0..8deb3b9 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -72,7 +72,7 @@ bool MIDIplay::LoadBank(const void *data, size_t size) return LoadBank(file); } -static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, WOPLInstrument &in) +static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, const WOPLInstrument &in) { ins.voice2_fine_tune = 0.0; int8_t voice2_fine_tune = in.second_voice_detune; @@ -188,40 +188,32 @@ bool MIDIplay::LoadBank(MIDIplay::fileReader &fr) m_setup.HighVibratoMode = -1; m_setup.VolumeModel = ADLMIDI_VolumeModel_AUTO; - /* TODO: Avoid memory reallocation in nearest future! */ - opl.dynamic_melodic_banks.clear(); - opl.dynamic_percussion_banks.clear(); - opl.dynamic_metainstruments.clear(); - opl.dynamic_percussion_offset = 0; - opl.setEmbeddedBank(m_setup.AdlBank); - OPL3::BankMap *slots_banks[2] = { &opl.dynamic_melodic_banks, &opl.dynamic_percussion_banks}; uint16_t slots_counts[2] = {wopl->banks_count_melodic, wopl->banks_count_percussion}; WOPLBank *slots_src_ins[2] = { wopl->banks_melodic, wopl->banks_percussive }; - for(int ss = 0; ss < 2; ss++) + for(unsigned ss = 0; ss < 2; ss++) { - for(int i = 0; i < slots_counts[ss]; i++) + for(unsigned i = 0; i < slots_counts[ss]; i++) { - uint16_t bank = (slots_src_ins[ss][i].bank_midi_msb * 256) + slots_src_ins[ss][i].bank_midi_lsb; - size_t offset = slots_banks[ss]->size(); - (*slots_banks[ss])[bank] = offset; - + unsigned bankno = + (slots_src_ins[ss][i].bank_midi_msb * 256) + + slots_src_ins[ss][i].bank_midi_lsb + + (ss ? OPL3::PercussionTag : 0); + OPL3::Bank &bank = opl.dynamic_banks[bankno]; for(int j = 0; j < 128; j++) { - adlinsdata2 ins; + adlinsdata2 &ins = bank.ins[j]; std::memset(&ins, 0, sizeof(adlinsdata2)); WOPLInstrument &inIns = slots_src_ins[ss][i].ins[j]; cvt_WOPLI_to_FMIns(ins, inIns); - opl.dynamic_metainstruments.push_back(ins); } } } opl.AdlBank = ~0u; // Use dynamic banks! //Percussion offset is count of instruments multipled to count of melodic banks - opl.dynamic_percussion_offset = 128 * wopl->banks_count_melodic; applySetup(); WOPL_Free(wopl); @@ -379,8 +371,7 @@ riffskip: #endif //ADLMIDI_DISABLE_XMI_SUPPORT else if(std::memcmp(HeaderBuf, "CTMF", 4) == 0) { - opl.dynamic_instruments.clear(); - opl.dynamic_metainstruments.clear(); + opl.dynamic_banks.clear(); // Creative Music Format (CMF). // When playing CTMF files, use the following commandline: // adlmidi song8.ctmf -p -v 1 1 0 @@ -402,13 +393,19 @@ riffskip: //std::printf("%u instruments\n", ins_count); for(unsigned i = 0; i < ins_count; ++i) { + unsigned bank = i / 256; + bank = (bank & 127) + ((bank >> 7) << 8); + if(bank > 127 + (127 << 8)) + break; + bank += (i % 256 < 128) ? 0 : OPL3::PercussionTag; + unsigned char InsData[16]; fr.read(InsData, 1, 16); /*std::printf("Ins %3u: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", 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 adlinsdata2 adlins; + adlinsdata2 &adlins = opl.dynamic_banks[bank].ins[i % 128]; + adldata adl; adl.modulator_E862 = ((static_cast(InsData[8] & 0x07) << 24) & 0xFF000000) //WaveForm | ((static_cast(InsData[6]) << 16) & 0x00FF0000) //Sustain/Release @@ -430,7 +427,6 @@ riffskip: adlins.tone = 0; adlins.flags = 0; adlins.voice2_fine_tune = 0.0; - opl.dynamic_metainstruments.push_back(adlins); } fr.seeku(mus_start, SEEK_SET); -- cgit v1.2.3 From d7b9439df5d09d121c55a15f2bc25c360deeebe0 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Thu, 17 May 2018 21:33:28 +0200 Subject: dynamic instrument API --- src/adlmidi_load.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 4 deletions(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index 8deb3b9..ac9d51a 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -72,7 +72,8 @@ bool MIDIplay::LoadBank(const void *data, size_t size) return LoadBank(file); } -static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, const WOPLInstrument &in) +template +static void cvt_generic_to_FMIns(adlinsdata2 &ins, const WOPLI &in) { ins.voice2_fine_tune = 0.0; int8_t voice2_fine_tune = in.second_voice_detune; @@ -83,7 +84,7 @@ static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, const WOPLInstrument &in) else if(voice2_fine_tune == -1) ins.voice2_fine_tune = -0.000025; else - ins.voice2_fine_tune = ((voice2_fine_tune * 15.625) / 1000.0); + ins.voice2_fine_tune = voice2_fine_tune * (15.625 / 1000.0); } ins.tone = in.percussion_key_number; @@ -114,7 +115,8 @@ static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, const WOPLInstrument &in) ins.adl[0].feedconn = in.fb_conn1_C0; if(!fourOps) ins.adl[1] = ins.adl[0]; - else { + else + { ins.adl[1].finetune = in.note_offset2; ins.adl[1].feedconn = in.fb_conn2_C0; } @@ -123,6 +125,75 @@ static void cvt_WOPLI_to_FMIns(adlinsdata2 &ins, const WOPLInstrument &in) ins.ms_sound_koff = in.delay_off_ms; } +template +static void cvt_FMIns_to_generic(WOPLI &ins, const adlinsdata2 &in) +{ + ins.second_voice_detune = 0; + double voice2_fine_tune = in.voice2_fine_tune; + if(voice2_fine_tune != 0) + { + if(voice2_fine_tune > 0 && voice2_fine_tune <= 0.000025) + ins.second_voice_detune = 1; + else if(voice2_fine_tune < 0 && voice2_fine_tune >= -0.000025) + ins.second_voice_detune = -1; + else + { + long value = lround(voice2_fine_tune * (1000.0 / 15.625)); + value = (value < -128) ? -128 : value; + value = (value > +127) ? +127 : value; + ins.second_voice_detune = static_cast(value); + } + } + + ins.percussion_key_number = in.tone; + bool fourOps = (in.flags & adlinsdata::Flag_Pseudo4op) || in.adl[0] != in.adl[1]; + ins.inst_flags = fourOps ? WOPL_Ins_4op : 0; + ins.inst_flags|= (in.flags & adlinsdata::Flag_Pseudo4op) ? WOPL_Ins_Pseudo4op : 0; + ins.inst_flags|= (in.flags & adlinsdata::Flag_NoSound) ? WOPL_Ins_IsBlank : 0; + + for(size_t op = 0, slt = 0; op < (fourOps ? 4 : 2); op++, slt++) + { + ins.operators[op].waveform_E0 = static_cast(in.adl[slt].carrier_E862 >> 24); + ins.operators[op].susrel_80 = static_cast(in.adl[slt].carrier_E862 >> 16); + ins.operators[op].atdec_60 = static_cast(in.adl[slt].carrier_E862 >> 8); + ins.operators[op].avekf_20 = static_cast(in.adl[slt].carrier_E862 >> 0); + ins.operators[op].ksl_l_40 = in.adl[slt].carrier_40; + + op++; + ins.operators[op].waveform_E0 = static_cast(in.adl[slt].carrier_E862 >> 24); + ins.operators[op].susrel_80 = static_cast(in.adl[slt].carrier_E862 >> 16); + ins.operators[op].atdec_60 = static_cast(in.adl[slt].carrier_E862 >> 8); + ins.operators[op].avekf_20 = static_cast(in.adl[slt].carrier_E862 >> 0); + ins.operators[op].ksl_l_40 = in.adl[slt].carrier_40; + } + + ins.note_offset1 = in.adl[0].finetune; + ins.fb_conn1_C0 = in.adl[0].feedconn; + if(!fourOps) + { + ins.operators[2] = ins.operators[0]; + ins.operators[3] = ins.operators[1]; + } + else + { + ins.note_offset2 = in.adl[1].finetune; + ins.fb_conn2_C0 = in.adl[1].feedconn; + } + + ins.delay_on_ms = in.ms_sound_kon; + ins.delay_off_ms = in.ms_sound_koff; +} + +void cvt_ADLI_to_FMIns(adlinsdata2 &ins, const ADL_Instrument &in) +{ + return cvt_generic_to_FMIns(ins, in); +} + +void cvt_FMIns_to_ADLI(ADL_Instrument &ins, const adlinsdata2 &in) +{ + cvt_FMIns_to_generic(ins, in); +} + bool MIDIplay::LoadBank(MIDIplay::fileReader &fr) { int err = 0; @@ -207,7 +278,7 @@ bool MIDIplay::LoadBank(MIDIplay::fileReader &fr) adlinsdata2 &ins = bank.ins[j]; std::memset(&ins, 0, sizeof(adlinsdata2)); WOPLInstrument &inIns = slots_src_ins[ss][i].ins[j]; - cvt_WOPLI_to_FMIns(ins, inIns); + cvt_generic_to_FMIns(ins, inIns); } } } -- cgit v1.2.3 From 611aac1271c2e76b0ca634f136d8a7102ba94fd6 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sun, 3 Jun 2018 12:43:43 +0200 Subject: fix build under dynamic bank map and embedded banks disabled --- src/adlmidi_load.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index ac9d51a..c75bed4 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -318,7 +318,7 @@ bool MIDIplay::LoadMIDI(MIDIplay::fileReader &fr) errorString.clear(); #ifdef DISABLE_EMBEDDED_BANKS - if((opl.AdlBank != ~0u) || (opl.dynamic_metainstruments.size() < 256)) + if((opl.AdlBank != ~0u) || opl.dynamic_banks.empty()) { errorStringOut = "Bank is not set! Please load any instruments bank by using of adl_openBankFile() or adl_openBankData() functions!"; return false; -- cgit v1.2.3 From adcf702a7e18846ad4f8753ec5a32cf56585ca23 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Sun, 3 Jun 2018 15:46:50 +0300 Subject: Bugfixes - Fixed all MSVC 2015/2017 warnings in both 32 and 64 bit builds - Fixed weird behavior when using adl_setHVibrato, adl_setHTremolo, adl_setScaleModulators, and adl_setVolumeRangeModel when passing the -1 "Auto" state - Move arpeggio counter into the MIDIPlay class as originally it was a global static variable which is ugly and danger when running multiple instances of the same library --- src/adlmidi_load.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/adlmidi_load.cpp') diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index c75bed4..9e19ab6 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -93,7 +93,7 @@ static void cvt_generic_to_FMIns(adlinsdata2 &ins, const WOPLI &in) ins.flags|= (in.inst_flags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0; 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++) + for(size_t op = 0, slt = 0; op < static_cast(fourOps ? 4 : 2); op++, slt++) { ins.adl[slt].carrier_E862 = ((static_cast(in.operators[op].waveform_E0) << 24) & 0xFF000000) //WaveForm @@ -111,13 +111,13 @@ static void cvt_generic_to_FMIns(adlinsdata2 &ins, const WOPLI &in) ins.adl[slt].modulator_40 = in.operators[op].ksl_l_40;//KSLL } - ins.adl[0].finetune = in.note_offset1; + ins.adl[0].finetune = static_cast(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].finetune = static_cast(in.note_offset2); ins.adl[1].feedconn = in.fb_conn2_C0; } @@ -151,7 +151,7 @@ static void cvt_FMIns_to_generic(WOPLI &ins, const adlinsdata2 &in) ins.inst_flags|= (in.flags & adlinsdata::Flag_Pseudo4op) ? WOPL_Ins_Pseudo4op : 0; ins.inst_flags|= (in.flags & adlinsdata::Flag_NoSound) ? WOPL_Ins_IsBlank : 0; - for(size_t op = 0, slt = 0; op < (fourOps ? 4 : 2); op++, slt++) + for(size_t op = 0, slt = 0; op < static_cast(fourOps ? 4 : 2); op++, slt++) { ins.operators[op].waveform_E0 = static_cast(in.adl[slt].carrier_E862 >> 24); ins.operators[op].susrel_80 = static_cast(in.adl[slt].carrier_E862 >> 16); -- cgit v1.2.3