lilypond-user
[Top][All Lists]
Advanced

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

Re: incomplete tuplets in non-standard time signatures


From: Thomas Morley
Subject: Re: incomplete tuplets in non-standard time signatures
Date: Sun, 29 Nov 2020 18:56:47 +0100

Am Fr., 27. Nov. 2020 um 17:21 Uhr schrieb 98123981293 1293812397123
<kylequarles@gmail.com>:
>
> Dear list,
>
> On list thread Apr 6 2020, Harm provided a Scheme workaround for half-dashed 
> tuplet brackets in non-standard time signatures in version 2.20. However, in 
> using his solution in 2.21.6, if a /tempo marking is included in any staff, I 
> observe that, for the first staff in the score, the custom stencil will 
> always engrave as a fully dashed instead of half-dashed tuplet (and no matter 
> where the /tempo statement occurs, all tuplets in that first staff are 
> affected). Half-dashed tuplet stencils engrave as expected in all other 
> staves regardless of any /tempo statements. Can anyone give any insight as to 
> why? Compare output of the following three examples below.
>
> (Or is there an easier way to do this now altogether in ver 2.21.6? Harm 
> hinted at such features possibly becoming available in future releases.)
>
> Thank you,
> Kyle
>
> \version "2.21.6"
>
> %%%SCHEME FUNCTIONS:%%%
>
> #(define (translated-dashed-line->draw-line bool lst)
> ;; lst is supposed to be a list retrieved from a stencil-expression, p.e.
> ;;     (translate-stencil
> ;;       (17.1123059321317 . 0.0)
> ;;       (dashed-line
> ;;         0.16 <- thick
> ;;         0.409629549559636 <- on
> ;;         0.614444324339455 <- off
> ;;         -7.57814666685327 <- x-destination
> ;;         0.0 <- y-destination
> ;;         0.0 <- phase
> ;;         ))
> ;; This procedure will transform it into:
> ;;     (drawline
> ;;       thick
> ;;       x-start
> ;;       y-start
> ;;       x-end
> ;;       y-end)
>
>   (if (and bool
>            (>= (length lst) 3)
>            (not (eq? (car lst) 'draw-line)))
>       (let* ((translate (list-ref lst 1))
>              (dashed-line (last lst))
>              (thick (list-ref dashed-line 1))
>              (x-dest (list-ref dashed-line 4))
>              (y-dest (list-ref dashed-line 5)))
>         (list
>           'draw-line
>           thick
>           (car translate)
>           (cdr translate)
>           (+ x-dest (car translate))
>           (+ y-dest (cdr translate))))
>       lst))
>
> #(define (half-solid-tuplet-bracket bool-pair)
> (lambda (grob)
>   (if (and ;; continue if the TupletBracket is dashed
>            (eq? (ly:grob-property grob 'style) 'dashed-line)
>            ;; continue if left or right part should become solid
>            (or (car bool-pair) (cdr bool-pair))
>            ;; don't continue, if TupletBracket is omitted
>            (not (ly:stencil-empty? (ly:grob-property grob 'stencil)))
>            ;; don't continue, if the whole TupletBracket should be dashed
>            (not (and (car bool-pair) (cdr bool-pair))))
>       ;; make left or right part solid
>       (let* ((stil (ly:grob-property grob 'stencil))
>              (x-ext (ly:stencil-extent stil X))
>              (y-ext (ly:stencil-extent stil Y))
>              (stil-expr (ly:stencil-expr stil))
>              (translate (list-ref stil-expr 1))
>              (combined-stil (last stil-expr))
>              (new-stencil-expr
>                (list
>                  'translate-stencil
>                  translate
>                  (cons 'combine-stencil
>                     (map
>                       (lambda (i)
>                         (translated-dashed-line->draw-line
>                           (if (odd? i)
>                               (cdr bool-pair)
>                               (car bool-pair))
>                           (list-ref combined-stil i)))
>                       (iota 4 1 1))))))
>       (ly:grob-set-property! grob 'stencil
>         (ly:make-stencil
>           new-stencil-expr
>           x-ext
>           y-ext))))))
>
> halfSolidTupletBracket =
> #(define-music-function (pair)(pair?)
> #{
>   \override TupletBracket.after-line-breaking =
>     #(half-solid-tuplet-bracket pair)
> #})
>
> %%%FAILS:%%%
>
> \score {
> <<
> \new Staff
> {
>  \override TupletBracket.bracket-visibility = ##t
>          \once \halfSolidTupletBracket #'(#t . #f)
>                   \once \override TupletBracket.style = #'dashed-line
>                   \once \override TupletBracket.edge-height = #'(0.7 . 0)
>                   \tempo 4 = 60
> \time 2/5
> \times 4/5 { c'16 c'8. c'16 c'16 c'8 } |
> }
>
> \new Staff
> {
>  \override TupletBracket.bracket-visibility = ##t
>          \once \halfSolidTupletBracket #'(#t . #f)
>                   \once \override TupletBracket.style = #'dashed-line
>                   \once \override TupletBracket.edge-height = #'(0.7 . 0)
>                   \tempo 4 = 60
> \time 2/5
> \times 4/5 { c'16 c'8. c'16 c'16 c'8 } |
> }
> >>
> }
>
> %%% ALSO FAILS:%%%
>
> \score {
> <<
> \new Staff
> {
>  \override TupletBracket.bracket-visibility = ##t
>          \once \halfSolidTupletBracket #'(#t . #f)
>                   \once \override TupletBracket.style = #'dashed-line
>                   \once \override TupletBracket.edge-height = #'(0.7 . 0)
> \time 2/5
> \times 4/5 { c'16 c'8. c'16 c'16 c'8 } |
> }
>
> \new Staff
> {
>  \override TupletBracket.bracket-visibility = ##t
>          \once \halfSolidTupletBracket #'(#t . #f)
>                   \once \override TupletBracket.style = #'dashed-line
>                   \once \override TupletBracket.edge-height = #'(0.7 . 0)
>                   \tempo 4 = 60
> \time 2/5
> \times 4/5 { c'16 c'8. c'16 c'16 c'8 } |
> }
> >>
> }
>
> %%%FUNCTIONAL:%%%
>
> \score {
> <<
> \new Staff
> {
>  \override TupletBracket.bracket-visibility = ##t
>          \once \halfSolidTupletBracket #'(#t . #f)
>                   \once \override TupletBracket.style = #'dashed-line
>                   \once \override TupletBracket.edge-height = #'(0.7 . 0)
> \time 2/5
> \times 4/5 { c'16 c'8. c'16 c'16 c'8 } |
> }
>
> \new Staff
> {
>  \override TupletBracket.bracket-visibility = ##t
>          \once \halfSolidTupletBracket #'(#t . #f)
>                   \once \override TupletBracket.style = #'dashed-line
>                   \once \override TupletBracket.edge-height = #'(0.7 . 0)
> \time 2/5
> \times 4/5 { c'16 c'8. c'16 c'16 c'8 } |
> }
> >>
> }

Hi,

I just filed a bug report
http://lilypond.1069038.n5.nabble.com/Wrongly-read-property-with-MetronomeMark-td237659.html

For the time being you could use

#(define (half-solid-tuplet-bracket bool-pair)
  (lambda (grob)
    (let ((style (ly:grob-property grob 'style))
          (stil (ly:tuplet-bracket::print grob)))
      (if (and ;; continue if the TupletBracket is dashed
               (eq? style 'dashed-line)
               ;; continue if left or right part should become solid
               (or (car bool-pair) (cdr bool-pair))
               ;; don't continue, if TupletBracket is omitted
               (not (ly:stencil-empty? stil))
               ;; don't continue, if the whole TupletBracket should be dashed
               (not (and (car bool-pair) (cdr bool-pair))))
          ;; make left or right part solid
          (let* ((x-ext (ly:stencil-extent stil X))
                 (y-ext (ly:stencil-extent stil Y))
                 (stil-expr (ly:stencil-expr stil))
                 (translate (list-ref stil-expr 1))
                 (combined-stil (last stil-expr))
                 (new-stencil-expr
                   (list
                     'translate-stencil
                     translate
                     (cons 'combine-stencil
                        (map
                          (lambda (i)
                            (translated-dashed-line->draw-line
                              (if (odd? i)
                                  (cdr bool-pair)
                                  (car bool-pair))
                              (list-ref combined-stil i)))
                          (iota 4 1 1))))))
            (ly:make-stencil
              new-stencil-expr
              x-ext
              y-ext))
          stil))))

halfSolidTupletBracket =
#(define-music-function (pair)(pair?)
#{
  \override TupletBracket.stencil =
    #(half-solid-tuplet-bracket pair)
#})


HTH,
  Harm



reply via email to

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