Older: Playing a tune that has silence at the beginning gets the moving feedback out of synch. May 6, 1986 5:38:33 pm PDT VoiceInTextImpl.AddVoiceMarkerAtPrimarySelection does not check for a point selection. BoundsFault. August 21, 1986 6:11:39 pm PDT February 17, 1987 6:24:36 pm PST 1. Adding a textual marker refreshes the whole viewer after each character on the color display. For a long annotation, this can be very slow, unless you adjust the window smaller. On the bw display, it just blinks the display in a rather annoying fashion. June 5, 1987 11:03:45 am PDT VoiceMarkersImpl: This was apparently because of a bug that Mike Plass has fixed since Stephen was working on text markers -- PaintViewer was called for each character as a workaround. Removed those calls. 2. Where did Stephen put his new version when he was here in September? incorporated into DCS TV restructuring of April 87 3. The sound viewer frequently gets into a state where you have to close and reopen it in order to be able to select anything. Redraw works at least sometimes to get out of this state. May 13, 1987 4:02:17 pm PDT Any Play to completion (rather than explicit STOP) triggers this state in released TV; in new TV, selection + Play to completion triggers it. 4. Trying to insert a temporary marker during playback is difficult, since the selection is being used to move the playback cue along. You are more likely to get the character that was selected before the playback operation was requested. Dan suggests that what you really want is to have one Mark operation insert a mark at the current playback spot, w/o any selecting. 5. Opening a Dictation Machine from a sound viewer and then clicking PlayFromSelection plays from the selection in the original viewer to its end -- it does not continue into the new sound viewer. It seems to know where a single selection is in some sound viewer, and clicking PlayFromSelection/ResumeFromSelection in any sound viewer plays/resumes from that single selection to the end of its viewer. Clicking ResumeFromEnd in some sound viewer resumes from the end of its own sound viewer only. 5a. It feels like DictationMachine should create a selection at the beginning of the new voice when recording begins. That way the user can repeatedly record and review without having to manually add selections. Of course the user could select something else later if he wishes. Another option: have a PlayFromMark, with DictationMachine automatically inserting Marks. 5b. When recording from the hands-free microphone, either the beep is too long or recording begins too quickly -- you get a bit of the beep at the start of recording. Recording from the handset is ok. 6. I can put voice in a Walnut Sender by clicking AddVoice in a regular Tioga viewer. Of course the interests for that voice will not be managed properly. 7. If you Mark a spot, open a new DictationMachine, and record as desired, you can't Store the DictationMachine at the original spot -- you can only copy it there. Also, if you have several marks, it may be difficult to recall which one to copy to - there aren't enough different colors for the editing history to help. (Using only a selection is even worse, of course, because you will instantly lose your place if you make any other selection anywhere.) 8. The color editing history is maintained over all sound viewers. That seems like the right choice. 9. Mark [left|middle|right] inserts a mark at the current selection (in any sound viewer) and scrolls that viewer to the top. If the selection is not in a sound viewer, it complains. 10. DeleteMarks [left|middle] deletes the selected mark (in any sound viewer) and scrolls that viewer to the top. It does not complain if no mark is selected. DeleteMarks [right] deletes all marks in its sound viewer and scrolls that viewer to the top. 11. If no character is selected during an AddVoice operation, TiogaVoice blows up when trying to create the talks bubble after recording completes. May 13, 1987 4:04:55 pm PDT Two options: either select some random character (inserting one if the document is empty), or ensure that there is a selection before recording begins (is it called under locks, so you can't change the selection during the recording process?). The first option would solve the WalnutVoice problem for sending "voice-only" messages. June 10, 1987 4:22:11 pm PDT Yet another option: create a voice viewer for the rope in question and give a message that there was no place to store it. Or perhaps force the user to select a character right then - not non-preemptive, though. June 15, 1987 2:53:56 pm PDT Implementation uses TextKeys (why here & not for voice viewer backpointers??). This allows editing during the voice recording process, but TextKeys really only talk about a point in the document, and we need a character to decorate. A. No movement during recording 1. No selection => complains. 2. Point selection in a node with no more chars => blows up. 3. Point selection in a node with following chars => places the annotation on the following char (unless there is already voice on that char, in which case it gives up quietly). B. Movement during recording. 1. End up with point selection in a node with no more chars => blows up. 2. Changing nodes during recording looks like a problem. June 15, 1987 5:03:22 pm PDT Create voice viewer and user message if anything goes wrong with the TextKey above. 12. Typing a CR in a sound viewer breaks the voice tube into multiple lines. These work correctly during playback. The multiple lines stay over a close/reopen, but editing the voice redraws at least the tail of the voice. Redraw also removes CRs. Interesting: inserting a CR sets the edited bit, but Redraw removes it if there have been no other edits. (How does it do that?) June 5, 1987 12:38:39 pm PDT It turns out that CR goes around the VoiceMarkersImpl.TextInput routines because Tioga.tip does not treat CR as a char. Furthermore, after a CR is inserted, the voice viewer char offsets are out of synch with what TiogaVoice thinks, so editing text markers beyond the CR doesn't work. June 5, 1987 6:17:46 pm PDT Have a new TIP table, but it's not being set onto each voice viewer for some reason. June 7, 1987 All better. New TIP table being set correctly (turns out it can't be done when initializing the viewer, because Tioga will reset it during its initialization, in EnableUserEdits). The new TIP table has the additional feature of disallowing ctrl-CR, which would seriously damage a voice viewer, because voice viewers must have a single node. June 10, 1987 4:28:23 pm PDT BUT: applying Break from the EditTool still works on a voice viewer. Need to trap that. 13. Adding textual annotations to a sound viewer does not set its edited bit, so TiogaVoice refuses to save it. (I can't seem to reproduce this.) June 3, 1987 12:23:27 pm PDT Does not seem to be true of the current version. 14. Textual annotations on earlier pieces of voice are chopped off by textual annotations on later pieces of voice. Adding a CR does not allow the text to extend past the voice tube, but adding enough more voice will reveal the covered text. 15. Dan would prefer talks bubbles that live on a spot between characters and extend out to possibly obscure line/lines above. There could be text (names, permanent textual annotations, etc.) in these large bubbles. Seems to require planes (21/2D) in Tioga. Maybe you'd do a prototype in Gargoyle? They could be anchored to a group of characters rather than just one, say by reverse videoing the anchoring chars. 16. Saving the underlying Tioga document while a voice viewer is open records the talks bubble as open (sound viewer #n) permanently. Saving the sound viewer thereafter does not close the talks bubble. However, destroying the sound viewer does change it back. Maybe saving a sound viewer is not supposed to close the associated talks bubble. Storing it at a new text location closes the old location and opens the newly stored location. Here's what the above remark should say: 16a. Saving the underlying Tioga document while a voice viewer is open records the talks bubble as open (sound viewer #n) permanently. If you then destroy the Tioga viewer before the sound viewer, the file will have an open bubble in it the next time it is opened (whether or not there is a viewer of that name any longer -- and anyway it would have to be the same voice rope and textual annotations). You do get a message in the CommandTool: "detaching parent link for voice viewer 1". Then when you destroy the sound viewer later, you get: "Voice viewer 1 had no parent". You are not allowed to edit the erroneously "open" voice, because TiogaVoice thinks it's already open. June 8, 1987 9:14:54 pm PDT No longer true for 9/86 TV. 16b. Inserting new text earlier in the Tioga viewer than an open annotated spot causes the report: "source marker not found at expected position!!". So the following scenario is a problem: AddVoice, STOP, EditVoice, save Tioga doc (w/ open bubble), edit voice, insert char in Tioga doc before annotated spot, Save sound viewer. Fails with the above report. If you then try to Store the sound viewer at its old spot, you get "cannot add sound on top of sound". EditVoice, edit voice, delete char(s) in Tioga doc before annotated spot, {save Tioga doc (w/ open bubble),} Save sound viewer works ok! -- June 15, 1987 1:54:52 pm PDT Because TV explicitly tracked deletes and adjusted its idea of the sound viewer's backpointer. EditVoice, insert char in Tioga doc before annotated spot, edit voice, Save sound viewer: complaint in the Message Window: "unable to find source marker for voice window: voice not saved", along with the CommandTool report. If you insert 1 char and delete a few chars, it is somehow possible to get a BoundsFault from Tioga trying to find the $voiceWindow character property. June 15, 1987 1:57:56 pm PDT All of the above now fixed, by searching the entire document if need be for the correct $voiceWindow property. Remaining problems: move or transpose to a different document, copying characters with open sound viewers, and splitting documents then destroying the original. 17. Once you have inserted a textual marker, say by typing a space, you can never remove the little arrow, no matter how far you backspace. It's not just something cached, because destroying the sound viewer and recreating it displays the arrows again. June 3, 1987 11:36:09 pm PDT By reading the code I discovered that BackWord (^W) had been coopted to remove all text markers in the selection. June 4, 1987 11:47:57 am PDT Changed BackWord to have its normal function for text markers. Changed both BackSpace and BackWord to remove the text marker whenever its length becomes 0. Function still exists to remove all text markers in the selection (RemoveTextMarkers), but no current user interface access. 18. May 13, 1987 3:55:59 pm PDT If the call to the recording service fails, TV seems to leave itself in a state where it knows recording is going on, so no further operations are allowed "Stop recording before trying to play back" or "Already recording" 19. May 13, 1987 4:02:53 pm PDT Want to allow move, exchange, undo, etc.... 20. May 13, 1987 4:17:10 pm PDT Check interactions with new VoiceRopes?? -------- Working on the new TiogaVoice for Finch7.0: includes SAdes fixes from 10/86 (current FInch for Cedar7.0 does not), plus restructured by DCS to have many fewer modules. ---------- 21. May 19, 1987 4:30:11 pm PDT Should use voice playback reports from Thrush to synchronize beginning/ending of playback cue movement. 22. May 19, 1987 4:31:30 pm PDT Make sure that VoiceInTextImpl.thrushHandle is updated if Finch/Thrush go away and come back. (This may not be needed -- VoiceRope may default a NIL parameter correctly.) 23. May 19, 1987 6:36:50 pm PDT Changed voiceplay10.ks to show feedback even in silent intervals, in such a way that you can still see the boundaries between sound and silence. 24. May 19, 1987 6:50:46 pm PDT ML problem resulting from Dan's combining VoicePlayImpl and VoiceRecordImpl into VoiceRecordPlayImpl: entry proc VoiceRecordPlayImpl.StopRecording calls VoiceViewersImpl.ReplaceSelectionWithSavedInterval which calls entry proc VoiceRecordPlayImpl.RedrawViewer (there rather than in VoiceViewersImpl to synchronize with possible playbacks in progress (?)). 1. If recording is in progress then no playback can be in progress. VoiceRecordPlayImpl.StopRecording also calls VoiceRecordPlayImpl.RedrawViewer directly May 22, 1987 7:58:17 pm PDT. Separated VoiceRecordPlayImpl into playback and recording again. 25. May 22, 1987 7:59:41 pm PDT Can't delete from a voice viewer at all. VoiceRope.Replace (called from VoiceViewersImpl.ReplaceSelectionWithSavedInterval) seems to be returning NIL when it shouldn't. May 27, 1987 4:07:36 pm PDT Changed VoiceRopeServerImpl.Replace (and a few other routines in that module, for cleanliness) to handle replacing with NIL correctly. Also, why does voiceViewerInfo have a VoiceRopeInterval field rather than a VoiceRope field?? Then the dereference in ReplaceSelection... wouldn't be blowing up there, anyhow. 26. May 22, 1987 8:05:05 pm PDT After any edits, the viewer displays as DPPIAK etc. Problem: The style-setting in VoicePlaybackImpl.RedrawViewer seems to have been necessary. Put it back somehow. May 27, 1987 11:13:46 am PDT Set style in RedrawViewer (without using selections, even!). 27. May 27, 1987 4:31:02 pm PDT Marks: the Mark button adds a mark at the point selection, or at both ends of a pending-delete selection. This is not so bad now that selections are not used for playback feedback, but I would still like a mode that automatically marks at "the current spot" during playback. May 29, 1987 11:01:16 am PDT Red-button-Mark now marks at the current spot during playback, otherwise uses selection as before. The DictationMachine button automatically adds a mark (at the place where recording began) iff recording is already active. A mark in a quiescent sound viewer would also be nice. Even better if it could allow a Store. June 1, 1987 11:35:32 am PDT Could add a new property $dictationLoc on a char in a voice window to allow a Store. 28. May 29, 1987 11:13:51 am PDT Possible FINCH bug: select voice balloon and click Play. Then click Stop. Finch never got a report that the conversation had stopped, although Finch claimed to be still connected and TiogaVoice knew that playback had finished. PROBABLE THRUSH BUG. 29. May 29, 1987 1:29:18 pm PDT Select balloon; EditVoice; Store in new loc (closes old text loc); open old loc; Save both voice viewers; Destroy Viewer #1 (corres to new loc) => new text loc does not close!!; Destroy Viewer #2 (corres to old loc) => closes correctly. 30. June 3, 1987 1:11:24 pm PDT Voice viewers have no Reset button => must Destroy & EditVoice to accomplish Reset. 31. June 5, 1987 4:20:37 pm PDT Voice viewers are currently $Text viewers, using a Tioga's TIP table & new notify proc that then calls Tioga when needed. At least a new TIP table, if not a new viewer class?? TiogaFileWatcherImpl tries to save all $Text viewers when the user types shift-shift-swat (?? - maybe it really checks for loading new file while editing older version). This can only work if the enumeration finds the voice viewers before the text viewers, since saving a voice viewer edits its corresponding text viewer. 32. June 8, 1987 8:25:33 pm PDT Editing silence into a voice rope seems to confuse someone about how long the rope is. A request to play the entire rope causes the voice file server to play just the silence, although TV shows feedback for the whole viewer. Similarly, removing silence seems to shorten the rope (perhaps), and it does not actually remove any silence. June 15, 1987 2:03:45 pm PDT 2 Bluejay problems: 1 fixed, and the other a performance problem by which it takes longer to start to play back a new rope than a 1-char deletion, so deleting silence in that way does not sound like it has done anything. 33. June 8, 1987 10:01:26 pm PDT Have a new voice viewer icon, but need to find all places where voice viewers become edited to set the dirty icon properly. June 15, 1987 5:05:33 pm PDT Including the new viewer created if no place to store the voice when recording finished. June 17, 1987 10:48:53 am PDT ways to make voice viewer edited: 1. record new voice into viewer - VoiceRecordImpl.NewRecordingMarker IF NOT viewer.newVersion THEN TiogaVoicePrivate.MakeVoiceEdited[viewer]; 2. edit voice: move, transpose, copy, delete VoiceViewersImpl: Delete, Copy VoiceMarkersImpl.AdjustSilences 3. edit text markers: insert or delete chars/markers VoiceMarkersImpl: TextInput, Back, RemoveTextMarkers 4. no place to store newly recorded voice in text viewer VoiceRecordImpl.StopRecording 5. delete text connected to a voice viewer VoiceInTextImpl.DeleteVoiceFromChar ways to make not edited 1. store - VoiceViewersImpl.StoreVoice 2. save - VoiceViewersImpl.SaveVoice 34. June 9, 1987 6:58:24 pm PDT If you copy a character that has an open sound viewer to some other part of the doc, you will get a char that thinks it has an associated voice viewer, but is in fact completely unrelated. Need to intercept the copy command between/within text viewers, and either remove the voice properties or record multiple associations with the text (could be in different files). The former is probably easier to handle for now, at least. What you really want is to copy the voice property to the new location, remove the voiceWindow property from the old location, and add the voiceWindow property to the new location. June 10, 1987 4:31:48 pm PDT This means monitoring all text-to-text copies. For speed, may want to associate a property flag with a viewer (or Tioga doc) that indicates whether the viewer/doc has any voice in it -- this would be valid before Tioga Saves. Might speed up Saves too. Note: probably only interested in open voice, so might not be that useful for speeding up Tioga Saves. psel ssel dir result not not s->p copy[s, p] => 1 p, 2 s = shift-SEL not not p->s copy[p, s] => 2 p, 1 s = ^S pend not s->p del[p] + copy[s, p] => 0 p, 2 s = pending shift-SEL pend not p->s move[p, s] => 1 p, 1 s = ^Z not pend s->p move[s, p] => 1 p, 1 s = ^shift-SEL not pend p->s -- not possible pend pend s->p del[p] + move[s, p] => 0 p, 1 s = pending ^shift-SEL pend pend p->s -- not possible + transpose transpose[p, s] => 1p, 1s June 12, 1987 6:51:53 pm PDT Does text UNDO create even more trouble with tracking these events??? 35. June 10, 1987 4:56:49 pm PDT To edit a character that contains voice, you might EditVoice on that char, replace the char with the desired one, and then store the voice viewer back in that spot. This operation currently gets address faults from VoiceInTextImpl.DoIt|14554 too. June 12, 1987 5:48:29 pm PDT Changed VoiceInTextImpl to treat TiogaVoicePrivate.VoiceViewerInfo.positionInParent as a hint only; search the parent for the correct $voiceWindow property if it's not where you thought it would be. 36. June 12, 1987 4:27:14 pm PDT TiogaVoice currently tracks the parent viewer for a voice viewer. Split followed by destroy original viewer will thus confuse it => "voice viewer has no parent viewer!", although the source markers will be visible. Option 1: ViewerClasses.Viewer.link holds a circular list of split viewers. Can register with ViewerEvents to track all creates & maybe destroys of $Text viewers, and put these additional viewers in a list that we need to look at for having voice, and substituting as needed if the original viewer is destroyed. Option 2: keep a parent document rather than a parent viewer (why is a parent viewer needed/good for anything anyway? Because it's quick, also easy to watch if that viewer is destroyed, i.e, Split;Destroy breaks the link). users of parentViewer VoiceViewersImpl SetParentViewer: PUBLIC PROC caller: VoiceInTextImpl.EditVoiceProc RemoveParentViewer: PUBLIC PROC caller: VoiceInTextImpl.DeleteVoiceFromChar StoreVoice: Menus.MenuProc SaveVoice: Menus.MenuProc DestroyVoiceInfo: PROC VoiceInTextImpl StoreVoiceAtSelection: PUBLIC PROC EditVoiceProc: Menus.MenuProc RemoveParentPointersTo: PUBLIC PROC TrackDeletes: PUBLIC PROC Option 3: use Tioga's TextKeys, which would need to be modified to a) cross document boundaries, b) not require a node hint, c) have multiplicity(?) Option 4: 37. June 15, 1987 2:07:55 pm PDT Use PopUpButtons to document the different options for Mark in a voice viewer? With integrated Help facility? 38. June 15, 1987 2:35:22 pm PDT Need to test: Deleting the contents of a voice viewer seems to destroy the viewer. What then happens to any text location that was related to that voice viewer? It's as you'd expect: the sound viewer disappears, leaving the original voice balloon on the character. The way to delete sound and record new is to DeleteVoice on the character and start over. Can DeleteVoice on an open balloon, which breaks the link, but leaves the voice viewer. 39. Documentation. 40. June 17, 1987 4:33:07 pm PDT From RJB: request confirmation of loss of edits when saving a text doc containing a pointer to an edited voice viewer. 41. June 17, 1987 4:33:10 pm PDT From RJB: could search entire doc for $voiceWindow props to support copies within a single doc. Could remove $voiceWindow prop in PaintProc if points to wrong doc (must search splits though). This would effectively break the links for copying, moving across doc boundaries. Could also implement lists in the PaintProc. 42. June 17, 1987 7:45:02 pm PDT in progress: VoiceViewersImpl GetVoiceViewerNumber GetVoiceViewerInfo VoiceViewerAttachmentValid VoiceInTextImpl ----------- Should only set viewerInfo values or char props under monitor/Tioga locks can't get rope from ViewerInfo DeleteVoiceFromChar have: TiogaOpsDefs.Location, TextNode.Ref want: true link?, voiceViewer, ViewerInfo (to remove link) SearchForVoice have: TiogaOpsDefs.Location, TextNode.Ref want: true link? AddVoiceWindowProps have: TiogaOpsDefs.Location, TextNode.Ref want: true link? (maybe should already have been fixed up) DeleteSourceMarker have: parent viewer, TiogaOpsDefs.Location, TextNode.Ref want: true link?, all linked text locs GetVoiceWindowRope have: TextNode.Ref, offset want: Rope (not clear this is really useful) SaveRopeAtSourceMarker have: parent viewer, TiogaOpsDefs.Location, TextNode.Ref want: all linked text locs DeleteLinks/RemoveAnySourceMarker have: viewer, TiogaOpsDefs.Location, TextNode.Ref want: all linked text locs RecordVoiceInstancesAtRoot have: viewer, rootnode, TextNode.Ref/viewer+property want: true link?, viewerInfo.edited if so TalksBubbleFormat have: TextNode.Location want: true link?, rope if so Option 1: TextNode.Ref, offset => valid, viewerInfo Option 2: VoiceWindowRef, TextNode.Ref => valid, viewerInfo ----------- TalksBubbleFormat RecordVoiceInstancesAtRoot (voiceWindowRope currently wrong) RecordVoiceInstancesAtRoot: PROC [viewer: ViewerClasses.Viewer] RETURNS [quit: BOOL _ FALSE] = { wholeFile: TiogaAccess.Reader _ TiogaAccess.FromViewer[viewer]; soundsInDocument: INT _ 0; rootNode: TextNode.Ref; voiceList: Rope.ROPE _ NIL; userConfirmed: BOOL _ FALSE; DebugRope["Voice messages in document:"]; IF NOT TiogaAccess.EndOf[wholeFile] THEN DO heavyChar: TiogaAccess.TiogaChar _ TiogaAccess.Get[wholeFile]; voiceRope: Rope.ROPE; voiceWindowRef: TiogaVoicePrivate.VoiceWindowRef; IF TiogaAccess.EndOf[wholeFile] THEN EXIT; voiceWindowRef _ NARROW[Atom.GetProp[$voiceWindow, heavyChar.propList]]; IF voiceWindowRef#NIL THEN { viewerInfo: TiogaVoicePrivate.VoiceViewerInfo _ TiogaVoicePrivate.GetVoiceViewerInfo[voiceWindowRef]; IF NOT userConfirmed AND SameViewerDoc[viewer, viewerInfo.parentViewer] AND viewerInfo.edited THEN { IF NOT MessageWindow.Confirm["Confirm discard of voice edits . . . "] THEN { MessageWindow.Append["Save aborted."]; RETURN[TRUE]; } ELSE userConfirmed _ TRUE; }; voiceRope _ NARROW[Atom.GetProp[$voice, heavyChar.propList]]; IF voiceRope#NIL THEN { DebugRope["\n"]; DebugRope[voiceRope]; soundsInDocument _ soundsInDocument + 1; voiceList _ Rope.Cat[voiceList, "&", voiceRope]; }; ENDLOOP; rootNode _ TiogaButtons.TextNodeRef[TiogaOps.ViewerDoc[viewer]]; TextEdit.PutProp[rootNode, $voicelist, voiceList]; IF soundsInDocument = 0 THEN DebugRope[" none\n"] ELSE DebugRope["\n"] }; 43. After Tioga provides notification on copy/move to other docs, can accelerate Save of text docs without voice: Place $ContainsVoice property on root node of doc whenever record voice into, store voice into, or copy/move char that contains voice. Could even consider incremental update of $voicelist root property. 44. June 18, 1987 4:25:27 pm PDT Would like a new ShowLink command in a voice viewer to show (all) places in its parent doc where this viewer would be stored. 45. June 18, 1987 5:25:25 pm PDT When EditVoice; delete, the icon becomes edited (caption=New File currently), but Destroy isn't guarded. New Dictation Machine windows have guarded Destroy buttons. What is different? 46. June 19, 1987 2:02:25 pm PDT If no root is specified, TiogaOps.CallWithLocks locks only the selection and may raise NoSelection: ERROR. TV may wish to use some other locking mechanism when no selection is involved. 47. June 22, 1987 1:01:48 pm PDT Minor TVPrivate: DeleteSourceMarkers should have exceptionLoc default to NIL, call in VoiceViewersImpl.DestroyVoiceInfo should utilize. 48. June 22, 1987 2:51:57 pm PDT Can't change doc in paintproc because paintproc holds read lock => check source marker links but don't destroy in paintproc => copying open source marker to another doc closes the marker (as it should), but copying it back yields an open source marker when it returns to the original doc. Could fork a process to break the link, but there could be races with user activity. 49. June 22, 1987 3:21:09 pm PDT Bug in copying pending-delete voice with text markers when source and dest are in the same voice viewer (addr fault when redrawing text markers). June 22, 1987 7:25:27 pm PDT caused by redrawing in the middle and thus destroying the dest node. VoiceViewersImpl: Copy, ReplaceSelectionWithSavedInterval. 50. June 22, 1987 7:57:33 pm PDT (JDM) Where is playback feedback when left click Play in voice viewer and no selection? 51. June 22, 1987 7:58:22 pm PDT (JDM) Copy open source marker; destroy voice viewer; edit assoc old text spot again => "TEditFormatImpl Character Artwork Format bug" in msgwindow. Also perhaps when trying to edit voice on char that has invisible $voiceWindow property? <TiogaVoiceNotes.tioga Polle Zellweger (PTZ) June 22, 1987 1:02:48 pm PDT If the voiceWindow is really linked to this doc (in case this region of the file has never been painted since a move or copy from the real linked doc) and the voiceWindow has been edited, ask user to confirm save without those edits. Ê L• voicelistP&PolleZ.pa#603701467&PolleZ.pa#603701676&PolleZ.pa#603723235&PolleZ.pa#603723286˜™Icode™2—J™J˜J˜J˜rJ˜Jšœƒ˜ƒJ˜J˜ J˜šÏy…Ñbiyy˜‚Jšœë˜ë—J˜JšGœ3˜zJ˜š¹˜¹Jš©˜©—J˜Jšô˜ôJ˜J• CharPropsg voicePolleZ.pa#603701467Artwork TalksBubble voicePolleZ.pa#603701676Artwork TalksBubbleƒXšœ¿Ïiœ–Ÿœ˜òJ˜J–ÓvoicePolleZ.pa#603723235Artwork TalksBubble textInVoice50:48:From Brad Myers's window paper - from microphonevoicePolleZ.pa#603723286Artwork TalksBubble textInVoice0:24:Brad again, from handset‚W˜óJ˜J˜ÉJ˜J˜›J˜J˜ÉJ˜J˜eJ˜JšœHŸœŸ"œ;˜·J˜Jšœ<ŸœŸ"œZŸœ1˜þJ˜šÐby“˜“JšŸé˜éJšŸñ˜ñšŸ˜JšŸé˜éšŸ˜JšŸ˜JšŸ<˜˜>Kšœ¤œ˜Kšœ1˜1Jš¤œ¤œ¤œ˜*Kšœ¤œ1˜Hš¤œ¤œ¤œ˜Kšœe˜eK™éš ¤œ¤œ¤œ/¤œ¤œ˜dš¤œ¤œ@¤œ˜LKšœ&˜&Kš¤œ¤œ˜ K˜—Kš¤œ¤œ˜—K˜—Jšœ ¤œ+˜=š¤œ ¤œ¤œ˜Jšœ˜Jšœ˜Jšœ(˜(Jšœ0˜0K˜—Jš¤œ˜——J˜Jšœ@˜@Jšœ2˜2Jš¤œ¤œ¤œ˜GJ˜——J˜——˜½J˜—J˜žJ˜J˜ÛJšœ…¤œQ˜ÛJ˜Jšœ2¥œc˜¨J˜J˜—J˜Jšœ®œtÏr)˜ÏJ˜J˜xJ˜J˜Ž—…—h”s