lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Hairpin endings


From: David Nalesnik
Subject: Re: Hairpin endings
Date: Sun, 23 Apr 2017 18:34:16 -0500

On Sun, Apr 23, 2017 at 6:15 PM, Thomas Morley <address@hidden> wrote:
> 2017-04-23 12:34 GMT+02:00 Andrew Bernard <address@hidden>:
>
>> Next thing to do is to achieve the half dashed/half solid appearance - or
>> can this be done already, in the same way that slurs can?
>
> How about:

This is great!

>
> #(define (solid-dashed-print-proc grob startx starty endx endy)
>   (let* ((dash-def (ly:grob-property grob 'dash-definition))
>          (thick
>            (* (layout-line-thickness grob)
>               (ly:grob-property grob 'thickness 0.1))))
>     (if (null? dash-def)
>         (ly:line-interface::line grob startx starty endx endy)
>         (apply ly:stencil-add empty-stencil

Why not reduce instead of apply?  Tiny point, but then you won't have
the extra empty stencil in the stencil expression.

>           (map
>             (lambda (dash-def-elt)
>               (let* ((start-x
>                        (+ startx (* (- endx startx) (first dash-def-elt))))
>                      (start-y
>                        (+ starty (* (- endy starty) (first dash-def-elt))))
>                      (end-x
>                        (+ startx (* (- endx startx) (second dash-def-elt))))
>                      (end-y
>                        (+ starty (* (- endy starty)  (second dash-def-elt)))))
>                 (ly:stencil-translate
>                   (ly:make-stencil
>                     (list 'dashed-line
>                       ;; thickness
>                       thick
>                       ;; on
>                       (third dash-def-elt)
>                       ;; off
>                       (- 1 (fourth dash-def-elt)) ;; calculation correct?
>                       ;; x-dest
>                       (- end-x start-x)
>                       ;; y-dest
>                       (- end-y start-y)
>                       ;; phase
>                       0)
>                     ;; x-ext
>                     (cons start-x (- end-x start-x))
>                     ;; y-ext
>                     (ordered-cons 0 (- end-y start-y)))
>                   (cons start-x start-y))))
>             dash-def)))))
>
> #(define ((open-hairpin open-gap close-gap) grob)
>    (let* ((stencil (ly:hairpin::print grob))
>           (thick (layout-line-thickness grob))
>           (dir (ly:grob-property grob 'grow-direction))
>           (X-ext (ly:stencil-extent stencil X))
>           (Y-ext (ly:stencil-extent stencil Y))
>           (width (- (interval-length X-ext) thick))
>           (height (- (interval-length Y-ext) thick))
>           (scaled-height (* height (max open-gap close-gap)))
>           (scaled-gap (* height (min open-gap close-gap)))
>           (upper-stil-part
>             (solid-dashed-print-proc
>               grob
>               0
>               (/ (if (= dir -1) scaled-height scaled-gap) 2)
>               width
>               (/ (if (= dir -1) scaled-gap scaled-height) 2))))
>      (ly:stencil-translate
>        (ly:stencil-add
>          upper-stil-part
>          (ly:stencil-scale upper-stil-part 1 -1))
>        (cons (interval-start X-ext) (interval-start Y-ext)))))
>
> {
>   c'1\> c'1 c'1\!
>   \once \override Hairpin.dash-definition =
>     #'((0      0.3    0    0.4)
>        (0.3    0.7    1    1)
>        (0.7    1.0    0.4  0.75))
>   %% order of arguments for 'open-hairpin' doesn't matter!
>   \override Hairpin.stencil = #(open-hairpin 0.2 1.0)
>   c'1\fff\> c'1 c'2 c'2\pppp\!
>   \once \override Hairpin.dash-definition =
>     #'((0      0.3    0    0.4)
>        (0.3    0.45    1    1)
>        (0.7    1.0    0.4  0.3))
>   \once \override Hairpin.thickness = 2
>   c'1\< c'1 c'1\!
>   \revert Hairpin.dash-definition
>   \override Hairpin.style = #'dashed-line
>   \once \override Hairpin.stencil = #(open-hairpin 1.0 0.5)
>   c'1\> c'1 c'1\!
>   \override Hairpin.dash-fraction = 0.3
>   \override Hairpin.dash-period = 1.5
>   \once \override Hairpin.stencil = #(open-hairpin 0.5 0.0)
>   c'1-\tweak thickness 3 \> c'1 c'1\!
> }
>
> HTH,
>   Harm



reply via email to

[Prev in Thread] Current Thread [Next in Thread]