1 Commits

Author SHA1 Message Date
tux
0339efcfea new engraver for spacing in chordlyrics 2025-06-12 21:32:25 +02:00

View File

@ -260,20 +260,27 @@ Chord_lyrics_spacing_engraver =
(last-lyric-syllable-width 0) (last-lyric-syllable-width 0)
(lyric-width-since-last-chord 0) (lyric-width-since-last-chord 0)
(notes-on-syllable-count 0) (notes-on-syllable-count 0)
(last-chord-width 0) (last-chord-name #f)
(remaining-chord-width 0)
(last-rest #f) (last-rest #f)
(rest-count 0)) (rest-count 0)
(multi-measure-rest-count 0))
(make-engraver (make-engraver
(listeners (listeners
((multi-measure-rest-event engraver event)
(set! multi-measure-rest-count (+ multi-measure-rest-count 1))
)
((break-event engraver event) ((break-event engraver event)
(set! last-note-head #f) (set! last-note-head #f)
(set! note-head-extended #f) (set! note-head-extended #f)
(set! last-lyric-syllable-width 0) (set! last-lyric-syllable-width 0)
(set! lyric-width-since-last-chord 0) (set! lyric-width-since-last-chord 0)
(set! notes-on-syllable-count 0) (set! notes-on-syllable-count 0)
(set! last-chord-width 0) (set! last-chord-name #f)
(set! remaining-chord-width 0)
(set! last-rest #f) (set! last-rest #f)
(set! rest-count 0) (set! rest-count 0)
(set! multi-measure-rest-count 0)
)) ))
(acknowledgers (acknowledgers
((note-head-interface this-engraver grob source-engraver) ((note-head-interface this-engraver grob source-engraver)
@ -284,9 +291,10 @@ Chord_lyrics_spacing_engraver =
(set! note-head-extended #f) (set! note-head-extended #f)
(set! last-rest #f) (set! last-rest #f)
(set! rest-count 0) (set! rest-count 0)
(set! multi-measure-rest-count 0)
) )
((lyric-syllable-interface this-engraver grob source-engraver) ((lyric-syllable-interface this-engraver grob source-engraver)
(set! last-chord-width (max 0 (- last-chord-width lyric-width-since-last-chord))) (set! remaining-chord-width (max 0 (- remaining-chord-width lyric-width-since-last-chord)))
(set! last-lyric-syllable-width (- (cdr (ly:grob-extent grob grob X)) 0.2)) (set! last-lyric-syllable-width (- (cdr (ly:grob-extent grob grob X)) 0.2))
(set! lyric-width-since-last-chord (+ lyric-width-since-last-chord last-lyric-syllable-width)) (set! lyric-width-since-last-chord (+ lyric-width-since-last-chord last-lyric-syllable-width))
(if last-note-head (set! notes-on-syllable-count 1)) (if last-note-head (set! notes-on-syllable-count 1))
@ -298,6 +306,8 @@ Chord_lyrics_spacing_engraver =
(let ((on-a-rest (> rest-count 0))) (let ((on-a-rest (> rest-count 0)))
(if (not on-a-rest) (if (not on-a-rest)
(set! notes-on-syllable-count (- notes-on-syllable-count 1))) (set! notes-on-syllable-count (- notes-on-syllable-count 1)))
(if (and last-chord-name (= multi-measure-rest-count 1) (> lyric-width-since-last-chord remaining-chord-width))
(ly:grob-set-property! last-chord-name 'extra-spacing-width (cons -0.1 (+ 0.1 (- lyric-width-since-last-chord remaining-chord-width)))))
(if last-note-head (if last-note-head
(let* ((last-note-min-x-extent (ly:grob-property last-note-head 'minimum-X-extent)) (let* ((last-note-min-x-extent (ly:grob-property last-note-head 'minimum-X-extent))
(last-note-min-x-lower (if (pair? last-note-min-x-extent) (car last-note-min-x-extent) 0)) (last-note-min-x-lower (if (pair? last-note-min-x-extent) (car last-note-min-x-extent) 0))
@ -313,19 +323,20 @@ Chord_lyrics_spacing_engraver =
(ly:grob-set-property! last-rest 'minimum-X-extent (cons 0 2)) (ly:grob-set-property! last-rest 'minimum-X-extent (cons 0 2))
) )
(if (and (> lyric-width-since-last-chord 0) (if (and (> lyric-width-since-last-chord 0)
(> last-chord-width lyric-width-since-last-chord)) (> remaining-chord-width lyric-width-since-last-chord))
(ly:grob-set-property! last-note-head 'minimum-X-extent (ly:grob-set-property! last-note-head 'minimum-X-extent
(cons (- -1.2 (- last-chord-width lyric-width-since-last-chord)) last-note-min-x-upper)) (cons (- -1.2 (- remaining-chord-width lyric-width-since-last-chord)) last-note-min-x-upper))
(let* ((width-per-note-head 0.5) (let* ((width-per-note-head 0.5)
(note-width-since-last-chord (* width-per-note-head notes-on-syllable-count))) (note-width-since-last-chord (* width-per-note-head notes-on-syllable-count)))
(if (> last-chord-width note-width-since-last-chord) (if (> remaining-chord-width note-width-since-last-chord)
(ly:grob-set-property! last-note-head 'minimum-X-extent (ly:grob-set-property! last-note-head 'minimum-X-extent
(cons (- note-width-since-last-chord last-chord-width) last-note-min-x-upper)) (cons (- note-width-since-last-chord remaining-chord-width) last-note-min-x-upper))
) )
) )
) )
))) )))
(set! last-chord-width (set! last-chord-name grob)
(set! remaining-chord-width
(if (and on-a-rest (equal? (ly:prob-property (ly:grob-property grob 'cause) 'duration) (ly:prob-property (ly:grob-property last-rest 'cause) 'duration))) (if (and on-a-rest (equal? (ly:prob-property (ly:grob-property grob 'cause) 'duration) (ly:prob-property (ly:grob-property last-rest 'cause) 'duration)))
0 0
(cdr (ly:grob-extent grob grob X)))) (cdr (ly:grob-extent grob grob X))))
@ -336,6 +347,7 @@ Chord_lyrics_spacing_engraver =
((rest-interface this-engraver grob source-engraver) ((rest-interface this-engraver grob source-engraver)
(set! rest-count (+ 1 rest-count)) (set! rest-count (+ 1 rest-count))
(set! last-rest grob) (set! last-rest grob)
(set! multi-measure-rest-count 0)
) )
)))) ))))