aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi_opl3.cpp
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2020-08-30 21:29:57 +0300
committerWohlstand <admin@wohlnet.ru>2020-08-30 21:35:21 +0300
commita21c9bb00abd359f5b9ea113e56ca74922e87e01 (patch)
treed706e389e8e25ea17285349acf52edf1e9dd3c77 /src/adlmidi_opl3.cpp
parentf8bf13beafd9f837212c08f38798a5e781d7b5e5 (diff)
downloadlibADLMIDI-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.cpp23
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;
}
}