<<>> <> <> <> <> <> DIRECTORY Rope USING [ROPE]; TuneParse: CEDAR DEFINITIONS = { Hertz: TYPE ~ INT; Milliseconds: TYPE ~ INT; Db: TYPE ~ INT; Tone: TYPE = RECORD [ f1: Hertz, -- Hertz. f2: Hertz, -- Hertz. on, off: Milliseconds, -- Tone will be played at f2 Hz. for on ms.; then off ms. of silence. repetitions: INT¬1 -- specifies number of repetitions of this toned ]; ToneList: TYPE = LIST OF Tone; ToneSpec: TYPE = REF ToneSpecRec; ToneSpecRec: TYPE = RECORD [ repeatIndefinitely: BOOL¬TRUE, -- else play just once volume: Db¬0, tones: ToneList¬NIL, asRope: Rope.ROPE¬NIL -- if derived from a rope, here it is ]; ParseTune: PROCEDURE [tune: Rope.ROPE, volume: Db] RETURNS[tones: ToneSpec]; <> <> MergeToneSpecs: PROCEDURE [t1, t2: ToneSpec, t2Divisor: INT¬1, t2Delay: INT¬0, volumeIncrement: Db¬0] RETURNS [ts: ToneSpec]; <> <> <> }.