> Le 19 nov. 2022 à 02:37, Gregory Evans <[email protected]> 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