From d56c11c5ff8157a9926a3de0ad834cd94690c97d Mon Sep 17 00:00:00 2001 From: tux Date: Sat, 16 Nov 2024 23:13:37 +0100 Subject: [PATCH] force printing first chord on newline --- chord_settings.ly | 59 ++++++++++++++++++------------------------- verses_with_chords.ly | 2 +- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/chord_settings.ly b/chord_settings.ly index a6bd174..e62089b 100644 --- a/chord_settings.ly +++ b/chord_settings.ly @@ -139,43 +139,32 @@ generalLayout = \layout { } #})) -% If you add this engraver to ChordNames Context chords get only printed on chordchanges and not at newline. -% See https://lists.gnu.org/archive/html/lilypond-user/2020-07/msg00187.html -Ignoring_newline_chord_changes_engraver = +% If you add this engraver to ChordNames Context chords get only printed on chordchanges and if its the first chord after line break. +Ensure_first_chord_after_line_break_printed_engraver = #(lambda (ctx) - (let* ((chord #f) - (last-chord #f)) - - (define (at-line-beginning? grob) - (let* ((col (ly:item-get-column grob)) - (ln (ly:grob-object col 'left-neighbor)) - (col-to-check (if (ly:grob? ln) ln col))) - (and (eq? #t (ly:grob-property col-to-check 'non-musical)) - (= 1 (ly:item-break-dir col-to-check))))) - + (define last-system-column-rank 0) (make-engraver (acknowledgers ((chord-name-interface this-engraver grob source-engraver) + (ly:grob-set-property! grob 'after-line-breaking + (lambda (grob) + (let ((current-system-column-rank (car (ly:grob-spanned-column-rank-interval (ly:grob-system grob))))) + (if (and + (ly:context-property ctx 'chordChanges #f) + (ly:grob-property grob 'begin-of-line-visible #f) + (not (= last-system-column-rank current-system-column-rank))) + ; the current chord handling implementation in lilypond uses 'begin-of-line-visible to mark repeated chords + (ly:grob-set-property! grob 'begin-of-line-visible #f)) + (set! last-system-column-rank current-system-column-rank) + (ly:chord-name::after-line-breaking grob) + ))))))) - (if chord - (begin - (set! last-chord chord) - (set! chord #f))) - - (set! chord (ly:grob-property grob 'text)) - - ;; If two subsequent chords are equal and chordChanges is enabled, - ;; set 'after-line-breaking to a procedure which sets the stencil - ;; to an empty-stencil if the new chord is at line-start. - (if (and (equal? chord last-chord) - (ly:context-property ctx 'chordChanges #f)) - (ly:grob-set-property! grob 'after-line-breaking - (lambda (grob) - (if (at-line-beginning? grob) - (ly:grob-set-property! grob 'stencil empty-stencil)) - ;; keep default - (ly:chord-name::after-line-breaking grob)))))) - ((finalize this-engraver) - ;; house keeping - (set! chord #f) - (set! last-chord #f))))) \ No newline at end of file +% If you add this engraver to ChordNames Context chords get only printed on chordchanges and not at newline. +Ignoring_newline_chord_changes_engraver = + #(lambda (ctx) + (make-engraver + (acknowledgers + ((chord-name-interface this-engraver grob source-engraver) + (when (and (ly:context-property ctx 'chordChanges #f) (ly:grob-property grob 'begin-of-line-visible #f)) + (ly:grob-suicide! grob) + ))))) \ No newline at end of file diff --git a/verses_with_chords.ly b/verses_with_chords.ly index c9bcc0d..bfebb26 100644 --- a/verses_with_chords.ly +++ b/verses_with_chords.ly @@ -277,7 +277,7 @@ \ChordNames \override VerticalAxisGroup.staff-affinity = ##f \override ChordName.extra-spacing-width = #'(-0.1 . 0.1) - \consists \Ignoring_newline_chord_changes_engraver + \consists \Ensure_first_chord_after_line_break_printed_engraver } \context { \Score