DEFINITION MODULE Play3S;

	(********************************************************)
	(*							*)
	(*		    3-part music			*)
	(*							*)
	(*  Programmer:		P. Moylan			*)
	(*  Last edited:	10 June 1994			*)
	(*  Status:		Working				*)
	(*							*)
	(*	See the notes in the implementation module	*)
	(*	for details of how to adjust the note		*)
	(*	frequencies and durations to compensate		*)
	(*	for different processor speeds.			*)
	(*							*)
	(********************************************************)

IMPORT Keyboard;	(* forces keyboard handler to be linked *)

(************************************************************************)
(*			THE FORMAT OF THE USER DATA			*)
(************************************************************************)
(*									*)
(* The music to be played is specified as an array of entries, each of	*)
(* which is three bytes long.  Each of the bytes specifies a note, so	*)
(* the triplet of bytes specifies three notes to be played		*)
(* simultaneously.  A value of 0 indicates a rest.			*)
(*									*)
(* Note values are in the range 1..63, and a standard 12 notes/octave	*)
(* scale is used.  (The main limit on the allowable range arises from	*)
(* aliasing effects due to the way we do the sampling.)  Note that the	*)
(* absolute note frequencies depend on the processor speed, although	*)
(* relative frequencies are processor-independent.			*)
(*									*)
(* Values greater than 63 in the first byte are interpreted as follows.	*)
(*									*)
(*	BYTE 1	    MEANING		    BYTES 2 AND 3		*)
(*									*)
(*	64..251	Currently not used	no meaning assigned		*)
(*	 252	No meaning assigned	ignored; this option is present	*)
(*					only for compatibility with	*)
(*					other versions of this module.	*)
(*	 253	Change note duration	the current duration is		*)
(*					multiplied by the value in	*)
(*					byte 2 and then divided by the	*)
(*					value in byte 3			*)
(*	 254	Set note duration	new duration (16 bits)		*)
(*	 255	End of data		not needed			*)
(*									*)
(************************************************************************)

PROCEDURE Play (VAR (*IN*) A: ARRAY OF BYTE);

    (* Plays the music encoded in array A.  The encoding is explained	*)
    (* in the comments above.						*)

END Play3S.
