1 /*
2 * gus_vol.c - Compute volume for GUS.
3 *
4 * Greg Lee 1993.
5 */
6 #include "sound_config.h"
7 #ifndef EXCLUDE_GUS
8
9 #define GUS_VOLUME gus_wave_volume
10
11
12 extern int gus_wave_volume;
13
14 /*
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.)
23 *
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.
27 */
28 unsigned short
29 gus_adagio_vol (int vel, int mainv, int xpn, int voicev)
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
30 {
31 int i, m, n, x;
32
33
34 /*
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
37 * library.
38 */
39 x = 256 + 6 * (voicev - 64);
40
41 /* Boost expression by voice volume above neutral. */
42 if (voicev > 65)
43 xpn += voicev - 64;
44 xpn += (voicev - 64) / 2;
45
46 /* Combine multiplicative and level components. */
47 x = vel * xpn * 6 + (voicev / 4) * x;
48
49 #ifdef GUS_VOLUME
50 /*
51 * Further adjustment by installation-specific master volume control
52 * (default 50).
53 */
54 x = (x * GUS_VOLUME * GUS_VOLUME) / 10000;
55 #endif
56
57 if (x < (1 << 11))
58 return (11 << 8);
59 else if (x >= 65535)
60 return ((15 << 8) | 255);
61
62 /*
63 * Convert to gus's logarithmic form with 4 bit exponent i and 8 bit
64 * mantissa m.
65 */
66 n = x;
67 i = 7;
68 if (n < 128)
69 {
70 while (i > 0 && n < (1 << i))
71 i--;
72 }
73 else
74 while (n > 255)
75 {
76 n >>= 1;
77 i++;
78 }
79 /*
80 * Mantissa is part of linear volume not expressed in exponent. (This is
81 * not quite like real logs -- I wonder if it's right.)
82 */
83 m = x - (1 << i);
84
85 /* Adjust mantissa to 8 bits. */
86 if (m > 0)
87 {
88 if (i > 8)
89 m >>= i - 8;
90 else if (i < 8)
91 m <<= 8 - i;
92 }
93
94 /* low volumes give occasional sour notes */
95 if (i < 11)
96 return (11 << 8);
97
98 return ((i << 8) + m);
99 }
100
101 #endif