Hi Harm,

On Tue, Sep 6, 2016 at 2:01 PM, Thomas Morley <thomasmorle...@gmail.com> wrote:
> 2016-09-06 19:41 GMT+02:00 David Nalesnik <david.nales...@gmail.com>:
>> On Tue, Sep 6, 2016 at 11:07 AM, Marc Hohl <m...@hohlart.de> wrote:
>>> Am 06.09.2016 um 16:09 schrieb David Nalesnik:
>>
>>>> Even if you for this to work, your mockup shows a line more complex
>>>> than a squiggle.  You'd only be able to get a simple zigzag line,
>>>> without the refinement at the ends, and without control of the
>>>> "amplitude" (as if my simple example below).
>>>
>>>
>>> I found out that the aplitude may be controlled by
>>>
>>> \override Staff.MultiMeasureRest.zigzag-length = #1.33
>>> \override Staff.MultiMeasureRest.zigzag-width = #1.33
>>>
>>> and playing around with these values.
>>
>> Aha!
>>
>> Well, I found time to finish what I started.  See attached. I added a
>> possibility of a wavy line.
>>
>> David
>
>
> Hi David,
>
> last time I tried to override MMR's stencil was back in 2.16.0.
> I never got it to work properly: always misalignings between default
> and tweaked stencils and/or MMR-Number. This happened differently
> depending whether the MMR occured in the first line or in next lines.
> Sometimes it made a difference, if I omitted Score.BarNumber or not
> (never found out why) and some other jokes of this kind..,
> In the end I gave up.
> Though, that was 2.16.0
>
> I didn't dive into your code, but did a test.
>
> mmrDefault = {
>   \compressFullBarRests
>   R1*24
>   R1*4
>   R1*72
> }
>
> mmrZigZag = {
>   \temporary \override Staff.MultiMeasureRest #'stencil =
>     #(my-stencil make-zigzag-squiggle 2 1) % squiggle length, height
>   \compressFullBarRests
>   R1*24
>   % ignored
>   R1*4
>   \once \override Staff.MultiMeasureRest #'stencil =
>     #(my-stencil make-zigzag-squiggle 3 1)
>   R1*72
>   \revert Staff.MultiMeasureRest #'stencil
> }
>
> mmrWavy = {
>   \temporary \override Staff.MultiMeasureRest #'stencil =
>     #(my-stencil make-wavy-squiggle 2 1)
>   \compressFullBarRests
>   R1*24
>   R1*4
>   \once \override Staff.MultiMeasureRest #'stencil =
>     #(my-stencil make-wavy-squiggle 3 2)
>   R1*72
>   \revert Staff.MultiMeasureRest #'stencil
> }
>
> \new StaffGroup
> <<
>   \new Staff { \key cis \major \mmrDefault \break \mmrDefault }
>   \new Staff { \mmrZigZag \mmrZigZag }
>   \new Staff { \mmrWavy \mmrWavy }
>>>
>
> \layout {
>   indent = 0
>   ragged-right = ##f
> }
>
> The result reminds me strongly at my previous experiences.

I was hoping no one would see that the redrawn stencils were slightly longer :)

This came from drawing the line to its full extent and adding the
vertical lines to the edges, further increasing the extent of the
redrawn stencil.

Here, I shorten the "horizontal" part by the thickness of the line and
superimpose the vertical lines.

The numbers turn out (see log) -- the stencil extents of the redrawn
stencils are the same as the default values.

I have to confess that working out problems of this sort -- accounting
for line-thickness, staff-line thickness, blot diameter, the fact that
make-combined-stencil starts at (0 0), and all the rest -- drives me
absolutely out of my mind.  I really hope that I've got it right,
though I suspect that you will be able to break it in a heartbeat :(

> I'm stil not motivated to catch this ball again,

Why ever not? :)

David

P. S.  This all might be easier if the C++ were translated to Scheme.
Then there would be no need to try to match the old stencil's
dimensions, and no redundant calculations.  Looks like it wouldn't be
to hard to do, though I'm not up to it at the moment.
\version "2.19.46"

