DEFINITION MODULE Music; (********************************************************) (* *) (* Module to play music. *) (* *) (* Programmer: P. Moylan *) (* Last edited: 28 May 1989 *) (* Status: *) (* Initial version working well. Still testing. *) (* *) (********************************************************) PROCEDURE SetNoteDuration (D: CARDINAL); (* Sets the duration of each of the following notes, until further *) (* notice, to D milliseconds. The precision of this setting is *) (* limited by the clock interrupt frequency used in module Timer; *) (* the resolution can be as poor as 1/9 second. The duration can *) (* subsequently be modified by the * and / options (see below), or *) (* by another call to SetNoteDuration. *) PROCEDURE PlayMusic (notes: ARRAY OF CHAR); (* Plays the tune specified in array "notes". The playing is done *) (* asynchronously; that is, this procedure returns before the music *) (* is over. However, a return from this procedure does imply that *) (* array "notes" can be re-used or destroyed; the notes might not *) (* yet have been played, but the data necessary to play them have *) (* been processed and the necessary information stored. *) PROCEDURE WaitForMusicFinished; (* Blocks the calling task until there is no more music playing. *) (* This is a guard against things like premature task termination. *) (************************************************************************) (* *) (* In the "notes" argument to PlayMusic, the following options are *) (* accepted: *) (* C D E F G A B the usual notation for a note. *) (* b # flat or sharp, modifying the previously given *) (* note. There is no legality checking; for *) (* example, B# is illegal but the software does *) (* check for this. *) (* R a rest. *) (* * double the duration of the following notes. *) (* / halve the duration of the following notes. *) (* 3 divide the duration of the following notes *) (* by 3. The *, /, and 3 options take effect for *) (* all following notes, until the duration is *) (* modified again by one of these options or by *) (* an explicit call to SetNoteDuration. *) (* u go up one octave. *) (* d go down one octave. In many cases the u and d *) (* options are not needed because PlayMusic *) (* chooses the appropriate octave based on the *) (* assumption that successive notes will be *) (* close to each other; but u and d can override *) (* this assumption. *) (* *) (************************************************************************) END Music.