home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_05 / 2n05059a < prev    next >
Text File  |  1991-03-28  |  5KB  |  171 lines

  1.  
  2. /*******************************************************
  3. *  PlaySong - Play specified song or sound effect
  4. *  Parameters:
  5. *     nNumber - song number to play
  6. *
  7. *  Files:  song* in resource file
  8. *
  9. *  Notes:
  10. *  1.    MAX_SONGS is defined as maximum available songs
  11. *  2.    Voice 1 must be opened externally to this routine.
  12. *
  13. *  Copyright:
  14. *   Original code by William H. Roetzheim (619) 669-6970
  15. *   Copyright 1990 by William H. Roetzheim
  16. *   All rights reserved.
  17. ***********************************************************/
  18.  
  19. void    PlaySong (int nNumber)
  20. {
  21.    int             i;
  22.    char            szBuffer[255];
  23.    char            szTemp[6];
  24.    int             nDefault;
  25.    int             nNote;
  26.    int             nDuration;
  27.    int             nDot;
  28.    int             nPointer;
  29.    int             nOctave;
  30.    int             nSpeedAdjust;
  31.  
  32.  
  33.    StopSound ();   /* stop old song, if any */
  34.    i = LoadString (hInstance, IDS_SONG0 + nNumber, 
  35.                   szBuffer, 250);
  36.    szBuffer[i] = 0;
  37.  
  38.    /* Change queue size based on length of song */
  39.    nPointer = 0;
  40.    while (isdigit (szBuffer[nPointer]))
  41.    {
  42.          szTemp[nPointer] = szBuffer[nPointer];
  43.          nPointer++;
  44.    }
  45.    szTemp[nPointer] = 0;
  46.    i = atoi (szTemp);
  47.    i += 20;      /* safety margin */
  48.    i *= 8;       /* 8 bytes per note */
  49.    SetVoiceQueueSize (1, i);
  50.  
  51.    nDefault = 1;   /* default note duration */
  52.    while (nPointer < lstrlen (szBuffer))
  53.    {
  54.          switch (szBuffer[nPointer++])
  55.          {
  56.              case 'O':     /* octave */
  57.                    szTemp[0] = szBuffer[nPointer++];
  58.                    if (isdigit(szBuffer[nPointer]))
  59.                    {
  60.                        szTemp[1] = szBuffer[nPointer++];
  61.                        szTemp[2] = 0;
  62.                    }
  63.                    else szTemp[1] = 0;
  64.                    nOctave = 12 * (atoi (szTemp));
  65.                    continue;
  66.  
  67.              case 'S':     /* Speed adjust */
  68.                    szTemp[0] = szBuffer[nPointer++];
  69.                    if (isdigit(szBuffer[nPointer]))
  70.                    {
  71.                        szTemp[1] = szBuffer[nPointer++];
  72.                        szTemp[2] = 0;
  73.                    }
  74.                    else szTemp[1] = 0;
  75.                    nSpeedAdjust = atoi (szTemp);
  76.                    continue;
  77.  
  78.              case 'L':     /* reset default duration */
  79.                    szTemp[0] = szBuffer[nPointer++];
  80.                    if (isdigit(szBuffer[nPointer]))
  81.                    {
  82.                        szTemp[1] = szBuffer[nPointer++];
  83.                        szTemp[2] = 0;
  84.                    }
  85.                    else szTemp[1] = 0;
  86.                    nDefault = atoi (szTemp);
  87.                    continue;
  88.  
  89.              case 'A':
  90.                    nNote = 1;
  91.                    break;
  92.  
  93.              case 'B':
  94.                    nNote = 3;
  95.                    break;
  96.  
  97.              case 'C':
  98.                    nNote = 5;
  99.                    break;
  100.  
  101.              case 'D':
  102.                    nNote = 6;
  103.                    break;
  104.  
  105.              case 'E':
  106.                    nNote = 8;
  107.                    break;
  108.  
  109.              case 'F':
  110.                    nNote = 10;
  111.                    break;
  112.  
  113.              case 'G':
  114.                    nNote = 12;
  115.                    break;
  116.  
  117.              case 'R':     /* rest */
  118.                    nNote = 0;
  119.                    break;
  120.  
  121.              default:
  122.                    continue;
  123.          }
  124.  
  125.          /* check for sharps */
  126.          if ((szBuffer[nPointer] == '#') || (szBuffer[nPointer] 
  127.               == '+'))
  128.          {
  129.              nNote++;
  130.              nPointer++;
  131.          }
  132.          else if (szBuffer[nPointer] == '-')    /* and flats */
  133.          {
  134.              nNote--;
  135.              nPointer++;
  136.          }
  137.  
  138.          /* See if duration is explicitely called out */
  139.          if (isdigit (szBuffer[nPointer]))
  140.          {
  141.              i = 0;
  142.              szTemp[i++] = szBuffer[nPointer++];
  143.              if (isdigit (szBuffer[nPointer])) szTemp[i++] = 
  144.                 szBuffer[nPointer++];
  145.              szTemp[i] = 0;
  146.              nDuration = atoi (szTemp);
  147.          }
  148.          else nDuration = nDefault;
  149.  
  150.          /* Dotted note? */
  151.          nDot = 0;
  152.          if (szBuffer[nPointer] == '.')
  153.          {
  154.              nDot = 1;
  155.              nPointer++;
  156.          }
  157.  
  158.          SetVoiceNote (1, nNote + nOctave, nDuration * 
  159.                        nSpeedAdjust, nDot);
  160.    }
  161.    /* Optional unless you use GetThresholdStatus() */
  162.    SetVoiceThreshold (1, 0);
  163.  
  164.    StartSound ();
  165. }
  166.  
  167.  
  168.  
  169.  
  170.  
  171.