From 3c2f27b477a520d9435f228ffa9df98bcfe92121 Mon Sep 17 00:00:00 2001 From: tux Date: Sun, 2 Jun 2024 19:46:28 +0200 Subject: [PATCH] use upstream merge rest engraver --- all_base_includes.ly | 1 - auto_rest_merging.ly | 86 ------------------------------ basic_format_and_style_settings.ly | 1 + 3 files changed, 1 insertion(+), 87 deletions(-) delete mode 100644 auto_rest_merging.ly diff --git a/all_base_includes.ly b/all_base_includes.ly index 6e0548f..10689c0 100644 --- a/all_base_includes.ly +++ b/all_base_includes.ly @@ -5,7 +5,6 @@ \include "basic_format_and_style_settings.ly" \include "eps_file_from_song_dir.ly" \include "title_with_category_images.ly" -\include "auto_rest_merging.ly" \include "chord_settings.ly" \include "transposition.ly" \include "verses_with_chords.ly" diff --git a/auto_rest_merging.ly b/auto_rest_merging.ly deleted file mode 100644 index aa0fd4b..0000000 --- a/auto_rest_merging.ly +++ /dev/null @@ -1,86 +0,0 @@ -%% http://lsr.dsi.unimi.it/LSR/Item?id=336 -%% see also http://code.google.com/p/lilypond/issues/detail?id=1228 - -%% Usage: -%% \new Staff \with { -%% \override RestCollision.positioning-done = #merge-rests-on-positioning -%% } << \somevoice \\ \othervoice >> -%% or (globally): -%% \layout { -%% \context { -%% \Staff -%% \override RestCollision.positioning-done = #merge-rests-on-positioning -%% } -%% } -%% -%% Limitations: -%% - only handles two voices -%% - does not handle multi-measure/whole-measure rests - -#(define (rest-score r) - (let ((score 0) - (yoff (ly:grob-property-data r 'Y-offset)) - (sp (ly:grob-property-data r 'staff-position))) - (if (number? yoff) - (set! score (+ score 2)) - (if (eq? yoff 'calculation-in-progress) - (set! score (- score 3)))) - (and (number? sp) - (<= 0 2 sp) - (set! score (+ score 2)) - (set! score (- score (abs (- 1 sp))))) - score)) - -#(define (merge-rests-on-positioning grob) - (let* ((can-merge #f) - (elts (ly:grob-object grob 'elements)) - (num-elts (and (ly:grob-array? elts) - (ly:grob-array-length elts))) - (two-voice? (= num-elts 2))) - (if two-voice? - (let* ((v1-grob (ly:grob-array-ref elts 0)) - (v2-grob (ly:grob-array-ref elts 1)) - (v1-rest (ly:grob-object v1-grob 'rest)) - (v2-rest (ly:grob-object v2-grob 'rest))) - (and - (ly:grob? v1-rest) - (ly:grob? v2-rest) - (let* ((v1-duration-log (ly:grob-property v1-rest 'duration-log)) - (v2-duration-log (ly:grob-property v2-rest 'duration-log)) - (v1-dot (ly:grob-object v1-rest 'dot)) - (v2-dot (ly:grob-object v2-rest 'dot)) - (v1-dot-count (and (ly:grob? v1-dot) - (ly:grob-property v1-dot 'dot-count -1))) - (v2-dot-count (and (ly:grob? v2-dot) - (ly:grob-property v2-dot 'dot-count -1)))) - (set! can-merge - (and - (number? v1-duration-log) - (number? v2-duration-log) - (= v1-duration-log v2-duration-log) - (eq? v1-dot-count v2-dot-count))) - (if can-merge - ;; keep the rest that looks best: - (let* ((keep-v1? (>= (rest-score v1-rest) - (rest-score v2-rest))) - (rest-to-keep (if keep-v1? v1-rest v2-rest)) - (dot-to-kill (if keep-v1? v2-dot v1-dot))) - ;; uncomment if you're curious of which rest was chosen: - ;;(ly:grob-set-property! v1-rest 'color green) - ;;(ly:grob-set-property! v2-rest 'color blue) - (ly:grob-suicide! (if keep-v1? v2-rest v1-rest)) - (if (ly:grob? dot-to-kill) - (ly:grob-suicide! dot-to-kill)) - (ly:grob-set-property! rest-to-keep 'direction 0) - (ly:rest::y-offset-callback rest-to-keep))))))) - (if can-merge - #t - (ly:rest-collision::calc-positioning-done grob)))) - -generalLayout = \layout { - \generalLayout - \context { - \Staff - \override RestCollision.positioning-done = #merge-rests-on-positioning - } -} \ No newline at end of file diff --git a/basic_format_and_style_settings.ly b/basic_format_and_style_settings.ly index 0e7a8a1..cb63494 100644 --- a/basic_format_and_style_settings.ly +++ b/basic_format_and_style_settings.ly @@ -39,6 +39,7 @@ generalLayout = \layout { \context { \Staff \accidentalStyle modern + \consists Merge_rests_engraver } \context { \Score