2 Commits

Author SHA1 Message Date
tux
23bc0db0da new engraver for spacing in chordlyrics 2025-11-24 20:45:12 +01:00
3ff5a36106 better load song include data in windows 2025-11-24 16:47:13 +01:00
2 changed files with 87 additions and 101 deletions

View File

@@ -21,8 +21,17 @@
))))) )))))
(scm-load "resolve_inherits.scm") (scm-load "resolve_inherits.scm")
(scm-load "yaml_parser.scm"))) (scm-load "yaml_parser.scm")))
#(define AUTHOR_DATA (if (defined? 'AUTHOR_DATA) AUTHOR_DATA (parse-yml-file "../../lilypond-song-includes/data/authors.yml")))
#(define SONG_DATA (if (defined? 'SONG_DATA) SONG_DATA (parse-yml-file "../../lilypond-song-includes/data/songs.yml"))) #(define (song-includes-data-path filename)
(string-join
(list
(dirname (dirname (dirname (dirname (current-filename)))))
"lilypond-song-includes"
"data"
filename)
file-name-separator-string))
#(define AUTHOR_DATA (if (defined? 'AUTHOR_DATA) AUTHOR_DATA (parse-yml-file (song-includes-data-path "authors.yml"))))
#(define SONG_DATA (if (defined? 'SONG_DATA) SONG_DATA (parse-yml-file (song-includes-data-path "songs.yml"))))
\include "merge_rests_engraver_override.ily" \include "merge_rests_engraver_override.ily"
\include "basic_format_and_style_settings.ily" \include "basic_format_and_style_settings.ily"

View File

