home *** CD-ROM | disk | FTP | other *** search
/ Sound Sensations! / sound_sensations.iso / miscprog / pmusic11 / poly.doc < prev    next >
Text File  |  1989-07-04  |  61KB  |  1,337 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.             Polyphonic Music Compiler 1.10
  8.              Polyphonic Music Player
  9.  
  10.               Copyright (c) 1989 GrigaSoft Productions
  11.  
  12.                 _____________________________________________
  13.                /                                             \
  14.              -*> FOR UPDATES FROM VERSION 1.00 SEE THE FILE: <*-
  15.              -*>                UPDATE.TXT                   <*-
  16.              -*> ALL UPDATED MATERIAL THAT IS DOCUMENTED IN  <*-
  17.              -*>  UPDATE.TXT IS MARKED '(UPDATED)' IN THIS   <*-
  18.              -*>                  MANUAL                     <*-
  19.                \_____________________________________________/
  20.  
  21.                  IF YOU HAVE ANYTHING YOU'D LIKE TO SEE DONE
  22.                  WITH THIS PACKAGE (SPECIFIC SONG CODINGS,
  23.                  NEW APPLICATION IDEAS, ETC.) PLEASE CONTACT 
  24.                  THE AUTHOR (EDWARD GRIGASSY, (512)385-1368)
  25.                  [call collect if you have to!]. For more
  26.                  personal info see section 7.5 of this maunal.
  27.  
  28.  
  29.  
  30.  
  31.        
  32.         INTRODUCTION
  33.         ------------
  34.  
  35.              Welcome to the world of polyphonic music!  Recently several
  36.         programmers working seperately have discovered and implemented
  37.         the amazing ability to play three (count 'em) independent voices
  38.         on the cheap IBM PC/AT/Clone speaker. Why is this amazing? Well,
  39.         for years any IBM "Music" program was laughed at by experts simply
  40.         because all the software could do was drone out a simple (not to
  41.         mention, dull) melody. Lately the techniques to play three notes
  42.         at a time, allowing true chords and harmony, has been developed.
  43.         This package exemplifies the continued refining of these
  44.         techniques.
  45.  
  46.         CREDITS
  47.         -------
  48.  
  49.             Steve Muenter: wrote the original assembly algorithm
  50.                            for playing three notes at once,
  51.             Ted Holden: informed me of this algorithm and his program
  52.                         VMUSIC inspired all my work
  53.  
  54.         TABLE OF CONTENTS
  55.         -----------------
  56.  
  57.         Subject                                                 Section
  58.         -------                                                 -------
  59.         What's included ......................................... 1.0
  60.         What is Polyphonic Music? ............................... 2.0
  61.         MakePoly Compiler ....................................... 3.0
  62.            Explanation .......................................... 3.1
  63.            Use .................................................. 3.2
  64.               Requirements ...................................... 3.21
  65.               Starting MakePoly / Command Line .................. 3.22
  66.               Text File Format / Syntax ......................... 3.23
  67.         PlayPoly Player ......................................... 4.0
  68.            Explanation .......................................... 4.1
  69.            Use .................................................. 4.2
  70.               Requirements ...................................... 4.21
  71.               Starting PlayPoly / Command Line .................. 4.22
  72.         Other Polyphonic Music Programs ......................... 5.0
  73.            AutoHarp ............................................. 5.1
  74.            LoopPoly ............................................. 5.2
  75.            SoundEff ............................................. 5.3
  76.            TimeCHK .............................................. 5.4
  77.         Using the Polyphonic C library .......................... 6.0
  78.            The Library Routines ................................. 6.1
  79.            Using the Polyphonic Music Library ................... 6.2
  80.            How to use the Library Routines ...................... 6.3
  81.         Author's Note ........................................... 7.0
  82.            Program Development .................................. 7.1
  83.            Program Features ..................................... 7.2
  84.            Program Info ......................................... 7.3
  85.            Future Enhancements .................................. 7.4
  86.            Author's Corner ...................................... 7.5
  87.  
  88.  
  89.  1.0    WHAT'S INCLUDED
  90.         ---------------
  91.  
  92.         Included in this current version of Polyphonic Music are the
  93.         following files:
  94.  
  95.         MAKEPOLY.EXE    -- The textfile to polyfile compiler
  96.         PLAYPOLY.EXE    -- The polyfile player
  97.         LOOPPOLY.EXE    -- The polyfile player which repeats until
  98.                            a key is pressed
  99.         AUTOHARP.EXE    -- The executable version of an example of
  100.                            how to use the Polyphonic Music C interface.
  101.         SOUNDEFF.EXE    -- A sound effect program which uses the Poyphonic
  102.                            Music C interface.
  103.         TIMECHK.EXE     -- The executable version of an example of
  104.                            how to use the processor speed-checking functions
  105.                            of the Polyphonic Music library.
  106.         AUTOHARP.C      -- The source code of AUTOHARP.EXE.
  107.         SOUNDEFF.C      -- The source code of SOUNDEFF.EXE.
  108.         TIMECHK.C       -- The source code of TIMECHK.EXE.
  109.         POLYCOMP.BAT    -- An example compilation batch file for
  110.                            a C program calling the Polyphonic Music functions
  111.         POLY.H          -- The header file for the Polyphonic Music C 
  112.                            library
  113.         POLYCHRD.H      -- The header file for defining the array constants
  114.                            of lots of chords
  115.         POLY.LIB        -- The Polyphonic Music C interface library. 
  116.         NPOLY_S.OBJ     -- The UPDATED C extended function poly() (small 
  117.                    memory model)
  118.         NTRIT_S.OBJ     -- The UPDATEED C extended function tritone() (small
  119.                    memory model)
  120.         POLYFUNC.OBJ    -- The other C functions in the Polyphonic Music
  121.                            library
  122.         SIMPTEST.PLY    -- A polyfile song that is probably the first three-
  123.                            voice song ever heard on an IBM (see 7.1 - 
  124.                            PROGRAM DEVELOPEMENT)
  125.         TRIPTEST.SNG    -- An example song file that displays use of
  126.                            simulated triplets
  127.         POLY.DOC        -- The documentation file you are reading
  128.         *.SNG, *.PLY    -- Various song files to play
  129.  
  130.  
  131.  2.0    WHAT IS POLYPHONIC MUSIC?
  132.         -------------------------
  133.  
  134.              The Polyphonic Music programs are an innovative system
  135.         for allowing three voice music to be played on the IBM PC and 
  136.         compatibles. The package provides several uses of Polyphonic 
  137.         Music for the user. These are:
  138.  
  139.         o A command line controlled jukebox, in which the user simply
  140.           compiles (MakePoly.exe) and plays (PlayPoly.exe) his/her
  141.           songs,
  142.  
  143.         o A batch file enhancer, which can play three part music while
  144.           waiting for a keypress, and
  145.  
  146.         o A C programming language enhancer, which allows three voice
  147.           music to be played within a C program until a keypress is 
  148.           detected.
  149.  
  150.           [See section 7.4 - Future Enhancements for uses soon to be 
  151.           implemmented!]
  152.  
  153.              The Polyphonic Music programs use two techniques to play
  154.         music. The first is the ability to compile a text file with
  155.         commands similar to the IBM BASIC PLAY statement into a ".ply"
  156.         file format which can be directly played from the command line,
  157.         batch files, or even from within your C programs themselves.
  158.         The second technique is only usable within C programs. It involves
  159.         defining the music to be played within the program (in array form).
  160.         This second method may be preferrable if the song is short or
  161.         if the programmer doesn't wish to access external files.
  162.  
  163.  
  164.  3.0    MAKEPOLY COMPILER
  165.         -----------------
  166.  
  167.    3.1  EXPLANATION
  168.         -----------
  169.  
  170.              The MAKEPOLY.EXE file, when run, compiles text (ascii)
  171.         files into files in a ".PLY" format which can then be directly
  172.         read by other Polyphonic Music programs. This program is necessary
  173.         to translate a file of ascii music commands into the raw 
  174.         frequencies that the computer can play.
  175.  
  176.    3.2  USE
  177.         ---
  178.         
  179.         3.21    REQUIREMENTS
  180.                 ------------
  181.  
  182.                      The MAKEPOLY.EXE program will run in MS-DOS (and
  183.                 compatibles) 2.0 or later. It needs less than 80K of
  184.                 memory depending on the size of the text file being
  185.                 compiled (usually needs 15K to 64K). It can be run from
  186.                 either a floppy diskette or a hard disk. To work
  187.                 properly, a text file of music commands (see 3.23 - TEXT
  188.                 FILE FORMAT / SYNTAX) is required. (For more information
  189.                 on errors, see 3.24 - MAKEPOLY ERRORS.)
  190.  
  191.         3.22    STARTING MAKEPOLY / COMMAND LINE
  192.                 --------------------------------
  193.  
  194.                 To run MakePoly, make sure you are in the directory
  195.                 where MAKEPOLY.EXE resides. Enter the following command 
  196.                 at the DOS prompt:
  197.  
  198.                 MAKEPOLY <file1> [<file2>]
  199.  
  200.                 where:
  201.                    <file1> = the name of the text file which contains
  202.                              the Polyphonic Music commands (see 3.23 -
  203.                              TEXT FILE FORMAT / SYNTAX).
  204.                              This is the file to be compiled.
  205.                    <file2> = the name of the output ".ply" file which
  206.                              contains the raw music (frequencies, and
  207.                              durations) which can then be played by
  208.                              other Polyphonic Music routines, such as
  209.                              PLAYPOLY.EXE (this name is optional)
  210.  
  211.                 Note: If no extension is given on <file1> and/or <file2>,
  212.                       MAKEPOLY assumes ".SNG" (song) for <file1>,
  213.                                    and ".PLY" (poly or play) for <file2>.
  214.                       Also, if the <file2> parameter is not given,
  215.                       MAKEPOLY will attempt to add the ".PLY" extension
  216.                       to <file1>.
  217.  
  218.                 Examples:
  219.                    to compile a file named "SIMPTEST.SNG":
  220.  
  221.                    MAKEPOLY simptest
  222.  
  223.                    to compile a file named "ODE"
  224.  
  225.                    MAKEPOLY ode. ode.ply
  226.  
  227.         3.23    TEXT FILE FORMAT / SYNTAX
  228.                 -------------------------
  229.  
  230.                 MAKEPOLY compiles a file in a special format.
  231.                 The file is made up of ascii text with certain ascii
  232.                 characters representing certain music commands.
  233.  
  234.                 The commands can be in upper or lower case.
  235.  
  236.                 The commands have been derived directly from recent 
  237.                 versions of the IBM BASIC "PLAY" command (although a few
  238.                 new commands have been added).
  239.  
  240.                 Here is a list of the commands that MAKEPOLY will
  241.                 compile:
  242.  
  243.                 On  --  Sets the octave of subsequent note output. Any 
  244.                         integer n is allowed, but values between 0 and 
  245.                         6 are recommended. The value 3 is the octave 
  246.                         containing middle C (the only C written without 
  247.                         ledger lines in the Treble Clef). Octaves n < 3 
  248.                         are lower in pitch, while those with n > 3 
  249.                         are higher in pitch. Each octave contains 
  250.                         the notes from C to B (ascending).
  251.  
  252.                         (note: if not specified MAKEPOLY assumes 3)
  253.  
  254.                         Example: O4  -> sets subsequent note output to
  255.                                         the octave above middle C
  256.  
  257.                 Ln  --  Sets the default note length. The integer n
  258.                         can be one of the following:
  259.  
  260.                                 1  -- representing a whole note
  261.                                 2  -- half note
  262.                                 4  -- quarter note
  263.                                 8  -- eigth note
  264.                                 16 -- sixteenth note
  265.                                 32 -- thirty-secondth note
  266.                                 64 -- sixty-fourth note
  267.  
  268.                         (note: n can be other values between 1 and 64, see
  269.                                7.2 - PROGRAM FEATURES (discussion on 
  270.                                triplets) for details)
  271.  
  272.                         The number n is the length any subsequent note
  273.                         which doesn't have an explicit length following it
  274.                         will be assigned. (This is useful when a piece 
  275.                         comprises largely of one type of note length.)
  276.  
  277.                         (note: if not specified MAKEPOLY assumes 4)
  278.  
  279.                         Example: L4  -> sets default note length to quarter
  280.                                         notes
  281.  
  282.                 Tn  --  (UPDATED)
  283.                         Changes the current tempo for all subsequent notes. 
  284.                         See the file: UPDATE.TXT
  285.  
  286.                         This command, as well as the K command, can be 
  287.                         embedded in any voice. The tempo of all three voices 
  288.                         is changed at the point the Tn command is found.
  289.  
  290.                 >,< --  Raise current octave up, down. The command > raises
  291.                         the current octave set by the O command, while the
  292.                         command < lowers it. The current octave is raised
  293.                         or lowered by 1.
  294.  
  295.                 Vn  --  Set subsequent notes to be played by voice n.
  296.                         The integer n can ONLY have the values 1, 2, or 3.
  297.                         
  298.                         All the following notes will be programmed to play
  299.                         in voice n, until another Vn is found with a different 
  300.                         value for n.
  301.  
  302.                         (note: an error occurs when you attempt to play
  303.                                notes before setting which voice to play them
  304.                                on; no voice is assumed as default)
  305.  
  306.                         Any combination of the three voices is allowed,
  307.                         including ommission of 1 or more of them.
  308.  
  309.                         Example: V1  -> sets up voice 1 to play the
  310.                                         subsequent notes
  311.  
  312.                 K   --  Check the keyboard for a keypress. This command
  313.                         will abort the playing of the song if a key has
  314.                         been pressed. The playing routine will only abort
  315.                         in the place where the K command is specified.
  316.                         This command can be in any place in the song and
  317.                         it causes the player to check if a key pressed,
  318.                         and abort if so, at that point in the song.
  319.  
  320.                         Example: V1EEKEF  -> check for a keypress
  321.                                              after playing two 'E' notes
  322.                                              (if no key pressed, play 'EF')
  323.  
  324.                 *..*    (UPDATED)
  325.                         Allow a user comment. All text in between two 
  326.                         asterixes is ignored by the compiler. 
  327.  
  328.                         This is useful if the music scorer needs to mark a
  329.                         section of music or explain something about what he
  330.                         is scoring.
  331.  
  332.                         Example: *voice1:*  V1O3 AB   -> The words "voice1:"
  333.                                                          are ignored (skipped
  334.                                                          over) by MAKEPOLY
  335.  
  336.                         
  337.                 Notes are entered in the following manner:
  338.  
  339.                 <N>[#,+,-][n][.[.[. etc.]]] 
  340.  
  341.                 where:
  342.                    <N>  = the name of the note. This may be one of
  343.                           the following letters ONLY:
  344.  
  345.                           A,B,C,D,E,F,G  -- musical notes
  346.                           P,R            -- rests (pauses, silences)
  347.  
  348.                    [#,+,-]  = optional note modifier. 
  349.  
  350.                               #,+ -- makes the note "sharp"
  351.                               -   -- makes the note "flat"
  352.                                      (note: B# (or B+) = C, E# (or E+) = F,
  353.                                             and C- = B, F- = E)
  354.  
  355.                    [n] = the optional note length. Can be of the possible
  356.                          values described under the L command. If n is not
  357.                          included, MAKEPOLY assumes the default note length
  358.                          set by the last L command.
  359.  
  360.                    [.[.[. etc.]]] = the optional dots on the note. Each dot
  361.                                     modifies the note's length by adding
  362.                                     1/2 of the current value. There is no
  363.                                     limit to the number of dots modifying
  364.                                     any given note.
  365.  
  366.                 Examples:
  367.                           e       -- play note 'e'
  368.                           f#4     -- play 'f sharp' for a quarter note length
  369.                                      duration
  370.                           a+8.    -- play a dotted 'a sharp' eighth note
  371.                           b-      -- play 'b flat' for default duration
  372.                                      specified by last L command
  373.  
  374.  4.0    PLAYPOLY POLYPHONIC MUSIC PLAYER
  375.         --------------------------------
  376.  
  377.     4.1 EXPLANATION
  378.         -----------
  379.  
  380.              The PLAYPOLY.EXE file, when run, plays a ".ply" file
  381.         in polyphonic (three voice) sound. The ".ply" file is a special
  382.         file format that cannot be adjusted or modified directly; it
  383.         is only for use by the Polyphonic Music playing routines.
  384.  
  385.     4.2 USE
  386.         ---
  387.         
  388.         4.21    REQUIREMENTS
  389.                 ------------
  390.  
  391.                      The PLAYPOLY.EXE program will run in MS-DOS (and
  392.                 compatibles) 2.0 or later. It needs less than 80K of
  393.                 memory depending on the size of the ".ply" file being
  394.                 played (usually 15K to 64K). It can be run from
  395.                 either a floppy diskette or a hard disk. To work
  396.                 properly a ".ply" file must be specified. This file
  397.                 must be in a specific machine-readable format.
  398.  
  399.         4.22    STARTING PLAYPOLY / COMMAND LINE
  400.                 --------------------------------
  401.  
  402.                 To run PlayPoly, make sure you are in the directory
  403.                 where PLAYPOLY.EXE resides. Enter the following command 
  404.                 at the DOS prompt:
  405.  
  406.                 PLAYPOLY <file1> [tval,/c,/s]
  407.  
  408.                 where:
  409.                    <file1> = the name of the ".ply" file which contains
  410.                              the Polyphonic Music in raw form. Such a
  411.                              file can only be created by the MakePoly 
  412.                              compiler.
  413.                              This is the file to be played.
  414.  
  415.                    One of the following optional 2nd parameters may be used:
  416.                    tval    = the tempo you would like to set PlayPoly
  417.                              to play at. If not given, PLAYPOLY assumes
  418.                              1024. This can be any positive number ranging
  419.                              up to 65535. The lower the number, the
  420.                              faster the tempo. Included in the Polyphonic
  421.                              Music package is a program called TIMECHK.EXE
  422.                              which will approximate a good tempo value for
  423.                              your system (see 5.4 - TIMECHK).
  424.                              (UPDATED)
  425.                    /C      = the song's starting tempo is determined
  426.                              by a processor speed determining routine.
  427.                    /S      = same as /C, except the status line "PLAYPOLY.EXE:
  428.                              Checking processor speed..." is not displayed.
  429.  
  430.                 Note: If no extension is given on <file1>,
  431.                       PLAYPOLY assumes ".PLY" (for "poly" or "play").
  432.  
  433.                 Examples:
  434.                    to play a file named "SIMPTEST.PLY":
  435.  
  436.                    PLAYPOLY simptest
  437.  
  438.                    to play a file named "ODE.JOY"
  439.  
  440.                    PLAYPOLY ode.joy
  441.  
  442.                    to play a file named "INVENT13.PLY" at tempo = 512
  443.  
  444.                    PLAYPOLY invent13 512
  445.  
  446.                    to play a file named "INVENT13.PLY" and set the tempo
  447.                         according to the processor speed
  448.  
  449.                    PLAYPOLY invent13 /c
  450.         
  451.  
  452.  5.0    OTHER POLYPHONIC MUSIC PROGRAMS
  453.         -------------------------------
  454.  
  455.     5.1 AUTOHARP
  456.         --------
  457.  
  458.              As you may have noticed, several other mysterious programs
  459.         have reared their ugly heads in this package. The first one,
  460.         AUTOHARP is an interesting attepmt to breathe creativity into the
  461.         PC speaker. 
  462.  
  463.              Run it by entering AUTOHARP at the DOS prompt (in the drive/
  464.         directory where AUTOHARP.EXE is located). The keyboard layout
  465.         screen comes up.
  466.  
  467.              To use this program, play your favorite chord progression
  468.         by pressing the keys representing the chords you want. The top
  469.         row of the keyboard (numbers) will play all your major chords.
  470.         The next row plays minor chords, and the third plays diminished
  471.         chords. By pressing <Shift> along with any key used plays a 
  472.         seventh of the chord in question. For instance, to play a G7 chord
  473.         (that's G DOMINANT 7, to be specific), press <Shift '-'>.
  474.  
  475.              One other note: the tempo of the chord was set in the 
  476.         POLYCHRD.H include file and its a good speed for an IBM PCXT but 
  477.         may be way too fast for a quick processor. If you wamt to change 
  478.         the tempo modify the source code and recompile it.
  479.  
  480.              Side note: the way in which all those chords were defined is
  481.         kind of nasty (they're defined in POLYCHORD.H). A much better 
  482.         solution for chord playing would be to have some sort of template for
  483.         the form of each chord, and then make a key change appropriately.
  484.         
  485.              A discussion of the procedures called in AUTOHARP.C can be found
  486.         in 6.1 - THE LIBRARY ROUTINES.
  487.  
  488.     5.2 LOOPPOLY
  489.         --------
  490.  
  491.              This program is identical to PLAYPOLY.EXE in every way except
  492.         that at the end of a song it plays it over if a key has not been 
  493.         pressed. This is useful in batch files while waiting for user input.
  494.         
  495.              One other note, the ascii value of the key pressed which
  496.         ended the program is returned in the DOS variable "errorlevel", and
  497.         can be accessed in batch files.
  498.  
  499.     5.3 SOUNDEFF
  500.         --------
  501.         
  502.              This program just uses the Polyphonic Music library function
  503.         "tritone()" to sound as much like an airplane (with a propellor)
  504.         (or something else very peculiar) as it can.
  505.  
  506.     5.4 TIMECHK
  507.         -------
  508.         
  509.              TIMECHK.EXE is a very useful tool in the Polyphonic Music world.
  510.         Not only will it benchmark your computer, but it gives you an
  511.         accurate tempo value to set playback of your ".ply" files.
  512.  
  513.              You run TIMECHK.EXE by typing TIMECHK at the DOS prompt and
  514.         pressing enter. After a few seconds of processor intensive checking
  515.         routines, TIMECHK returns the number of hundredths of a second that
  516.         your processor completed these tasks in. Also it evaluates an 
  517.         approximate Polyphonic Music tempo value from this count.
  518.  
  519.              Just for comparison, I ran this on some of the machines around
  520.         the office:
  521.                                   Hund. of Secs.      Poly. Tempo
  522.         IBM original PC                45                 465
  523.         Turbo XT clone                 20                1024
  524.         IBM original AT                14                1462
  525.         IBM PC + 286 charge card       13                1706
  526.         IBM PS2 model 50                8                2560
  527.         286 machine                     6                3413
  528.         386 machine                     3                6820
  529.  
  530.              The best use for this value is in making a batch file for
  531.         your player files. For instance, if you had the 386 machine, you
  532.         could call PLAYPOLY with a batch file PLAY.BAT that looks like 
  533.         the following:
  534.  
  535.         PLAYPOLY %1 6820
  536.         
  537.              Note: If your computer is so fast that the hundredths of a
  538.         second value is 2 or lower, you may have to experiment with large
  539.         tempos (7000 or above) to find the correct value for your computer.
  540.  
  541.              A discussion of the C functions used in the source code
  542.         of TIMECHK can be found in section 6.1 - THE LIBRARY ROUTINES.
  543.  
  544.  6.0    USING THE POLYPHONIC C LIBRARY
  545.         ------------------------------
  546.         
  547.     6.1 THE LIBRARY ROUTINES
  548.         -------------------- 
  549.  
  550.              The Polyphonic library consists of several functions that
  551.         can be directly accessed within your C program source code and
  552.         can be then linked in to your executable modlues. Since not all
  553.         C compilers are the same, I've included both the .LIB file 
  554.         (POLY.LIB) containing all the enhancement functions, and its
  555.         component .OBJ files. 
  556.  
  557.              All the functions are defined in the header file POLY.H, and
  558.         are supported in POLY.LIB. Within this package only near pointers are
  559.         accounted for. Any LARGE structures will probably not work. You can 
  560.         order the Large memory model versions of these functions (see the
  561.         text file included in this package: REGISTER.TXT).
  562.  
  563.  
  564.         Here are descriptions of the Polyphonic Music functions:
  565.  
  566.         -------------------------------------------------------------------
  567.  
  568.         #include <poly.h>
  569.  
  570.         int playpoly(plyfilename, defaulttempo)
  571.         char *plyfilename;                         -- DOS path to play
  572.         int defaulttempo;                          -- beginning tempo
  573.  
  574.         Object module: polyfunc.obj+poly.obj
  575.  
  576.         Description:
  577.         
  578.         The playpoly routine, when passed a legal filename (of the
  579.         proper ".ply" type), and a beginning tempo, will play the three-
  580.         voice song defined by the data in the ".ply" file.
  581.  
  582.         The playpoly routine can only read files of the type created by
  583.         the MAKEPOLY.EXE program. 
  584.  
  585.         If a file extension is not specified in the string plyfilename,
  586.         a ".ply" is assumed. 
  587.  
  588.         The default tempo must be in the range of 1 (very fast) to 65535
  589.         (very slow). This value is the starting tempo of the music
  590.         file when played. (UPDATED)
  591.  
  592.         This routine will allocate memory and read in the file. If successful,
  593.         it will close the file and play the entire file until completion.
  594.         Then the allocated memory is freed. 
  595.  
  596.         A keypress may abort the playing if such an action was provided for
  597.         in the text version of the song (see 'K' command, section 3.23 -
  598.         TEXT FILE FORMAT / SYNTAX).
  599.  
  600.         Return value: 
  601.         
  602.         playpoly() returns a 0 (zero) if no errors occured during play.
  603.         If an error does occur, an appropriate message is written to stderr,
  604.         and a value of -1 (0xFF) is returned.
  605.  
  606.         See Also: looppoly(), polytempo()
  607.  
  608.         Example:
  609.            
  610.         #include <stdio.h>
  611.         #include <poly.h>
  612.  
  613.         main()
  614.         {
  615.            printf(" 'Ode to Joy'. Press any key to stop repititions.... ");
  616.            while (!kbhit())
  617.               playpoly( "ode", polytempo(10,250) );
  618.            printf("\r\n");
  619.         }
  620.         
  621.         -------------------------------------------------------------------
  622.  
  623.         #include <poly.h>
  624.  
  625.         int looppoly(plyfilename, defaulttempo)
  626.         char *plyfilename;                         -- DOS path to play
  627.         int defaulttempo;                          -- beginning tempo
  628.  
  629.         Object module: polyfunc.obj+poly.obj
  630.  
  631.         Description:
  632.         
  633.         The looppoly routine, when passed a legal filename (of the
  634.         proper ".ply" type), and a beginning tempo, will play the three-
  635.         voice song defined by the data in the ".ply" file. It will play
  636.         the song reptitively until a key has been pressed.
  637.  
  638.         The looppoly routine can only read files of the type created by
  639.         the MAKEPOLY.EXE program. 
  640.  
  641.         If a file extension is not specified in the string plyfilename,
  642.         a ".ply" is assumed. 
  643.  
  644.         The default tempo must be in the range of 1 (very fast) to 65535
  645.         (very slow). This value is the starting tempo of the music
  646.         file when played. (UPDATED)
  647.  
  648.         This routine will allocate memory and read in the file. If successful,
  649.         it will close the file and play the entire file until completion.
  650.         If a key has not been pressed, it will start playing again.
  651.         When a key press is detected, the allocated memory is freed. 
  652.         The keyboard is only checked every time the song ends!
  653.  
  654.         A keypress may abort the playing DURING the song if such an action 
  655.         was provided for in the text version of the song (see 'K' command,
  656.         section 3.23 - TEXT FILE FORMAT / SYNTAX).
  657.  
  658.         Return value: 
  659.         
  660.         looppoly() returns the ascii/scan value (getch()) of the keypress 
  661.         detected. If an error occurs, an appropriate message is written to 
  662.         stderr, and a value of -1 (0xFF) is returned.
  663.         
  664.         See Also: playpoly(), polytempo()
  665.  
  666.         Example:
  667.            
  668.         #include <stdio.h>
  669.         #include <poly.h>
  670.  
  671.         main()
  672.         {
  673.            printf(" 'Ode to Joy'. Press any key to stop repetitions.... ");
  674.            looppoly( "ode", polytempo(10,250) );
  675.            printf("\r\n");
  676.         }
  677.         
  678.         -------------------------------------------------------------------
  679.  
  680.         #include <poly.h>
  681.              
  682.         unsigned timetest(sizechk)
  683.         int sizechk;                       -- number of nodes to test
  684.  
  685.         Object module: polyfunc.obj+poly.obj
  686.  
  687.         Description:
  688.  
  689.         The routine timetest() is used to determine the current processor's
  690.         speed. The function itself does several processor intensive tasks
  691.         on an array of size sizechk, and returns the amount of hundredths
  692.         of seconds required by the processor.
  693.  
  694.         The sizechk parameter determines the size of a mallocated array
  695.         and thus the complexity and length (in time) of the test. The larger
  696.         this value is, the longer the test will take, the more memory it
  697.         will require, and the more accurate the return value will be.
  698.  
  699.         Return value:
  700.  
  701.         timetest() returns the number of hundreths of a second required to
  702.         complete several processor intensive routines.
  703.  
  704.         On fast machines, sizechk values below 300 can often return 0. 
  705.  
  706.         See also: processval(), polytempo()
  707.  
  708.         Example: 
  709.  
  710.         #include <stdio.h>
  711.         #include <poly.h>
  712.         
  713.         main()
  714.         {
  715.         int numnodes;
  716.  
  717.            printf("How many nodes to test? ");
  718.            scanf("%d", &numnodes);
  719.            printf("\r\n");
  720.            printf("Test completed in %d hundreths of a second.\r\n", 
  721.                   timetest(numnodes));
  722.         }
  723.         
  724.         -------------------------------------------------------------------
  725.  
  726.         #include <poly.h>
  727.         
  728.         unsigned processval( times, nodes )
  729.         int times;                           -- number of times to run test
  730.         int nodes;                           -- number of nodes to use
  731.  
  732.         Object module: polyfunc.obj+poly.obj
  733.  
  734.         Description:
  735.  
  736.         This routine runs the timetest() routine the number of times sent
  737.         in the 'times' parameter using arrays of 'nodes' size. It then 
  738.         returns the average of all the tests to give a processor dependent 
  739.         value which can be used to portably move your programs from computer
  740.         to computer, adjusting program speed by means of a ratio of processor
  741.         value to your original value.
  742.  
  743.         This technique was used in the PlayPoly routines.
  744.  
  745.         Return value:
  746.  
  747.         The amount of hundreths of a second, on average, the processor took
  748.         to do the timetest() function 'times' times, with 'nodes' nodes.
  749.  
  750.         See also: timetest(), polytempo()
  751.  
  752.         Example: SEE the included file TIMECHK.C for an example of this 
  753.                  routine.
  754.  
  755.         -------------------------------------------------------------------
  756.  
  757.         #include <poly.h>
  758.         
  759.         unsigned polytempo( times, nodes )
  760.         int times;                           -- number of times to run test
  761.         int nodes;                           -- number of nodes to use
  762.  
  763.         Object module: polyfunc.obj+poly.obj
  764.  
  765.         Description:
  766.  
  767.         This routine runs the timetest() routine the number of times sent
  768.         in the times parameter using arrays of nodes size. It then returns
  769.         an approximate value which is the optimum polyphonic tempo for
  770.         the current processor to play at. This function allows portability
  771.         of all the PlayPoly routines that require a tempo value, as the
  772.         processor which is about to do the playing can be tested for speed
  773.         first.
  774.  
  775.         This technique was used in the PlayPoly routines.
  776.  
  777.         Return value:
  778.  
  779.         The approximate optimum tempo for the PlayPoly routines to play at.
  780.         (note: this function involves division and if the processval()
  781.                function returns a 0 because of a very fast processor,
  782.                this function will cause a division by zero error)
  783.  
  784.         See also: timetest(), processval()
  785.  
  786.         Example: SEE the included file TIMECHK.C for an example of this 
  787.                  routine.
  788.  
  789.         -------------------------------------------------------------------
  790.  
  791.         #include <poly.h>
  792.         
  793.         void poly( song )  (UPDATED)
  794.         int *song;                  -- array of ".ply" format music to play
  795.  
  796.         Object module: npoly_s.obj
  797.  
  798.         Description:
  799.  
  800.         This routine plays the array of integers pointed to by song.
  801.         This routine drives the PC speaker. The integer array is in a 
  802.         special format. Each value in the array means a specific command 
  803.         to the function.
  804.  
  805.         THE FIRST VALUE IN THE ARRAY IS THE TEMPO TO BEGIN PLAY AT.
  806.  
  807.         The constant values below are defined in the POLY.H file.
  808.         The value that accompanies each comand is ORed (|) into the
  809.         low 13 bits of the integer.
  810.  
  811.         A value of:         Means:
  812.           TCHANGE             modify the starting tempo (see UPDATE.TXT
  813.                               with value being equivalent to the n in
  814.                               the updated version of the Tn command)
  815.           V1                  set the frequency of voice 1 to value
  816.           V2                  set the frequency of voice 2 to value
  817.           V3                  set the frequency of voice 3 to value
  818.           KBCHECK             check the keyboard buffer to see if a key
  819.                               has been pressed
  820.           DUR                 play the three voices (set by V1..V3) for
  821.                               a duration of DUR * Current_Tempo
  822.           STOP                quit playing, return to calling program
  823.  
  824.         A song is played by setting the tempo, setting the three voices, and
  825.         setting the duration (which then plays the three voices), until a
  826.         STOP value is encountered. 
  827.  
  828.         Return value:
  829.  
  830.         There is no return value.
  831.  
  832.         See also: tritone(), playpoly()
  833.  
  834.         Example: SEE the included file AUTOHARP.C and POLYCHRD.H for an 
  835.                  example of this routine.
  836.  
  837.         -------------------------------------------------------------------
  838.         
  839.         #include <poly.h>
  840.  
  841.         void tritone(tempo, v1, v2, v3, duration)
  842.         int tempo;                        -- the tempo to play at
  843.         int v1, v2, v3;                   -- the three voice frequencies
  844.         int duration;                     -- the duration of the 3 voices
  845.  
  846.         Object module: ntrit_s.obj
  847.  
  848.         Description:
  849.  
  850.         This function plays three notes simultaneously on the speaker.
  851.         The tempo value is usually an static variable which applies 
  852.         throughout the program and is processor dependent. For best
  853.         results in frequencies, use the defined values in the POLY.H
  854.         file.
  855.  
  856.         This function can be used for music or sound effects.
  857.  
  858.         Return value:
  859.  
  860.         There is no return value.
  861.  
  862.         See also: poly(), playpoly(), polytempo()
  863.  
  864.         Example: SEE the included file SOUNDEFF.C for an example of this 
  865.                  routine.
  866.  
  867.     6.2 USING THE POLYPHONIC MUSIC LIBRARY
  868.         ----------------------------------
  869.  
  870.         In order to use the Polyphonic C routines, insert them as you
  871.         normally would into your source code (for an example, see any of the
  872.         ".c" files included in this package).
  873.  
  874.         Next, compile your source code to object modules (".obj" files).
  875.         In other words, compile WITHOUT linking. 
  876.  
  877.         Finally, if you are using Microsoft C, link your object modules
  878.         to the POLY.LIB library (as well as to the standard library).
  879.  
  880.         This step may not work with other brands of C compilers, so I've
  881.         included the .OBJ files included in POLY.LIB. If you can't use
  882.         the POLY.LIB or it doesn't work, link your C source files to
  883.         the necessary object files (each function's necessary object files
  884.         are listed before their description in section 6.1 - THE LIBRARY
  885.         ROUTINES). This usually involves using a '+' command with your
  886.         linker.
  887.  
  888.         For example: (taken from the file POLYCOMP.BAT)
  889.  
  890.         cl /c myprog.c         --> compiles without linking (Microsoft C)
  891.         link myprog,,,+poly;   --> links myprog.obj with standard library
  892.                                    and also uses poly.lib (Microsoft Linker)
  893.         myprog.exe             --> runs myprog
  894.  
  895.         If you use just the object files:
  896.  
  897.         cl /c myprog.c                   --> say myprog calls playpoly()
  898.         link myprog+polyfunc+poly_s;     --> link necessary object files
  899.         myprog.exe                       --> run program
  900.  
  901.     6.3 HOW TO USE THE LIBRARY ROUTINES
  902.         -------------------------------
  903.  
  904.         PlayPoly/LoopPoly:
  905.              These functions need a legitimate ".ply" file to play.
  906.  
  907.         First, type in the music you want to play in the text format 
  908.         outlined in section 3.23. Make sure you place the 'K' command
  909.         wherever necessary (to abort on keypress). It is suggested that
  910.         you use the 'K' command in rests or at the end of phrases or
  911.         measures, since it may take a small time interval to scan the 
  912.         keyboard (but usually this is not noticable). Also, be generous 
  913.         with them because your program user probably does not want to 
  914.         have to wait until the end of several measures for the program 
  915.         to continue.
  916.  
  917.         Second, compile the text file to a ".ply" file format using the
  918.         included program MAKEPOLY.EXE.
  919.  
  920.         Third, use the path of the file in a call to the playpoly()/
  921.         looppoly() functions (see section 6.1 - THE LIBRARY ROUTINES).
  922.  
  923.         Fourth, compile and link your C program as described above (section
  924.         6.2).
  925.  
  926.         Poly:
  927.              This function needs a legitimate array whose members are
  928.         a list of integers in the ".ply" format.
  929.  
  930.         There are two ways to make this integer array. One is to load the
  931.         array from a ".ply" file into memory (see PlayPoly/LoopPoly above
  932.         for how to obtain the file). The second way is to hard code the
  933.         music into your source code. Using this method has the advantage 
  934.         that the music takes up no external files, it is stored within the 
  935.         executable program itself.
  936.  
  937.         The way this second method is implemented is as follows:
  938.         (UPDATED)
  939.            
  940.                 1. Define an integer array,
  941.                 2. Fill it with the ".ply" values making up your
  942.                    song (this involves a certain amount of derivation),
  943.                 3. Call poly() with the array pointer as a parameter.
  944.  
  945.         The way in which you fill the array with ".ply" values (step 2 
  946.         above) is as follows:
  947.                 
  948.                 1. Use the defined values created in the POLY.H file.
  949.                 2. Set the tempo by plugging a tempo value into the
  950.                    array (an unsigned integer in the range of 1 to 65535).
  951.                 3. Set the voices by plugging (Vn | voicefreqency) into the
  952.                    array (where 'n' is '1', '2', or '3'). You can use
  953.                    the frequency values defined in POLY.H. They are set
  954.                    up by nameofnote_octave, e.g. C sharp in the middle
  955.                    octave (the one with middle C in it) = CSHA_M. Set these
  956.                    defines according to your usage. Note: multiplying these
  957.                    numbers by 2 raises one ocatve, and dividing by 2 lowers
  958.                    one octave. 
  959.                 4. Set the duration of the notes by plugging (DUR | 
  960.                    notelength) into the array. This will play the last 
  961.                    defined voice values for the duration given. If any voice
  962.                    was not defined it will use the last frequency given.
  963.                    If there was never any value defined for any one voice
  964.                    it will play 0 (silence) for that voice.
  965.                 5. Check for keypresses at any point by plugging (KBCHECK)
  966.                    into the array
  967.                 6. Continue steps 3 - 5 (use TCHANGE | changeval as described
  968.                    in UPDATE.TXT to change the tempo in the middle of the
  969.                    song) until the song is completely hard coded.
  970.                 7. Plug the last value (STOP) into the array
  971.  
  972.         For an example of this, see the header file POLYCHRD.H which defines
  973.         the play of several three-note chords as if they were songs.
  974.  
  975.         Tritone:
  976.              Use this function exactly as you would Poly, except send
  977.         the VALUES of tempo, v1, v2, v3, and duration as parameters, NOT
  978.         as an array. This function does not check for a keypress and
  979.         a STOP value is not necessary since it stops once the duration
  980.         expires.
  981.  
  982.         TimeTest/ProcessVal/PolyTempo:
  983.              Use these functions to test the speed of a processor. They
  984.         should be self-explanatory.
  985.                 
  986.  7.0    AUTHOR'S NOTE
  987.         -------------
  988.  
  989.     7.1 PROGRAM DEVELOPMENT
  990.         -------------------
  991.  
  992.              The idea for this program first came the time I excitedly
  993.         downloaded PIANOMAN.ARC from my favorite bulletin board. I 
  994.         impatiently loaded up the program waiting to see what one
  995.         unknowingly deceiving uploader penned as "Plays polyphonic
  996.         music!". When it loaded up I was sorely disheartened, as the
  997.         pianoman was as far from a piano as a computer could be (well,
  998.         next to having no speaker at all). 
  999.  
  1000.              Then one day I noticed a file that said VMUSIC.ARC "plays
  1001.         notes simultaneously". I had to check it out. And sure enough, it
  1002.         did what it claimed. It did not "simulate" three voices by playing
  1003.         three notes real fast through one voice. All three voices were there!
  1004.         This interested me and I played a little with the program.
  1005.  
  1006.              The time came when I wanted to use the possibility of three
  1007.         voices in a program I was writing. VMUSIC couldn't help me because
  1008.         it was unable to be accessed from C easily and quickly (not to
  1009.         mention it was copyrighted!), so I called up Ted Holden, the
  1010.         writer of VMUSIC. He didn't give me any code, but he referred me
  1011.         to the work of Steve Muenter. This was the guy who wrote the low-
  1012.         level technique for three voices. So, I got a copy of this assembly
  1013.         code and I hooked it up to C.
  1014.  
  1015.              I thought that a music compiler (putting the music into
  1016.         raw form for quick playing) would be a good idea, so I wrote
  1017.         MakePoly. I wrote it so that the three voices could be implemented
  1018.         into C.
  1019.  
  1020.              Basically this is the end result. The C enhancement
  1021.         routines provided in this package expand on the original concept
  1022.         and applications of three-voice music. And there is even more in 
  1023.         the works (from Mr. Holden as well as myself -- see 7.4 - PROGRAM
  1024.         ENHANCEMENTS).
  1025.  
  1026.              Every thing in this package was written in either C or 
  1027.         assembly (here's your free plug, Microsoft (5.1 to be exact)).
  1028.  
  1029.         * Three voice technology first started with Steve Muenter (as
  1030.           far as I know). He created a cryptic BASIC interface with a
  1031.           function similar to the poly() function in this package. 
  1032.           His program played the song contained in the file SIMPTEST.PLY.
  1033.           The form it is in now is not very far from the original form
  1034.           in was in!
  1035.           Ted Holden crystalized this idea by allowing imitation BASIC
  1036.           commands in ascii text files to be played. *
  1037.  
  1038.     7.2 PROGRAM FEATURES (UPDATED)
  1039.         ----------------
  1040.         
  1041.              Both MAKEPOLY/PLAYPOLY and VMUSIC use the Basic-like commands
  1042.         to read and play three-voice music. They both are good music 
  1043.         writing/composition tools.
  1044.  
  1045.              In the latest version of VMUSIC which is propogating around
  1046.         the nation's bulletin boards, Richard Pierce scored lots of Bach
  1047.         pieces and offered some comments to Ted Holden. In one of the 
  1048.         README files Ted responds directly to Richard Pierce's suggestions.
  1049.         I'd like to do the same (my comments delimited by **'s):
  1050.  
  1051.             "There  are some obvious ways (to me, at least) vmusic could
  1052.         be enhanced. This is contradictory to the concept of vmusic  as,
  1053.         really, a toy program (with no intention on my part to denegrate
  1054.         it or the authors efforts). Many of the suggestions I have would
  1055.         be satisfied by MIDI sequencer programs. I doubt that the author
  1056.         had any inkling that vmusic would be put to such  efforts  as  I
  1057.         have here. Be that as it may...
  1058.  
  1059. Check!> Tempo
  1060.              Implementation  of  the  Basic "play" command for tempo 't'
  1061.              would be very useful. Several  of  the  pieces  performance
  1062.              style  could  hve been immeasurably helped by being able to
  1063.              implement even incremental changes of tempo, much less true
  1064.              accelerando and ritardando.
  1065.  
  1066.         ** Incremental tempo changes are supported in this version... 
  1067.            (see UPDATE.TXT) **
  1068.  
  1069. Check!> Triplets
  1070.              True  triplet  notes  (where  three notes are played in two
  1071.              beats) could have made some of the pieces far  easier,  and
  1072.              would  have  encouraged me to try others. One way that this
  1073.              could be noted in the music source would be some convention
  1074.              that would group the triplets together, such as:
  1075.  
  1076.                   l8
  1077.                   v1o4 (efe)3 (ded)3 c4
  1078.                   v2o3 c<b    >cd     e4
  1079.  
  1080.  
  1081.              where  the triplet eighth notes like "efe" are played three
  1082.              against the normal two eighth notes "c<b" in a  normal  3/4
  1083.              time  measure.  The  extension  of  this to sixth groupings
  1084.              "(......)6" and even seventh groupings  "(.......)7"  would
  1085.              enable  many  other  pieces  to be simply coded (the latter
  1086.              being true for the first movement of Bach's Partita #6).
  1087.  
  1088.         ** MAKEPOLY will allow "simulated" triplets. The manner in which
  1089.            this is accomplished is the following:
  1090.  
  1091.            Every note length in the <textfile> is first converted to
  1092.            a real time value. Specifically,
  1093.  
  1094.                Note Length:     1   2   4    8   16   32   64
  1095.            - is converted to -
  1096.            Real Time Duration:  64  32  16   8   4    2    1
  1097.  
  1098.            (the formula is RTD = 64 / NL)
  1099.  
  1100.            So, if you time your triplets in real time, and then set
  1101.            your note length accordingly, you can fake them.
  1102.  
  1103.            For instance, say you want a triplet for eighth notes.
  1104.            This would be equivalent in real time to 2 eighth notes, i.e.
  1105.            real time = 8+8 = 16, so your three notes would need to add up
  1106.            to 16. Let's use 5, 5, and 6. Since NL = 64 / RTD, and 64/5 =
  1107.            12.8, and 64/6 = 10.67, use the notelengths, 13, 13, and 11,
  1108.            which add up to (when applied through the original formula, and 
  1109.            rounded) 16. This works only because MAKEPOLY rounds the RTD 
  1110.            derived from the formula. Try it! 
  1111.  
  1112.            This example is realized in the file TRIPTEST.SNG.  They sound
  1113.            like triplets to me! **
  1114.  
  1115.         More voices
  1116.              Simply said...
  1117.  
  1118.         ** It is possible. I tried four (have capability for up to five)
  1119.            but the noise level was too much. I'll continue work on this! **
  1120.  
  1121.         Platform independence
  1122.              It would be nice to be able to  detect  the  speed  of  the
  1123.              machine,  then set the tempo and pitch parameters automati-
  1124.              cally (or at least scale them) so that the same piece would
  1125.              sound the same on different hardware.
  1126.  
  1127. Check!> ** PLAYPOLY currently offers this capability (see the command line
  1128.            parameter /C, section 4.22 - STARTING PLAYPOLY / COMMAND LINE)
  1129.            for playing songs which don't change tempo internally. This 
  1130.            option has not been fully tested to see whether it reproduces 
  1131.            pitches perfectly or just scales them (most likely the pitches 
  1132.            are only scaled). A better speed detector would be nice 
  1133.            (one that plays silence for instance!) **
  1134.  
  1135.         Syntax checking
  1136.              A   more  intelligent  parser  would  help  debugging.  For
  1137.              example, if  vmusic  had  some  knowledge  of  the  measure
  1138.              length,  it could detect missing or excessive notes in each
  1139.              measure.
  1140.  
  1141.         ** MAKEPOLY simply plays silence for a voice when a voice's 
  1142.            info runs out. If you know what the piece sounds like, you 
  1143.            should be able to detect slips in the voices. Although, an
  1144.            idea is in the works which, when implemented, will inform 
  1145.            the user that one voice is shorter than another.
  1146.  
  1147.            Also: use the comment delimiters to section off pieces of
  1148.            the music. This allows focusing in on certain parts and
  1149.            you can then easily determine what's wrong. Never thought
  1150.            I'd be debugging an opera! **
  1151.  
  1152.         Note Style
  1153.              Implementing the Basic  "play"  command  for  setting  note
  1154.              style,  such as legato, portamento and staccato, would make
  1155.              coding easier.
  1156.  
  1157.         ** One possible alternative is to play half of the value of the
  1158.            note and then rest the other half (staccato). I beleive these
  1159.            styles are possible. Explain what exactly the terms mean, and I'll
  1160.            have a go at them in upcoming versions **
  1161.  
  1162. Check!> Equal voices
  1163.              In some of the  more  complex  pieces  (such  as  the  trio
  1164.              sonata),  the  second and third voices get lost beneath the
  1165.              more predominate first voices. All voices should have equal
  1166.              weight. 
  1167.  
  1168.         ** 'This version of MAKEPOLY doesn't account for this but I have
  1169.             some ideas of ways to attempt this. Hopefully the next
  1170.             version will have conquered this problem.' - I said last (1.00)
  1171.            version. 
  1172.  
  1173.            And it has... see UPDATE.TXT for details on equal voices ** ."
  1174.  
  1175.     7.3 PROGRAM INFO
  1176.         ------------
  1177.  
  1178.              MakePoly was written entirely in Microsoft C 5.1.
  1179.         In its finished form it is rougly 20K of source code.
  1180.              PlayPoly was written in Microsoft C 5.1, and linked to
  1181.         and external function written in Microsoft Macro Assembler 5.1.
  1182.  
  1183.              Both programs use dynamic memory for note storage, so the
  1184.         only limitation to song length is the amount of available memory.
  1185.         (Large memory model only, the small memory model has an upward
  1186.         limit of about 64K).
  1187.  
  1188.              Updated versions will be produced even if the amount of user
  1189.         feedback is minimal (in other words, PLEASE FEED BACK! Your comments
  1190.         are greatly wanted/apprieciated!).
  1191.  
  1192.     7.4 FUTURE ENHANCEMENTS
  1193.         -------------------
  1194.  
  1195.         Other than the enhancements mentioned in the discussion with
  1196.         Richard Pierce in section 7.2 - PROGRAM FEATURES, I personally
  1197.         am dedicated to see the following enhancements come to the world
  1198.         of three voice IBM music:
  1199.  
  1200.                 * Functions to add three voice capability to:
  1201.                         BASIC
  1202.                         PASCAL, and any other requested languages
  1203.                   (Note: the poly() function, in its present form, may 
  1204.                          may very well work for Pascal. I have yet to 
  1205.                          try it, but I ask anyone who uses Pascal to 
  1206.                          feel free to explore! I will attempt this 
  1207.                          if and when I get Turbo Pascal 5.5!)
  1208.                 * The ability to work appearantly simultaneously
  1209.                   while other functions are doing their thing (this
  1210.                   is the "DOS-world-possibility" mentioned in section
  1211.                   7.2)
  1212.                 * The "REPEATED MEASURE" ability for MAKEPOLY
  1213.                 * For AUTOHARP type programs, a sensitive assembly key-
  1214.                   board parser which plays a chord until a key is released
  1215.                   (not just repeating the key).
  1216.                 * A simple sequencer-type program that let's you
  1217.                   edit a ".ply" file without knowing how to read music!
  1218.                   (the keyboard would have to have assembly-type instructions
  1219.                   as described for AUTOHARP above so the program could
  1220.                   sense when keys were pressed and released.)
  1221.                 * What would be really great is to be able to tune
  1222.                   the player to concert pitch.
  1223.                 
  1224.  
  1225.     7.5 AUTHOR'S CORNER
  1226.         ---------------
  1227.  
  1228.         Let me just tell you a little about myself...
  1229.  
  1230.         I am 19, a Computer Science Major at the University of Texas.
  1231.         I also work for the Department of Verteran's Affairs, working with
  1232.         (what else) PC's. I am a programmer, and a serious musician.
  1233.         I play the guitar primarily, but I also have a great love for
  1234.         piano and the drums (trapset). I can't deny but that the Lord has been 
  1235.         very instrumental and creative in my life. He has given me peace, joy, 
  1236.         and love I never knew before I knew Him (and believe me, I searched!).
  1237.         Not only that but He has specifically answered my prayers and spoken 
  1238.         through me. I give every waking moment to Him, and He satisfies me 
  1239.         more than the world ever did!
  1240.  
  1241.         So if you have any comments, questions, advice, suggestions, or
  1242.         obscene remarks about what is present in this package, PLEASE 
  1243.         contact me!
  1244.  
  1245.         Edward ("Eddie") Grigassy
  1246.         2304A Riverside Farms Rd.
  1247.         Austin, TX  78741
  1248.         (512)385-1368
  1249.  
  1250.         On Compuserve: 73207,3140   
  1251.  
  1252.         Here is the address of Ted Holden, author of VMUSIC (obtainable
  1253.         on Compuserve {go ibmnew, music section}):
  1254.  
  1255.            Ted Holden
  1256.            HT Enterprises
  1257.            1947 Storm Dr.
  1258.            Falls Church, Va. 22043
  1259.  
  1260.            703 760-9713
  1261.  
  1262.         And here is the address of Richard Pierce, the arranger of the
  1263.         many Bach music files (playable through MAKEPOLY and the other
  1264.         Polyphonic Music play routines presented here) included in the latest 
  1265.         VMUSIC package (some were reproduced here):
  1266.  
  1267.            Richard Pierce
  1268.            17 Sartelle Street
  1269.            Pepperell, Ma 01463
  1270.  
  1271.  
  1272. Technical Stuff:
  1273. ----------------
  1274.  
  1275. If you enjoyed, used, or even loved this package, please consider a 
  1276. contribution of $20 or of any size. This package has been designated as
  1277. ShareWare by the author (E. Grigassy); it serves as a demo for the
  1278. more powerful later versions of Polyphonic Music, the Large
  1279. memory models of the poly.lib functions. (see REGISTER.TXT), and 
  1280. the registration releasing full rights to the registeree 
  1281. (is that a word?).
  1282.  
  1283.     Registration Information:
  1284.  
  1285.     Polyphonic Music is distributed as User-Supported software.  You are free 
  1286.     to copy and distribute this software freely, however, if you find it of 
  1287.     use to you, you are encouraged to register your copy.  Registering your 
  1288.     copy of the software helps the author continue to provide professional
  1289.     quality software at very reasonable prices.
  1290.  
  1291.     The Basic Registration is $5.00 and includes royalty-free use of library 
  1292.     functions, unlimited technical support, and information about low-cost 
  1293.     upgrades. 
  1294.  
  1295.     All materials are shipped on 5.25-inch floppy diskettes. If you require
  1296.     3.5-inch floppies instead, there is an additional $2.00 charge covering
  1297.     the cost of the diskette itself.
  1298.  
  1299.     Non-U.S. orders need to include $5.00 extra to cover additional shipping
  1300.     and handling charges.  Checks and money orders must be drawn on a U.S.
  1301.     bank.  Please send all payments payable in U.S. Dollars.
  1302.  
  1303.     Print the registration form, REGISTER.TXT, or include on a piece of
  1304.     paper your name, address, phone number, and requested items, and send
  1305.     it along with your payment to:
  1306.  
  1307.         Edward Grigassy
  1308.         GrigaSoft Productions
  1309.         2304A Riverside Farms Rd.
  1310.         Austin, TX  78741
  1311.  
  1312. Microsoft(R), MS(R) are registered trademarks of Microsoft Corporation.
  1313. IBM(R) is a registered trademark of the International Business Machines
  1314. Corporation.
  1315. All versions of VMUSIC (vm0389.exe is latest as of writing) are Copyright
  1316. HT Enterprises / Ted Holden
  1317.  
  1318. The files: PLAYPOLY.EXE, MAKEPOLY.EXE, LOOPPOLY.EXE, AUTOHARP.EXE, 
  1319.            TIMECHK.EXE, AUTOHARP.C, TIMECHK.C, POLY.H, POLYCHRD.H,
  1320.            POLY.LIB, POLY_S.OBJ, TRIT_S.OBJ, POLYFUNC.OBJ, and
  1321.            any of the original source code not mentioned above
  1322.            are Copyright (c) 1989 Edward P. Grigassy / GrigaSoft 
  1323.            Productions. None of these files or procedures may
  1324.            be used in any commercial software nor may they be
  1325.            bought or sold without the explicit written permission
  1326.            of Edward P. Grigassy / GrigaSoft Productions. 
  1327. Polyphonic Music (TM) is a trademark of GrigaSoft Productions.
  1328.  
  1329. Disclaimer:
  1330. -----------
  1331. Edward Grigassy / GrigaSoft Productions is not responsible for any
  1332. damage or loss of property caused by the software in this package. This
  1333. package is provided AS IS and no guarantee is made by the author/owner
  1334. for the safety of the user's property.
  1335. All the documentaion included in this package is subject to change at any
  1336. time and in no way reflects any commitment on the part of the author/owner.
  1337.