Hi,

In a recent thread, the topic of centering items within their measures came
up.  This post on "Scores of Beauty" (
http://lilypondblog.org/2013/06/horizontally-aligning-full-measure-rests/ )
shows an example where this nonstandard practice looks much better.
Normally, of course, a note filling a measure isn't centered, while a whole
rest is.  When the two occur at the same time, it's more appealing when
both are centered.

(See also the thread at
http://www.mail-archive.com/lilypond-user%40gnu.org/msg98447.html for a
usage case.)

The Scores of Beauty post comes with a code attachment which allows
automation of the process.

It just occurred to me that this might be done through PaperColumns.
Moving a PaperColumn will carry everything associated with it--the
NoteColumn, noteheads, dots, stem, articulations.  And _arpeggio_ (which
presented a difficulty discussed in the thread this branched off from).

Here is a sketch of that approach.  It doesn't yet allow for the
fine-grained control of the other code.

Note: measures aren't resized.  We simply use the available space.
However... one of the nice features of paper columns is that there is easy
access to adjoining paper columns.  I wonder if it's possible to manipulate
their X-extents to create a more flexible approach?

--David

%%%%%%

\version "2.19.17"

\paper {
  right-margin = 3\in
}

#(define center-column
   (lambda (grob)
     (if (grob::has-interface grob 'note-column-interface)
         (let* ((col (ly:item-get-column grob))
                (left-col (ly:grob-object col 'left-neighbor))
                (right-col (ly:grob-object col 'right-neighbor)))
           ;; we only shift a PaperColumn if it is alone in its
           ;; measure
           (if (and (ly:grob-property left-col 'non-musical)
                    (ly:grob-property right-col 'non-musical))
               (let* ((sys (ly:grob-system grob))
                      (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))))
         ;; do nothing if override applied to something other
         ;; than NoteColumn
         '()
         )))

%%%%%%%%%%%%%%

\new PianoStaff <<
  \new Staff {
    <c' e' g' c''>1\accent\fermata\f\arpeggio
    c'4 d' e' f'
    R1
  }
  \new Staff {
    R1
    R1
    <c' e' g' c''>1\accent\fermata\f\arpeggio
  }
>>

\layout {
  ragged-right = ##f
  \context {
    \Voice
    \override NoteColumn.after-line-breaking = #center-column
  }
}
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to