[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