From f3dd9a6e69ba4ddc1359287754029f588db249df Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Sun, 6 Sep 2020 00:56:41 +0300 Subject: Added an aproximated HMI volume model --- src/adldata.cpp | 22 +++++++++++----------- src/adlmidi_midiplay.cpp | 7 ++++++- src/adlmidi_opl3.cpp | 14 ++++++++++++++ src/adlmidi_opl3.hpp | 4 +++- src/wopl/wopl_file.h | 3 ++- 5 files changed, 36 insertions(+), 14 deletions(-) (limited to 'src') 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 -- cgit v1.2.3