diff options
author | Wohlstand <admin@wohlnet.ru> | 2020-09-06 02:20:31 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2020-09-06 02:20:31 +0300 |
commit | 666ab37e10b335030e63469864538cba39d5c43b (patch) | |
tree | a665ce1931824093b2a629b42450f1cf2b683b01 /src/adlmidi_opl3.cpp | |
parent | 258d95474290cb6c8066504dafaa36a137ca2593 (diff) | |
download | libADLMIDI-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.cpp | 21 |
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; } |