home *** CD-ROM | disk | FTP | other *** search
/ Sound Sensations! / sound_sensations.iso / miscprog / mvsrc / music.c < prev    next >
Text File  |  1990-12-23  |  3KB  |  138 lines

  1. /* Music on PC demonstration program */
  2.  
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <dos.h>
  7.  
  8.  
  9. #define BASENOTE 440.00     /* frequency of la in octave 3 */
  10. #define BASEOCTAVE 3
  11. #define K 1.0595   /* k^12=2 -- constant of the geometric sequence of note frequencies */
  12. #define OCTAVESIZE 12 /* number of notes in octave */
  13. #define BASENOTENUM 11  /* number of LA */
  14.  
  15.  
  16.  
  17. typedef struct {
  18.      char octave;
  19.      char note;
  20.      char stacatto;
  21.      unsigned length;
  22.    } NOTEREC;
  23.  
  24.                       /* function prototypes */
  25.  
  26. displaynotes ();
  27. playnotes ();
  28. displaynote (NOTEREC *currentnote);
  29. playnote (unsigned note, unsigned octave, unsigned length, unsigned stacatto);
  30. beep (unsigned freq, unsigned length);
  31.  
  32.  
  33.  
  34.  
  35. main (int argc, char *argv [])
  36. {
  37.    int i;
  38.  
  39.  
  40.    if ()
  41.    playnotes ();
  42.    fcloseall ();
  43.    exit (0);
  44. }
  45.  
  46. displaynotes ()
  47. {
  48.    NOTEREC *currentnote;
  49.    FILE *notefile;
  50.  
  51.    if (notefile = fopen ("D:\\TC\\PROGRAMS\\NOTES.MUS","rb")) {
  52.          while (! feof (notefile))
  53.             {
  54.                fread (currentnote, sizeof (NOTEREC), 1, notefile);
  55.                displaynote (currentnote);
  56.             }
  57.  
  58.          fclose (notefile);
  59.       }
  60.  
  61. }
  62.  
  63.  
  64. playnotes ()
  65. {
  66.    NOTEREC *currentnote;
  67.    FILE *notefile;
  68.    int notecount;
  69.  
  70.    if (notefile = fopen ("D:\\TC\\PROGRAMS\\NOTES.MUS","rb")) {
  71.          
  72.          notecount = 0;
  73.          while ((! feof (notefile)) && (bioskey (1) == 0))
  74.             {
  75.                fread (currentnote, sizeof (NOTEREC), 1, notefile);
  76.                playnote ((unsigned) (currentnote -> note),
  77.                          (unsigned) (currentnote -> octave),
  78.                          (unsigned) (currentnote -> length),
  79.                          (unsigned) (currentnote -> stacatto));
  80.  
  81.                notecount++;
  82.                if (notecount == 116)
  83.                   notecount = notecount;
  84.             }
  85.  
  86.          fclose (notefile);
  87.       }
  88. }
  89.  
  90.  
  91. displaynote (NOTEREC *currentnote)
  92. {
  93.    printf ("\nOctave: %d", (int) currentnote -> octave);
  94.    printf ("\nNote: %d", (int) currentnote -> note);
  95.    printf ("\nStacatto: %d", (int) currentnote -> stacatto);
  96.    printf ("\nLength: %d", (int) currentnote -> length);
  97. }
  98.  
  99. playnote (unsigned note, unsigned octave, unsigned length, unsigned stacatto)
  100. {
  101.    unsigned freq;  /* frequency of the note to be played            */
  102.    int diff;  /* number of notes between the note to be played */
  103.                    /* and the LA of the 3rd octave                  */
  104.  
  105.    
  106.  
  107.    if (note == 13)
  108.       delay (length);  /* rest period */
  109.          else
  110.             {  /* audible note */
  111.                if (octave > BASEOCTAVE)
  112.                   diff = (OCTAVESIZE - BASENOTENUM) + note + (octave - BASEOCTAVE - 1) * OCTAVESIZE;
  113.                      else
  114.                         if (octave < BASEOCTAVE)
  115.                            diff = - (BASENOTENUM + (OCTAVESIZE - note) + (BASEOCTAVE - octave - 1) * OCTAVESIZE);
  116.                               else
  117.                                  diff = note - BASENOTENUM;   /* note is in the base octave */
  118.  
  119.  
  120.  
  121.                freq = (unsigned) (BASENOTE * pow (K, diff));
  122.  
  123.                beep (freq, length - stacatto);
  124.                delay (stacatto);
  125.  
  126.             }  /* audible note */
  127.  
  128. }
  129.  
  130. beep (unsigned freq, unsigned length)
  131. {
  132.    nosound ();
  133.    sound (freq);
  134.    delay (length);
  135.    nosound ();
  136. }
  137.  
  138.