-- Author: John Maxwell
-- Last Edited by: Maxwell, November 21, 1983 9:20 am
DIRECTORY MusicDefs: FROM "MusicDefs";
Voice: DEFINITIONS =
BEGIN
OPEN MusicDefs;
max: CARDINAL = 10;
StatePTR: TYPE = POINTER TO State;
State: TYPE = ARRAY [0..max) OF StateRec;
StateRec: TYPE = RECORD[found, grace, graced, full: BOOLEAN, duration, sum: Time];
Check: PROCEDURE[score: ScorePTR];
Correct: PROCEDURE[score: ScorePTR, time1, time2: Time]; -- may raise Piece.Overflow
Set: PROCEDURE[score: ScorePTR, voice: CARDINAL]; -- takes selection as a parameter
-- procedures for enumerating voices
ClearState: PROCEDURE[vs: StatePTR] = INLINE {FOR i: CARDINAL IN [0..max) DO
vs[i] ← [FALSE, FALSE, FALSE, FALSE, 0, 0]; ENDLOOP};
SetState: PROCEDURE[vs: StatePTR, event: EventPTR,
m: INTEGER ← 128, separate: BOOLEAN ← FALSE] RETURNS[max: Time];
Selected: PROC[score: ScorePTR, v: CARDINAL] RETURNS[BOOLEAN] =INLINE
{RETURN[score.sheet.voice = noVoice OR v = score.sheet.voice]};
END.