-- 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.