aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2020-09-02 22:49:04 +0300
committerWohlstand <admin@wohlnet.ru>2020-09-02 22:49:04 +0300
commitd29b0cacf3e7a1da793fc2692a958dcf6c4b9c75 (patch)
tree38397165639eec8a5e6369b2a6aca733d6e6dd06
parentefdf769050aaf344ddac660386009b58fa156ad2 (diff)
downloadlibADLMIDI-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.cpp29
-rw-r--r--src/adlmidi_midiplay.cpp23
-rw-r--r--src/adlmidi_midiplay.hpp24
-rw-r--r--src/adlmidi_opl3.hpp2
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