Hi David,
On Tue, Dec 3, 2013 at 6:17 AM, David Kastrup <d...@gnu.org> wrote: > David Kastrup <d...@gnu.org> writes: > > > Here is a scan from a Peters edition of Grieg with somewhat flamboyantly > > executed slurs (I am almost sure that the engraver had felt some grim > > satisfaction when doing those). > > > > > > And the tuplet numbers are definitely awful. I tried it with 2.16.2, > > and the results were either equally awful, or one of the tuplet numbers > > was written in the middle of the beams. Can't reproduce this right now > > with -dpreview, however, so whether the tuplet numbers are in the clouds > > or the beams probably depends on some internal evaluation order. > Here's a workaround for the tuplet number placement issue. Haven't updated this for over a year, so I'm a little surprised that it still works. I imagine all of this should be handled in the C++ code, but for what it's worth... --David
\version "2.16.0" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% A function to position tuplet numbers next to kneed beams on a single %% staff and between staves. Will ignore tuplets on ordinary beams and %% with visible brackets. %% %% Usage: \override TupletNumber #'Y-offset = #kneed-beam %% %% You must use manual beaming for this function to work properly. %% %% An additional function, called with a separate override (see below), will %% horizontally center the tuplet number on the kneed beam. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #(define ((kneed-beam length-fraction) tuplet-number) (let* ((bracket (ly:grob-object tuplet-number 'bracket)) (first-note-col (ly:grob-parent tuplet-number X)) (first-stem (ly:grob-object first-note-col 'stem)) (beam (ly:grob-object first-stem 'beam))) (if (and (ly:grob? beam) ; beam on first note? (eq? #t (ly:grob-property beam 'knee)) ; is it kneed? (interval-empty? (ly:grob-extent bracket bracket Y))) ; no visible bracket? (let* ((stems (ly:grob-object beam 'stems)) (stem-nearest-number (nearest tuplet-number stems)) (first-stem-dir (ly:grob-property first-stem 'direction)) (nearest-stem-dir (ly:grob-property stem-nearest-number 'direction)) (beaming (ly:grob-property stem-nearest-number 'beaming)) (beaming-near-number (if (car beaming) (car beaming) (cdr beaming))) (beam-multiplier (if (= nearest-stem-dir UP) (count positive? beaming-near-number) (count negative? beaming-near-number))) (beam-X-pos (ly:grob-property beam 'X-positions)) (beam-dx (- (cdr beam-X-pos) (car beam-X-pos))) (beam-Y-pos (ly:grob-property beam 'positions)) (beam-dy (- (cdr beam-Y-pos) (car beam-Y-pos))) (beam-slope (/ beam-dy beam-dx)) (mid-beam-Y (+ (car beam-Y-pos) (* beam-slope length-fraction beam-dx))) (bracket-padding (ly:grob-property bracket 'padding)) (beam-width (ly:grob-property beam 'beam-thickness)) (beam-gap (* 0.5 (ly:grob-property beam 'gap)))) (+ mid-beam-Y (* nearest-stem-dir (+ bracket-padding (* 0.5 beam-width) (if (= first-stem-dir nearest-stem-dir) 0 (* beam-multiplier (+ beam-gap beam-width))))))) (ly:tuplet-number::calc-y-offset tuplet-number)))) %% find the stem closest to the tuplet-number #(define (nearest tuplet-number stems) (let* ((refp (ly:grob-system tuplet-number)) (X-coord (interval-center (ly:grob-extent tuplet-number refp X))) (closest (ly:grob-array-ref stems 0))) (let lp ((x 1)) (if (<= (abs (- X-coord (ly:grob-relative-coordinate (ly:grob-array-ref stems x) refp X))) (abs (- X-coord (ly:grob-relative-coordinate closest refp X)))) (set! closest (ly:grob-array-ref stems x))) (if (< x (1- (ly:grob-array-length stems))) (lp (1+ x)) closest)))) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% A function which horizontally centers a tuplet number on a kneed beam. May %% be used in conjunction with the earlier function. %% %% Usage: \override TupletNumber #'X-offset = #center-on-beam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #(define ((center-on-beam length-fraction) tuplet-number) (let* ((bracket (ly:grob-object tuplet-number 'bracket)) (first-note-col (ly:grob-parent tuplet-number X)) (first-stem (ly:grob-object first-note-col 'stem)) (beam (ly:grob-object first-stem 'beam))) (if (and (ly:grob? beam) (eq? #t (ly:grob-property beam 'knee)) (interval-empty? (ly:grob-extent bracket bracket Y))) (let* ((refp (ly:grob-system tuplet-number)) (beam-Y-pos (ly:grob-property beam 'positions)) (number-X (interval-center (ly:grob-extent tuplet-number refp X))) (beam-extent (ly:grob-extent beam refp X)) (beam-center-X (+ (car beam-extent) (* length-fraction (interval-length beam-extent))))) (- beam-center-X number-X)) (ly:tuplet-number::calc-x-offset tuplet-number)))) correctTupletNumber = #(define-music-function (parser location pos) (number?) (set! pos (max 0 pos)) (set! pos (min 1 pos)) #{ \override TupletNumber #'X-offset = #(center-on-beam pos) \override TupletNumber #'Y-offset = #(kneed-beam pos) #}) correctTupletNumberDefault = \correctTupletNumber #0.5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% END FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \layout { ragged-right = ##f } \new PianoStaff \with { \accidentalStyle piano } << \time 6/8 \new Staff = "up" \relative f { \key f\major a''8-.-> r \correctTupletNumberDefault %%%%%%%%%% \times 4/5 { bes32( a f des \change Staff = "down" a } des,8-.) \change Staff = "up" r8 c''32( d c d | c8-.->) r \times 4/6 { d32( c bes f \change Staff = "down" c a } c,8-.) \change Staff = "up" r16 cis''16( a8-.) } \new Staff = "down" \relative f { \key f\major des''8-.-> r8 s8 s8 r8 f32( a f a | f8-.->) r8 s8 s8 r8 r8 | } >>
_______________________________________________ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel