[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Cross staff parenthesize
From: |
Thomas Morley |
Subject: |
Re: Cross staff parenthesize |
Date: |
Sun, 12 Feb 2017 14:17:16 +0100 |
2017-02-12 2:59 GMT+01:00 Andrew Bernard <address@hidden>:
> Now I observe the same thing when simply changing staves, no cross staff
> stemming involved. Is this a bug, or am I using parenthesize incorrectly?
> The issue is that the parentheses do not enclose the accent properly.
Hi Andrew,
I did some research.
The parantheses are printed with 'parentheses-item::print' for the
stencil. This procedure uses 'parenthesize-elements'.
In both procedures ly:relative-group-extent fails to return a sane
intervall, if \change Staff is in the game.
I don't no why this happens.
Nevertheless, I tried the fix below getting every extent on his own
and reducing the results afterwards.
There is some debugging-output returning the values for the proposed
fix and the original.
Note:
- It is not tested beyond the given example
- skylining is still buggy (see the printed output for Fingering and
StringNumber)
\version "2.19.54"
#(ly:set-option 'debug-skylines #t)
#(define (parenthesize-elements grob . rest)
(let* ((refp (if (null? rest)
grob
(car rest)))
(elts (ly:grob-array->list (ly:grob-object grob 'elements)))
(get-friends
(lambda (g)
(let ((syms (ly:grob-property g 'parenthesis-friends '()))
(get-friend
(lambda (s)
(let ((f (ly:grob-object g s)))
(cond
((ly:grob? f) (list f))
((ly:grob-array? f) (ly:grob-array->list f))
(else '()))))))
(append-map get-friend syms))))
(friends (apply append elts (map get-friends elts)))
(common-ref
(ly:grob-common-refpoint grob (ly:grob-parent grob X) X))
(x-exts
(map
(lambda (elt)
(ly:grob-robust-relative-extent elt common-ref X))
friends))
(x-ext
(cons
(reduce min +inf.0 (map car x-exts))
(reduce max -inf.0 (map cdr x-exts))))
(x-ext-source
(ly:relative-group-extent friends refp X))
(stencils (ly:grob-property grob 'stencils))
(lp (car stencils))
(rp (cadr stencils))
(padding (ly:grob-property grob 'padding 0.1)))
(format
#t
"\n\nThe fix-attempt for 'parenthesize-elements' returns for x-ext: ~a"
x-ext)
(format
#t
"\nThe source-code for 'parenthesize-elements' returns for x-ext: ~a"
x-ext-source)
(ly:stencil-add
(ly:stencil-translate-axis lp (- (car x-ext) padding) X)
(ly:stencil-translate-axis rp (+ (cdr x-ext) padding) X))))
#(define-public (parentheses-item::print me)
(let* ((elts (ly:grob-object me 'elements))
(y-ref (ly:grob-common-refpoint-of-array me elts Y))
(x-ref (ly:grob-common-refpoint-of-array me elts X))
(stencil (parenthesize-elements me x-ref))
(y-exts
(map
(lambda (elt)
(ly:grob-extent elt y-ref Y))
(ly:grob-array->list elts)))
(elt-y-ext
(cons
(reduce min +inf.0 (map car y-exts))
(reduce max -inf.0 (map cdr y-exts))))
(elt-y-ext-source
(ly:relative-group-extent elts y-ref Y))
(y-center (interval-center elt-y-ext)))
(format
#t
"\nThe fix-attempt for 'parentheses-item::print' returns for elt-y-ext: ~a"
elt-y-ext)
(format
#t
"\nThe source-code for 'parentheses-item::print' returns for elt-y-ext: ~a"
elt-y-ext-source)
(ly:stencil-translate
stencil
(cons
(- (ly:grob-relative-coordinate me x-ref X))
(- y-center (ly:grob-relative-coordinate me y-ref Y))))))
treble = {
\clef treble
\time 1/4
s4
}
bass = {
\clef bass
\time 1/4
\override ParenthesesItem.stencil = #parentheses-item::print
e'16 ^\parenthesize ^> ^\parenthesize ^1 ^\parenthesize ^\3
\change Staff = treble
\stemDown
f' g' a'
}
\score {
\new PianoStaff
<<
\new Staff = "treble" { \treble }
\new Staff = "bass" { \bass }
>>
\layout {
}
}
HTH a bit,
Harm