diff options
author | Wohlstand <admin@wohlnet.ru> | 2020-09-02 22:49:04 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2020-09-02 22:49:04 +0300 |
commit | d29b0cacf3e7a1da793fc2692a958dcf6c4b9c75 (patch) | |
tree | 38397165639eec8a5e6369b2a6aca733d6e6dd06 | |
parent | efdf769050aaf344ddac660386009b58fa156ad2 (diff) | |
download | libADLMIDI-d29b0cacf3e7a1da793fc2692a958dcf6c4b9c75.tar.gz libADLMIDI-d29b0cacf3e7a1da793fc2692a958dcf6c4b9c75.tar.bz2 libADLMIDI-d29b0cacf3e7a1da793fc2692a958dcf6c4b9c75.zip |
When playing XMIDI files, set defaults of AIL
- Default volume in AIL is 127
- Default pitch bend sensitivity is a full octave up, and full octave down:
MSB=12, LSB=0
-rw-r--r-- | src/adlmidi_load.cpp | 29 | ||||
-rw-r--r-- | src/adlmidi_midiplay.cpp | 23 | ||||
-rw-r--r-- | src/adlmidi_midiplay.hpp | 24 | ||||
-rw-r--r-- | src/adlmidi_opl3.hpp | 2 |
4 files changed, 60 insertions, 18 deletions
diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index 3e790db..40e0d4c 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -181,7 +181,7 @@ bool MIDIplay::LoadMIDI_post() uint16_t ins_count = static_cast<uint16_t>(instruments.size()); for(uint16_t i = 0; i < ins_count; ++i) { - const uint8_t *InsData = instruments[i].data; + const uint8_t *insData = instruments[i].data; size_t bank = i / 256; bank = ((bank & 127) + ((bank >> 7) << 8)); if(bank > 127 + (127 << 8)) @@ -194,18 +194,18 @@ bool MIDIplay::LoadMIDI_post() adlinsdata2 &adlins = synth.m_insBanks[bank].ins[i % 128]; adldata adl; adl.modulator_E862 = - ((static_cast<uint32_t>(InsData[8] & 0x07) << 24) & 0xFF000000) //WaveForm - | ((static_cast<uint32_t>(InsData[6]) << 16) & 0x00FF0000) //Sustain/Release - | ((static_cast<uint32_t>(InsData[4]) << 8) & 0x0000FF00) //Attack/Decay - | ((static_cast<uint32_t>(InsData[0]) << 0) & 0x000000FF); //MultKEVA + ((static_cast<uint32_t>(insData[8] & 0x07) << 24) & 0xFF000000) //WaveForm + | ((static_cast<uint32_t>(insData[6]) << 16) & 0x00FF0000) //Sustain/Release + | ((static_cast<uint32_t>(insData[4]) << 8) & 0x0000FF00) //Attack/Decay + | ((static_cast<uint32_t>(insData[0]) << 0) & 0x000000FF); //MultKEVA adl.carrier_E862 = - ((static_cast<uint32_t>(InsData[9] & 0x07) << 24) & 0xFF000000) //WaveForm - | ((static_cast<uint32_t>(InsData[7]) << 16) & 0x00FF0000) //Sustain/Release - | ((static_cast<uint32_t>(InsData[5]) << 8) & 0x0000FF00) //Attack/Decay - | ((static_cast<uint32_t>(InsData[1]) << 0) & 0x000000FF); //MultKEVA - adl.modulator_40 = InsData[2]; - adl.carrier_40 = InsData[3]; - adl.feedconn = InsData[10] & 0x0F; + ((static_cast<uint32_t>(insData[9] & 0x07) << 24) & 0xFF000000) //WaveForm + | ((static_cast<uint32_t>(insData[7]) << 16) & 0x00FF0000) //Sustain/Release + | ((static_cast<uint32_t>(insData[5]) << 8) & 0x0000FF00) //Attack/Decay + | ((static_cast<uint32_t>(insData[1]) << 0) & 0x000000FF); //MultKEVA + adl.modulator_40 = insData[2]; + adl.carrier_40 = insData[3]; + adl.feedconn = insData[10] & 0x0F; adl.finetune = 0; adlins.adl[0] = adl; adlins.adl[1] = adl; @@ -246,11 +246,16 @@ bool MIDIplay::LoadMIDI_post() } else { + if(format == MidiSequencer::Format_XMIDI) + synth.m_musicMode = Synth::MODE_XMIDI; + synth.m_numChips = m_setup.numChips; if(m_setup.numFourOps < 0) adlCalculateFourOpChannels(this, true); } + resetMIDIDefaults(); + m_setup.tick_skip_samples_delay = 0; synth.reset(m_setup.emulator, m_setup.PCM_RATE, this); // Reset OPL3 chip //opl.Reset(); // ...twice (just in case someone misprogrammed OPL3 previously) diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 70e5854..f023414 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -200,11 +200,32 @@ void MIDIplay::resetMIDI() m_midiChannels.clear(); m_midiChannels.resize(16, MIDIchannel()); + resetMIDIDefaults(); + caugh_missing_instruments.clear(); caugh_missing_banks_melodic.clear(); caugh_missing_banks_percussion.clear(); } +void MIDIplay::resetMIDIDefaults(int offset) +{ + Synth &synth = *m_synth; + + for(size_t c = offset, n = m_midiChannels.size(); c < n; ++c) + { + MIDIchannel &ch = m_midiChannels[c]; + if(synth.m_musicMode == Synth::MODE_XMIDI) + { + ch.def_volume = 127; + ch.def_bendsense_lsb = 0; + ch.def_bendsense_msb = 12; + } + else + if(synth.m_musicMode == Synth::MODE_RSXX) + ch.def_volume = 127; + } +} + void MIDIplay::TickIterators(double s) { Synth &synth = *m_synth; @@ -257,7 +278,6 @@ void MIDIplay::realTime_ResetState() { MIDIchannel &chan = m_midiChannels[ch]; chan.resetAllControllers(); - chan.volume = (synth.m_musicMode == Synth::MODE_RSXX) ? 127 : 100; chan.vibpos = 0.0; chan.lastlrpn = 0; chan.lastmrpn = 0; @@ -1701,6 +1721,7 @@ size_t MIDIplay::chooseDevice(const std::string &name) size_t n = m_midiDevices.size() * 16; m_midiDevices.insert(std::make_pair(name, n)); m_midiChannels.resize(n + 16); + resetMIDIDefaults(n); return n; } diff --git a/src/adlmidi_midiplay.hpp b/src/adlmidi_midiplay.hpp index f7732fe..93b36e9 100644 --- a/src/adlmidi_midiplay.hpp +++ b/src/adlmidi_midiplay.hpp @@ -64,6 +64,10 @@ public: void partialReset(); void resetMIDI(); +private: + void resetMIDIDefaults(int offset = 0); + +public: /**********************Internal structures and classes**********************/ /** @@ -71,6 +75,13 @@ public: */ struct MIDIchannel { + //! Default MIDI volume + uint8_t def_volume; + //! Default LSB of a bend sensitivity + int def_bendsense_lsb; + //! Default MSB of a bend sensitivity + int def_bendsense_msb; + //! LSB Bank number uint8_t bank_lsb, //! MSB Bank number @@ -317,10 +328,10 @@ public: void resetAllControllers() { bend = 0; - bendsense_msb = 2; - bendsense_lsb = 0; + bendsense_msb = def_bendsense_msb; + bendsense_lsb = def_bendsense_lsb; updateBendSensitivity(); - volume = 100; + volume = def_volume; expression = 127; sustain = false; softPedal = false; @@ -369,8 +380,11 @@ public: --extended_note_count; } - MIDIchannel() - : activenotes(128) + MIDIchannel() : + def_volume(100), + def_bendsense_lsb(0), + def_bendsense_msb(2), + activenotes(128) { gliding_note_count = 0; extended_note_count = 0; diff --git a/src/adlmidi_opl3.hpp b/src/adlmidi_opl3.hpp index 83db8e1..81307d2 100644 --- a/src/adlmidi_opl3.hpp +++ b/src/adlmidi_opl3.hpp @@ -123,6 +123,8 @@ public: { //! MIDI mode MODE_MIDI, + //! AIL XMIDI mode + MODE_XMIDI, //! Id-Software Music mode MODE_IMF, //! Creative Music Files mode |