* added 0.99 linux version
[mascara-docs.git] / i386 / linux / linux-0.99 / drivers / sound / gus_vol.c
blobea3ece3582162ee74b49cc38b670f7eea04f4fe2
1 /*
2 * gus_vol.c - Compute volume for GUS.
3 *
4 * Greg Lee 1993.
5 */
6 #include "sound_config.h"
7 #ifndef EXCLUDE_GUS
9 #define GUS_VOLUME gus_wave_volume
12 extern int gus_wave_volume;
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.)
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.
28 unsigned short
29 gus_adagio_vol (int vel, int mainv, int xpn, int voicev)
31 int i, m, n, x;
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.
39 x = 256 + 6 * (voicev - 64);
41 /*
42 * Boost expression by voice volume above neutral.
44 if (voicev > 65)
45 xpn += voicev - 64;
46 xpn += (voicev - 64) / 2;
48 /*
49 * Combine multiplicative and level components.
51 x = vel * xpn * 6 + (voicev / 4) * x;
53 #ifdef GUS_VOLUME
54 /*
55 * Further adjustment by installation-specific master volume control
56 * (default 60).
58 x = (x * GUS_VOLUME * GUS_VOLUME) / 10000;
59 #endif
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;
68 #endif
70 if (x < 2)
71 return (0);
72 else if (x >= 65535)
73 return ((15 << 8) | 255);
75 /*
76 * Convert to gus's logarithmic form with 4 bit exponent i and 8 bit
77 * mantissa m.
79 n = x;
80 i = 7;
81 if (n < 128)
83 while (i > 0 && n < (1 << i))
84 i--;
86 else
87 while (n > 255)
89 n >>= 1;
90 i++;
92 /*
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.)
96 m = x - (1 << i);
98 /*
99 * Adjust mantissa to 8 bits.
101 if (m > 0)
103 if (i > 8)
104 m >>= i - 8;
105 else if (i < 8)
106 m <<= 8 - i;
109 return ((i << 8) + m);
112 #endif