Jump to content

Hiding part of a glissando when clashing a clef

From LilyPond wiki

When a glissando crosses a G or F clef, the \whiteout function does not hide it properly.

Here are two clef-combining stencils that offer something more accurate.

For technical reasons, this doesn't show up in the Wiki because \postscript only works with LilyPond's PS backend and is neither supported in the SVG (used in this Wiki) nor in the Cairo backend.

\version "2.24"

%% http://lsr.di.unimi.it/LSR/Item?id=886

%LSR by P.P.Schneider

%here starts the snippet:

#(set-global-staff-size 25)

GlissCrossClefG = {
    \once \override Staff.Clef.stencil = #ly:text-interface::print
    \once \override Staff.Clef.text = 
    \markup {  
        \combine
          \postscript " 1.1 4.2 moveto
              2 3.5 1.9 2.3 1.25 1.5 curveto
              1.4 1 lineto
              2.1 1 2.9 -0.1 1.7 -1.05 curveto
              1.7 -1.4 1.9 -1.7 1.1 -2.2 curveto
              0 -2.3 -0.25 -1.6 0.1 -1 curveto
              0.3 -0.9 lineto
              0.3 -0.8 lineto
              0.2 -0.8 -1.1 0.5 0.5 1.8 curveto
              0.5 1.8 0 3.5 1 4.2 curveto
              closepath
  	      1 setgray	
              fill"
          \musicglyph "clefs.G_change" 
    }
    \clef G
}

GlissCrossClefF = {
    \once \override Staff.Clef.stencil = #ly:text-interface::print
    \once \override Staff.Clef.text = 
    \markup {  
        \combine
          \postscript " -0.2 -0.3 moveto
              -0.5 0.9  0.4 1.6  1.7 0.8 curveto
              2.0 0.8 lineto
              2.25 0.6 lineto
              2.25 -0.5 lineto
              2.0 -0.75 lineto
              1.65 -0.75 lineto
              1.65 -0.75  0.9 -1.7  -0.1 -1.8 curveto
              -0.1 -1.8 -0.5 -1.7 -0.3 -1.5 curveto
              0 -0.7 lineto
              0.6 -0.6 lineto
              0.7 -0.4 lineto
              0.4 -0.5 lineto
              closepath
  	      1 setgray	
              fill"
          \musicglyph "clefs.F_change" 
    }
    \clef F
}

\score {
  \new Staff {
    \override Score.StaffSymbol.layer = #3
    \override Staff.Clef.layer = #2
    \clef F
    \time 4/4
    \cadenzaOn
    \set glissandoMap = #'((2 . 0) (1 . 1) (0 . 2))
    \once\override TextScript.extra-offset = #'(-3 . 1) 
    <e, c c'>1 ^\markup\column {
                   \vspace #1 %% LSR-problem-workaround
                   \line { "Using" \italic "whiteout" ":"} }
    \glissando
    \once \override Staff.Clef.whiteout = ##t 
    \clef G 
    <a c'' c'''>
    \bar "||"
    \stopStaff
    s1
    \startStaff
    \override Score.StaffSymbol.layer = #3
    \override Score.Glissando.layer = #2
    \once\override Staff.Clef.full-size-change = ##t
    \clef F
    \time 4/4
    \set glissandoMap = #'((2 . 0) (1 . 1) (0 . 2))
    \once\override TextScript.extra-offset = #'(-2 . 1) 
    <e, c c'>1^\markup { "New stencil :"}  \glissando
    \GlissCrossClefG
    <a c'' c'''>
    \cadenzaOff
    \bar "||"
  }
  \layout {
    indent = #0
    \context {
      \Staff
      \override TimeSignature.transparent = ##t
    }
  }
}

\score {
  \new Staff {
    \override Score.StaffSymbol.layer = #3
    \override Staff.Clef.layer = #2
    \clef G
    \time 4/4
    \cadenzaOn
    \set glissandoMap = #'((2 . 0) (1 . 1) (0 . 2))
    <c' c'' c'''>1 \glissando
    \once \override Staff.Clef.whiteout = ##t 
    \clef F
    <c, c c'>1 
    \bar "||"
    \stopStaff
    s1
    \startStaff
    \override Score.StaffSymbol.layer = #3
    \override Score.Glissando.layer = #0
    \once\override Staff.Clef.full-size-change = ##t
    \clef G
    \time 4/4
    \set glissandoMap = #'((2 . 0) (1 . 1) (0 . 2))
    <c' c'' c'''>\glissando
    \GlissCrossClefF
    <c, c c'>1 
    \cadenzaOff
    \bar "||"
  }
  \layout {
    indent = #0
    \context {
      \Staff
      \override TimeSignature.transparent = ##t
    }
  }
}

\paper { tagline = ##f }