-- Author: John Maxwell
-- Last Edited by: Maxwell, November 21, 1983 9:39 am

DIRECTORY
	Graphics USING [Context],
	MusicDefs: FROM "MusicDefs";

Score: DEFINITIONS IMPORTS MusicDefs = 
BEGIN
OPEN MusicDefs;

-- ****************************************************************************
-- procedures 
-- ****************************************************************************
-- all of the Sets and Gets take "score" as the implied first parameter

Initialize: PROCEDURE[score: ScorePTR, context: Graphics.Context];
BuildCache: PROCEDURE[score: ScorePTR, time: Time];
Draw: PROCEDURE[score: ScorePTR, erase: BOOLEAN ← TRUE];
Redraw: PROCEDURE[score: ScorePTR, t1, t2: Time];
Print: PROCEDURE[score: ScorePTR, splines: BOOLEAN];

SetKey: PROCEDURE[score: ScorePTR, key: INTEGER, time1, time2: Time]; 
-- may raise Piece.Overflow
GetKey: PROCEDURE[score: ScorePTR, t: Time] RETURNS[key: INTEGER];
GetAccidental: PROCEDURE[score: ScorePTR, n: NotePTR] RETURNS[Accidental];

SetMetrenome: PROCEDURE[score: ScorePTR, m: INTEGER, time1, time2: Time];
-- may raise Piece.Overflow
GetMetrenome: PROCEDURE[score: ScorePTR, t: Time] RETURNS[metrenome: INTEGER];
DrawMetrenome: PROCEDURE[score: ScorePTR, metrenome: INTEGER, time: Time];

SetTimeSignature: PROCEDURE[score: ScorePTR, ts: TimeSignature, time1, time2: Time];
-- may raise Piece.Overflow
GetTimeSignature: PROCEDURE[score: ScorePTR, t: Time] RETURNS[TimeSignature];
DrawTimeSignature: PROCEDURE[score: ScorePTR, ts: TimeSignature, time: Time];

SetStyle: PROC[score: ScorePTR, index: INTEGER, t1, t2: Time];
-- may raise Piece.Overflow
GetStyle: PROC[score: ScorePTR, time: Time] RETURNS[INTEGER];
SetClef: PROC[score: ScorePTR, pitch, staff: INTEGER, time: Time];
-- may raise Piece.Overflow
SetOctava: PROC[score: ScorePTR, pitch, staff, height: INTEGER, t1, t2: Time];
-- may raise Piece.Overflow

Justify: PROCEDURE[score: ScorePTR, begin, end: Time];
LogicalToPhysical: PROCEDURE[score: ScorePTR, begin, end: Time];
ScalePhysical: PROCEDURE[score: ScorePTR, n: INTEGER]; 
ShowLogical: PROCEDURE[score: ScorePTR, firstEvent, lastEvent: CARDINAL];

Look: PROCEDURE[score: ScorePTR, look: LookCommand, switch: BOOLEAN← TRUE, n: INTEGER ← 0];

-- key specific procedures
AddToPitch: PROCEDURE[key, pitch, delta: INTEGER] RETURNS[INTEGER];
KeyHeight: PROCEDURE[key, pitch: INTEGER] RETURNS[INTEGER];
NormalAcc: PROCEDURE[key, pitch: INTEGER] RETURNS[Accidental];
PriorNote: PROCEDURE[score: ScorePTR, pitch, height: INTEGER, index: CARDINAL] RETURNS[NotePTR];
ShowPitch: PROCEDURE[sheet: SheetPTR, pitch: INTEGER, spelled: Accidental, key: INTEGER] RETURNS[INTEGER] = 
INLINE BEGIN
IF NOT sheet.accidental THEN RETURN[pitch];
IF spelled = inKey THEN RETURN[pitch];
SELECT spelled FROM
	doubleSharp => pitch ← pitch-2;
	sharp         => pitch ← pitch-1;
	natural	    => pitch ← pitch-0;
	flat	    => pitch ← pitch+1;
	doubleFlat   => pitch ← pitch+2;
	ENDCASE   => ERROR;
IF Mod[pitch, 12] = 7 AND key < -5 THEN RETURN[pitch-1];
IF Mod[pitch, 12] = 0 AND key < -6 THEN RETURN[pitch-1];
IF Mod[pitch, 12] = 1 AND key > 5 THEN RETURN[pitch+1];
IF Mod[pitch, 12] = 8 AND key > 6 THEN RETURN[pitch+1];
RETURN[pitch];
END;

-- ****************************************************************************
-- utility procedures 
-- ****************************************************************************

FileIn: PROCEDURE[fileName: STRING] RETURNS[ScorePTR];
-- FileInOld: PROCEDURE[score: ScorePTR, s: STRING];
FileOut: PROCEDURE[score: ScorePTR, fileName: STRING] RETURNS[BOOLEAN];
-- FileOutOld: PROCEDURE[s: STRING];
FileStats: PROCEDURE[score: ScorePTR]; 
InitializeSynthesizer: PROCEDURE;
StartListening: PROCEDURE[score: ScorePTR];
StartPlaying: PROCEDURE[score: ScorePTR, first: CARDINAL, physical: BOOLEAN, 
	  displayCursor: PROCEDURE[score: ScorePTR, time: Time]]; 
	  -- displayCursor may raise Piece.Overflow
StopListening: PROCEDURE[score: ScorePTR];
StopPlaying: PROCEDURE[score: ScorePTR];
Test: PROCEDURE[score: ScorePTR] RETURNS[errors: BOOLEAN];

END..