Jump to content

Tuplet brackets and numbers always on note head side

From LilyPond wiki

If you want to place the tuplet bracket and the tuplet number always at the side of the note head, you could use \tupletAtNoteHeads as defined here.

If a kneed beam occurs, a warning gets printed.

\version "2.24"

%% TODO:
%% TupletBracket/Number is improved with 2.20;
%% check whether this snippet is still needed/useful

tupletAtNoteHeads =
  \override TupletBracket.before-line-breaking =
    #(lambda (grob)
      (let* ((tuplet-dir (ly:grob-property grob 'direction))
             (note-columns 
               (ly:grob-array->list (ly:grob-object grob 'note-columns)))
             (note-heads-array-list 
               (flatten-list
                 (map 
                   (lambda (x) 
                     (ly:grob-object x 'note-heads))
                       note-columns)))
             (note-heads 
             	(flatten-list 
             	  (map 
             	    (lambda (x) 
             	      (ly:grob-array->list x)) 
             	        note-heads-array-list)))
            (stems (map (lambda (x) (ly:grob-object x 'stem)) note-heads))
            (stem-dirs (map (lambda (x) (ly:grob-property x 'direction)) stems))
            (sorted-stems-dirs-list 
              (sort-list stem-dirs (lambda (a b) (< a b))))
            (equal-stems-dir? 
              (= (car sorted-stems-dirs-list) 
                 (car (reverse sorted-stems-dirs-list)))))
                 
  (if (and equal-stems-dir? (= (car sorted-stems-dirs-list) tuplet-dir))
    (ly:grob-set-property! grob 'direction (* -1 (car sorted-stems-dirs-list)))
    ;; With 2.14.2 the log-warning is sometimes misleading.
    ;; Works nice with higher versions.
    (ly:warning 
      "Kneed beam detected - if desired, adjust TupletBracket manually."))))

\relative c' {
  \override TupletBracket.bracket-visibility = ##t
  \tupletAtNoteHeads
  \tuplet 3/2 { a'8 b c }
  \tuplet 3/2 { r8 d e } 
  \tuplet 3/2 { r8 r f, }
  \tuplet 3/2 { g, a'' r } 
  \tuplet 3/2 { c,,8 c c }
  \tuplet 3/2 { r8 c c } 
  \tuplet 3/2 { r8 r c }
  \tuplet 3/2 { c c'' r }
}