Jump to content

Fingering spanner

From LilyPond wiki
Revision as of 06:41, 11 March 2026 by Lemzwerg (talk | contribs) (Revise)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Draw a straight or dashed line between two fingerings.

Syntax is

-\guide dashed? offset -f

If Boolean argument dashed? is set to #t, draw a dashed line. The target fingering number is given by f, the offset from f to the start fingering is offset, which is coordinate pair (the X-value of this pair is thus always negative).

This function should be only used after the complete music has been typeset. Any change in the formatting will make the X-offsets invalid.

\version "2.24"

% LSR Credits: PPS in May 2015

guide =
#(define-music-function (dashed? coord fingering) 
  (boolean? pair? ly:music?)
  "Make a line or dashed spanner, starting from the end 
   fingering and ending at the start fingering.
   One should define the ending point with x and y coordinates."
  (let ((fingering-ev (make-music 'FingeringEvent))
        (finger (ly:music-property fingering 'digit)))
    #{
      \tweak stencil
        #(lambda (grob)
          (grob-interpret-markup grob
            #{ 
              \markup 
                \concat {
            	  \line {
            	    \translate #'(0 . 0.5)
            	    \override #'(thickness . 1.3)
            	    \with-dimensions #'(0 . 0) #'(0 . 0)
            	    #(if dashed?
            	         #{
            	           \markup
            	             \override #'(on . 0.8)
            	             \override #'(off . 0.4)
            	             \draw-dashed-line $coord 
            	         #}
            	         #{ \markup \draw-line $coord #})
            	  }
            	  \hspace #0.4
            	  #(number->string finger)
            	}
            #}))
        $fingering-ev
    #}))

%%%% Test:
voiceI = {
  \set fingeringOrientations = #'(up)

  <cis'-3>16 <e'-0> <a-2> b 
    <c'-\guide ##f #'(-4 . 1) -2
       -1>8 
    cis' d' dis' e' f' | 
  fis' g'
    <gis'-\guide ##t #'(-39.5 . -2.5) -2
         -\guide ##t #'(-39.5 . -2.5) -1> 
    <a'-3
       -\guide ##f #'(-3.5 . -0.2) -1> bes' b'
    <c''-\guide ##t #'(-13 . -0.8) -3
        -\guide ##t #'(-13 . -0.8) -1> 
    <cis''-2-4> |
}

voiceII = {
  r4 a16 a, ais a, b a, bis a, cis' a, d' a, | 
  dis' a, e' a, eis' a, fis' a, g' a, gis' a, a' a, g' a, |
}

{
  \clef "G_8" 
  \key d \major
  << \voiceI \\ \voiceII >> 
}