--Author: John Maxwell
--last modified: November 28, 1981 8:44 AM

DIRECTORY
MusicDefs: FROM "MusicDefs";

Sync: DEFINITIONS IMPORTS MusicDefs =
BEGIN
OPEN MusicDefs;

AddNote
:PROCEDURE[s:SyncPTR,n:NotePTR];
AddTimes:PROCEDURE[s:SyncPTR,time:Time,toc:Time];
Adjust:PUBLIC PROCEDURE[s:SyncPTR];
Draw:PROCEDURE[s:SyncPTR];
Hidden:PROCEDURE[f,s:CARDINAL,leftEdge:Time] RETURNS[BOOLEAN];
Octava:PROCEDURE[s:SyncPTR] RETURNS[SyncPTR];
RemoveNote:PROCEDURE[s:SyncPTR,n:NotePTR];
SetStave:PROCEDURE[oldS:StavesPTR,new:SyncPTR];

--INLINE Procedures

GetScoreIndex:PUBLIC PROCEDURE[s:SyncPTR] RETURNS[CARDINAL] = INLINE
{i,j,index:CARDINAL←0;
binary:CARDINAL ← 8192;
IF s=NIL THEN RETURN[scoreLength];
FOR i IN [0..13) DO
binary ← binary/2;
IF index+binary>=scoreLength THEN LOOP;
IF score[index+binary].time<=s.time THEN index←index+binary;
IF score[index].time#s.time THEN LOOP;
IF score[index]=s THEN RETURN[index];
--must be a nearby sync
FOR j IN (index..scoreLength) WHILE score[j].time=s.time DO
IF score[j]=s THEN RETURN[j]; ENDLOOP;
FOR j DECREASING IN [0..index) WHILE score[j].time=s.time DO
IF score[j]=s THEN RETURN[j]; ENDLOOP;
EXIT; ENDLOOP;
-- FAILURE: score isn’t sorted. Try again.
FOR i IN [0..scoreLength) DO IF score[i]=s THEN RETURN[i]; ENDLOOP;
RETURN[scoreLength]}; --not in score

GetStaff:PROCEDURE[s:SyncPTR,staff:CARDINAL] RETURNS[LONG POINTER TO Staff] = INLINE
{staves:StavesPTR = LOOPHOLE[@s.event]; RETURN[@staves.staff[staff]]};

Grace:PROCEDURE[s:SyncPTR] RETURNS[BOOLEAN] = INLINE
{IF s.type#notes THEN RETURN[FALSE];
FOR j:CARDINAL IN [0..syncLength) DO
IF s.event[j]=NIL THEN EXIT;
IF ~s.event[j].grace THEN RETURN[FALSE];
ENDLOOP;
RETURN[TRUE]};

InVoice:PROCEDURE[s:SyncPTR,voice:CARDINAL] RETURNS[BOOLEAN] = INLINE
{FOR j:CARDINAL IN [0..syncLength) DO
IF s.event[j]=NIL THEN EXIT;
IF s.event[j].voice=voice THEN RETURN[TRUE];
ENDLOOP;
RETURN[FALSE]};

Length:PROC[s:SyncPTR] RETURNS[CARDINAL] = INLINE
{FOR i:CARDINAL IN [0..syncLength] DO
IF i=syncLength THEN RETURN[i];
IF s.event[i]=NIL THEN RETURN[i];
ENDLOOP;
ERROR};

END..