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

Reply via email to