ref: 37aae66760717b106acf602c180140096d95d036
parent: ae20311e3e6b6345db92bcec9f527c0b92c146f7
author: khokh2001 <[email protected]>
date: Wed Oct 29 13:03:45 EDT 2014
opl additive voice volume calculation fix opl additive voice volume calculation fix
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -507,6 +507,7 @@
static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume)
{
genmidi_voice_t *opl_voice;
+ unsigned int midi_volume;
unsigned int full_volume;
unsigned int car_volume;
unsigned int mod_volume;
@@ -517,8 +518,11 @@
// Multiply note volume and channel volume to get the actual volume.
- full_volume = (volume_mapping_table[voice->note_volume] * (2 * (volume_mapping_table[(voice->channel->volume * current_music_volume) / 127] + 1))) >> 9;
+ midi_volume = 2 * (volume_mapping_table[(voice->channel->volume
+ * current_music_volume) / 127] + 1);
+ full_volume = (volume_mapping_table[voice->note_volume] * midi_volume) >> 9;
+
// The volume value to use in the register:
car_volume = 0x3f - full_volume;
@@ -540,7 +544,8 @@
{
mod_volume = car_volume;
}
- OPL_WriteRegister(OPL_REGS_LEVEL + voice->op1, mod_volume | (opl_voice->modulator.scale & 0xc0));
+ OPL_WriteRegister(OPL_REGS_LEVEL + voice->op1,
+ mod_volume | (opl_voice->modulator.scale & 0xc0));
}
}
}