DIRECTORY Graphics USING [Context, FontRef, PaintMode, SetPaintMode, SetStipple], Rope USING [ROPE]; MusicDefs: CEDAR DEFINITIONS IMPORTS Graphics = BEGIN Error: SIGNAL[s: Rope.ROPE]; Notify: SIGNAL[s: Rope.ROPE]; Overflow: SIGNAL[type: Sequence]; Sequence: TYPE = {beam, beamHeap, chord, chordHeap, piece, score, sheet, sync}; PieceArray: TYPE = ARRAY [0..maxScoreLength) OF SyncPTR; -- most pieces are maxPieceLength SyncRec: TYPE = RECORD[ time: Time _ 0, --placement on the page type: EventType_ notes, ts: TimeSignature _ [0, 0], value: INTEGER _ 0, event: ARRAY [0..syncLength) OF NotePTR _ ALL[NIL] ]; NoteRec: TYPE = RECORD[ sync: SyncPTR _ NIL, beam: BeamPTR _ NIL, chord: ChordPTR _ NIL, tie: NotePTR _ NIL, tieHeight: INTEGER _ 0, show: BOOL _ FALSE, spare: [0..2000) _ 0, staff: [0..16) _ 1, -- the index of the staff delta: [-128..128) _ 0, accDelta: [-128..128) _ 0, voice: CARDINAL _ 0, toc: LONG CARDINAL _ 0, duration: CARDINAL _ 0, pitch: INTEGER _ 44, tied: BOOL _ FALSE, rest: BOOL _ FALSE, dotted: BOOL _ FALSE, doubleDotted: BOOL _ FALSE, grace: BOOL _ FALSE, stemUp: BOOL _ TRUE, embellish: Embellishment _ none, --3 bits value: NoteValue _ unknown, --3 bits spelled: Accidental _ inKey --3 bits ]; PhysicalNote: TYPE = RECORD[ pitch: INTEGER, duration: CARDINAL, loudness: CARDINAL, toc: LONG CARDINAL -- toc is the physical time of occurrence ]; ChordRec: TYPE = RECORD[ stemUp: BOOL, delta: INTEGER _ 0, note: ARRAY [0..chordLength) OF NotePTR ]; BeamRec: TYPE = RECORD[ tilt: REAL, beamed: BOOL, ntuple, against: [0..128), sync1, sync2: SyncPTR, beam: BeamPTR, height: INTEGER, invisible: BOOL, spare1: [0..1024), staff: [0..32), -- graphical information chord: ARRAY[0..beamLength) OF VariousPTR ]; endOfBeam: VariousPTR ~ NIL; Time: TYPE = LONG INTEGER; EventType: TYPE = { notes, measure, repeat1, repeat2, endMeasure, doubleMeasure, m5, timeSignature, keySignature, metronome, staves, clef, octava1, octava2, spare5, spare6, spare7, spare8, spare9, spare10, spare11, spare12, spare13, spare14 }; SheetSwitch: TYPE = EventType [staves..octava2]; TimeSignature: TYPE = RECORD[top, bottom: [0..32)]; Embellishment: TYPE = {none, trill, mordent1, mordent2, e1, e2, e3, e4}; NoteValue: TYPE = {whole, half, quarter, eighth, sixteenth, thirtysecond, sixtyfourth, unknown}; Accidental: TYPE = {doubleSharp, sharp, natural, inKey, flat, doubleFlat}; Section: TYPE = RECORD[ x, y, page, key: INTEGER, time: Time, staves: StavesPTR ]; DocumentProfile: TYPE = RECORD[ sheet: Staves, accidental, notehead, noCarry, sync, structure: BOOL, display: DisplayMode ]; DisplayMode: TYPE = {physical, logical, graphical}; Staves: TYPE = RECORD[ junk1: NotePTR _ NIL, height, offset: INTEGER, sl: CARDINAL, staff: ARRAY [0..4) OF Staff, junk2: Junk _ [0, ALL[0]] ]; Staff: TYPE = RECORD[pitch, y: INTEGER]; Junk: TYPE = RECORD[j1: INTEGER, j2: ARRAY [0..syncLength-7) OF LONG INTEGER]; ObjectType: TYPE = {measure, note, leftBeam, rightBeam, tie}; LookCommand: TYPE = {accidental, graphical, hardcopy, justified, logical, noCarry, notehead, overview, physical, sheet, sync, voice}; VariousPTR: TYPE = REF; -- NotePTR, ChordPTR, or BeamPTR SyncPTR: TYPE = REF SyncRec; StavesPTR: TYPE = REF Staves; ChordPTR: TYPE = REF ChordRec; NotePTR: TYPE = REF NoteRec; BeamPTR: TYPE = REF BeamRec; PiecePTR: TYPE = REF PieceArray; ChordHeapPTR: TYPE ~ REF ChordHeapRec; ChordHeapRec: TYPE ~ ARRAY [0..maxChordHeapLength) OF ChordPTR; BeamHeapPTR: TYPE ~ REF BeamHeapRec; BeamHeapRec: TYPE ~ ARRAY [0..maxBeamHeapLength) OF BeamPTR; chordLength: CARDINAL = 10; syncLength: CARDINAL = 13; beamLength: CARDINAL = 16; sheetLength: CARDINAL = 350; maxScoreLength: CARDINAL = MAX[maxPieceLength, 3000]; --6000 maxPieceLength: CARDINAL = 1000; maxBeamHeapLength: CARDINAL = 1000; --2000 maxChordHeapLength: CARDINAL = 1000; --2000 maxSelectionLength: CARDINAL = 100; score: PiecePTR; scoreLength: CARDINAL; sheet: ARRAY [0..sheetLength) OF Section; style: ARRAY [0..20] OF Staves; TF: CARDINAL; -- "Time Factor" = horizontal scale of score on sheet. show: DocumentProfile; voice: BOOL; selectedVoice: CARDINAL; maxVoice: CARDINAL; begin, endTime: Time; scale, staffLength, top: INTEGER; hardcopy: BOOL; lineSelect: READONLY BOOL; selection: ARRAY [0..maxSelectionLength) OF NotePTR; selectionLength: CARDINAL; select1, select2, greySelect1, greySelect2: READONLY Time; min, max: Time; -- extent of change command, flash: BOOL; -- flash = "error" context: Graphics.Context; text, music: Graphics.FontRef; print: BOOL; dataStructureInFlux: BOOL; playing, listening: READONLY BOOL; chordHeap: ChordHeapPTR; chordHeapLength: CARDINAL; beamHeap: BeamHeapPTR; beamHeapLength: CARDINAL; Texture: TYPE ~ CARDINAL; white: Texture=0; light: Texture; grey: Texture=122645B; black: Texture=177777B; Measure: PROC[e: EventType] RETURNS[BOOL] = INLINE {RETURN[e IN [measure..m5] OR e=staves]}; EndOfScore: PROC RETURNS[Time] =INLINE {IF scoreLength#0 THEN RETURN[score[scoreLength-1].time+40] ELSE RETURN[10]}; LMod: PROC[m, n: Time] RETURNS[k: Time] = INLINE {k _ m - n*(m/n); IF k>n THEN k _ k+n}; Mod: PROC[m, n: INTEGER] RETURNS[k: INTEGER] = INLINE {k_ m MOD n; IF k<0 THEN k _ k+n}; SetBrush: PROC[tex: Texture, pnt: Graphics.PaintMode] = INLINE { Graphics.SetStipple[context, tex]; [] _ Graphics.SetPaintMode[context, pnt]}; SetDirty: PROC[begin, end: Time] = INLINE {min _ MIN[min, begin]; max _ MAX[max, end]}; END. ¼MusicDefs.mesa Copyright (C) 1981, 1984 Xerox Corporation. All rights reserved. Author: John Maxwell last modified: December 9, 1981 8: 22 AM Edited by Doug Wyatt, June 14, 1984 4:10:43 pm PDT ********************************************************************************** the basic music types ********************************************************************************** ********************************************************************************** other types ********************************************************************************** ********************************************************************************** global variables ********************************************************************************** view on score selection return info for commands graphics communicating with the synthesizer data storage ********************************************************************************** INLINE Procedures ********************************************************************************** ************************************************************************* mouse and keyboard ************************************************************************* AnyBug: PROC RETURNS[BOOL] = INLINE {RETURN[RedBug[] OR BlueBug[] OR YellowBug[]]}; RedBug: PROC RETURNS[BOOL] = INLINE {RETURN[(MouseButtons^ MOD 8) < 4]}; BlueBug: PROC RETURNS[BOOL] = INLINE {RETURN[(MouseButtons^ MOD 4) < 2]}; YellowBug: PROC RETURNS[BOOL] = INLINE {RETURN[(MouseButtons^ MOD 2) = 0]}; Shift: PROC RETURNS[BOOL] = INLINE {RETURN[InlineDefs.BITAND[KeyBoard3^, 000100B]=0 OR InlineDefs.BITAND[KeyBoard4^, 000010B]=0 OR InlineDefs.BITAND[KeyBoard4^, 000200B]=0]}; Control: PROC RETURNS[BOOL] = INLINE {RETURN[InlineDefs.BITAND[KeyBoard3^, 004000B]=0]}; MouseButtons: POINTER TO CARDINAL = LOOPHOLE[177030B]; KeyBoard1: POINTER TO CARDINAL = LOOPHOLE[177034B]; KeyBoard2: POINTER TO CARDINAL = LOOPHOLE[177035B]; KeyBoard3: POINTER TO CARDINAL = LOOPHOLE[177036B]; KeyBoard4: POINTER TO CARDINAL = LOOPHOLE[177037B]; MouseX: POINTER TO INTEGER = LOOPHOLE[424B]; MouseY: POINTER TO INTEGER = LOOPHOLE[425B]; CursorX: POINTER TO CARDINAL = LOOPHOLE[426B]; CursorY: POINTER TO CARDINAL = LOOPHOLE[427B]; Ê ¿˜šœ™Jšœ@™@Jšœ™Jšœ)™)J™2J˜—šÏk ˜ Jšœ œ9˜GJšœœœ˜J˜—Jšœ œ ˜Jšœ ˜Jšœ˜J˜Jšœœ œ˜Jšœœ œ˜J˜Jšœ œ˜!Jšœ œA˜OJ˜JšœR™RJšœ™JšœR™RJ˜Jšœ œœœ Ïc!˜ZJ˜šœ œœ˜Jšœž˜'J˜J˜Jšœœ˜Jš œœœ œœ˜2Jšœ˜—J˜šœ œœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœ œ˜Jšœœœ˜J˜Jšœž˜-J˜J˜Jšœœ˜Jšœœœ˜Jšœ œ˜Jšœœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœ!ž˜)Jšœž˜$Jšœž˜$Jšœ˜—J˜šœœœ˜Jšœœ˜Jšœ œ˜Jšœ œ˜Jšœœœž)˜