Dear David and lilyponders:

I'm glad to see that you are around here again, so now I hope it will be not much of a trouble if ask you to take a look to the aforementioned problem with the ties and centered notes. For those who don't know what I'm talking about, David Nalesnik programed a very useful function that centers notes when they occupy the whole measure. The problem seems to be that tie's length is not recalculated after the note column has been moved; and since my scheme-fu is very basic, I just can't fix this myself.

    See attachments for minimum example and output.

Thanks and best regards,
Víctor.


\version "2.19.15"

#(define center-column
   (lambda (col)
     (let* ((sys (ly:grob-system col))
            (all-cols
             (ly:grob-array->list
              (ly:grob-object sys 'columns)))
            (measure-no
             (car (ly:grob-property col 'rhythmic-location)))
            ; we need to find out if there is another
            ; PaperColumn in the measure.  If there is,
            ; we make no adjustments.
            (in-company?
             ; is there a column...
             (any
              (lambda (c)
                (and
                 ; which is NOT our column...
                 (not (eq? col c))
                 ; which is a PaperColumn...
                 (not (eq? #t (ly:grob-property c 'non-musical)))
                 ; which is in the same measure
                 (eq?
                  (car (ly:grob-property c 'rhythmic-location))
                  measure-no)))
              all-cols))
            (alone? (not in-company?))) ; 
       (if alone?
           (let* ((left-col (ly:grob-object col 'left-neighbor))
                  (right-col (ly:grob-object col 'right-neighbor))
                  (elts-list
                   (ly:grob-array->list (ly:grob-object col 'elements)))
                  (note-cols
                   (filter
                    (lambda (elt)
                      (grob::has-interface elt 'note-column-interface))
                    elts-list))
                  (all-rests
                   (map (lambda (c)
                          (ly:grob-object c 'rest))
                     note-cols))
                  (all-rests (filter ly:grob? all-rests))
                  (all-notes
                   (map
                    (lambda (c)
                      (ly:grob-object c 'note-heads))
                    note-cols))
                  (all 
                   (map (lambda (ga) 
                          (if (ly:grob-array? ga)
                              (ly:grob-array->list ga)
                              '()))
                     all-notes))
                  (all (flatten-list all))
                  (all (append all all-rests))
                  (same-dur?
                   (every (lambda (o) 
                            (equal?
                             (ly:grob-property o 'duration-log)
                             (ly:grob-property (car all)
                               'duration-log)))
                     all)))
             (if same-dur?
                 (let* ((col-center (interval-center
                                     (ly:grob-extent col sys X)))
                        (left-right-X
                         (cdr (ly:grob-extent left-col sys X)))
                        (right-left-X
                         (car (ly:grob-extent right-col sys X)))
                        (middle-X
                         (- (average left-right-X right-left-X)
                           col-center)))
                   (ly:grob-translate-axis! col middle-X X))))))))

centerSolitaryPaperColumn =
\override Score.PaperColumn.after-line-breaking = #center-column

\score{
  <<
    \new Staff \relative c' { \time 3/4 \repeat unfold 9 f4 \break f2.~ f4 \repeat unfold 7 f4 f~ f2. }
    \new Staff \relative c' { \time 3/4 \repeat unfold 9 f4 \break f2.~ f4 \repeat unfold 7 f4 f~ f2. }
  >>
}

\layout{
  \centerSolitaryPaperColumn
}
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to