aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--include/adlmidi.h4
-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
-rw-r--r--utils/gen_adldata/file_formats/load_bnk.h2
-rw-r--r--utils/gen_adldata/progs_cache.h10
-rw-r--r--utils/midiplay/adlmidiplay.cpp10
10 files changed, 54 insertions, 23 deletions
diff --git a/README.md b/README.md
index 65218e5..484d1fd 100644
--- a/README.md
+++ b/README.md
@@ -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";
}
}