1 Commits

Author SHA1 Message Date
tux
d44773b4dc new engraver for spacing in chordlyrics 2025-11-04 22:14:04 +01:00

View File

@@ -253,6 +253,88 @@
(make-pad-right-markup -0.1 (make-tied-lyric-markup text)) (make-pad-right-markup -0.1 (make-tied-lyric-markup text))
text)))) text))))
Chord_lyrics_spacing_engraver =
#(lambda (ctx)
(let ((last-lyric-syllable #f)
(last-lyric-syllable-width 0)
(lyric-width-since-last-chord 0)
(last-printed-chord #f)
(chord-width-since-last-lyric 0)
(lyrics-seen-since-break #f)
(have-a-rest #f))
(make-engraver
(listeners
((multi-measure-rest-event engraver event)
(set! have-a-rest #t)
)
((rest-event engraver event)
(set! have-a-rest #t)
)
((lyric-event engraver event)
(set! have-a-rest #f)
)
((break-event engraver event)
(set! last-lyric-syllable #f)
(set! last-lyric-syllable-width 0)
(set! lyric-width-since-last-chord 0)
(set! last-printed-chord #f)
(set! chord-width-since-last-lyric 0)
(set! lyrics-seen-since-break #f)
))
(acknowledgers
((lyric-syllable-interface this-engraver grob source-engraver)
(let ((syllable-width (interval-length (ly:grob-extent grob grob X))))
(set! lyric-width-since-last-chord (+ lyric-width-since-last-chord syllable-width))
(set! last-lyric-syllable-width syllable-width)
)
(if (> chord-width-since-last-lyric 0)
(if lyrics-seen-since-break
(ly:grob-set-property! grob 'extra-spacing-width
(cons (- chord-width-since-last-lyric) (cdr (ly:grob-property grob 'extra-spacing-width '(0 . 0)))))
(if last-printed-chord
(let ((last-printed-chord-width (interval-length (ly:grob-extent last-printed-chord last-printed-chord X))))
(ly:grob-set-parent! grob X last-printed-chord)
(ly:grob-set-property! grob 'X-offset last-printed-chord-width)
)))
)
(set! last-lyric-syllable grob)
(set! chord-width-since-last-lyric 0)
(set! lyrics-seen-since-break #t)
)
((chord-name-interface this-engraver grob source-engraver)
(if (not (and
(boolean? (ly:grob-property grob 'begin-of-line-visible))
(ly:grob-property grob 'begin-of-line-visible)))
(let* ((last-printed-chord-width (if last-printed-chord (interval-length (ly:grob-extent last-printed-chord last-printed-chord X)) 0))
(chord-overwidth (- last-printed-chord-width lyric-width-since-last-chord))
(chord-gap 0.5))
(if have-a-rest
(let ((chord-width (interval-length (ly:grob-extent grob grob X))))
(if last-lyric-syllable
(begin
(ly:grob-set-parent! grob X last-lyric-syllable)
(ly:grob-set-property! grob 'X-offset last-lyric-syllable-width)
)
(if last-printed-chord
(begin
(ly:grob-set-parent! grob X last-printed-chord)
(ly:grob-set-property! grob 'X-offset (+ chord-gap last-printed-chord-width))
)))
(set! chord-width-since-last-lyric (+ chord-width-since-last-lyric chord-width chord-gap))
))
(if (and last-lyric-syllable last-printed-chord (> chord-overwidth 0))
(ly:grob-set-property! last-lyric-syllable 'extra-spacing-width
(cons (car (ly:grob-property last-lyric-syllable 'extra-spacing-width '(0 . 0))) (+ chord-gap chord-overwidth)))
)
(set! last-printed-chord grob)
(set! last-lyric-syllable #f)
(set! lyric-width-since-last-chord 0)
)
)
)
)
)))
#(define-markup-command (chordlyrics layout props lyrics) (ly:music?) #(define-markup-command (chordlyrics layout props lyrics) (ly:music?)
#:properties ((verse-chords #{#}) #:properties ((verse-chords #{#})
(verse-reference-voice #{#}) (verse-reference-voice #{#})
@@ -296,9 +378,11 @@
\context { \context {
\Score \Score
\override PaperColumn.keep-inside-line = ##f \override PaperColumn.keep-inside-line = ##f
% \override SpacingSpanner.strict-note-spacing = ##t % \override SpacingSpanner.strict-note-spacing = ##t
\override SpacingSpanner.uniform-stretching = ##t \override SpacingSpanner.uniform-stretching = ##t
\override SpacingSpanner.spacing-increment = 0 \override SpacingSpanner.spacing-increment = 0
% \override SpacingSpanner.packed-spacing = ##t
\consists \Chord_lyrics_spacing_engraver
\remove Bar_number_engraver \remove Bar_number_engraver
\remove Mark_engraver \remove Mark_engraver
\remove Jump_engraver \remove Jump_engraver
@@ -328,14 +412,6 @@
\remove Note_heads_engraver \remove Note_heads_engraver
\remove Script_engraver \remove Script_engraver
} }
\context {
\NullVoice
\consists Rest_engraver
\omit Rest
\undo \omit NoteHead
\hide NoteHead
\override NoteHead.X-extent = #'(0 . 0)
}
} }
} }
} }