<div dir="ltr">Thanks, David.<div>I'm not sure how the image got in a bad state :-(</div><div>I'll start over with a new one.</div><div><br></div><div>Cheers,</div><div>Karl</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Apr 22, 2018 at 6:41 PM, David T. Lewis <span dir="ltr"><<a href="mailto:lewis@mail.msen.com" target="_blank">lewis@mail.msen.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I re-saved Karl's update in Morphic-dtl.1418, which is the same as Morphic-kfr.1418<br>
except for the fixed ancestry. I kept a copy of Karl's original MCZ file in case<br>
of any problems.<br>
<br>
Dave<br>
<div class="HOEnZb"><div class="h5"><br>
On Sun, Apr 22, 2018 at 10:10:04AM -0400, David T. Lewis wrote:<br>
> Hi Karl,<br>
> <br>
> I used the web interface to delete version Morphic-kfr.1418.<br>
> <br>
> You will need to do "MCFileBasedRepository flushAllCaches" in your image,<br>
> and probably delete the file in your package-cache directory also.<br>
> <br>
> Usually it is best not to delete versions the way I just did, but in this<br>
> case the version history seemed to be causing problems, so I deleted it.<br>
> <br>
> If anyone has problems with a recently updated image, please revert back<br>
> to Morphic-cmm.1417 and do a flushAllCaches.<br>
> <br>
> Dave<br>
> <br>
> <br>
> On Sun, Apr 22, 2018 at 11:50:59AM +0200, karl ramberg wrote:<br>
> > Hm,<br>
> > Bogus ancestry for this commit :-(<br>
> > Can it be deleted ?<br>
> > <br>
> > Best,<br>
> > Karl<br>
> > <br>
> > On Sun, Apr 22, 2018 at 11:31 AM, <<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>> wrote:<br>
> > <br>
> > > Karl Ramberg uploaded a new version of Morphic to project The Trunk:<br>
> > > <a href="http://source.squeak.org/trunk/Morphic-kfr.1418.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/<wbr>trunk/Morphic-kfr.1418.mcz</a><br>
> > ><br>
> > > ==================== Summary ====================<br>
> > ><br>
> > > Name: Morphic-kfr.1418<br>
> > > Author: kfr<br>
> > > Time: 22 April 2018, 11:30:41.518937 am<br>
> > > UUID: d6dd46c1-fa46-5043-bf0d-<wbr>8b4542cf733d<br>
> > > Ancestors: Morphic-kfr.1416, Morphic-cmm.1417<br>
> > ><br>
> > > Some maintenance to ScorePlayerMorph.<br>
> > > Fixing some layout issues.<br>
> > > Add menu options to make a new score and add tracks to the score.<br>
> > ><br>
> > > =============== Diff against Morphic-kfr.1416 ===============<br>
> > ><br>
> > > Item was changed:<br>
> > >   ----- Method: ProportionalSplitterMorph>><wbr>balanceOffsets (in category<br>
> > > 'layout') -----<br>
> > >   balanceOffsets<br>
> > > +       (self valueOfProperty: #fullDelta) ifNil: [self setProperty:<br>
> > > #fullDelta toValue: (0@0)] .<br>
> > ><br>
> > >         self layoutFrame hasFixedHeight ifTrue: [<br>
> > >                 | otop obot ctop cbot topf |<br>
> > ><br>
> > >                 otop := (owner submorphs detect: [:m |<br>
> > >                                         m layoutFrame topFraction isZero]<br>
> > > ifNone: [^ self]) in: [:tm |<br>
> > >                                                 tm top - (tm layoutFrame<br>
> > > topOffset ifNil: [0])].<br>
> > ><br>
> > >                 obot := (owner submorphs detect: [:m |<br>
> > >                                         m layoutFrame bottomFraction = 1]<br>
> > > ifNone: [^ self]) in: [:tm |<br>
> > >                                                 tm bottom - (tm<br>
> > > layoutFrame bottomOffset ifNil: [0])].<br>
> > ><br>
> > >                 ctop := (self layoutFrame topFraction * (obot - otop))<br>
> > > rounded<br>
> > >                                         + otop + (self layoutFrame<br>
> > > topOffset ifNil: [0]).<br>
> > >                 cbot := (self layoutFrame bottomFraction * (obot - otop))<br>
> > > rounded<br>
> > >                                         + otop + (self layoutFrame<br>
> > > bottomOffset ifNil: [0]).<br>
> > ><br>
> > >                 topf := self layoutFrame topFraction.<br>
> > >                 self layoutFrame topFraction:  ((ctop + cbot) * 0.5 -<br>
> > > otop) / (obot - otop) asFloat.<br>
> > >                 self layoutFrame bottomFraction: self layoutFrame<br>
> > > topFraction.<br>
> > >                 self layoutFrame topOffset: ctop -<br>
> > >                         (self layoutFrame topFraction * (obot - otop) +<br>
> > > otop) rounded.<br>
> > >                 self layoutFrame bottomOffset: cbot -<br>
> > >                         (self layoutFrame bottomFraction * (obot - otop) +<br>
> > > otop) rounded..<br>
> > ><br>
> > >                 (leftOrTop copy union: rightOrBottom) do: [:m |<br>
> > >                         (m layoutFrame topFraction closeTo: topf) ifTrue: [<br>
> > >                                 m layoutFrame topFraction: self<br>
> > > layoutFrame topFraction.<br>
> > >                                 m layoutFrame topOffset:<br>
> > >                                         m layoutFrame topOffset - (self<br>
> > > valueOfProperty: #fullDelta) y].<br>
> > >                         (m layoutFrame bottomFraction closeTo: topf)<br>
> > > ifTrue: [<br>
> > >                                 m layoutFrame bottomFraction: self<br>
> > > layoutFrame topFraction.<br>
> > >                                 m layoutFrame bottomOffset:<br>
> > >                                         m layoutFrame bottomOffset - (self<br>
> > > valueOfProperty: #fullDelta) y.]]] .<br>
> > ><br>
> > >         self layoutFrame hasFixedWidth ifTrue: [<br>
> > >                 | oleft oright cleft cright leftf |<br>
> > ><br>
> > >                 oleft := (owner submorphs detect: [:m |<br>
> > >                         m layoutFrame leftFraction isZero] ifNone: [^<br>
> > > self]) in: [:tm |<br>
> > >                                 tm left - (tm layoutFrame leftOffset<br>
> > > ifNil: [0])].<br>
> > ><br>
> > >                 oright := (owner submorphs detect: [:m |<br>
> > >                         m layoutFrame rightFraction = 1] ifNone: [^ self])<br>
> > > in: [:tm |<br>
> > >                                 tm right - (tm layoutFrame rightOffset<br>
> > > ifNil: [0])].<br>
> > ><br>
> > >                 cleft := (self layoutFrame leftFraction * (oright -<br>
> > > oleft)) rounded<br>
> > >                                         + oleft + (self layoutFrame<br>
> > > leftOffset ifNil: [0]).<br>
> > >                 cright := (self layoutFrame rightFraction * (oright -<br>
> > > oleft)) rounded<br>
> > >                                         + oleft + (self layoutFrame<br>
> > > rightOffset ifNil: [0]).<br>
> > ><br>
> > >                 leftf := self layoutFrame leftFraction.<br>
> > >                 self layoutFrame leftFraction: ((cleft + cright) * 0.5 -<br>
> > > oleft) / (oright - oleft) asFloat.<br>
> > >                 self layoutFrame rightFraction: self layoutFrame<br>
> > > leftFraction.<br>
> > ><br>
> > >                 self layoutFrame leftOffset: cleft -<br>
> > >                         (self layoutFrame leftFraction * (oright - oleft)<br>
> > > + oleft) rounded.<br>
> > >                 self layoutFrame rightOffset: cright -<br>
> > >                         (self layoutFrame rightFraction * (oright - oleft)<br>
> > > + oleft) rounded.<br>
> > ><br>
> > >                 (leftOrTop copy union: rightOrBottom) do: [:m |<br>
> > >                         (m layoutFrame leftFraction closeTo: leftf)<br>
> > > ifTrue: [<br>
> > >                                 m layoutFrame leftFraction: self<br>
> > > layoutFrame leftFraction.<br>
> > >                                 m layoutFrame leftOffset:<br>
> > >                                         m layoutFrame leftOffset - (self<br>
> > > valueOfProperty: #fullDelta) x].<br>
> > >                         (m layoutFrame rightFraction closeTo: leftf)<br>
> > > ifTrue: [<br>
> > >                                 m layoutFrame rightFraction: self<br>
> > > layoutFrame leftFraction.<br>
> > >                                 m layoutFrame rightOffset:<br>
> > >                                         m layoutFrame rightOffset - (self<br>
> > > valueOfProperty: #fullDelta) x.]]] .<br>
> > ><br>
> > >         self removeProperty: #fullDelta.<br>
> > >         owner layoutChanged<br>
> > >   !<br>
> > ><br>
> > > Item was changed:<br>
> > >   ----- Method: ProportionalSplitterMorph>><wbr>step (in category 'events')<br>
> > > -----<br>
> > >   step<br>
> > >         splitsTopAndBottom<br>
> > >                 ifTrue: [ self reduceTopBottomImbalance ]<br>
> > >                 ifFalse:<br>
> > >                         [ self reduceLeftRightImbalance abs > 1 ifTrue:<br>
> > >                                 [ self splittersLeftDo:<br>
> > >                                         [ : splitter | splitter<br>
> > > reduceLeftRightImbalance ].<br>
> > >                                 self splittersRightDo:<br>
> > > +                                       [ : splitter | splitter<br>
> > > reduceLeftRightImbalance ] ] ].<br>
> > > +       self balanceOffsets!<br>
> > > -                                       [ : splitter | splitter<br>
> > > reduceLeftRightImbalance ] ] ]!<br>
> > ><br>
> > > Item was added:<br>
> > > + ----- Method: ScorePlayerMorph>>addNewScore (in category 'menu') -----<br>
> > > + addNewScore<br>
> > > +       "Open a MIDI score and re-init controls..."<br>
> > > +       | score player |<br>
> > > +<br>
> > > +       score := MIDIScore new.<br>
> > > +       score tracks: (Array with: Array new).<br>
> > > +       score trackInfo: #('Instrument').<br>
> > > +       player := ScorePlayer onScore: score.<br>
> > > +       ^self onScorePlayer: player title: 'new'!<br>
> > ><br>
> > > Item was added:<br>
> > > + ----- Method: ScorePlayerMorph>><wbr>addTrackToScore (in category 'menu')<br>
> > > -----<br>
> > > + addTrackToScore<br>
> > > +       "add a instrument track to the current score"<br>
> > > +       | score tracks trackInfo player |<br>
> > > +       score := scorePlayer score.<br>
> > > +       tracks := score tracks copyWith:#().<br>
> > > +       score tracks: tracks.<br>
> > > +       trackInfo := score trackInfo copyWith: 'Instrument'.<br>
> > > +       score trackInfo: trackInfo.<br>
> > > +       player := ScorePlayer onScore: score.<br>
> > > +       ^self onScorePlayer: player title: 'new'!<br>
> > ><br>
> > > Item was changed:<br>
> > >   ----- Method: ScorePlayerMorph>>invokeMenu (in category 'menu') -----<br>
> > >   invokeMenu<br>
> > >         "Invoke a menu of additonal functions for this ScorePlayer."<br>
> > > -<br>
> > >         | aMenu |<br>
> > >         aMenu := MenuMorph new defaultTarget: self.<br>
> > > +       aMenu add: 'add a new score' translated action: #addNewScore.<br>
> > > +       aMenu add: 'add a new track to score' translated action:<br>
> > > #addTrackToScore.<br>
> > >         aMenu add: 'open a MIDI file' translated action: #openMIDIFile.<br>
> > > +       aMenu addList: {#-. {'save as AIFF file' translated. #saveAsAIFF}.<br>
> > > {'save as WAV file' translated. #saveAsWAV}. {'save as Sun AU file'<br>
> > > translated. #saveAsSunAudio}. #-}.<br>
> > > +       aMenu<br>
> > > +               add: 'reload instruments' translated<br>
> > > +               target: AbstractSound<br>
> > > +               selector: #updateScorePlayers.<br>
> > > -       aMenu addList: {<br>
> > > -               #-.<br>
> > > -               {'save as AIFF file' translated.        #saveAsAIFF}.<br>
> > > -               {'save as WAV file' translated.         #saveAsWAV}.<br>
> > > -               {'save as Sun AU file' translated.      #saveAsSunAudio}.<br>
> > > -               #-}.<br>
> > > -       aMenu add: 'reload instruments' translated target: AbstractSound<br>
> > > selector: #updateScorePlayers.<br>
> > >         aMenu addLine.<br>
> > >         scorePlayer midiPort<br>
> > > +               ifNil: [aMenu add: 'play via MIDI' translated action:<br>
> > > #openMIDIPort]<br>
> > > +               ifNotNil: [aMenu add: 'play via built in synth' translated<br>
> > > action: #closeMIDIPort.<br>
> > > -               ifNil: [<br>
> > > -                       aMenu add: 'play via MIDI' translated action:<br>
> > > #openMIDIPort]<br>
> > > -               ifNotNil: [<br>
> > > -                       aMenu add: 'play via built in synth' translated<br>
> > > action: #closeMIDIPort.<br>
> > >                         aMenu add: 'new MIDI controller' translated<br>
> > > action: #makeMIDIController:].<br>
> > >         aMenu addLine.<br>
> > >         aMenu add: 'make a pause marker' translated action:<br>
> > > #makeAPauseEvent:.<br>
> > > +       aMenu popUpInWorld: self world!<br>
> > > -<br>
> > > -       aMenu popUpInWorld: self world.<br>
> > > - !<br>
> > ><br>
> > > Item was changed:<br>
> > >   ----- Method: ScorePlayerMorph>><wbr>onScorePlayer:title: (in category<br>
> > > 'initialization') -----<br>
> > >   onScorePlayer: aScorePlayer title: scoreName<br>
> > >         | divider col r |<br>
> > >         scorePlayer := aScorePlayer.<br>
> > >         scorePlayer ifNotNil:<br>
> > >                 [scorePlayer  reset.<br>
> > >                 instrumentSelector := Array new: scorePlayer score tracks<br>
> > > size].<br>
> > ><br>
> > >         self removeAllMorphs.<br>
> > >         self addMorphBack: self makeControls.<br>
> > >         scorePlayer ifNil: [^ self].<br>
> > ><br>
> > >         r := self makeRow<br>
> > > +               hResizing: #spaceFill;<br>
> > > -               hResizing: #shrinkWrap;<br>
> > >                 vResizing: #shrinkWrap.<br>
> > >         r addMorphBack: self rateControl;<br>
> > >                 addMorphBack: (Morph newBounds: (0@0 extent: 20@0) color:<br>
> > > Color transparent);<br>
> > >                 addMorphBack: self volumeControl.<br>
> > >         self addMorphBack: r.<br>
> > >         self addMorphBack: self scrollControl.<br>
> > ><br>
> > >         col := AlignmentMorph newColumn color: color; layoutInset: 0.<br>
> > >         self addMorphBack: col.<br>
> > >         1 to: scorePlayer trackCount do: [:trackIndex |<br>
> > >                 divider := AlignmentMorph new<br>
> > >                         extent: 10@1;<br>
> > >                         borderWidth: 1;<br>
> > >                         layoutInset: 0;<br>
> > >                         borderColor: #raised;<br>
> > >                         color: color;<br>
> > >                         hResizing: #spaceFill;<br>
> > >                         vResizing: #rigid.<br>
> > >                 col addMorphBack: divider.<br>
> > >                 col addMorphBack: (self trackControlsFor: trackIndex)].<br>
> > ><br>
> > >         LastMIDIPort ifNotNil: [<br>
> > >                 "use the most recently set MIDI port"<br>
> > >                 scorePlayer openMIDIPort: LastMIDIPort].<br>
> > >   !<br>
> > ><br>
> > > Item was changed:<br>
> > >   ----- Method: ScorePlayerMorph>>rateControl (in category 'layout') -----<br>
> > >   rateControl<br>
> > ><br>
> > >         | rateSlider middleLine r |<br>
> > >         rateSlider := SimpleSliderMorph new<br>
> > >                 color: color;<br>
> > >                 sliderColor: Color gray;<br>
> > > +               extent: 180@12;<br>
> > > -               extent: 180@6;<br>
> > >                 target: self;<br>
> > >                 actionSelector: #setLogRate:;<br>
> > >                 minVal: -1.0;<br>
> > >                 maxVal: 1.0;<br>
> > >                 adjustToValue: 0.0.<br>
> > >         middleLine := Morph new  "center indicator for pan slider"<br>
> > >                 color: (Color r: 0.4 g: 0.4 b: 0.4);<br>
> > >                 extent: 1@(rateSlider height - 4);<br>
> > >                 position: rateSlider center x@(rateSlider top + 2).<br>
> > >         rateSlider addMorphBack: middleLine.<br>
> > >         r := self makeRow<br>
> > > +               hResizing: #spaceFill;<br>
> > > -               hResizing: #shrinkWrap;<br>
> > >                 vResizing: #rigid;<br>
> > >                 height: 24.<br>
> > >         r addMorphBack: (StringMorph contents: 'slow ' translated).<br>
> > >         r addMorphBack: rateSlider.<br>
> > >         r addMorphBack: (StringMorph contents: ' fast' translated).<br>
> > >         ^ r<br>
> > >   !<br>
> > ><br>
> > > Item was changed:<br>
> > >   ----- Method: ScorePlayerMorph>><wbr>scrollControl (in category 'layout')<br>
> > > -----<br>
> > >   scrollControl<br>
> > ><br>
> > >         | r |<br>
> > >         scrollSlider := SimpleSliderMorph new<br>
> > >                 color: color;<br>
> > >                 sliderColor: Color gray;<br>
> > > +               extent: 360@12;<br>
> > > -               extent: 360@6;<br>
> > >                 target: scorePlayer;<br>
> > >                 actionSelector: #positionInScore:;<br>
> > >                 adjustToValue: scorePlayer positionInScore.<br>
> > >         r := self makeRow<br>
> > > +               hResizing: #spaceFill;<br>
> > > -               hResizing: #shrinkWrap;<br>
> > >                 vResizing: #rigid;<br>
> > >                 height: 24.<br>
> > >         r addMorphBack: (StringMorph contents: 'start ' translated).<br>
> > >         r addMorphBack: scrollSlider.<br>
> > >         r addMorphBack: (StringMorph contents: ' end' translated).<br>
> > >         ^ r<br>
> > >   !<br>
> > ><br>
> > > Item was changed:<br>
> > >   ----- Method: ScorePlayerMorph>><wbr>trackNumAndMuteButtonFor: (in category<br>
> > > 'layout') -----<br>
> > >   trackNumAndMuteButtonFor: trackIndex<br>
> > ><br>
> > >         | muteButton instSelector pianoRollColor r |<br>
> > >         muteButton := SimpleSwitchMorph new<br>
> > >                 onColor: (Color r: 1.0 g: 0.6 b: 0.6);<br>
> > >                 offColor: color;<br>
> > >                 color: color;<br>
> > >                 label: 'Mute' translated;<br>
> > >                 target: scorePlayer;<br>
> > >                 actionSelector: #mutedForTrack:put:;<br>
> > >                 arguments: (Array with: trackIndex).<br>
> > >         instSelector := PopUpChoiceMorph new<br>
> > >                 extent: 95@14;<br>
> > >                 contentsClipped: 'oboe1';<br>
> > >                 target: self;<br>
> > >                 actionSelector: #atTrack:from:<wbr>selectInstrument:;<br>
> > >                 getItemsSelector: #instrumentChoicesForTrack:;<br>
> > >                 getItemsArgs: (Array with: trackIndex).<br>
> > >         instSelector arguments:<br>
> > >                 (Array with: trackIndex with: instSelector).<br>
> > >         instrumentSelector at: trackIndex put: instSelector.<br>
> > ><br>
> > >         "select track color using same color list as PianoRollScoreMorph"<br>
> > >         pianoRollColor := (Color wheel: scorePlayer score tracks size) at:<br>
> > > trackIndex.<br>
> > ><br>
> > >         r := self makeRow<br>
> > >                 hResizing: #spaceFill;<br>
> > >                 vResizing: #spaceFill;<br>
> > >                 extent: 70@10.<br>
> > >         r addMorphBack:<br>
> > >                 ((StringMorph<br>
> > >                         contents: trackIndex printString<br>
> > >                         font: (TextStyle default fontOfSize: 24)) color:<br>
> > > pianoRollColor).<br>
> > >         trackIndex < 10<br>
> > >                 ifTrue: [r addMorphBack: (Morph new color: color; extent:<br>
> > > 19@8)]  "spacer"<br>
> > >                 ifFalse: [r addMorphBack: (Morph new color: color; extent:<br>
> > > 8@8)].  "spacer"<br>
> > >         r addMorphBack:<br>
> > >                 (StringMorph new<br>
> > > +                       extent: 80@14;<br>
> > > -                       extent: 140@14;<br>
> > >                         contentsClipped: (scorePlayer infoForTrack:<br>
> > > trackIndex)).<br>
> > >         r addMorphBack: (Morph new color: color; extent: 8@8).  "spacer"<br>
> > >         r addMorphBack: instSelector.<br>
> > >         r addMorphBack: (AlignmentMorph newRow color: color).  "spacer"<br>
> > >         r addMorphBack: muteButton.<br>
> > >         ^ r<br>
> > >   !<br>
> > ><br>
> > > Item was changed:<br>
> > >   ----- Method: ScorePlayerMorph>><wbr>volumeControl (in category 'layout')<br>
> > > -----<br>
> > >   volumeControl<br>
> > ><br>
> > >         | volumeSlider r |<br>
> > >         volumeSlider := SimpleSliderMorph new<br>
> > >                 color: color;<br>
> > >                 sliderColor: Color gray;<br>
> > > +               extent: 80@12;<br>
> > > -               extent: 80@6;<br>
> > >                 target: scorePlayer;<br>
> > >                 actionSelector: #overallVolume:;<br>
> > >                 adjustToValue: scorePlayer overallVolume.<br>
> > >         r := self makeRow<br>
> > > +               hResizing: #spaceFill;<br>
> > > -               hResizing: #shrinkWrap;<br>
> > >                 vResizing: #rigid;<br>
> > >                 height: 24.<br>
> > >         r addMorphBack: (StringMorph contents: 'soft  ' translated).<br>
> > >         r addMorphBack: volumeSlider.<br>
> > >         r addMorphBack: (StringMorph contents: ' loud' translated).<br>
> > >         ^ r<br>
> > >   !<br>
> > ><br>
> > ><br>
> > ><br>
> <br>
> > <br>
> <br>
> <br>
<br>
</div></div></blockquote></div><br></div>