Hi David,
On Tue, Dec 3, 2013 at 6:17 AM, David Kastrup <[email protected]> wrote:
> David Kastrup <[email protected]> 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
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-devel