diff options
author | Vitaly Novichkov <Wohlstand@users.noreply.github.com> | 2020-08-30 14:00:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-30 14:00:15 +0200 |
commit | 82fa5cb3e0859942fc6b353a3138aae8c10520a3 (patch) | |
tree | 28e99c08b430742c719f6b9bda236d29b650ffd8 /src/adlmidi_private.cpp | |
parent | 678be9ff7eb835087a426684a24f0e0172c9178d (diff) | |
parent | 6223286c01b83748f5c92cd21612e9eecc3d7525 (diff) | |
download | libADLMIDI-82fa5cb3e0859942fc6b353a3138aae8c10520a3.tar.gz libADLMIDI-82fa5cb3e0859942fc6b353a3138aae8c10520a3.tar.bz2 libADLMIDI-82fa5cb3e0859942fc6b353a3138aae8c10520a3.zip |
Merge pull request #232 from Wohlstand/wip-new-embedded-banks
Brand new embedded banks database format
Diffstat (limited to 'src/adlmidi_private.cpp')
-rw-r--r-- | src/adlmidi_private.cpp | 79 |
1 files changed, 57 insertions, 22 deletions
diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp index 1cd57aa..9478236 100644 --- a/src/adlmidi_private.cpp +++ b/src/adlmidi_private.cpp @@ -24,6 +24,8 @@ #include "adlmidi_midiplay.hpp" #include "adlmidi_opl3.hpp" #include "adlmidi_private.hpp" +#include "wopl/wopl_file.h" + std::string ADLMIDI_ErrorString; @@ -43,9 +45,9 @@ int adlCalculateFourOpChannels(MIDIplay *play, bool silent) bool rhythmModeNeeded = false; //Automatically calculate how much 4-operator channels is necessary -#ifndef DISABLE_EMBEDDED_BANKS - if(synth.m_embeddedBank == Synth::CustomBankTag) -#endif +//#ifndef DISABLE_EMBEDDED_BANKS +// if(synth.m_embeddedBank == Synth::CustomBankTag) +//#endif { //For custom bank Synth::BankMap::iterator it = synth.m_insBanks.begin(); @@ -67,25 +69,25 @@ int adlCalculateFourOpChannels(MIDIplay *play, bool silent) } } } -#ifndef DISABLE_EMBEDDED_BANKS - else - { - //For embedded bank - for(size_t a = 0; a < 256; ++a) - { - size_t insno = banks[play->m_setup.bankId][a]; - size_t div = a / 128; - if(insno == 198) - continue; - ++n_total[div]; - adlinsdata2 ins = adlinsdata2::from_adldata(::adlins[insno]); - if((ins.flags & adlinsdata::Flag_Real4op) != 0) - ++n_fourop[div]; - if(div && ((ins.flags & adlinsdata::Mask_RhythmMode) != 0)) - rhythmModeNeeded = true; - } - } -#endif +//#ifndef DISABLE_EMBEDDED_BANKS +// else +// { +// //For embedded bank +// for(size_t a = 0; a < 256; ++a) +// { +// size_t insno = banks[play->m_setup.bankId][a]; +// size_t div = a / 128; +// if(insno == 198) +// continue; +// ++n_total[div]; +// adlinsdata2 ins = adlinsdata2::from_adldata(::adlins[insno]); +// if((ins.flags & adlinsdata::Flag_Real4op) != 0) +// ++n_fourop[div]; +// if(div && ((ins.flags & adlinsdata::Mask_RhythmMode) != 0)) +// rhythmModeNeeded = true; +// } +// } +//#endif size_t numFourOps = 0; @@ -118,3 +120,36 @@ int adlCalculateFourOpChannels(MIDIplay *play, bool silent) return 0; } + +#ifndef DISABLE_EMBEDDED_BANKS +void adlFromInstrument(const BanksDump::InstrumentEntry &instIn, adlinsdata2 &instOut) +{ + instOut.voice2_fine_tune = 0.0; + if(instIn.secondVoiceDetune != 0) + instOut.voice2_fine_tune = (double)((((int)instIn.secondVoiceDetune + 128) >> 1) - 64) / 32.0; + + instOut.midi_velocity_offset = instIn.midiVelocityOffset; + instOut.tone = instIn.percussionKeyNumber; + instOut.flags = (instIn.instFlags & WOPL_Ins_4op) && (instIn.instFlags & WOPL_Ins_Pseudo4op) ? adlinsdata::Flag_Pseudo4op : 0; + instOut.flags|= (instIn.instFlags & WOPL_Ins_4op) && ((instIn.instFlags & WOPL_Ins_Pseudo4op) == 0) ? adlinsdata::Flag_Real4op : 0; + instOut.flags|= (instIn.instFlags & WOPL_Ins_IsBlank) ? adlinsdata::Flag_NoSound : 0; + instOut.flags|= instIn.instFlags & WOPL_RhythmModeMask; + + for(size_t op = 0; op < 2; op++) + { + if((instIn.ops[(op * 2) + 0] < 0) || (instIn.ops[(op * 2) + 1] < 0)) + break; + const BanksDump::Operator &op1 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 0]]; + const BanksDump::Operator &op2 = g_embeddedBanksOperators[instIn.ops[(op * 2) + 1]]; + instOut.adl[op].modulator_E862 = op1.d_E862; + instOut.adl[op].modulator_40 = op1.d_40; + instOut.adl[op].carrier_E862 = op2.d_E862; + instOut.adl[op].carrier_40 = op2.d_40; + instOut.adl[op].feedconn = (instIn.fbConn >> (op * 8)) & 0xFF; + instOut.adl[op].finetune = static_cast<int8_t>(op == 0 ? instIn.noteOffset1 : instIn.noteOffset2); + } + + instOut.ms_sound_kon = instIn.delay_on_ms; + instOut.ms_sound_koff = instIn.delay_off_ms; +} +#endif |