<> <> <> <> <> <<>> DIRECTORY Beam USING [Draw, Drawn, SetSyncs], Chord USING [Draw], Event USING [Free, GetScoreIndex, GetStaff, KeySignature, Metronome, Sync, TimeSignature], Graphics USING [SetStipple], MusicDefs USING [BeamPTR, black, ChordPTR, EventPTR, EventRec, KeySignaturePTR, light, MeasureType, NotePTR, ScorePTR, Staff, StavesPTR, SyncPTR, Time], Note USING [Draw, InVoice], Sheet USING [MapNote, Reset], Utility USING [DrawLine]; EventImpl: CEDAR PROGRAM IMPORTS Beam, Chord, Event, Graphics, MusicDefs, Note, Sheet, Utility EXPORTS Event = BEGIN OPEN MusicDefs; GetScoreIndex: PUBLIC PROC[score: ScorePTR, event: EventPTR] RETURNS[index: CARDINAL _ 0] = { binary: CARDINAL _ 8192; IF event = NIL THEN RETURN[score.length]; FOR i: CARDINAL IN [0..13) DO binary _ binary/2; IF index + binary >= score.length THEN LOOP; IF score[index+binary].time <= event.time THEN index _ index + binary; IF score[index].time # event.time THEN LOOP; IF score[index] = event THEN RETURN[index]; <> FOR j: CARDINAL IN (index..score.length) WHILE score[j].time = event.time DO IF score[j] = event THEN RETURN[j]; ENDLOOP; FOR j: CARDINAL DECREASING IN [0..index) WHILE score[j].time = event.time DO IF score[j] = event THEN RETURN[j]; ENDLOOP; EXIT; ENDLOOP; <> FOR i: CARDINAL IN [0..score.length) DO IF score[i] = event THEN RETURN[i]; ENDLOOP; RETURN[score.length]; -- not in score }; GetStaff: PUBLIC PROC[staves: StavesPTR, staff: CARDINAL] RETURNS[Staff] ~ { RETURN[staves.staff[staff]]; }; Invisible: PUBLIC PROC[score: ScorePTR, index: CARDINAL, leftEdge: Time] RETURNS[BOOL] = { event: EventPTR ~ score[index]; WITH event SELECT FROM ev: StavesPTR => IF ev.staves # clef THEN RETURN[FALSE]; ev: KeySignaturePTR => NULL; ENDCASE => RETURN[FALSE]; RETURN[event.time-leftEdge <= 15]; }; <<>> <<******************************************************************>> <> <<******************************************************************>> SetStave: PUBLIC PROC[score: ScorePTR, oldS: StavesPTR, newS: StavesPTR] = { n, o: BOOL; pitch, height: INTEGER; IF newS = NIL THEN RETURN; height _ newS.height; IF newS.staves # style THEN { pitch _ newS.staff[newS.value].pitch; newS^ _ oldS^; newS.height _ height; FOR j: CARDINAL IN [0..newS.length) DO IF newS.staff[j].y # newS.staff[newS.value].y THEN LOOP; newS.staff[j].pitch _ pitch; ENDLOOP; RETURN}; <> newS^ _ score.style[newS.value]^; newS.height _ height; <> IF oldS = NIL THEN RETURN; IF oldS.length # newS.length THEN RETURN; FOR i: CARDINAL IN [1..newS.length) DO n _ newS.staff[i].y = newS.staff[i-1].y; o _ oldS.staff[i].y = oldS.staff[i-1].y; IF n # o THEN RETURN; ENDLOOP; FOR i: CARDINAL IN [0..newS.length) DO newS.staff[i].pitch _ oldS.staff[i].pitch; ENDLOOP; }; GetOctava: PUBLIC PROC[score: ScorePTR, octava: StavesPTR] RETURNS[StavesPTR] = { OPEN Event; -- USING [GetScoreIndex, GetStaff]; IF octava = NIL THEN RETURN[NIL]; IF octava.staves = octava1 THEN { FOR i: CARDINAL IN (GetScoreIndex[score, octava]..score.length) DO staves: StavesPTR; IF score[i].type # staves THEN LOOP; staves _ NARROW[score[i]]; IF staves.staves # octava2 THEN LOOP; IF octava.value = staves.value THEN RETURN[staves]; IF GetStaff[octava, octava.value].y = GetStaff[staves, staves.value].y THEN RETURN[staves]; ENDLOOP}; IF octava.staves = octava2 THEN { FOR i: CARDINAL DECREASING IN [0..GetScoreIndex[score, octava]) DO staves: StavesPTR; IF score[i].type # staves THEN LOOP; staves _ NARROW[score[i]]; IF staves.staves # octava1 THEN LOOP; IF octava.value = staves.value THEN RETURN[staves]; IF GetStaff[octava, octava.value].y = GetStaff[staves, staves.value].y THEN RETURN[staves]; ENDLOOP}; RETURN[NIL]; }; <<>> Draw: PUBLIC PROC[score: ScorePTR, event: EventPTR] = { <> <> <> <