diff options
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | include/adlmidi.h | 4 | ||||
-rw-r--r-- | src/adldata.cpp | 22 | ||||
-rw-r--r-- | src/adlmidi_midiplay.cpp | 7 | ||||
-rw-r--r-- | src/adlmidi_opl3.cpp | 14 | ||||
-rw-r--r-- | src/adlmidi_opl3.hpp | 4 | ||||
-rw-r--r-- | src/wopl/wopl_file.h | 3 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_bnk.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/progs_cache.h | 10 | ||||
-rw-r--r-- | utils/midiplay/adlmidiplay.cpp | 10 |
10 files changed, 54 insertions, 23 deletions
@@ -190,6 +190,7 @@ To build that example you will need to have installed SDL2 library. * Added AIL volume model * Added Generic FM variant of Win9X volume model * Fixed an incorrect work of CC-121 (See https://github.com/Wohlstand/libADLMIDI/issues/227 for details) + * Added an aproximal simulation of HMI volume model (TODO: Research an actual HMI volume model and fix it!) ## 1.4.0 2018-10-01 * Implemented a full support for Portamento! (Thanks to [Jean Pierre Cimalando](https://github.com/jpcima) for a work!) diff --git a/include/adlmidi.h b/include/adlmidi.h index ae52c82..055265a 100644 --- a/include/adlmidi.h +++ b/include/adlmidi.h @@ -121,7 +121,9 @@ enum ADLMIDI_VolumeModels /*! Audio Interfaces Library volume scaling model */ ADLMIDI_VolumeModel_AIL = 8, /*! Aproximated and shorted volume map table (Generic FM driver). Similar to general, but has less granularity. */ - ADLMIDI_VolumeModel_9X_GENERIC_FM = 9 + ADLMIDI_VolumeModel_9X_GENERIC_FM = 9, + /*! HMI Sound Operating System volume scaling model */ + ADLMIDI_VolumeModel_HMI = 10 }; /** 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 diff --git a/utils/gen_adldata/file_formats/load_bnk.h b/utils/gen_adldata/file_formats/load_bnk.h index 29f5494..0aa41ac 100644 --- a/utils/gen_adldata/file_formats/load_bnk.h +++ b/utils/gen_adldata/file_formats/load_bnk.h @@ -27,7 +27,7 @@ bool BankFormats::LoadBNK(BanksDump &db, const char *fn, unsigned bank, } std::fclose(fp); - size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_Generic); + size_t bankDb = db.initBank(bank, bankTitle, BanksDump::BankEntry::SETUP_HMI); BanksDump::MidiBank bnk; /*printf("%s:\n", fn);*/ diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h index c2ade65..668c253 100644 --- a/utils/gen_adldata/progs_cache.h +++ b/utils/gen_adldata/progs_cache.h @@ -113,7 +113,9 @@ struct BanksDump WOPL_VM_Win9x, WOPL_VM_DMX_Fixed, WOPL_VM_Apogee_Fixed, - WOPL_VM_AIL + WOPL_VM_AIL, + WOPL_VM_Win9x_GeneralFM, + WOPL_VM_HMI } WOPL_VolumeModel; /** @@ -122,13 +124,15 @@ struct BanksDump enum BankSetup { SETUP_Generic = 0x0300, - SETUP_Win9X = 0x0304, + SETUP_Win9X = 0x0304, // SB16 + SETUP_Win9XGF = 0x0308, // GeneralFM SETUP_DMX = 0x0002, SETUP_Apogee = 0x0003, SETUP_AIL = 0x0307, SETUP_IBK = 0x0301, SETUP_IMF = 0x0200, - SETUP_CMF = 0x0201 + SETUP_CMF = 0x0201, + SETUP_HMI = 0x0309 }; uint_fast16_t bankSetup = SETUP_Generic; // 0xAABB, AA - OPL flags, BB - Volume model diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp index c4738e1..fe54877 100644 --- a/utils/midiplay/adlmidiplay.cpp +++ b/utils/midiplay/adlmidiplay.cpp @@ -213,17 +213,19 @@ const char* volume_model_to_str(int vm) case ADLMIDI_VolumeModel_DMX: return "DMX"; case ADLMIDI_VolumeModel_APOGEE: - return "Apogee"; + return "Apogee Sound System"; case ADLMIDI_VolumeModel_9X: return "9X (SB16)"; case ADLMIDI_VolumeModel_DMX_Fixed: - return "DMX (fixed)"; + return "DMX (fixed AM voices)"; case ADLMIDI_VolumeModel_APOGEE_Fixed: - return "Apogee (fixed)"; + return "Apogee Sound System (fixed AM voices)"; case ADLMIDI_VolumeModel_AIL: - return "AIL"; + return "Audio Interfaces Library (AIL)"; case ADLMIDI_VolumeModel_9X_GENERIC_FM: return "9X (Generic FM)"; + case ADLMIDI_VolumeModel_HMI: + return "HMI"; } } |