lilypond-user
[Top][All Lists]
Advanced

[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



reply via email to

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