root/drivers/sound/gus_vol.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. gus_adagio_vol

   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][next][first][last][top][bottom][index][help] */
  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   /* 
  42    * Boost expression by voice volume above neutral. 
  43    */
  44   if (voicev > 65)
  45     xpn += voicev - 64;
  46   xpn += (voicev - 64) / 2;
  47 
  48   /* 
  49    * Combine multiplicative and level components. 
  50    */
  51   x = vel * xpn * 6 + (voicev / 4) * x;
  52 
  53 #ifdef GUS_VOLUME
  54   /* 
  55    * Further adjustment by installation-specific master volume control
  56    * (default 60).
  57    */
  58   x = (x * GUS_VOLUME * GUS_VOLUME) / 10000;
  59 #endif
  60 
  61 #ifdef GUS_USE_CHN_MAIN_VOLUME
  62   /*
  63    * Experimental support for the channel main volume
  64    */
  65 
  66    mainv = (mainv / 2) + 64;  /* Scale to 64 to 127 */
  67    x = (x * mainv * mainv) / 16384;
  68 #endif
  69 
  70   if (x < 2)
  71     return (0);
  72   else if (x >= 65535)
  73     return ((15 << 8) | 255);
  74 
  75   /* 
  76    * Convert to gus's logarithmic form with 4 bit exponent i and 8 bit
  77    * mantissa m.
  78    */
  79   n = x;
  80   i = 7;
  81   if (n < 128)
  82     {
  83       while (i > 0 && n < (1 << i))
  84         i--;
  85     }
  86   else
  87     while (n > 255)
  88       {
  89         n >>= 1;
  90         i++;
  91       }
  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.)
  95    */
  96   m = x - (1 << i);
  97 
  98   /* 
  99    * Adjust mantissa to 8 bits. 
 100    */
 101   if (m > 0)
 102     {
 103       if (i > 8)
 104         m >>= i - 8;
 105       else if (i < 8)
 106         m <<= 8 - i;
 107     }
 108 
 109   return ((i << 8) + m);
 110 }
 111 
 112 #endif

/* [previous][next][first][last][top][bottom][index][help] */