Jump to content

Maria durch ein Dornwald ging

From LilyPond wiki
Revision as of 21:58, 20 December 2025 by Lemzwerg (talk | contribs) (Make Wiki display the header)

German advent song with many features of Lilypond.

\version "2.24"

\language "deutsch"
#(set-global-staff-size 24)
musicextrema =
#(define-music-function (mus)(ly:music?)
   (let*
    (
      (alle-pitches
       (let loop ((mus mus) (pitches '()))
         (let ((p  (ly:music-property mus 'pitch)))
           (if (ly:pitch? p)
               (cons p pitches)
               (let ((elt (ly:music-property mus 'element)))
                 (fold loop
                       (if (ly:music? elt)
                           (loop elt pitches)
                           pitches)
                       (ly:music-property mus 'elements)))))))
      (alle-sortiert (sort alle-pitches ly:pitch<?))
      (tief (car alle-sortiert))
      (hoch (car (reverse alle-sortiert)))
      )
    ;     (display tief )(display hoch)
    ;     (write-me "alle pitches----> " (list? alle-pitches))
    (make-music
     'SequentialMusic
     'elements
     (list
      (make-music
       'NoteEvent
       'duration
       (ly:make-duration 2)
       'pitch
       tief)
      (make-music
       'NoteEvent
       'pitch
       hoch
       'duration
       (ly:make-duration 2))))
    ))

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

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

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% Akkordbezeichnungen und Contexte
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(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 (note-international->markup pitch lowercase?)
   "Return pitch markup for @var{pitch}."
   (define (accidental->markup alteration)
     "Return accidental markup for ALTERATION."
     (if (= alteration 0)
         (make-line-markup (list empty-markup))
         (conditional-kern-before
          (alteration->text-accidental-markup alteration)
          (= alteration FLAT) 0.094725)))
   (define (conditional-string-downcase str condition)
     (if condition
         (string-downcase str)
         str))
   (define (conditional-kern-before markup bool amount)
     "Add AMOUNT of space before MARKUP if BOOL is true."
     (if bool
         (make-line-markup
          (list (make-hspace-markup amount)
                markup))
         markup))
   (make-line-markup
    (list
     (make-simple-markup
      (conditional-string-downcase
       (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename pitch))
       lowercase?))
     (accidental->markup (ly:pitch-alteration pitch)))))

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
   #}
   )

\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 Slur.thickness = #3
    \override Tie.thickness = #3
    \override PhrasingSlur.thickness = #3
    \override Rest.voiced-position = #0
    \consists Horizontal_bracket_engraver
    \override HorizontalBracket.direction = #UP
    \override HorizontalBracket.bracket-flare = #'(0 . 0)
    \omit AmbitusAccidental
  }
  \context {
    \Lyrics
     \override LyricText.font-size = #-2
    \override StanzaNumber.font-size = #-2
    \override LyricHyphen.whiteout = ##t
    \override LyricHyphen.layer = #10
    \override VerticalAxisGroup.staff-affinity = #0
    \override LyricText.self-alignment-X = #LEFT
   }
  \context {
    \Staff
    \remove Keep_alive_together_engraver
    explicitKeySignatureVisibility = #end-of-line-invisible
    explicitClefVisibility = #end-of-line-invisible %% Notenschlüssel am Zeilenende nicht anzeigen
    \RemoveEmptyStaves
    beamExceptions = #'()
    \override BreathingSign.text =
    \markup { \musicglyph "scripts.lvarcomma" }
  }
  \context {
    \ChordNames
    chordRootNamer = #note-international->markup
    noChordSymbol = ##f
    \override ChordName.self-alignment-X = #LEFT
    chordNameLowercaseMinor = ##f
    \override Rest.stencil = ##f
    chordChanges = ##f
    \override ChordName.font-size = #-1
  }
  \context {
    \ChordNames
    \name GermanChordNames
    \alias ChordNames
    chordRootNamer = #(chord-name->german-markup-text-alteration #f)
  }
  \context {
    \Score
    \override VerticalAxisGroup.remove-first = ##t
    \override MetronomeMark.break-align-anchor-alignment = #0
    \override MetronomeMark.break-align-symbols = #'(left-edge ambitus clef)
    \override MetronomeMark.font-size = #1
    \override MetronomeMark.font-variant = #'small-caps
    \override BarLine.thick-thickness = 5
    barNumberVisibility = #first-bar-number-invisible-and-no-parenthesized-bar-numbers
    \override BarNumber.after-line-breaking = ##f
    \override BarNumber.color = #(rgb-color 0.3 0.3 0.3)
    \override BarNumber.outside-staff-priority =##f
    \override BarNumber.padding = #0.5
    \override BarNumber.font-size = #-1.5
    \override BarNumber.layer = #-1
    \override BarNumber.self-alignment-X = #0
    \override BarNumber.break-visibility = #end-of-line-invisible
    \override Timing.beamExceptions = #'()
    \override RehearsalMark.break-visibility = #end-of-line-invisible
    \accepts GermanChordNames
  }
}

orgel =
%% Notensatz für Orgelnoten 4stimmig + Text + Harmonisierung + Umbrüche +
%% Stimme für Ambitus
#(define-music-function (sop alt ten bas amb akk stru lyr p nation)
   (ly:music? ly:music? ly:music? ly:music? ly:music?
              ly:music? ly:music? ly:music? ly:pitch? boolean?)
   (let*
    ((ober (if nation 'GermanChordNames 'ChordNames))
     )
    #{
      <<
        \new $ober \transpose c $p $akk
        \new PianoStaff
        <<
          \new Staff="up"
          <<
            \new Voice="Alt"
            {
              \voiceOne
              \transpose c $p $sop
            }
            \new NullVoice
            \with {
              \consists "Ambitus_engraver"
              \omit AmbitusAccidental
            }
            {
              \transpose c $p $amb
            }
            \new Voice { \voiceTwo \transpose c $p $alt }
          >>
          \new Lyrics \lyricsto Alt $lyr
          \new Staff="down"
          <<
            \new Voice {
              \voiceOne \transpose c $p $ten
            }
            \new Voice { \voiceTwo \transpose c $p $bas }
            \new NullVoice $stru
          >>
        >>
      >>
    #}
    ))

sop = \relative {
  \key g \major
  \tieDashed
  \autoBeamOff
  h4 e4 ~ e8 fis8 g4 h g fis8 e  fis4 ~ fis
  g4 8 8 a2 h r4 \bar "" \break
  g8[ a] h4. a8 h4 c8[ h]
  a4. g8 a4
  h8 a g4~ 8
  fis8 g8 g a8 g fis4~ 8 e8 fis4 fis \breathe
  \slurSolid
  e4. fis8 g4 h g8[ fis] e2
  \bar "|."
}

alt = \relative {
  h4
  h2 h2 h h h d
  d s4 d
  g4. fis8 g4 e
  fis4. e8 fis4
  d4
  e2 e
  dis4 dis8 cis dis2
  h2 e
  h4 h2
}

ten = \relative {
  \key g \major
  \clef bass
  g4
  g2 g g2 fis2
  g a g r4 h
  %g4. a8 g4 a8 g
  h2. a4
  a2. g4
  e2 g
  fis fis \breathe
  g g2
  g4 g2
}

bas = \relative {
  e4
  e2 e e dis
  e fis g, s4 g'
  % e4. d8
  e2. e4
  d2. g,4
  h2 h
  h h
  e e
  e4 e2
}

Akk=
\chordmode {
  e4:m q1 q4 a h2
  e2:m d g1
  g4. d8 g4 a:m
  d2. g4 e1:m h4. a8:7 h2
  e1:m
  e8:m h e2:m
}

lyr = \lyricmode {
  <<
    {
      \set stanza = #"1"
      Ma -- ri -- a durch ein Dorn -- wald _ ging.
    }
    \new Lyrics
    \with { alignAboveContext = down }
    {
      \set stanza = #"2"
      Was trug Ma -- ri -- a unter
      ih -- rem Herzen?
    }
    \new Lyrics
    \with { alignAboveContext = down }
    {
      \set stanza = #"3"
      Da ha_ben die Dor -- nen
      Ro -- sen ge -- tragen.
    }
  >>
  \dropLyrics #-2.9
  \set stanza = #"1-3:" Ky -- rie e -- lei -- son
  \raiseLyrics
  <<
    {
      \set stanza = #"1" Ma --  ri -- a durch ein Dorn -- wald ging,
      der _ hat in
      \set ignoreMelismata = ##t
      sie -- ben Jahr kein
      \set ignoreMelismata = ##f
      Laub ge -- tra -- gen.
    }
    \new Lyrics
    \with { alignAboveContext = down }
    {
      \set stanza = #"2"
      Ein klei -- nes Kind -- lein oh -- ne Schmer -- zen,
      das trug Ma -- ri -- a un -- ter ih -- rem Her -- zen.
    }
    \new Lyrics
    \with { alignAboveContext = down }
    {
      \set stanza = #"3"
      Als_das Kind -- lein durch den Wald ge -- tra -- gen,
      da ha_ben die Dor _ -- nen _
      Ro_sen ge -- tra -- gen.
    }
  >>
  \dropLyrics #-2.9
  \set stanza = #"1-3:" Je -- sus und Ma -- ri -- a.
}

\header {
  title = \markup "Maria durch ein Dornwald ging"
  composer = \markup \override #'(baseline-skip . 2)
  \right-column {
    "M&T: August Franz von Haxthausen""(1792-1866) 1850"
  }
}

Struktur =
{
  \override Score.NonMusicalPaperColumn.page-break-permission = ##f
  \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1/2)
  \time 4/4
  \partial 4
  \mynote 4
}

\paper {
  #(include-special-characters)
  indent = #0
  tagline = ##f
  ragged-right = ##f
  ragged-last = ##f
  print-all-headers = ##f
  print-first-page-number = ##f
  oddHeaderMarkup = ##f
  evenHeaderMarkup = ##f
  oddFooterMarkup = ##f
  top-margin = 25\mm
  bottom-margin = #top-margin
  line-width = 170\mm
  markup-markup-spacing.padding = #1
  markup-system-spacing.padding = #5
  ragged-last-bottom = ##t
}

\bookpart {
  #(for-each
    (lambda (p)
      (add-score
       (scorify-music #{
         {
           \orgel \sop \alt \ten \bas
           { \musicextrema \sop }
           \Akk
           {
             \Struktur
           }
           \lyr
           $p ##t
                      } #} )))
    (music-pitches #{
      {
        c %b, d es f
                   } #}
                   ))
}