Hi Andrew, Thank you for your reaction.
I can understand that you did not understand why I wanted to centre the final chord. I was thinking of the perectly centered final rests, and if the last bar had not contained a \breve chord but a rest R1*2 would have produced it. I thought that such a thing should somehow also be possible for a chord but I could not find out how. Hence the subject title of my question. I will have a go with the extensive and complicated thing you forwarded. (But not today. ) Best regards, Robert On 4 Feb 2019, at 10:07 , Andrew Bernard <[email protected]> wrote: > You asked to centre the chord, but then if you add barline offset it's not > centred, so I am a bit confused what you mean. although the picture makes it > clear. > > I just wanted to say that there are often times when you really do want to > centre a chord or a rest in a single, especially in Baroque music. To this > end, when I asked about this in the past, David Nalesnik and Thomas Morley > produced this excellent code. Note that it only works for one thing in a bar, > but it's great. > > Hope this may help. > > One of those things that ought to go in LSR I suppose. > > > Andrew > > %==== > % Thanks to David Nalesnik and Thomas Morley. > > #(define (sort-by-X-coord sys grob-lst) > "Arranges a list of grobs in ascending order by their X-coordinates" > (let* ((X-coord (lambda (x) (ly:grob-relative-coordinate x sys X))) > (comparator (lambda (p q) (< (X-coord p) (X-coord q))))) > > (sort grob-lst comparator))) > > #(define (find-bounding-grobs note-column grob-lst) > (let* ((sys (ly:grob-system note-column)) > (X-coord (lambda (n) (ly:grob-relative-coordinate n sys X))) > (note-column-X (X-coord note-column))) > > (define (helper lst) > (if (and (< (X-coord (car lst)) note-column-X) > (> (X-coord (cadr lst)) note-column-X)) > (cons (car lst) (cadr lst)) > (if (null? (cddr lst)) > (cons note-column note-column) > (helper (cdr lst))))) > > (helper grob-lst))) > > #(define (read-out ls1 ls2 ls3 symbol) > "Filters all elements of ls1 from ls2 and appends it to ls3" > (set! ls3 (append ls3 (filter (lambda (x) (eq? (car ls1) (symbol x))) > ls2))) > (if (null? (cdr ls1)) > ls3 > (read-out (cdr ls1) ls2 ls3 symbol))) > > #(define ((center-note-column x-offs) grob) > (let* ((sys (ly:grob-system grob)) > (elements-lst (ly:grob-array->list (ly:grob-object sys > 'all-elements))) > (grob-name (lambda (x) (assq-ref (ly:grob-property x 'meta) 'name))) > (X-extent (lambda (q) (ly:grob-extent q sys X))) > ;; NoteColumn > (note-column-coord (ly:grob-relative-coordinate grob sys X)) > (grob-ext (X-extent grob)) > (grob-length (interval-length grob-ext)) > ;; NoteHeads > (note-heads (ly:grob-object grob 'note-heads)) > (note-heads-grobs (if (not (null? note-heads)) > (ly:grob-array->list note-heads) > '())) > (one-note-head (if (not (null? note-heads-grobs)) > (car note-heads-grobs) > '())) > (one-note-head-length (if (not (null? one-note-head)) > (interval-length (X-extent > one-note-head)) ;; NB > 0)) > ;; Stem > (stem (ly:grob-object grob 'stem)) > (stem-dir (ly:grob-property stem 'direction)) > (stem-length-x (interval-length (X-extent stem))) ;; NB > ;; DotColumn > (dot-column (ly:note-column-dot-column grob)) > ;; AccidentalPlacement > (accidental-placement (ly:note-column-accidentals grob)) > ;; Arpeggio > (arpeggio (ly:grob-object grob 'arpeggio)) > ;; Rest > (rest (ly:grob-object grob 'rest)) > ;; Grobs to center between > (args (list 'BarLine > 'Clef > 'KeySignature > 'KeyCancellation > 'TimeSignature)) > (grob-lst (read-out args elements-lst '() grob-name)) > (new-grob-lst (remove (lambda (x) (interval-empty? (X-extent x))) > grob-lst)) > (sorted-grob-lst (sort-by-X-coord sys new-grob-lst)) > ;; Bounds > (bounds (find-bounding-grobs grob sorted-grob-lst)) > (left (cdr (X-extent (car bounds)))) > (right (car (X-extent (cdr bounds)))) > > ;;(bounds-coord (cons left right)) ;; delete > > (basic-offset > (- (average left right) > (interval-center (X-extent grob)) > (* -1 x-offs))) > (dir-correction > (if (> grob-length one-note-head-length) > (* stem-dir (* -2 stem-length-x) grob-length) > 0)) > > ) ;; End of Defs in let* > > ;; Calculation > (begin > ;;(display "\n\tbounds: \t")(write bounds) > (for-each > (lambda (x) > (cond ((ly:grob? x) > (ly:grob-translate-axis! > x > (- basic-offset dir-correction) > X)))) > (list > (cond ((not (null? note-heads)) grob)) > dot-column accidental-placement arpeggio rest)) > ))) > > centerNoteColumnOn = \override Staff.NoteColumn #'after-line-breaking = > #(center-note-column 0) > > centerNoteColumnOff = \revert Staff.NoteColumn #'after-line-breaking > > onceCenterNoteColumn = > #(define-music-function (x-offs)(number?) > #{ > \once \override Staff.NoteColumn #'after-line-breaking = > #(center-note-column x-offs) > #}) > > > %====
_______________________________________________ lilypond-user mailing list [email protected] https://lists.gnu.org/mailman/listinfo/lilypond-user