#(define (make-zigzag-squiggle startX endX squiggle-length squiggle-height)
   (let* ((len (- endX startX))
          (squiggle-count (floor (/ len squiggle-length)))
          (leftover (- len (* squiggle-length squiggle-count))))
     (let loop ((start (+ startX (/ leftover 2)))
                (sqc squiggle-count)
                (y squiggle-height) ; amplitude
                (result '()))
       (if (= sqc 0)
           (append result (list (list endX 0)))
           (loop
            (+ start squiggle-length)
            (1- sqc)
            (- y)
            (append result
              (list
               (list start 0)
               (list (+ start (/ squiggle-length 2)) y)
               (list (+ start squiggle-length) 0))))))))

#(define (make-wavy-squiggle startX endX squiggle-length squiggle-height)
   (let* ((len (- endX startX))
          (squiggle-count (floor (/ len squiggle-length)))
          (leftover (- len (* squiggle-length squiggle-count))))
     (let loop ((start (+ startX (/ leftover 2)))
                (sqc squiggle-count)
                (y squiggle-height) ; amplitude
                (result (list (list (+ startX (/ leftover 2)) 0))))
       (if (= sqc 0)
           (reverse (cons (list endX 0) result))
           (loop
            (+ start squiggle-length)
            (1- sqc)
            (- y)
            (cons
             (list
              start 0
              (+ start (/ squiggle-length 2)) y
              (+ start squiggle-length) 0)
             result))))))

#(define (my-big-rest grob proc squiggle-len squiggle-height width)
   (let* ((thick-thick (ly:grob-property grob 'thick-thickness 1.0))
          (hair-thick (ly:grob-property grob 'hair-thickness 0.1))
          (ss (ly:staff-symbol-staff-space grob))
          (slt (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness))
          (y (* slt (/ thick-thick 2) ss))
          (ythick (* hair-thick slt ss))
          (blot (* 0.8 (min y ythick)))

          ;; default
          ;(m (ly:round-filled-box
          ;   (cons 0.0 (max 0.0 (- width (* 2 ythick))))
          ;  (cons (- y) y)
          ;  blot))

          (m (make-connected-path-stencil
              (proc 0 (- width ythick) squiggle-len squiggle-height)
              ythick 1 1 #f #f))
          (m (ly:stencil-translate-axis m (/ ythick 2) X))
          ;(m (ly:line-interface::line grob (* slt 0.5) 0 (- width (* slt 0.5)) 0))

          (yb (ly:round-filled-box
               (offset-scale (cons -0.5 0.5) ythick)
               (cons (- ss) ss)
               blot))
          (m
           (ly:stencil-add m
            (ly:stencil-translate-axis
             (ly:stencil-aligned-to yb X RIGHT) width X)))
          (m
           (ly:stencil-add m (ly:stencil-aligned-to yb X LEFT)))
          (m (ly:stencil-aligned-to m X LEFT)))
     m))

#(define (my-stencil proc squiggle-length squiggle-height)
   (lambda (grob)
     (let* ((default-stil (ly:multi-measure-rest::print grob))
            (X-ext (ly:stencil-extent default-stil X))
            (len (interval-length X-ext)))
       (display "stencil-ext  ")(display X-ext) (newline)
       (if (< len 2)
           default-stil
           (let ((my-stil (my-big-rest grob proc squiggle-length squiggle-height len)))
             ;; stencil from my-big-rest will be at 0.0; move it to X position of default
             (ly:stencil-translate-axis my-stil (car X-ext) X))))))
#(define (print-extent grob)
   (display (ly:stencil-extent (ly:grob-property grob 'stencil) X))
   (newline))

mmrDefault = {
  \compressFullBarRests
  R1*24
  R1*4
  R1*72
}

mmrZigZag = {
  \temporary \override Staff.MultiMeasureRest #'stencil =
    #(my-stencil make-zigzag-squiggle 2 1) % squiggle length, height
  \compressFullBarRests
  R1*24
  % ignored
  R1*4
  \once \override Staff.MultiMeasureRest #'stencil =
    #(my-stencil make-zigzag-squiggle 3 1)
  R1*72
  \revert Staff.MultiMeasureRest #'stencil
}

mmrWavy = {
  \temporary \override Staff.MultiMeasureRest #'stencil =
    #(my-stencil make-wavy-squiggle 2 1)
  \compressFullBarRests
  R1*24
  R1*4
  \once \override Staff.MultiMeasureRest #'stencil =
    #(my-stencil make-wavy-squiggle 3 2)
  R1*72
  \revert Staff.MultiMeasureRest #'stencil
}

\new StaffGroup
<<
  \new Staff { \key cis \major \mmrDefault \break \mmrDefault }
  \new Staff { \mmrZigZag \mmrZigZag }
  \new Staff { \mmrWavy \mmrWavy }
>>

\layout {
  indent = 0
  ragged-right = ##f
  \context {
    \Staff
    \override MultiMeasureRest.after-line-breaking = #print-extent
  }
}
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to