From d44773b4dc4da3c9448d076704f10bda9ca52f3d Mon Sep 17 00:00:00 2001 From: tux Date: Mon, 9 Jun 2025 23:09:55 +0200 Subject: [PATCH] new engraver for spacing in chordlyrics --- private_includes/base/verses_with_chords.ily | 94 ++++++++++++++++++-- 1 file changed, 85 insertions(+), 9 deletions(-) diff --git a/private_includes/base/verses_with_chords.ily b/private_includes/base/verses_with_chords.ily index efa6de2..f0e3c54 100644 --- a/private_includes/base/verses_with_chords.ily +++ b/private_includes/base/verses_with_chords.ily @@ -253,6 +253,88 @@ (make-pad-right-markup -0.1 (make-tied-lyric-markup 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?) #:properties ((verse-chords #{#}) (verse-reference-voice #{#}) @@ -296,9 +378,11 @@ \context { \Score \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.spacing-increment = 0 + % \override SpacingSpanner.packed-spacing = ##t + \consists \Chord_lyrics_spacing_engraver \remove Bar_number_engraver \remove Mark_engraver \remove Jump_engraver @@ -328,14 +412,6 @@ \remove Note_heads_engraver \remove Script_engraver } - \context { - \NullVoice - \consists Rest_engraver - \omit Rest - \undo \omit NoteHead - \hide NoteHead - \override NoteHead.X-extent = #'(0 . 0) - } } } }