aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi_opl3.cpp
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2020-09-06 02:20:31 +0300
committerWohlstand <admin@wohlnet.ru>2020-09-06 02:20:31 +0300
commit666ab37e10b335030e63469864538cba39d5c43b (patch)
treea665ce1931824093b2a629b42450f1cf2b683b01 /src/adlmidi_opl3.cpp
parent258d95474290cb6c8066504dafaa36a137ca2593 (diff)
downloadlibADLMIDI-666ab37e10b335030e63469864538cba39d5c43b.tar.gz
libADLMIDI-666ab37e10b335030e63469864538cba39d5c43b.tar.bz2
libADLMIDI-666ab37e10b335030e63469864538cba39d5c43b.zip
Attempt to closely aproximate HMI volume model
Diffstat (limited to 'src/adlmidi_opl3.cpp')
-rw-r--r--src/adlmidi_opl3.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp
index 334db43..96fa707 100644
--- a/src/adlmidi_opl3.cpp
+++ b/src/adlmidi_opl3.cpp
@@ -239,6 +239,22 @@ static const uint_fast32_t s_ail_vel_graph[16] =
106, 109, 112, 115, 118, 121, 124, 127
};
+//! a VERY APROXIMAL HMI volume model, TODO: Research accurate one!
+static const uint_fast32_t s_hmi_volume_table[128] =
+{
+ 0x3f, 0x3f, 0x3a, 0x35, 0x35, 0x30, 0x30, 0x2c, 0x2c, 0x29, 0x29,
+ 0x25, 0x25, 0x24, 0x24, 0x23, 0x23, 0x22, 0x21, 0x21, 0x20, 0x20,
+ 0x1f, 0x1f, 0x1e, 0x1e, 0x1d, 0x1d, 0x1c, 0x1c, 0x1b, 0x1b, 0x1a,
+ 0x1a, 0x1a, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x17, 0x17, 0x17,
+ 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x14, 0x13,
+ 0x13, 0x13, 0x13, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10,
+ 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x07, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04,
+ 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00
+};
enum
{
@@ -634,13 +650,14 @@ void OPL3::touchNote(size_t c,
if(m_masterVolume < 127)
midiVolume = (midiVolume * m_masterVolume) / 127;
}
+ break;
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;
+ volume = (((velocity < 128) ? velocity : 127) * volume) / 127;
+ volume = 63 - s_hmi_volume_table[volume];
}
break;
}