lilypond-user
[Top][All Lists]
Advanced

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

Re: Getting grob Y position (spacing error)


From: Jean Abou Samra
Subject: Re: Getting grob Y position (spacing error)
Date: Sat, 19 Nov 2022 09:08:07 +0100


Le 19 nov. 2022 à 02:37, Gregory Evans <gregoryrowlandevans@gmail.com> a écrit :



Hello Jean,
thank you for the information about after-line-breaking and the timing of skyline computing. Is there an equivalent property to trigger callback after the skylines are calculated?



I’m afraid not. There are lower-level techniques you can use for that though, but see below for why you won’t need them.


I am trying to use (ly:stencil-add ...) to add to the stencil of a notehead by drawing a line from one notehead in one staff to a notehead in another staff.


Have you seen the VoiceFollower grob? Try using that instead.

By reading things in 'left-bound-info and 'right-bound-info, you can also spare yourself quite some code.

The notehead grob does not appear to have a cross-staff property to delay stencil callback.


NoteHead is a very fundamental grob at the heart of a lot of code (note collision handling, beams, note spacing, etc.). That code makes reasonable assumptions about the note heads and doesn’t expect cross-staff note heads.

\language "english"
\version "2.23.14"

#(set-global-staff-size 12)

\score {
    <<
        \new Staff {
            \override NoteHead.cross-staff = ##t
            \once \override NoteHead.after-line-breaking = #(lambda (grob)
                    (let*
                        (
                           (sys (ly:grob-system grob))
                           (x-extent (ly:grob-extent grob sys X))
                           (y-extent (ly:grob-extent grob sys Y))
                        )
                        (display (list x-extent ))
                    )
                )
            c'1
            c'1
            c'1
            c'1
        }
        \new Staff {
            c'1
            c'1
            c'1
            c'1
        }
    >>
}

A larger example of the function (without a great deal of context) looks like this:

interrupt = #(define-music-function (value) (number?)
  #{
      \once \override Staff.NoteHead.after-line-breaking = #(lambda (grob)
              (let* (
                (stem (ly:grob-object grob 'stem))
                (stem-dir (ly:grob-property stem 'direction))
                (stem-thickness (ly:grob-property stem 'thickness))
                (thickness (/ stem-thickness 10))
                (notecol (ly:grob-parent grob X))
                (meta  (assoc 'other-grob (ly:grob-property notecol 'meta)))

Have you seen ly:grob-object and ly:grob-set-object! ?

That would be way cleaner than abusing 'meta for this purpose. There is also 'details you can use instead of 'meta.

                (other (if meta
                              (cdr meta)
                              grob
                      ))
                (notehead-width (cdr (ly:grob-property grob 'X-extent)))
                (sys (ly:grob-system grob))
                (now-pos (ly:grob-extent grob sys X))
                (next-pos (ly:grob-extent other sys X))

                ;;the offending lines
                (now-pos-y (ly:grob-extent grob common Y))
                (next-pos-y (ly:grob-extent other common Y))

                (x-distance
                    (if (= stem-dir -1)
                      (+ (- (get-distance now-pos next-pos) notehead-width ) (/ thickness 2))
                      (- (get-distance now-pos next-pos) (/ thickness 2))
                    ))
                (y-distance
                    (if (= stem-dir -1)
                      (+ (- (get-distance now-pos-y next-pos-y) notehead-width ) (/ thickness 2))
                      (- (get-distance now-pos-y next-pos-y) (/ thickness 2))
                    ))

                ;; alternative which takes input number
                ;(ps-bracket
                ;    (if (= stem-dir -1)
                ;      (draw-ps-bracket x-distance notehead-width (- value 0.5) thickness)
                ;      (draw-ps-bracket x-distance notehead-width value thickness)
                ;    ))
                (ps-bracket


Does 'ps' stand for PostScript?

Best,
Jean


reply via email to

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