2 * gus_vol.c - Compute volume for GUS.
6 #include "sound_config.h"
9 #define GUS_VOLUME gus_wave_volume
12 extern int gus_wave_volume
;
15 * Calculate gus volume from note velocity, main volume, expression, and
16 * intrinsic patch volume given in patch library. Expression is multiplied
17 * in, so it emphasizes differences in note velocity, while main volume is
18 * added in -- I don't know whether this is right, but it seems reasonable to
19 * me. (In the previous stage, main volume controller messages were changed
20 * to expression controller messages, if they were found to be used for
21 * dynamic volume adjustments, so here, main volume can be assumed to be
22 * constant throughout a song.)
24 * Intrinsic patch volume is added in, but if over 64 is also multiplied in, so
25 * we can give a big boost to very weak voices like nylon guitar and the
26 * basses. The normal value is 64. Strings are assigned lower values.
29 gus_adagio_vol (int vel
, int mainv
, int xpn
, int voicev
)
35 * A voice volume of 64 is considered neutral, so adjust the main volume if
36 * something other than this neutral value was assigned in the patch
39 x
= 256 + 6 * (voicev
- 64);
42 * Boost expression by voice volume above neutral.
46 xpn
+= (voicev
- 64) / 2;
49 * Combine multiplicative and level components.
51 x
= vel
* xpn
* 6 + (voicev
/ 4) * x
;
55 * Further adjustment by installation-specific master volume control
58 x
= (x
* GUS_VOLUME
* GUS_VOLUME
) / 10000;
61 #ifdef GUS_USE_CHN_MAIN_VOLUME
63 * Experimental support for the channel main volume
66 mainv
= (mainv
/ 2) + 64; /* Scale to 64 to 127 */
67 x
= (x
* mainv
* mainv
) / 16384;
73 return ((15 << 8) | 255);
76 * Convert to gus's logarithmic form with 4 bit exponent i and 8 bit
83 while (i
> 0 && n
< (1 << i
))
93 * Mantissa is part of linear volume not expressed in exponent. (This is
94 * not quite like real logs -- I wonder if it's right.)
99 * Adjust mantissa to 8 bits.
109 return ((i
<< 8) + m
);