On 2021-03-19 12:30 pm, Dimitris Marinakis wrote:
I don't like manually setting Y values of glissando endpoints. I'd
appreciate a more thoughtful approach.
Is it possible to reference the calculation Lilypond already does and add a
value to it without trying to guesstimate what the actual value is from
scratch? The default placement is sometimes 95% fine but I'd like to nudge
it a bit upwards or downwards without tweaking the padding.

This makes cross-staff glissando editing really annoying. If my thinking makes sense, this would solve the problem partially since Lilypond will do its best each time the staff spacing gets changed but the tweak will help
on top of that.

Normally, this would be a job for \offset. However, \offset does not work with all properties, in particular, nested properties like the bound-details of the line-spanner-interface.

But you can effect the same change by using extra-dy and Y-offset with a little bit of arithmetic:

%%%%
\version "2.22.0"

offsetGlissando =
#(begin
  (define (number-or-number-list? arg)
   (or (number? arg) (number-list? arg)))
  (define ((indexed lst) grob)
   (list-ref lst (ly:grob-property grob 'glissando-index)))
  (define-event-function
   (left-dy right-dy)
   (number-or-number-list? number-or-number-list?)
   (if (number? left-dy) (set! left-dy (list left-dy)))
   (if (number? right-dy) (set! right-dy (list right-dy)))
   (let ((extra-dy (map (lambda (l r) (- r l)) left-dy right-dy))
         (Y-offset (map (lambda (l r) (/ (+ l r) 2)) left-dy right-dy)))
    #{ \tweak extra-dy #(indexed extra-dy)
       \tweak Y-offset #(indexed Y-offset)
       \glissando #})))

\paper { indent = 0 line-width = 10\cm}

{ f'2 \glissando c''2
  f'2 \offsetGlissando #-1 #-1 c''2
  f'2 \offsetGlissando #1 #1 c''2
  f'2 \offsetGlissando #-2 #0 c''2
  f'2 \offsetGlissando #2 #0 c''2 \break
  f'2 \offsetGlissando #0 #-2 c''2
  f'2 \offsetGlissando #0 #2 c''2 \bar "||"

  \override Glissando.before-line-breaking =
   #(lambda (grob)
     (ly:grob-set-property! grob 'color
      (list-ref (list black red blue)
                (ly:grob-property grob 'glissando-index))))
  <f' a' c''>2 \glissando <c'' g' e'>2
  <f' a' c''>2 \offsetGlissando #'(1 1 -2) #'(-1.5 1.5 0)
  <c'' g' e'>2 \bar "|." }
%%%%

The parameters to \offsetGlissando are delta-Y values for the left and right bounds respectively. If there are multiple glissandi, then the arguments should be lists of numbers, each value corresponding to a particular glissando. Shown above is an untangling of the crossing glissandi, which the coloring should make clearer.

P.S. I am ignoring the possibility of broken glissandi, as they are not supported by default.


-- Aaron Hill

Reply via email to