@@ -255,110 +255,96 @@
Chord_lyrics_spacing_engraver = Chord_lyrics_spacing_engraver =
#(lambda (ctx) #(lambda (ctx)
(let ((last-note-head #f) (let ((last-lyric-syllable #f)
(note-head-extended #f)
(last-lyric-syllable-width 0)
(lyric-width-since-last-chord 0) (lyric-width-since-last-chord 0)
(notes-on-syllable-count 0) (music-columns-for-last-syllable 0)
(last-chord-name #f) (last-printed-chord #f)
(remaining-chord-width 0) (chord-width-since-last-lyric 0)
(last-rest #f) (lyrics-seen-since-break #f)
(rest-count 0) (have-a-rest #f)
(multi-measure-rest-count 0) (stanza #f)
(stanza-shift 0)) (place-at-right-edge
(lambda (grob anchor padding)
(let ((anchor-width (interval-length (ly:grob-extent anchor anchor X))))
(ly:grob-set-parent! grob X anchor)
(ly:grob-set-property! grob 'X-offset (+ padding anchor-width))
))))
(make-engraver (make-engraver
(listeners (listeners
((multi-measure-rest-event engraver event) ((multi-measure-rest-event engraver event)
(set! multi-measure-rest-count (+ multi-measure-rest-count 1)) (set! have-a-rest #t)
)
((rest-event engraver event)
(set! have-a-rest #t)
)
((lyric-event engraver event)
(set! have-a-rest #f)
(set! music-columns-for-last-syllable 0)
) )
((break-event engraver event) ((break-event engraver event)
(set! last-note-head #f) (set! last-lyric-syllable #f)
(set! note-head-extended #f)
(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! music-columns-for-last-syllable 0)
(set! last-chord-name #f) (set! last-printed-chord #f)
(set! remaining-chord-width 0) (set! chord-width-since-last-lyric 0)
(set! last-rest #f) (set! lyrics-seen-since-break #f)
(set! rest-count 0)
(set! multi-measure-rest-count 0)
(set! stanza-shift 0)
)) ))
(acknowledgers (acknowledgers
((note-head-interface this-engraver grob source-engraver) ((musical-paper-column-interface this-engraver grob source-engraver)
(if (and (> rest-count 0) (not last-note-head)) (set! music-columns-for-last-syllable (+ 1 music-columns-for-last-syllable))
(let ((rest-spacing-on-line-start 1.2))
(ly:grob-set-property! grob 'minimum-X-extent (cons (- rest-spacing-on-line-start) 0))
(set! stanza-shift rest-spacing-on-line-start)
))
(set! notes-on-syllable-count (+ 1 notes-on-syllable-count))
(set! last-note-head grob)
(set! note-head-extended #f)
(set! last-rest #f)
(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! remaining-chord-width (max 0 (- remaining-chord-width lyric-width-since-last-chord))) (let ((syllable-width (interval-length (ly:grob-extent grob grob X))))
(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 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 (> 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
(begin
(if stanza (ly:grob-set-property! stanza 'padding chord-width-since-last-lyric))
(place-at-right-edge grob last-printed-chord 0)
)))
)
(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) ((chord-name-interface this-engraver grob source-engraver)
(if (not (and (if (not (and
(boolean? (ly:grob-property grob 'begin-of-line-visible)) (boolean? (ly:grob-property grob 'begin-of-line-visible))
(ly:grob-property grob 'begin-of-line-visible))) (ly:grob-property grob 'begin-of-line-visible)
(let ((on-a-rest (> rest-count 0))) lyrics-seen-since-break))
(if (not on-a-rest) (let* ((last-printed-chord-width (if last-printed-chord (interval-length (ly:grob-extent last-printed-chord last-printed-chord X)) 0))
(set! notes-on-syllable-count (- notes-on-syllable-count 1))) (chord-overwidth (- last-printed-chord-width lyric-width-since-last-chord))
(if (and last-chord-name (= multi-measure-rest-count 1) (> lyric-width-since-last-chord remaining-chord-width)) (chord-gap 0.5))
(ly:grob-set-property! last-chord-name 'extra-spacing-width (cons -0.1 (+ 0.1 (- lyric-width-since-last-chord remaining-chord-width))))) (if have-a-rest
(if last-note-head (let ((chord-width (interval-length (ly:grob-extent grob grob X))))
(let* ((last-note-min-x-extent (ly:grob-property last-note-head 'minimum-X-extent)) (if last-lyric-syllable
(last-note-min-x-lower (if (pair? last-note-min-x-extent) (car last-note-min-x-extent) 0)) (if (and last-printed-chord (> chord-overwidth 0))
(last-note-min-x-upper (if (pair? last-note-min-x-extent) (cdr last-note-min-x-extent) 0))) (place-at-right-edge grob last-printed-chord chord-gap)
(if on-a-rest (place-at-right-edge grob last-lyric-syllable 0))
(begin (if last-printed-chord
(if (not note-head-extended) (place-at-right-edge grob last-printed-chord chord-gap)))
(begin (set! chord-width-since-last-lyric (+ chord-width-since-last-lyric chord-width chord-gap))
(ly:grob-set-property! last-note-head 'minimum-X-extent ))
(cons last-note-min-x-lower (- last-lyric-syllable-width -2 (* 2.2 rest-count)))) (if (and last-lyric-syllable last-printed-chord (> chord-overwidth 0))
(set! note-head-extended #t) (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)))
(ly:grob-set-property! last-rest 'minimum-X-extent (cons 0 2)) )
) (set! lyric-width-since-last-chord (* (if last-lyric-syllable (interval-length (ly:grob-extent last-lyric-syllable last-lyric-syllable X)) 0) (- 1 (/ 1.0 music-columns-for-last-syllable))))
(if (and (> lyric-width-since-last-chord 0) (set! last-printed-chord grob)
(> remaining-chord-width lyric-width-since-last-chord)) (set! last-lyric-syllable #f)
(ly:grob-set-property! last-note-head 'minimum-X-extent )
(cons (- -1.2 (- remaining-chord-width lyric-width-since-last-chord)) last-note-min-x-upper)) (ly:grob-set-property! grob 'X-extent '(+inf.0 . -inf.0))
(let* ((width-per-note-head 0.5) )
(note-width-since-last-chord (* width-per-note-head notes-on-syllable-count)))
(if (> remaining-chord-width note-width-since-last-chord)
(ly:grob-set-property! last-note-head 'minimum-X-extent
(cons (- note-width-since-last-chord remaining-chord-width) last-note-min-x-upper))
)
)
)
)))
(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)))
0
(cdr (ly:grob-extent grob grob X))))
(set! lyric-width-since-last-chord 0)
(set! notes-on-syllable-count (if on-a-rest 0 1))
))
) )
((rest-interface this-engraver grob source-engraver) ((stanza-number-interface this-engraver grob source-engraver)
(set! rest-count (+ 1 rest-count)) (set! stanza grob)
(set! last-rest grob) )
(set! multi-measure-rest-count 0) )
) )))
((stanza-number-interface this-engraver grob source-engraver)
(ly:grob-set-property! grob 'padding (+ 1 stanza-shift)))
))))
%#(ly:set-option 'debug-skylines #t)
#(define-markup-command (chordlyrics layout props lyrics) (ly:music?) #(define-markup-command (chordlyrics layout props lyrics) (ly:music?)
#:properties ((verse-chords #{#}) #:properties ((verse-chords #{#})
@@ -403,10 +389,10 @@ Chord_lyrics_spacing_engraver =
\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 % \override SpacingSpanner.packed-spacing = ##t
\consists \Chord_lyrics_spacing_engraver \consists \Chord_lyrics_spacing_engraver
\remove Bar_number_engraver \remove Bar_number_engraver
\remove Mark_engraver \remove Mark_engraver
@@ -437,15 +423,6 @@ Chord_lyrics_spacing_engraver =
\remove Note_heads_engraver \remove Note_heads_engraver
\remove Script_engraver \remove Script_engraver
} }
\context {
\NullVoice
\consists Rest_engraver
\omit Rest
\override Rest.X-extent = #'(0 . 0)
\undo \omit NoteHead
\hide NoteHead
\override NoteHead.X-extent = #'(0 . 0.5)
}
} }
} }
} }