On 2018-08-11 13:30, David F. wrote:
While we’re on the topic of bending slurs to our will, I’d like for
slurred, beamed eighth notes to have the slur printed below or inside
the beam.  This works with a simple ^~ for ties.  How might I
accomplish this?

The behavior I am after can also be seen here:

You can always adjust the control points to get the slur to fit within the notes. However, manually setting control points can be a little tedious, especially if you have a slur that is almost correct but just needs a little nudging in the right direction.

This (likely over-engineered) approach allows you to transform an existing slur by means of scaling, rotation and translation. It automatically scales and rotates about the center of the slur, which seemed most natural when I was experimenting with it.

\version "2.19.82"
\language "english"

#(define (transform-coords coords scale rotate offset)
  (let* ((x-coords (map (lambda (coord) (car coord)) coords))
         (y-coords (map (lambda (coord) (cdr coord)) coords))
         (x-center (/ (+ (apply min x-coords) (apply max x-coords)) 2))
         (y-center (/ (+ (apply min y-coords) (apply max y-coords)) 2))
         (theta (* rotate (/ PI 180)))
         (c (cos theta)) (s (sin theta)))
    (map (lambda (coord) (let (
        (x (* (- (car coord) x-center) (car scale)))
        (y (* (- (cdr coord) y-center) (cdr scale))))
      (cons (+ (* x c) (* y (- s)) x-center (car offset))
            (+ (* x s) (* y c) y-center (cdr offset))))) coords)))

#(define ((transform-slur scale rotate offset) grob)
  (let ((coords (ly:slur::calc-control-points grob)))
    (transform-coords coords scale rotate offset)))

transformSlur =
#(define-music-function (parser location scale rotate offset)
                        (pair? number? pair?)
  #{ \once \override Slur.control-points =
       #(transform-slur scale rotate offset) #})

\new Staff \with { beamExceptions = #'() } << {
  e'8 ( a'8 )
  \transformSlur #'(0.6 . 0.8) #15 #'(-0.3 . -2.6)
  e'8 ^( a'8 )
  \tuplet 3/2 { b'8 ( a'8 ) f'8 }
  \tuplet 3/2 {
    \transformSlur #'(0.5 . 0.6) #180 #'(0.4 . 2)
    b'8 _( a'8 )f'8 }
} >>

NOTE: Purely for the sake of demonstrating rotation, the second slur is a "down" slur that I have flipped over.

-- Aaron Hill
lilypond-user mailing list

Reply via email to