aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/adldata.cpp22
-rw-r--r--src/adlmidi_midiplay.cpp7
-rw-r--r--src/adlmidi_opl3.cpp14
-rw-r--r--src/adlmidi_opl3.hpp4
-rw-r--r--src/wopl/wopl_file.h3
5 files changed, 36 insertions, 14 deletions
diff --git a/src/adldata.cpp b/src/adldata.cpp
index 3e7b048..0f1f77b 100644
--- a/src/adldata.cpp
+++ b/src/adldata.cpp
@@ -14,18 +14,18 @@ const BanksDump::BankEntry g_embeddedBanks[] =
{
{0x0307, 1, 1, "AIL (Star Control 3, Albion, Empire 2, etc.)", 0, 1},
{0x0300, 1, 1, "Bisqwit (selection of 4op and 2op)", 2, 3},
- {0x0300, 1, 1, "HMI (Descent, Asterix)", 4, 5},
- {0x0300, 1, 1, "HMI (Descent:: Int)", 6, 7},
- {0x0300, 1, 1, "HMI (Descent:: Ham)", 8, 9},
- {0x0300, 1, 1, "HMI (Descent:: Rick)", 10, 11},
- {0x0300, 1, 1, "HMI (Descent 2)", 12, 13},
- {0x0300, 1, 1, "HMI (Normality)", 14, 15},
- {0x0300, 1, 1, "HMI (Shattered Steel)", 16, 17},
+ {0x0309, 1, 1, "HMI (Descent, Asterix)", 4, 5},
+ {0x0309, 1, 1, "HMI (Descent:: Int)", 6, 7},
+ {0x0309, 1, 1, "HMI (Descent:: Ham)", 8, 9},
+ {0x0309, 1, 1, "HMI (Descent:: Rick)", 10, 11},
+ {0x0309, 1, 1, "HMI (Descent 2)", 12, 13},
+ {0x0309, 1, 1, "HMI (Normality)", 14, 15},
+ {0x0309, 1, 1, "HMI (Shattered Steel)", 16, 17},
{0x0003, 1, 1, "HMI (Theme Park)", 18, 19},
- {0x0300, 1, 1, "HMI (3d Table Sports, Battle Arena Toshinden)", 20, 21},
- {0x0300, 1, 1, "HMI (Aces of the Deep)", 22, 23},
- {0x0300, 1, 1, "HMI (Earthsiege)", 24, 25},
- {0x0300, 1, 1, "HMI (Anvil of Dawn)", 26, 27},
+ {0x0309, 1, 1, "HMI (3d Table Sports, Battle Arena Toshinden)", 20, 21},
+ {0x0309, 1, 1, "HMI (Aces of the Deep)", 22, 23},
+ {0x0309, 1, 1, "HMI (Earthsiege)", 24, 25},
+ {0x0309, 1, 1, "HMI (Anvil of Dawn)", 26, 27},
{0x0002, 1, 1, "DMX (Doom 2)", 28, 29},
{0x0002, 1, 1, "DMX (Hexen, Heretic)", 30, 31},
{0x0002, 1, 1, "DMX (DOOM, MUS Play)", 32, 33},
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp
index a7fb4ed..843bdb2 100644
--- a/src/adlmidi_midiplay.cpp
+++ b/src/adlmidi_midiplay.cpp
@@ -1365,7 +1365,12 @@ int64_t MIDIplay::calculateChipChannelGoodness(size_t c, const MIDIchannel::Note
s -= 40000;
// If it's same instrument, better chance to get it when no free channels
if(chan.recent_ins == ins)
- s = (synth.m_musicMode == Synth::MODE_CMF) ? 0 : -koff_ms;
+ {
+ if(synth.m_musicMode == Synth::MODE_CMF || synth.m_volumeScale == Synth::VOLUME_HMI)
+ s = 0; // Re-use channel immediately
+ else
+ s = -koff_ms; // Wait until releasing sound will complete
+ }
return s;
}
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp
index d5ae1f3..334db43 100644
--- a/src/adlmidi_opl3.cpp
+++ b/src/adlmidi_opl3.cpp
@@ -634,6 +634,14 @@ void OPL3::touchNote(size_t c,
if(m_masterVolume < 127)
midiVolume = (midiVolume * m_masterVolume) / 127;
}
+
+ case Synth::VOLUME_HMI:
+ {
+ /* Temporarily copying DMX volume model. TODO: Reverse-engine the actual HMI volume model! */
+ volume = (channelVolume * channelExpression * m_masterVolume) / 16129;
+ volume = (s_dmx_volume_model[volume] + 1) << 1;
+ volume = (s_dmx_volume_model[(velocity < 128) ? velocity : 127] * volume) >> 9;
+ }
break;
}
@@ -985,6 +993,10 @@ void OPL3::setVolumeScaleModel(ADLMIDI_VolumeModels volumeModel)
case ADLMIDI_VolumeModel_9X_GENERIC_FM:
m_volumeScale = OPL3::VOLUME_9X_GENERIC_FM;
break;
+
+ case ADLMIDI_VolumeModel_HMI:
+ m_volumeScale = OPL3::VOLUME_HMI;
+ break;
}
}
@@ -1011,6 +1023,8 @@ ADLMIDI_VolumeModels OPL3::getVolumeScaleModel()
return ADLMIDI_VolumeModel_AIL;
case OPL3::VOLUME_9X_GENERIC_FM:
return ADLMIDI_VolumeModel_9X_GENERIC_FM;
+ case OPL3::VOLUME_HMI:
+ return ADLMIDI_VolumeModel_HMI;
}
}
diff --git a/src/adlmidi_opl3.hpp b/src/adlmidi_opl3.hpp
index ccc5c57..76edcc7 100644
--- a/src/adlmidi_opl3.hpp
+++ b/src/adlmidi_opl3.hpp
@@ -155,7 +155,9 @@ public:
//! Audio Interfaces Library volume scaling model
VOLUME_AIL,
//! Windows 9x Generic FM driver volume scale table
- VOLUME_9X_GENERIC_FM
+ VOLUME_9X_GENERIC_FM,
+ //! HMI Sound Operating System volume scale table
+ VOLUME_HMI
} m_volumeScale;
//! Reserved
diff --git a/src/wopl/wopl_file.h b/src/wopl/wopl_file.h
index 752d363..48cc665 100644
--- a/src/wopl/wopl_file.h
+++ b/src/wopl/wopl_file.h
@@ -60,7 +60,8 @@ typedef enum WOPL_VolumeModel
WOPL_VM_DMX_Fixed,
WOPL_VM_Apogee_Fixed,
WOPL_VM_AIL,
- WOPL_VM_Win9x_GenericFM
+ WOPL_VM_Win9x_GenericFM,
+ WOPL_VM_HMI
} WOPL_VolumeModel;
typedef enum WOPL_InstrumentFlags