foxygit / doom Log in
commit 37aae66760717b106acf602c180140096d95d036
Author:     khokh2001 <alexeytf2@gmail.com>
AuthorDate: Wed Oct 29 17:03:45 2014 +0900
Commit:     khokh2001 <alexeytf2@gmail.com>
CommitDate: Wed Oct 29 17:03:45 2014 +0900

    opl additive voice volume calculation fix

    opl additive voice volume calculation fix
---
 src/i_oplmusic.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/i_oplmusic.c b/src/i_oplmusic.c
index 39517e3f..128cff18 100644
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -507,6 +507,7 @@ static void SetVoiceInstrument(opl_voice_t *voice,
 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,7 +518,10 @@ static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume)

     // 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 @@ static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume)
             {
                 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));
         }
     }
 }