shithub: choc

Download patch

ref: 37aae66760717b106acf602c180140096d95d036
parent: ae20311e3e6b6345db92bcec9f527c0b92c146f7
author: khokh2001 <alexeytf2@gmail.com>
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));
         }
     }
 }