diff options
author | Wohlstand <admin@wohlnet.ru> | 2020-08-30 21:29:57 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2020-08-30 21:35:21 +0300 |
commit | a21c9bb00abd359f5b9ea113e56ca74922e87e01 (patch) | |
tree | d706e389e8e25ea17285349acf52edf1e9dd3c77 /src/adlmidi_opl3.cpp | |
parent | f8bf13beafd9f837212c08f38798a5e781d7b5e5 (diff) | |
download | libADLMIDI-a21c9bb00abd359f5b9ea113e56ca74922e87e01.tar.gz libADLMIDI-a21c9bb00abd359f5b9ea113e56ca74922e87e01.tar.bz2 libADLMIDI-a21c9bb00abd359f5b9ea113e56ca74922e87e01.zip |
Added "fixed" DMX and Apogee volume models
These volume models will apply the fix of AM voices behavior
Diffstat (limited to 'src/adlmidi_opl3.cpp')
-rw-r--r-- | src/adlmidi_opl3.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index d0f3953..68825bd 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -564,6 +564,7 @@ void OPL3::touchNote(size_t c, break; case Synth::VOLUME_DMX: + case Synth::VOLUME_DMX_FIXED: { volume = (channelVolume * channelExpression * m_masterVolume) / 16129; volume = (DMX_volume_mapping_table[volume] + 1) << 1; @@ -572,6 +573,7 @@ void OPL3::touchNote(size_t c, break; case Synth::VOLUME_APOGEE: + case Synth::VOLUME_APOGEE_FIXED: { volume = 0; midiVolume = (channelVolume * channelExpression * m_masterVolume / 16129); @@ -627,7 +629,9 @@ void OPL3::touchNote(size_t c, { tlCar -= volume / 2; } - else if(m_volumeScale == Synth::VOLUME_APOGEE && mode <= 1) + else if((m_volumeScale == Synth::VOLUME_APOGEE || + m_volumeScale == Synth::VOLUME_APOGEE_FIXED) && + mode <= 1) { // volume = ((64 * (velocity + 0x80)) * volume) >> 15; do_modulator = do_ops[mode][ 0 ] || m_scaleModulators; @@ -646,7 +650,10 @@ void OPL3::touchNote(size_t c, // to not work properly on AM instruments // The fix of this bug is just replacing of tlCar with tmMod // in this formula - tlMod = (midiVolume * tlCar) >> 15; + if(m_volumeScale == Synth::VOLUME_APOGEE_FIXED) + tlMod = (midiVolume * tlMod) >> 15; + else + tlMod = (midiVolume * tlCar) >> 15; tlMod ^= 63; } @@ -891,6 +898,14 @@ void OPL3::setVolumeScaleModel(ADLMIDI_VolumeModels volumeModel) case ADLMIDI_VolumeModel_9X: m_volumeScale = OPL3::VOLUME_9X; break; + + case ADLMIDI_VolumeModel_DMX_Fixed: + m_volumeScale = OPL3::VOLUME_DMX_FIXED; + break; + + case ADLMIDI_VolumeModel_APOGEE_Fixed: + m_volumeScale = OPL3::VOLUME_APOGEE_FIXED; + break; } } @@ -909,6 +924,10 @@ ADLMIDI_VolumeModels OPL3::getVolumeScaleModel() return ADLMIDI_VolumeModel_APOGEE; case OPL3::VOLUME_9X: return ADLMIDI_VolumeModel_9X; + case OPL3::VOLUME_DMX_FIXED: + return ADLMIDI_VolumeModel_DMX_Fixed; + case OPL3::VOLUME_APOGEE_FIXED: + return ADLMIDI_VolumeModel_APOGEE_Fixed; } } |