<> <> <> <> <> <<>> DIRECTORY ImagerFont USING [ Font ], Jukebox USING [bytesPerChirp], MBQueue USING [Queue], Menus USING [Menu, MenuProc, MenuEntry], Rope USING [ROPE], TEditDocument USING [SelectionId], TiogaOpsDefs USING [Location, Ref, WhichSelection], ViewerClasses USING [Viewer], ViewerEvents USING [EventRegistration], VoiceRope USING [Handle, IntervalSpecs, VoiceRopeInterval] ; <<>> TiogaVoicePrivate: CEDAR DEFINITIONS = BEGIN <<>> <> <<>> <> <<>> VoiceViewerInfo: TYPE = REF VoiceViewerInfoRec; VoiceViewerInfoRec: TYPE = RECORD [ -- the data structure underpinning all voice viewers viewer: ViewerClasses.Viewer, viewerNumber: INT, ropeInterval: VoiceRopeInterval, -- the rope interval represented by the viewer soundList: SoundList, -- a list of the sound/silence intervals in that rope interval remnant: INT, -- the display shows the rope interval using characters representing a fixed amount of time: this is samplesInRope MOD lengthOfACharacterInSamples charMarkList: LIST OF INT _ NIL, -- an ordered list of the characters which have character marks on them textMarkList: LIST OF TextMarkEntry _ NIL, -- see below: list is again ordered ageList: LIST OF IntPair _ NIL, -- see below: each age lasts until the next element in the list, otherwise until the end of the viewer color: BOOLEAN _ FALSE, -- is the viewer currently on the color display? edited: BOOLEAN _ FALSE, -- the true indication whether the voice has been edited: at times may not agree with the viewer's 'edited' flags editInProgress: BOOLEAN _ TRUE, -- set if an initiated edit has yet to complete: this includes all cut/paste operations; input to the viewer; alteration of markers and redrawing operations, since none of these is allowed to occur simultaneously in this implementation. It is created TRUE and only set FALSE once the viewer's contents are valid destroyEvent: ViewerEvents.EventRegistration, changeColumnEvent: ViewerEvents.EventRegistration, parentViewer: ViewerClasses.Viewer _ NIL, -- trace of where the SourceMarker for the viewer is, NIL if no parent positionInParent: TiogaOpsDefs.Location, -- ditto: invalid if parentViewer = NIL nextInfoRec: VoiceViewerInfo _ NIL ]; <> TextMarkEntry: TYPE = REF TextMarkRec; TextMarkRec: TYPE = RECORD [ position: INT, -- the number of the character to which the text is attached text: Rope.ROPE, -- the text itself displayChars: INT, -- how much of the text can be displayed [without running into the next TextMarkEntry], in characters width: INT -- how much space this display will take, measured in voice character widths ]; <> IntPair: TYPE = RECORD [ position: INT, age: INT ]; <> <<>> soundRopeCharsPerSecond: NAT = 4; soundRopeCharLength: NAT = Jukebox.bytesPerChirp/soundRopeCharsPerSecond; <> soundRopeCharDivisions: NAT = 4; -- number of stripes per character; soundRopeResolution: NAT = soundRopeCharLength/soundRopeCharDivisions; voiceViewerMenu: Menus.Menu; <> voiceViewerInfoList: VoiceViewerInfo; <> <<>> <> <<>> VoiceRopeInterval: TYPE = VoiceRope.VoiceRopeInterval; <> Selection: TYPE = REF SelectionRec; SelectionRec: TYPE = RECORD [ <> viewer: ViewerClasses.Viewer, voiceViewerInfo: VoiceViewerInfo, ropeInterval: VoiceRopeInterval, displayNode: TiogaOpsDefs.Ref ]; <> SoundInterval: TYPE = REF SoundIntervalRec; SoundIntervalRec: TYPE = RECORD [ ropeInterval: VoiceRopeInterval, soundList: SoundList _ NIL, charMarkList: LIST OF INT _ NIL, textMarkList: LIST OF TextMarkEntry _ NIL ]; SoundList: TYPE = LIST OF Sound; Sound: TYPE = RECORD [ silence: INT, -- a Sound element simply consists of a length of silence sound: INT -- Followed by a length of sound - either may legally be zero ]; <<>> <> <<>> SelectionsAfterRedraw: TYPE = { unAltered, deSelected, primaryOnInsert }; <<>> <> <<>> <> <<>> <> <<>> <> <<>> voiceCharWidth: REAL = 8.0; voiceCharAscent: REAL = 9.0; voiceCharDescent: REAL = 1.0; voiceCharHeight: REAL = voiceCharAscent + voiceCharDescent; voiceMarkerFont: ImagerFont.Font; -- the font used to display the text voiceCharSet: BYTE = 0; -- since at times a 16-bit Xerox character code is called for <<>> <> <<>> VoiceWindowRef: TYPE = REF VoiceWindowRec; VoiceWindowRec: TYPE = RECORD [ <> label: Rope.ROPE ]; thrushHandle: VoiceRope.Handle; voiceButtonQueue: MBQueue.Queue; <<>> <> <<>> oldest: READONLY INT; youngest: READONLY INT; <<>> <> <<>> <> <> <> <<>> BuildVoiceViewer: PROC [ voiceID: Rope.ROPE, textInVoice: Rope.ROPE, youngVoice: BOOLEAN] RETURNS [ viewer: ViewerClasses.Viewer, viewerInfo: VoiceViewerInfo, viewerNumber: INT]; <> <<>> SetViewerContents: PROC [viewer: ViewerClasses.Viewer, viewerInfo: VoiceViewerInfo, voiceID: Rope.ROPE, textInVoice: Rope.ROPE, youngVoice: BOOLEAN]; <> SetParentViewer: PROC [viewerInfo: VoiceViewerInfo, parentViewer: ViewerClasses.Viewer, positionInParent: TiogaOpsDefs.Location]; RemoveParentViewer: PROC [viewerNumber: INT]; <> <<>> SetVoiceViewerEditStatus: PROC [viewer: ViewerClasses.Viewer]; <> <<>> GetVoiceLock: PROC [VoiceViewerInfo] RETURNS [BOOLEAN]; <> <<>> <> <> <<>> PlayBackMenuProc: Menus.MenuProc; <> PlaySlabSection: PROC [ viewer: ViewerClasses.Viewer, node: TiogaOpsDefs.Ref, from, to: INT]; <<'node' is the voice-profile rope in the voice viewer 'viewer'. Play all the sound represented by characters 'from' through 'to' inclusive.>> PlayWholeSlab: PROC [viewer: ViewerClasses.Viewer]; PlayRopeWithoutCue: PROC [voiceID: Rope.ROPE]; <> PlayBackInProgress: PROC RETURNS [BOOLEAN]; <> CancelPlayBack: PROC; <> RemoveViewerReferences: PROC [viewer: ViewerClasses.Viewer] RETURNS [okay: BOOLEAN]; <> <<>> RedrawViewer: PROC [ viewer: ViewerClasses.Viewer, newContents: Rope.ROPE, unchangedHead, deleteChars, insertChars: INT, timeRemnant: INT, age: BOOLEAN, selectionsAfterRedraw: SelectionsAfterRedraw] RETURNS [newNode: TiogaOpsDefs.Ref]; <> <> <> <<>> <> <> <<>> RecordingInProgress: PROC RETURNS [BOOLEAN]; <> AddVoiceProc: Menus.MenuProc; <> <<>> StopRecording: PROC; <> DictationMachine: Menus.MenuProc; <> RecordInPlaceOfSelection: PROC [selection: Selection]; <> <<>> <> <> <<>> SoundListFromIntervalSpecs: PROC [ intervalSpecs: VoiceRope.IntervalSpecs, lengthOfRopeInterval: INT] RETURNS [SoundList]; ExtractSoundList: PROC [voiceViewerInfo: VoiceViewerInfo, soundInterval: SoundInterval]; <> <<>> ReplaceSoundList: PROC [ voiceViewerInfo: VoiceViewerInfo, cutStart: INT, cutLength: INT, replacement: SoundList]; <> SoundChars: PROC [ viewerInfo: VoiceViewerInfo, skipChars: INT _ 0] RETURNS [soundRope: Rope.ROPE _ NIL, remnant: INT]; <> << >> LastSilenceInSoundList: PROC [soundList: SoundList, lengthGreaterThan: INT _ 0] RETURNS [startsAt: INT, lasts: INT _ -1]; <> <<>> <> <> <<>> Mumble: PROC [opAttempted: Rope.ROPE, viewerTypes: Rope.ROPE]; <> DescribeSelection: PROC [ which: TiogaOpsDefs.WhichSelection, forceDelete: BOOLEAN, returnSoundInterval: BOOLEAN, viewerAlreadyLocked: ViewerClasses.Viewer _ NIL] RETURNS [failed: BOOLEAN, selection: Selection, soundInterval: SoundInterval _ NIL]; <> <> ReplaceSelectionWithSavedInterval: PROC [ selection: Selection, soundInterval: SoundInterval, leaveSelected: BOOLEAN] RETURNS [viewerDeleted: BOOLEAN, insertChars, positionAfterInsert: INT]; <> <> <> Delete: PROC; <> Copy: PROC [target: TEditDocument.SelectionId _ primary]; <> <<>> Transpose: PROC [target: TEditDocument.SelectionId _ primary]; <> <<>> <> <> <<>> DictationOps: Menus.MenuProc; <> <<>> ToggleDictationMenu: PROC [viewer: ViewerClasses.Viewer]; <> <<>> <> <> <<>> ReColorViewer: PROC [ viewer: ViewerClasses.Viewer, voiceViewerInfo: VoiceViewerInfo _ NIL, repaint: BOOLEAN _ FALSE]; <> <> AgeAllViewers: PROC [youngestViewer: ViewerClasses.Viewer]; <> <<>> EditAges: PROC [ viewerInfo: VoiceViewerInfo, unchangedHead, deleteChars, insertChars: INT]; <> <<>> <> <> <<>> RegisterViewer: PROC[viewer: ViewerClasses.Viewer]; <> <<>> RemoveParentPointersTo: PROC[viewer: ViewerClasses.Viewer]; <> <<>> TrackDeletes: PROC; <> <<>> <> <> <> <> <<>> AddCharMark: Menus.MenuProc; DeleteCharMarks: Menus.MenuProc; LockedAddCharMark: PROC [viewer: ViewerClasses.Viewer, position: INT]; DisplayCharMarks: PROC [ unMarkedRope: Rope.ROPE, charMarkList: LIST OF INT, skipChars: INT] RETURNS [Rope.ROPE]; <> <<>> ExtractCharMarks: PUBLIC PROC [ viewerInfo: VoiceViewerInfo, soundInterval: SoundInterval]; <> <<>> EditCharMarks: PROC [ viewerInfo: VoiceViewerInfo, unchangedHead, deleteChars, insertChars: INT, soundInterval: SoundInterval]; <> <<>> TextInput: PROC [viewer: ViewerClasses.Viewer, input: Rope.ROPE]; <> <<>> BackSpace: PROC [viewer: ViewerClasses.Viewer]; <> BackWord: PROC [viewer: ViewerClasses.Viewer]; <> RedrawTextMarkers: PROC [ viewer: ViewerClasses.Viewer, voiceCharNode: TiogaOpsDefs.Ref]; <> ExtractTextMarks: PUBLIC PROC [ viewerInfo: VoiceViewerInfo, soundInterval: SoundInterval]; <> EditTextMarks: PROC [ viewerInfo: VoiceViewerInfo, unchangedHead, deleteChars, insertChars: INT, soundInterval: SoundInterval]; <> <<>> RopeFromTextList: PROC [LIST OF TextMarkEntry] RETURNS [Rope.ROPE]; <> TextListFromRope: PROC [Rope.ROPE] RETURNS [LIST OF TextMarkEntry]; <> <<>> <> <> <<>> DebugRope: PROC [Rope.ROPE]; ChangeMenu: PROC [viewer: ViewerClasses.Viewer, subMenu: Menus.MenuEntry]; <> <> ApplyToCharsInPrimarySelection: PROC [ActionProc: PROC [TiogaOpsDefs.Location]]; <> <<>> ApplyToLockedChars: PROC [ActionProc: PROC [TiogaOpsDefs.Location]]; <> StoreVoiceAtSelection: PROC [voiceViewerInfo: VoiceViewerInfo] RETURNS [succeeded: BOOLEAN]; <> <<>> PlaySelection: PROC; <> CancelProc: Menus.MenuProc; <> DeleteVoiceFromChar: PROC [position: TiogaOpsDefs.Location]; DeleteSourceMarker: PROC [viewer: ViewerClasses.Viewer, positionInParent: TiogaOpsDefs.Location, voiceViewerNumber: INT]; <> SaveRopeAtSourceMarker: PROC [viewer: ViewerClasses.Viewer, positionInParent: TiogaOpsDefs.Location, voiceViewerNumber: INT, voiceRopeID: Rope.ROPE, textInVoice: Rope.ROPE] RETURNS [succeeded: BOOLEAN]; <> END. <> <> <> <<>>