Fuge c moll (BWV 847)

Zur Navigation springen Zur Suche springen

staffdown = { \change Staff = "down" }
staffup = { \change Staff = "up"}

sop = \relative c''' {
  \key es \major
  \set Timing.beamExceptions = #'()
  \set Timing.baseMoment = #(ly:make-moment 1/4)
  \set Timing.beatStructure = #'(1 1 1 1 )  %% abhängig vom Takt
  \oneVoice
  R1 R1
  r8 g16-4 ( fis g8-- ) c,-- es-- g16 ( fis! g8 ) a --
  d,8-- g16 ( fis g8 ) a-- c,16-1 ( d es4 ) ( d16 c-1

%%% 5
  b8-2 ) es16-4 ( d es8 ) g,-- as-- f'16 ( es f8 ) a,--
  b8-- g'16 ( f g8 ) h,-- c-- d16 es
  \voiceOne
  f4-5~
  f8 es16 d c-1 b!-4 as g
  \set Voice.beatStructure = #'(2 2 )
  f8-1 as'-5 ( g f-3
  es-2 ) d-3 ( es f h,-3 ) (c-4 d-5 h!-1 )
  \set Voice.beatStructure = #'(1 1 1 1 )
  c8---2 g'16-5 ( fis g8 ) d-2 es4---3 r8 e-4 (

%%% 10
  f8-5 f16 e f8 c-2 ) d4-3 r8 d-4
  es8-5 es16 d es8 b-2 c es16 d! es8 f
  \oneVoice
  b,8 es16 d es8 f as,16 b c4 b16 ( as
  \oneVoice
  g16 es f g as b c d es d c d es f g a
  b16 ) f, ( g as! b c d! e f es d es f g a h
  %\noBreak
  % {
%%% 15
  %\halsup
  \voiceOne
  c8-5 ) h16 a g f!-1 es-4 d
  \set Voice.beatStructure = #'(2 2 )
  c8-1-2 es-1-5 d-1-5 c-2-4
  b8-1-3
  \once \override Fingering.X-offset = #0.5
  a-3-4 b-1-4 c-3-5 fis,!-1-3 g a! fis-2-4
  \set Voice.beatStructure = #'(1 1 1 1 )
  g8-2-5 d'16 c d8 r r e16 d e8 r
  r8 fis16-1-5 e fis8 r r g,16 f! g8 r
  r8 a16 g a8 r r h16 a h8 r
  % {
%%% 20
  r8 c16 ( h c8 ) g_- as_- c16 ( h! c8 ) d--
  g,8-- c16 ( h c8 ) d f,16 ( g as4 ) g16 ( f
  es8 ) c'16_( h c8 ) g-3 as4 r8 a
  b8 b16_( a b8 ) f g4 r8 g~
  g8 as16 b c h c-5 as-3 f2~-4
  % {
%%% 25
  f8 d'16_( c d8 ) f,-3 es es'16_( d es8 ) g,-3
  f8 f'16 ( es f8 ) as,-- g16 f'-4 ( es-3 d-2 c-1 h-4 a-1-3 g-2 )
  c8-1-3 ( [ f-2-5 es-1-4 d-1-3 ] ) r-2 as-1-5 ( g f
  g8-1-4 f16 es f8 d ) as' g r a
  h8 c f,16 es d c c8\noBeam c'16 h c8 g
  % {
%%% 30
  as8 c16 h c8
  %\once \override Fingering.X-offset = #0.5
  < as! h! d >-2-5
  g c16 h c8 d
  f,16 g as4 g16-5 f e2\fermata
  %}
  \bar "|."
}

alt = \relative c' {
  s1*6
  \voiceTwo
  \set Voice.beatStructure = #'(2 2 )
  c4 r r8 f' es d
  r8 as g f
  \set Voice.beatStructure = #'(1 1 1 1 )
  g-1 f16-2 es f8 d
  g4 r8 h-1 c-2 c16 h!-1 c8-- g-1

%%% 10
  as4-1 g8\rest a b b16a!-3 b8 f
  g4-1 r8 g-1 as-1 as g-1 f-1
  \staffdown
  \voiceOne
  \set Voice.beatStructure = #'(2 2 )
  r8 as, b c r
  as16 [ g-1 ] as8 f
  b8 c b as b g f es
  f8 des' c b c as g f
  % {
%%% 15
  g8\noBeam
  %\staffup \voiceTwo
  %\clef treble
  \set Voice.beatStructure = #'(1 1 1 1 )
  \override Fingering.direction = #UP
  g'16 fis g8 c, es%\noBeam \clef bass
  \staffup \voiceTwo
  %\override Fingering.outside-staff-priority = #'100
  g16 fis!-1 g8 a
  d,8 g16
  %\once \override NoteHead.X-offset = #-1
  %\once \override Stem.X-offset = #-1
  %\once \override NoteColumn.force-hshift = #-12
  fis-2 g8 a! c,16 d-1 es4-2-4 d16 c-1
  b8 r r16 d e fis g-4 a-1 b8~ b16 e,! f g
  a16-1 b-2 c8~ c16 fis,-1 g a b8 es,!16 d es8 g,-1
  as!8-1 f'16 es f8 a,-1 b-1 g'16 f g8 h,
  % {
%%% 20
  c16-1
  \staffdown \voiceOne
  %\once \override NoteColumn.force-hshift =#1
  \once \override NoteHead.X-offset = #0.5
  \once \override Stem.X-offset = #1.8
  %\once \override Fingering.X-offset = #0.5
  \once \override Fingering.extra-offset = #'(0 . 9 )
  f_1 es d
  c^1 b! as g-1 f8
  \staffup \voiceTwo
  \set Voice.beatStructure = #'(2 2 )
  as' g f
  es8 d es f h, c d h
  c4 r8 e
  \set Voice.beatStructure = #'(1 1 1 1 )
  f f16-3 e! f8 c
  d4 r8 d es^( es16 d es8 ) b
  c2~ c8 d16 es f es f d
  % {
%%% 25
  h8 r r h c r r es
  d8 r r f~ f r r f
  \set Voice.beatStructure = #'(2 2 )
  es8 as! g f es d es f
  h,8 c d h? h? c r c
  \set Voice.beatStructure = #'(1 1 1 1 )
  f16 d es c~ c8 h c4\noBeam r8 e
  % {
%%% 30
  f4 r8
  \once \override NoteColumn.force-hshift = #1
  \override TextSpanner.bound-details.left.text = "rit."
  \override Fingering.extra-offset = #'( 0 . 0.5)
  f^1^3_\startTextSpan f

  es16 d es8 <as f>
  <h, d>8 r <h d> r <g c>2\stopTextSpan
  %}
}

ten = \relative c'' {
  \clef treble
  \key es \major
  %\halsdown
  \override Fingering.avoid-slur = #'inside
  \override Fingering.direction = #DOWN
  \oneVoice
  r8 c16-2 ( h c8 ) g---5 as-- c16 ( h c8-2 )  d---1
  g,8-- c16 ( h  c8 ) d-- f,16-4 ( g as4 ) g16 ( f
  es16 ) c' ( h a g f! es d
  \set Voice.beatStructure = #'(2 2 )
  c8-5 )  es'-2 ( d c
  b8 ) a ( b c-1 ) fis,-3 ( g a! fis-3

%%% 5
  \set Voice.beatStructure = #'(1 1 1 1 )
  g4-1 ) r16 c,-5 d es f g-1 as8~-2 as16 d,-5 es f
  g16 a-1 b8~-2 b16 es,-3 f g-1 as-2 g-1 f es d8
  \staffup
  c'16 h!
  \staffdown
  \clef bass
  r8 c,16-2 ( h c8 ) g-- as-- c16 ( h! c8 ) d--
  g,8 c16 ( h c8 ) d-- f,16-4 ( g as4 ) g16 ( f
  es16 ) c' ( h a g-1 f! es d
  \override Fingering.direction = #DOWN
  c-5 d-3 es d c-1 b! as! g

%%% 10
  f16 ) b'-2 ( as g-1 f-2 es!-3 d-1 c-2
  b-3 c-2 d-1 c-2 b-3 as!-4 g-1 f-2
  es16-3 ) as'-2_( g-1 f es des-4 c-1 b
  \set Voice.beatStructure = #'(2 2 )
  as8 ) c'-1 ( b-2 as-3
  \voiceTwo
  \override Fingering.avoid-slur = #'around
  g8 ) f-3-5 ( g as d,-5 es-2-4 f-2-3 d-3-5
  es8-1-4 as-1-2 g f g ) es-1-3 ( d c
  d8 ) b'-3 ( as g as ) f-1-3 ( es d!
  % {
%%% 15
  \oneVoice
  \override Fingering.direction = #DOWN
  es8 ) r8 r4 r8 c-3 b a
  \set Voice.beatStructure = #'(1 1 1 1 )
  %\revert Fingering.direction
  r8
  \once \override NoteHead.X-offset = #1.5
  \once \override Stem.X-offset = #1.5
  es'-2 [ d-1 c ] d---1 c16 ( b c8 ) d--
  g,8-- b'16-2 ( a-1 b8---2 ) d,---5 es---4 c'16-1 ( b-2 c8---1 ) e,--
  f8---4 d'16 ( c d8 ) fis,-- g4-- r16 g,-5_( a h
  c16 d-1 es8~-2 es16 ) a,-4^\<_( b c d-1 es-2 f8~\!-1 ) f16 h,-5_( c d
  % {
%%% 20
  \voiceTwo
  es8-2 ) r r e-3-5
  \set Voice.beatStructure = #'(2 2 )
  f-2 f,-3 es! d
  \oneVoice
  r8 as'-2 g-1 f
  \set Voice.beatStructure = #'(1 1 1 1 )
  \override Fingering.direction = #DOWN
  g-1 f16 es f8 g
  c16-4 d es d c-1 b! as  g f b'-2 as-3 g-1 f-2 es! d-1 c
  b16 c d c b as! g-1 f-4 es as'-2 g-1 f es d-1 c-2 b
  as16-4 b c b as g-1 f-3 es d g'-1 f-2 es d c h a
  %\revert Fingering.direction
  % {
%%% 25
  g4-5 r r16 g-5 a h c d-1 es-3 f
  g16 f-3 as-2 g-1 f es-3 d-1 c-2 h8 c16 h c8 g as c16 ( h! c8 ) d--
  g,8-- c16  ( h  c8 ) d ( f,16-4 g as4 ) g16 ( f
  es4-5 ) r8 es'
  d8 c g' g, <c, c'>2~

%%% 30
  <c c'>1~
  <c c'>1
  %}
}

Struktur =
{
  \override Score.NonMusicalPaperColumn.page-break-permission = ##f
  \override Score.NonMusicalPaperColumn.line-break-permission = ##f
  \override PianoStaff.VerticalAxisGroup.staff-staff-spacing.padding = #2
  \time 4/4
  <<
    {
      s1 * 15 \pageBreak
    }
    \\
    {
      \repeat unfold 4 { s1 * 3 \break }
      s1 * 6 \break
      \repeat unfold 3 { s1 * 3 \break }
    }
  >>
}

lyr = \lyricmode {
  \set stanza = #"1."
}

kopf = \header {
  title = "Fuge C Moll"
  composer = "M: Johann Sebastian Bach"
  subtitle = "BWV 847"
}

mypaper =
\paper {
  oddFooterMarkup = \markup \fill-line {
    \null
    \line {
      \simple #(strftime "%x um %X" (localtime (current-time)))
      {
        LilyPond \simple #(lilypond-version)
      }
    }
    \null
  }
  evenFooterMarkup = ##f
  oddHeaderMarkup = ##f
  evenHeaderMarkup = ##f
  top-margin = 20\mm
  ragged-bottom = ##t
  ragged-last-bottom = ##t
  bottom-margin = 10\mm
  line-width = 175\mm
  indent = 0
  score-markup-spacing.padding = #8
  system-system-spacing.padding = #4
}

\bookpart {
  \mypaper
  \kopf
  \score
  {
    <<
      \new PianoStaff
      <<
        \new Staff="up"
        <<
          \new Voice="melody" { \sop }
          \new Voice { \alt }
          \new NullVoice \Struktur
        >>
        \new Staff="down"
        <<
          \new Voice { \ten }
        >>
      >>
    >>
  }
}

#(set-global-staff-size 22)
#(define ((chord-name->german-markup-text-alteration B-instead-of-Bb) pitch lowercase?)

   (define (pitch-alteration-semitones pitch)
     (inexact->exact (round (* (ly:pitch-alteration pitch) 2))))

   (define (conditional-string-downcase str condition)
     (if condition
         (string-downcase str)
         str))

   (let* ((name (ly:pitch-notename pitch))
          (alt-semitones  (pitch-alteration-semitones pitch))
          (n-a (if (member (cons name alt-semitones) `((6 . -1) (6 . -1)))
                   (cons 7 (+ (if B-instead-of-Bb 1 1) alt-semitones))
                   (cons name alt-semitones))))
     (make-line-markup
      (list
       (make-simple-markup
        (conditional-string-downcase
         (vector-ref #("C" "D" "E" "F" "G" "A" "H" "B") (car n-a))
         lowercase?))
       (let ((alteration (/ (cdr n-a) 2)))
         (cond
          ((and (equal? lowercase? #f) (= alteration FLAT) (= (car n-a) 7)) (make-simple-markup ""))
          ((and (= alteration FLAT) (or (= (car n-a) 5) (= (car n-a) 2) )) (make-simple-markup "s"))
          ((= alteration FLAT) (make-simple-markup "es"))
          ((and (= alteration DOUBLE-FLAT) (or (= (car n-a) 5)(= (car n-a) 2) )) (make-simple-markup "ses"))
          ((= alteration DOUBLE-FLAT) (make-simple-markup "eses"))
          ((= alteration SHARP) (make-simple-markup "is"))
          ((= alteration DOUBLE-SHARP) (make-simple-markup "isis"))
          (else empty-markup)))))))

#(define germanChords (chord-name->german-markup-text-alteration #t))

make-midi-list =
#(define-void-function (name score tempolist)
   ((string? #f) ly:score? list?)
   (for-each
    (lambda (tempo)
      (ly:book-process
       (apply
        ly:make-book
        $defaultpaper
        $defaultheader
        (list score))
       $defaultpaper
       #{
         \midi {
           \tempo 4 = $tempo
         }
       #}
       (format #f "~a_~a"
         (or name "midi")
         tempo)))
    tempolist))

editorsColor = #grey
ed =
#(define-music-function (grob col mus)
   (symbol-list-or-symbol? (color? editorsColor) ly:music?)
   ;; for abbreviations, we need a symbol instead of a one-element list
   (let ((grob (if (= 1 (length grob)) (car grob) grob)))
     (case
      grob
      ;; define abbreviations
      ;; which call the function recursively with a value
      ;; leading into the (else) clause
      ;; (or to _another_ abbreviation)
      ;; be careful to avoid infinite recursion :-)
      ;; – abbreviation names must not be actual grob names
      ;; (at least if they’re used in the corresponding
      ;; clause) or recursion will be infinite also
      ;; It is recommended to use singular forms only
      ;; for abbreviations.
      ((Caut) #{ \ed Staff.AccidentalCautionary #})
      ((LedgerLine) #{ % barline is workaround to issue 3949
        \stopStaff
        \ed Staff.LedgerLineSpanner {
          \startStaff
          $mus
          \stopStaff
        }
        \startStaff #})
      ((Mmr) #{ \ed MultiMeasureRest $mus #})
      ((Note) #{ \ed Staff.Accidental
                 \ed Beam
                 \ed Dots
                 \ed Flag
                 \ed LedgerLine
                 \ed NoteHead
                 \ed Rest
                 \ed Stem $mus #})
      ((Pitch) #{ \ed NoteHead $mus #})
      ((Suggest) #{ \ed Staff.AccidentalSuggestion #})
      ((StemWithFlag) #{ \ed Stem \ed Flag $mus #})
      ((Tuplet) #{ \ed TupletNumber \ed TupletBracket $mus #})
      ;; ‘normal’ case
      (else
       #{
         \override $grob . color = #col
         $mus
         \revert $grob . color
       #}))))

#(define new-stil
   (lambda (grob)
     (let* ((sz (ly:grob-property grob 'font-size 0.0))
            (mult (magstep sz))
            (dir (ly:grob-property grob 'direction))
            (thick 0.15)
            (radius 0.7)
            (scaled-radius (* mult radius))
            (ps-command-string
             (format #f
               "
             0 ~a translate
             ~a setlinewidth
             ~a 0 moveto
             0 0 ~a 180 0 ~a
             stroke
             "
               ;mult
               (* thick dir)
               thick
               (- scaled-radius)
               scaled-radius
               (if (negative? dir) "arcn" "arc"))))

       (ly:make-stencil
        (list 'embedded-ps
          (format #f
            "
              gsave currentpoint translate
              ~a
              grestore
              "
            ps-command-string))
        (cons (- scaled-radius) scaled-radius)
        (cons
         (if (negative? dir) 0 (- scaled-radius))
         (if (negative? dir) scaled-radius 0))))))

soft =
-\tweak stencil #new-stil \fermata

#(define-markup-command (text-fromproperty layout props text-1 symbol text-2)
   (markup? symbol? markup?)
   #:category other
   (let ((m (chain-assoc-get symbol props)))
     (if (markup? m)
         ;; prevent infinite loops by clearing the interpreted property:
         (interpret-markup
          layout
          (cons (list (cons symbol `(,property-recursive-markup ,symbol))) props)
          (make-concat-markup (list text-1 m text-2)))
         empty-stencil)))



klavier =
%% simple orgelsatz nur SATBs
#(define-music-function (sop alt ten bas stru)
   (ly:music? ly:music? ly:music? ly:music? ly:music?)
   #{
     <<
       \new PianoStaff="leadsheet"
       <<
         \new Staff="Discant"
         <<
           \new Voice="Alt" { $sop }
           \new Voice { $alt }
         >>
         \new Staff="Bass"
         <<
           \new Voice { $ten }
           \new Voice { $bas }
           \new NullVoice $stru
         >>
       >>
     >>
   #}
   )

mynote =
#(define-music-function (m)
   (ly:duration?)
   #{
     \override Score.RehearsalMark.break-align-symbols = #'(time-signature)
     \once \override Score.RehearsalMark.self-alignment-X = #-1
     \mark \markup \fontsize #-3.5 \note { $m } #UP
   #}
   )


oob = { \once \override Score.BarNumber.stencil = ##f \bar "" }
bnf = \once \override Score.BarNumber.stencil = ##f
#(use-modules (ice-9 regex))

dynamictext =
#(define-event-function (text) (markup?)
   (if (string? text)
       (let* ((underscores-replaced
               (string-map
                (lambda (x) (if (eq? x #\_) #\space x))
                text))
              (split-text (string-split underscores-replaced #\space))
              (formatted (map
                          (lambda (word)
                            (if (string-match "^[mrzfps]*$" word)
                                (markup #:dynamic word)
                                (markup #:normal-text #:italic word)))
                          split-text)))
         #{
           #(make-dynamic-script (make-line-markup formatted))
         #})
       ;; user provided a full-blown markup, so we don't mess with it:
       #{
         #(make-dynamic-script (markup #:normal-text text))
       #}))

startMyGrace = {
  \temporary \override Slur.minimum-length = #0.1
  \startSlashedGraceMusic
  <>-#(make-music 'LaissezVibrerEvent)
  \revert Slur.minimum-length
}

myAcc =
#(def-grace-function startMyGrace stopSlashedGraceMusic)

dropLyrics =
#(define-scheme-function (amount) (number?)
   #{
     \override LyricText.extra-offset = #`(0 . ,amount)
     \override LyricHyphen.extra-offset = #`(0 . ,amount)
     \override LyricExtender.extra-offset = #`(0 . ,amount)
     \override StanzaNumber.extra-offset = #`(0 . ,amount)
   #}
   )

raiseLyrics = {
  \revert LyricText.extra-offset
  \revert LyricHyphen.extra-offset
  \revert LyricExtender.extra-offset
  \revert StanzaNumber.extra-offset
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Liedverse Formatierung
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define-markup-list-command (paragraph layout props args) (markup-list?)
   #:properties ((x-shift 2))
   (interpret-markup-list layout props
     (make-justified-lines-markup-list (cons (make-hspace-markup x-shift) args))))

#(define (numbering-start lst strt)
   "Returns a list of custom formated markups for numbers, relying on the length
of @var{lst}, starting with number 2"
   (if (eq? strt 0)
       (map
        (lambda (i)
          #{ \markup \concat \paragraph { " " } #})
        (iota (length lst)))
       (map
        (lambda (i)
          #{ \markup \concat \paragraph { \bold #(format #f "~2d. " i) } #})
        (iota (length lst) strt 1))))

#(define (equal-sized-splited-list lst n rl)
   "Split @var{lst} in equal sized parts of length @var{n}.
If @var{lst} is finally not empty add the remaining rest."
   (cond ((null? lst) (reverse rl))
     ((< (length lst) n) (reverse (cons lst rl)))
     (else
      (equal-sized-splited-list (drop lst n) n (cons (take lst n) rl)))))

columns-markup-list =
#(define-scheme-function (lines-per-verse ls)(index? markup-list?)
   "Returns a markup-list.  Each markup is done from a subset of @var{ls} under
control of @var{lines-per-verse}.  The markups are custom-formated using
@code{\\column-lines}, @code{\\column} and a hard-coded @code{baseline-skip} of
value 3"
   (let ((splitted-ls (equal-sized-splited-list ls lines-per-verse '())))
     (map
      (lambda (l)
        #{ \markup \override #'(baseline-skip . 3)
           %\override #`(font-name . ,myMin)
           \override \largerFont
           \column \column-lines $l #})
      splitted-ls) ))

formatAdditionalVerses =
#(define-scheme-function (center-overshoot number-start columns lst)
   ((boolean? #t) index? index? markup-list?)
   (let* ((numberings (numbering-start lst number-start))
          (new-list
           (map
            (lambda (x y)
              #{
                \markup
                \override #'(baseline-skip . 3)
                \line {
                  \paragraph {
                    \overlay {
                      \right-align \transparent "222"
                      \right-align \number $x
                    }
                  }
                  $y
                }
              #})
            numberings
            lst))
          (lst-lngth (length lst))
          (table-lst
           (if (and (odd? lst-lngth)
                    (= (remainder lst-lngth columns) 1)
                    center-overshoot)
               (drop-right new-list 1)
               new-list))
          (odd-tail
           (if (and (odd? lst-lngth)
                    (= (remainder lst-lngth columns) 1)
                    center-overshoot)
               (take-right new-list 1)
               #f))
          (columns-format-list (make-list columns LEFT))
          (args-list
           #{ \markuplist {
             \override #'(font-size . -1)
             \table #columns-format-list #table-lst
           } #})
          (args-list-rev
           (append
            args-list
            (if odd-tail
                #{
                  \markuplist \override #'(font-size . -1)
                  %% hier nix ändern, das sind die Nummerierungen!!
                  \column-lines { \fill-line { \line { #odd-tail } } }
                #}
                '()))))
     args-list-rev))

#(define-markup-list-command (paragraph layout props args) (markup-list?)
   #:properties ((x-shift 2))
   (interpret-markup-list layout props
     (make-justified-lines-markup-list (cons (make-hspace-markup x-shift) args))))

#(define (reorder-lists lists)
   ;; TODO better name and DOC
   "Example:
   (reorder-lists '((a) (b c) (d e f)))
   ->'(a b d "" c e "" "" f)"
   (let* ((max-length (apply max 0 (map length lists)))
          (equal-length-lists
           (map
            (lambda (l)
              (let ((length-diff (- max-length (length l))))
                (if (zero? length-diff)
                    l
                    (append l (make-list length-diff "")))))
            lists)))

     (define (new-lists lists rl)
       ;; TODO better name and DOC
       "Example
       (new-lists '((a b c) (d e f) (g h i)) '())
       ->
       '((a d g) (b e h) (c f i))"
       (if (every null? lists)
           (reverse rl)
           (new-lists
            (map cdr lists)
            (cons (map car lists) rl))))

     (apply append '() (new-lists equal-length-lists '()))))

#(define (numbering-start lst strt)
   "Returns a list of custom formated markups for numbers, relying on the length
of @var{lst}, starting with number 2"
   (if (eq? strt 0)
       (map
        (lambda (i)
          #{ \markup \concat \paragraph { " " } #})
        (iota (length lst)))
       (map
        (lambda (i)
          #{ \markup \concat \paragraph { \bold #(format #f "~2d. " i) } #})
        (iota (length lst) strt 1))))

formatTwoColumns =
#(define-scheme-function (trenner r-col r-start l-col l-start)
   ((string? " ") markup-list? index? markup-list? index?)
   #{
     \markuplist {
       %\override #`(font-name . ,myMin)
       %s\override \largerFont
       %\override #'(baseline-skip . 3)
       %\override #'(padding . 0)
       \table
       #'(1 -1 1 1 -1)
       #(reorder-lists
         (list
          ;; numbering is done for each list, because we can't warrant equal
          ;; length of each list
          (numbering-start r-col r-start)
          r-col
          (make-list (length r-col) trenner)
          (numbering-start l-col l-start)
          l-col))
     }
   #}
   )

%% LSR 233 https://lsr.di.unimi.it/LSR/Item?id=233
hairpinWithCenteredText =
#(define-music-function (parser location text) (markup?)
  #{
    \once \override Voice.Hairpin.after-line-breaking = 
      #(lambda (grob)
        (let* ((stencil (ly:hairpin::print grob))
               (par-y (ly:grob-parent grob Y))
               (dir (ly:grob-property par-y 'direction))
               (staff-line-thickness
                 (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness))
               (new-stencil (ly:stencil-aligned-to
                 (ly:stencil-combine-at-edge
                   (ly:stencil-aligned-to stencil X CENTER)
                   Y dir
                   (ly:stencil-aligned-to
                     (grob-interpret-markup
                       grob
                       (make-fontsize-markup
                         (magnification->font-size
                           (+ (ly:staff-symbol-staff-space grob)
                              (/ staff-line-thickness 2)))
                           text)) X CENTER))
                 X LEFT))
               (staff-space (ly:output-def-lookup
                 (ly:grob-layout grob) 'staff-space))
               (par-x (ly:grob-parent grob X))
               (dyn-text (grob::has-interface par-x 'dynamic-text-interface))
               (dyn-text-stencil-x-length
                 (if dyn-text
                   (interval-length 
                     (ly:stencil-extent (ly:grob-property par-x 'stencil) X))
                   0))
               (x-shift 
                 (if dyn-text 
                   (- 
                     (+ staff-space dyn-text-stencil-x-length)
                     (* 0.5 staff-line-thickness)) 0)))
  
        (ly:grob-set-property! grob 'Y-offset 0)
        (ly:grob-set-property! grob 'stencil 
           (ly:stencil-translate-axis
            new-stencil
            x-shift X))))
  #})
\layout {
  \context {
    \Voice
    beamExceptions = #'()
    \override BreathingSign.text =
    \markup { \musicglyph "scripts.lvarcomma" }
    \override Stem.neutral-direction = #down
    \override Script.outside-staff-priority = #'()
    \override Script.padding = #1
    \override Tie.thickness = #1
    \override PhrasingSlur.thickness = #3
    \override Rest.voiced-position = #0
    \override MultiMeasureRest.expand-limit = #3
  }
  \context {
    \Voice
    \name FirstVoice
    \alias Voice
    \voiceOne
  }
  \context {
    \Voice
    \name SecondVoice
    \alias Voice
    \remove "Tuplet_engraver"
    \remove "Rest_engraver"
    \remove "Multi_measure_rest_engraver"
    %\override NoteHead.font-size = #smallerNoteHead
    \voiceTwo
  }
  \context {
    \Lyrics
    \override VerticalAxisGroup.staff-affinity = #CENTER
    \override LyricText.font-size = #-1.5
    \override StanzaNumber.font-size = #-1.5
  }
  \context {
    \Staff
    printPartCombineTexts = ##f
    beamExceptions = #'()
    \override BreathingSign.text =
    \markup { \musicglyph "scripts.lvarcomma" }
    \override InstrumentName.font-features = #'("smcp")
    \consists #Span_stem_engraver
    \accepts FirstVoice
    \accepts SecondVoice
  }
  \context {
    \Score
    \override VerticalAxisGroup.remove-first = ##t
    skipBars = ##f
    \override MetronomeMark.font-size = #1
    \override MetronomeMark.font-shape = #'caps
    \override BarLine.thick-thickness = 5
    \override Timing.beamExceptions = #'()
    \override BarNumber.color = #(rgb-color 0.7 0.7 0.7)
    \override BarNumber.layer = #-200
    \override BarNumber.padding = #0.4
    \override BarNumber.outside-staff-priority =#'()
    \override BarNumber.after-line-breaking = ##f
    \override BarNumber.font-size = #-1
    \override BarNumber.font-series = #'bold
    \override BarNumber.self-alignment-X = #0
    \override BarNumber.break-visibility = #end-of-line-invisible
    \override SystemStartBar.collapse-height = #4

  }
  \context {
    \ChordNames
    chordNameLowercaseMinor = ##f
    \remove Staff_performer
    chordRootNamer = #germanChords
    \override ChordName.font-name = #"Orator10 BT"
    chordNoteNamer = #(chord-name->german-markup #f)
    \override ChordName.X-offset =
    #ly:self-alignment-interface::aligned-on-x-parent
    \override ChordName.self-alignment-X = #CENTER
    \override ChordName.font-name = #"Arial Narrow"
    \override ChordName.layer = #2
    \override ChordName.font-size = #-0.5
    noChordSymbol = ##f
  }
  \context {
    \PianoStaff
    \override StaffGrouper.staffgroup-staff-spacing.basic-distance = #2
    \override StaffGrouper.staffgroup-staff-spacing.minimum-distance = #0
  }
  \context {
    \StaffGroup
    \override SystemStartBracket.collapse-height = #4
    \override SystemStartBracket.thickness = #.2
  }
}