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 } |
}
>>
}

Reply via email to