Erzeugung von MIDI-Dateien

Es gibt relativ einfache Lieder, die mit dem ersten Takt beginnen und mit dem letzten enden. In solchen Fällen ist die Erzeugung einer midi-Datei recht einfach. Sie müssen lediglich eine kleine Ergänzung im \score Bereich des \book vornehmen:

\book {
   ...
   \layout {
      ...
   }
   \midi { }
}
ergänzen. Lilypond wird dann ganz nebenbei auch eine midi-Datei erstellen.

Etwas komplizierter wird es, wenn unser Lied - wie im vorliegenden Fall - Wiederholungen beinhaltet. Hier gilt es aber noch einmal zwischen einem eher einfachen und einem deutlich komplexeren Fall zu unterscheiden:

  1. Wiederholungen, die mit den syntaktischen Mitteln von lilypond, also \repeat volta x { } oder \repeat segno y { } abgebildet werden.
  2. Wiederholungen mit Da Capos u.ä., die nicht mit den vorhandenen syntaktischen Mitteln dargestellt werden können. Bei solchen Wiederholungen müssen die Segno- und Coda-Zeichen als \markups eingefügt. Für einen Musiker liefert das relevante Information, die er beim Spielen berücksichtigen wird. Für lilypond stellt das aber nur grafischen Schnickschnack dar, es weiß nichts von der daraus resultierenden logischen Struktur des Musikstücks.

In beiden Fällen benötigen wir eine zusätzliche \book-Umgebung. Zunächst der einfachere Fall:

midi-Files bei \repeat volta oder \repeat coda

lilypond bietet die Möglichkeit, Wiederholungen mittels \unfoldRepeats "auszuschreiben". Gehen wir davon aus, dass unser \book wie folgt aussieht:

\book {
   \score {
      ...
   }
   \layout {
      ...
   }
}
Kopieren sie das ganze \book mit der Maus und fügen sie es darunter noch einmal ein. Danach verändern sie die Kopie geringfügig indem sie am Beginn des \score-Blocks \unfoldRepeats einfügen, den \layout-Block komplett entfernen und an gleicher Stelle \midi { } einfügen. Da das zweite Buch keinen \layout-Block hat, wird nur eine midi-Datei und kein pdf erzeugt. That's it!

Obwohl nicht unbeding notwendig, können sie auch noch ein \bookOutputSuffix am Anfang jeder \book-Umgebung ergänzen. Der wird jeweils beim Erzeugen der Ausgabedateien an den Dateinamen angehängt und sorgt für etwas mehr Übersichtlichkeit in ihrem Ausgabeverzeichnis. Machen sie das nicht, benutzt lilypond immer den gleichen Dateinamen, hängt aber zur Unterscheidung irgendwelche Ziffern an.

\book {
   \bookOutputSuffix "Piano Vocal"
   \score {
      ...
   }
   \layout {
      ...
   }
}
\book {
   \bookOutputSuffix "Midi"
   \score {
      \unfoldRepeats
      ...
   }
   \midi { }
}

In unserem konkreten Fall - dem Tipperary Song - reicht dieser Lösungsansatz im Grunde genommen aus. Wobei anzumerken ist, dass sie vermutlich den Liedtext etwas anpassen müssen. Oder sie lassen ihn ganz weg, denn nicht jeder midi-Sequencer scheint damit etwas anfangen zu können. Das schlichte Konsolenprogramm timidity kann es immerhin und sie werden beim rumprobieren schnell feststellen, dass \unfoldRepeats die Sache mit dem Gesangstext nicht korrekt hinbekommt. Wiederholungen sind auf Textebene zumeist keine Wiederholungen sondern eine neue Strophe. Im folgenden werde ich mich nicht weiter mit \unfoldRepeats rumplagen, sondern beispielhaft einen allgemeineren und flexiberen Ansatz zeigen. Dieser eignet sich gleichzeitig auch für den bereits genannten zweiten Fall:

midi-Files bei komplexen Wiederholungen

Insbesondere im Bereich der Pop-Musik wird gerne mit Da Capo dal Segno und ähnlichem gearbeitet. Dabei muss man derart kreuz und quer durch die Noten springen, dass man meinen könnte, man hätte es mit klassischem BASIC-Spaghetticode zu tun. lilypond hat zwar nicht nur seit einiger Zeit den \repeat segno-Befehl und wir benutzen ihn sogar in unserem Beispiel. Der ist allerdings einigermaßen limitiert. Einzelne Wiederholungen, egal ob volta oder segno, dürfen sich nicht überlappen. Und genau das ist gar nicht so selten der Fall. Wenn die Automatik es nicht kann, muss der Mensch Hand anlegen.

Der Einfachheit betrachten wir zunächst nur ein Notensystem: Den Gesang. Aber natürlich müssen die gezeigten Umformungen bei allen Stimmen, Dynamikangaben, Dämpferpedalangaben in gleicher Form umgesetzt werden In unserem Lilypond File sieht das so aus:

singer = \relative c'' {
    something_part_A
    \repeat segno 3 {
        \repeat volta 2 {
            something_part_B
        }
        something part C
        \repeat volta 2 {
            something_part_D
        }
        \alternative {
            {
                something_part_E
            }
            {
                something_part_F
            }
        }
    }
}

Als erstes machen wir uns daran, die Noten in einzelne Segmente singerA, singerB etc. zu unterteilen. Geeignete Bruchstellen sind etwa \repeat Stellen oder per Markup eingefügte Segnos oder Coda-Zeichen. Diese Befehle sollten NICHT in den Segmenten drin stehen. Sie kommen allerdings wieder ins Spiel sobald wir die ursprüngliche Stimme singer wieder rekonstruieren.

singerA = \relative c'' {
    something_part_A
}
singerB = \relative c'' {
    something_part_B
}
singerC = \relative c'' {
    something_part_C
}
singerD = \relative c'' {
    something_part_D
}
singerE = \relative c'' {
    something_part_E
}
singerF = \relative c'' {
    something_part_F
}

singer = {
  \singerA
  \repeat segno 3 {
    \repeat volta 2 { \singerB }
    \singerC
    \repeat volta 2 { \singerD }
    \alternative { { \singerE } { \singerF } }
  }
}

Scheinbar ist damit nichts gewonnen, ausser dass alles komplizierter geworden zu sein scheint. Aber wir haben eine Basis geschaffen, mit der wir auch sehr einfach eine Stimme mit linearem Ablauf ohne die Wiederholungszeichen, Segnos etc. erstellen können:
singerUnfolded = {
    \singerA \singerB \singerB
    \singerC \singerD \singerE \singerD \singerF
    \singerC \singerD \singerE \singerD \singerF
    \singerC \singerD \singerE \singerD \singerF
}

In ähnlicher Form verfahren wir mit den Stimmen für linke und rechte Hand, Dämpferpedal und Dynamik. Der Gesangstext muss auch zerpflückt werden, jedoch folgt der mit seinen drei Strophen und dem Refrain einer eigenen Logik. Am Ende verfügen wir über folgende Variablen, immer mit gleichem Inhalt aber jeweils mit und ohne Wiederholungsstruktur:

Mit diesen Bausteinen können sie jetzt \books für alle möglichen Zwecke erstellen. Das ausgeführte Beispiel erzeugt vier verschiedene Ausgabedateien:

Piano_Vocal
Der komplette Score mit eigenen Notenzeilen für Gesang und Klavier. Der Text steht unter dem Notensystem für Gesang, das wiederum über den Klaviernoten ausgegeben wird.
Piano_with_Lyrics
Die Klaviernoten mit Text. Der Text steht oberhalb der Klaviernoten. Beachten sie, dass die Gesangsstimme hier als unsichtbare Stimme (Nullvoice) als parallel laufende Stimme in die Zeile der linken Hand eingefügt wird. Ohne diese Stimme wäre die waagrechte Ausrichtung des Textes an der Gesangsmelodie nicht notwendig. Die Klavierstimme, meist eine Begleitstimme kommt für diesen Zweck meist nicht in Frage, da sie meist von der Gesamgsmelodie abweicht.
Die Gesangstimme muss übrigens schon definiert sein, bevor der Text hinzugefügt wird, sonst gibt es außer einer Fehlermeldung nichts zu bestaunen. Will man den Text über der obersten Notenzeile stehen haben, muss man diese Reihenfolge trotzdem einhalten. Um den Text trotzdem oberhalb eines Notensystems auszugeben, benutzt man:
\with { alignAboveContext = "pianoUpper" }
Banner
Der komplette Score mit Notenzeilen für Gesang und Klavier. Der Text steht unter dem Notensystem für Gesang. Der Notensatz verwendet ein selbst definiertes Papierformat, das so breit ist, dass nur eine einzige Notenzeile ausgegeben wird. Zusätzlich wird ein proportionales Spacing benutzt, so dass alle Takte gleich breit sind. Nur manchmal kann es passieren, dass zu langer Gesangstext einen Takt verbreitert. Möglicherweise müssen sie die auch Breite des selbstdefinierten Papierformats anpassen, damit alles passt.
Midi
Eine Midi-Datei, die auch den mit der Gewsangsmelodie synchronisierten Text beinhaltet.

Downloads: Quelltext - Kompletter Score(PDF-Datei) - Klaviernoten mit Text (PDF-Datei) - Banner (PDF-Datei) - Midi-Datei -

\version "2.24.4"

\header {
  % The following fields are centered
  % dedication = "Dedication"
  title = "It’s a long, long way to Tipperary"
  % subtitle = "subtitle"
  % subsubtitle = "Subsubtitle"

  % The following fields are evenly spread on one line
  % the field "instrument" also appears on following pages
  % instrument = "Instrument"
  % poet = "poet"
  composer = "Written and Composed Jack Judge & Harry Williams"

  % The following fields are placed at opposite ends of the same line
  % meter = "Meter"
  % arranger = "arranger"

  % The following fields are centered at the bottom
  copyright = "Copyright 1912 by B. Feldmann & Co, London, Eng."
  tagline = \markup {
    \tiny {
      \column \center-align {
        {
          \line  { lilypond 2.24.4 - www.lilypond.org }
          \line { Thomas Kneisel }
        }
      }
    }
  }
}

keyTimeEtc = {
  \key bes \major
  \time 2/4

  \set Score.tempoHideNote = ##t
  \tempo "Allegro con spirito" 4 = 96

  \set tieWaitForNote = ##t
}

singerA = \relative c'' {
  \clef "treble"
  \keyTimeEtc

  r2 |
  r2 |
  r2 |
  r2 |
}
singerB = \relative c'' {
  r2 |
  r2 |
  r2 |
  r2 |
}
singerC = \relative c'' {
  bes8 d c bes |
  g8 f d es |
  f8 g f d |
  f4. r8 |
  bes8 d c bes |
  g8 f d f |
  a8 bes a e |
  a4. r8 |
  bes8 d c bes |
  g8 f d f |
  a8 bes a e |
  a4. c8|
  d8 c bes a |
  c8 bes c d |
  a8 g a bes |
  c4\fermata \bar "||"  d,8^\markup { \bold Chorus } es |
}
singerD = \relative c' {
  f4 f~ |
  f8 f g a |
  bes 4 d~ |
  d4 d8 c |
  bes4 g~ |
  g4  bes |
  f2~ |
  f8 r bes d, |
  f4 f~ |
  f8 f g a |
  bes4 d~ |
  d4 bes8 b |
  c4 g |
  a4 bes |
  c2~ |
  c4 r |
  f,4 f~ |
  f4 g8 a |
  bes4 d~ |
  d4 r |
  es4 g, |
  bes4 c |
  d2~ |
  d8 r bes c |
  d4 d |
  d8 bes c bes |
  g2( |
  f4) bes |
  d4 bes~ |
  bes4 c |
}
singerE = \relative c'' {
  bes2~ |
  bes8 r d, es |
}
singerF = \relative c' {
  bes'2~ |
  bes8 r r4 |
}

pianoUpperA = \relative c' {
  \clef "treble"
  \keyTimeEtc

  <d bes'>8 <d d'> < d c'> <d bes'> |
  <d g>8 <d f> <bes d> <c es> |
  <d f>8 <d g> <d f> d |
  f8. f16 <es g>8 <es a> |
}
pianoUpperB = \relative c' {
  bes'16. bes 32 bes 16. bes 32 bes16. c32 d16. es32 |
  f16. g32 f16. g32 f16. d32 c16. bes32 |
  c16. g32 g16. g32 g16. a32 bes16. c32 |
  <d, d'>16. bes'32 <es, c'>16. a32 <d, bes'>8 <bes' d f bes>-> |
}
pianoUpperC = \relative c'' {
  <d, bes'>8 <d d'> <d c'> <d bes'> |
  <d g>8 <d f> <bes d> <c es> |
  <bes d f>8 <bes d g> <gis d' f> <gis d'> |
  <a es' f>8 <a es' fis> <bes es g> <c es a> |
  <d bes'>8 <d d'> <d c'> <d bes'> |
  <cis g'>8 <d f> <bes d> f' |
  <cis g' a>8 <cis g' bes> <cis g' a> <cis e> |
  <d f a>8 <d f> <c es g> <c es a> |
  <d bes'>8 <d d'> <d c'> <d bes'> |
  <d g>8 <d f> <bes d> <d f> |
  <cis a'>8 <cis bes'> <cis a'> <cis e> |
  <d f a>8 <c f a> <c e bes'> <c f c'> |
  << { d'8 c bes a } \\ { fis4 fis } >> |
  << { c'8 bes c d } \\ { <d, g>4 <d g> } >> |
  << { a'8 g a bes } \\ { e,4 e } >> |
  <es f c'>4\fermata \bar "||"  <bes d>8 <c es> |
}
pianoUpperD = \relative c' {
  <d f>8-. <bes d f>-. <a d f>-. <g d' f>-. |
  <f d' f>8 <f d' f> <g es' g > <a es' a> |
  << { bes'4 d~ d s } \\ { r8 <d, f>16 <d f> r8 <d f>16 <d f> <d f>8 <d f> <bes' d> <a c> } >> |
  << { bes4 g~ g bes } \\ { r8 <es, g> r es r es r <es g> } >> |
  << { f8. g16  <d f>8 <bes d> } \\ { d4 s } >> |
  << { g8. a16  bes8 d, } \\ { cis4 d8 bes } >> |
  <d f>8-. <bes d f>-. <a d f>-. <g d' f>-. |
  <f d' f>8 <f d' f> <g es' g> <a es' a> |
  << { bes'4 d~ d } \\ { r8 <d, f>16 <d f> r8 <d f>16 <d f> <d f>8 <d f>  } >> < d g bes>8 <d g b> |
  << { c'4 g } \\ { r8 <e g> r <c e> } >> |
  << { a'4 bes } \\ { r8 <c, e> r <c e> } >> |
  << { c'8. d16 } \\ { es,4 } >> <es c'>8 <es a> |
  <es g>8 <es f> <bes d> <c es> |
  f8 d'16( c bes a g ges) |
  << { f4 } \\ { r8 <bes, d> } >> <es g> <es a> |
  << { bes'4 d~ d~ d } \\ { r8 <d, f>16 <d f> r8 <d f>16 <d f> <d f>8 bes' a as } >> |
  <g es'>4 <es g>-> |
  <g bes>4-> <g c>-> |
  <fis d'>8 a16 gis a8 fis |
  d8 r <d bes'> <es c'> |
  << { d'4 d } \\ { r8 <d, f> r <d f> } >> |
  <d f d'>8 <d f bes> <d f c'> <d f bes> |
  << { g2( f4) bes } \\ { r8 <cis, e>16 <cis e> <cis e>8 <cis e> d4 <d f> } >> |
  << { d'4 bes~ bes c } \\ { r8 <d, g bes> r <d g> r <e g> r <es f> } >> |
}
pianoUpperE = \relative c' {
  < d f bes>8 c'16 d c8 bes16 a |
  g8 f <bes, d> <c es> |
}
pianoUpperF = \relative c' {
  <d f bes>8 d16 es f8 <es a d>-> |
  <d f bes>8 r <bes' d f bes>-> r |
}

pianoLowerA = \relative c' {
  \clef "bass"
  \keyTimeEtc

  bes,8 <f' bes> f, <f' bes> |
  bes,8 <f' bes> f, f' |
  bes,8 <f' bes> f, <f' bes> |
  c8 <a' c es> <f bes> <f c'> |
}
pianoLowerB = \relative c' {
  <g bes d>4-> <g bes d>8<g bes d> |
  <d f bes d>4-> <d f bes d>8 <d f bes d> |
  <es g c>4 <es g c>8 <es g c> |
  <f bes>8-> <f a>-> <bes, f' bes>-> <bes, bes'>-> |
}
pianoLowerC = \relative c, {
  bes'8 <f' bes> f, <f' bes> |
  bes,8 <f' bes> f, f' |
  bes,8 f' b, f' |
  c8 f f, f' |
  bes,8 <f' bes> f, <f' bes> |
  << { e8 f f4 } \\ { bes,8 bes bes4 } >> |
  e8 a a, <g' a> |
  <d a'>8 <d a'> <c f> <f, f'> |
  bes8 <f' bes> f, <f' bes> |
  bes,8 <f' bes> f, <f' bes> |
  e8 <g a> a, <g'a> |
  <d a'>8 <f, f'> <g g'> <a a'> |
  << { d8 f d' c } \\ { d,4~ d } >> |
  << { c'8 bes <g, g'>4 } \\ { g'4 s } >> |
  << { c8 bes a g } \\ { c,4 c } >> |
  << { a'4\fermata } \\ { f4 } >> \bar "||"  r4 |
}
pianoLowerD = \relative c' {
  bes,8 f' f, f' |
  bes,8 f' f, f' |
  bes,8 <f' bes> f, <f' bes> |
  bes,8 <f' bes> d <f bes d> |
  es8 <g bes> bes, <g' bes> |
  es8 <g bes> es <g bes> |
  \acciaccatura e8 <bes f'>4 \acciaccatura e8 <bes f'>4 |
  <bes e >4 <bes f'>8 <bes f'> |
  bes8 f' f, f' |
  bes,8 f' f, f' |
  bes,8 <f' bes> f, <f' bes> |
  bes,8 <f' bes> <g, g'> <g g'> |
  <c c'>4 <bes bes'> |
  <a a'> <g g'> |
  <f' a>4 <f a>8 <f c'> |
  <f bes>8 <f a> <f, f'>4 |
  bes8 <f' bes d> f, <f' bes d> |
  bes,8 f' f, <f' a> |
  bes,8 <f' bes> f, <f' bes> |
  << { bes, bes' c d } \\ { bes,2 } >> |
  <es bes' es>4 <es bes'> |
  <es bes' es>4 <es a es'> |
  <d a' d>8 a'16 gis a8 f |
  d8 r r4 |
  bes8 <f' bes> f, <f' bes> |
  bes,8 <f' bes> f, <f' bes> |
  << { bes,8 <g' bes> <g bes> <g bes> } \\ { bes,2 } >> |
  <bes f' bes>4 <bes bes'> |
  g8 <g' bes> g, <g' bes> |
  c,8 <g' bes c> f, <f' a> |
}
pianoLowerE = \relative c' {
  <bes, f' bes>8 c'16 d c8 bes16 a |
  g8 f <f, f'>4 |
}
pianoLowerF = \relative c {
  <bes f' bes>8 d16 es f8 <f, f'> |
  <bes f'>8 r <bes, bes'> r |
}

pianoDynamicsA = {
  \keyTimeEtc
  s8\f s s4 |
  s2 |
  s2 |
  s2 |
}
pianoDynamicsB = {
  s2 |
  s2 |
  s2 |
  s4 s8 s8\sfz |
}
pianoDynamicsC = {
  s8\mp s s4 |
  s2 |
  s8\< s8\! s4 |
  s8\> s s s\! |
  s2 |
  s2 |
  s8\< s s s\!
  s8\> s s s\! |
  s2 |
  s2 |
  s2 |
  s8\< s\! s\> s\! |
  s2 |
  s2 |
  s2 |
  s4 s8\p s\f |
}
pianoDynamicsD = {
  s2 |
  s4 s8
  s8\< |
  % Problem: A hairpins ending after the first note of a bar
  % Solution 1: Add an additional note while keeping the overall duration
  s16 s\! s8 s4 |
  s8\> s s\! s |
  s2 |
  s8\< s s s\! |
  s2 |
  s8\> s s s\! |
  s2 |
  % Problem: A hairpins ending after the first note of a bar
  % Solution 2: Override lilypond's standard behaviour only once
  s4 s8 \once \override Hairpin.to-barline = ##f s8\< |
  s8\! s s s16 s\> |
  s8 s \! s s |
  s2 |
  % Problem: A hairpins ending after the first note of a bar
  % Solution 3: Override lilypond's standard behaviour for the rest of the score
  s8 \once \override Hairpin.to-barline = ##f s8\< s4 |
  s4\! s4 |
  s8\> s s s\! |
  s2 |
  s2 |
  s2 |
  s2 |
  s8.\< s16\! s8 s |
  s8 s s s\< |
  s8 s16 s\! s4 |
  s8\> s s s\! |
  s2 |
  s2 |
  s2 |
  s2 |
  s2 |
  s4 s8\< s |
}
pianoDynamicsE = {

  s4 s8\! s |
  s2 |
}
pianoDynamicsF = {
  s8\< s s\! s |
  s4 s8\fz s |
}

lyricsSnippetA = \lyricmode {
  \set stanza = #"1. "
  Up to might -- y Lon -- don came an Ir -- ish man one day,
  As the street are paved with gold, sure ev -- ’ry -- one was gay;
  Sing -- ing songs of Pic -- ca -- dil -- ly, Strand and Leice -- ster Square,
  Till Pad -- dy got ex -- cit -- ted, then he shout -- ed to them there:
}
lyricsSnippetB = \lyricmode {
  \set stanza = #"2. "
  Pad -- dy wrote a let -- ter to his Ir -- ish Mol -- ly O’,
  Say -- ing, “Should you not re -- ceive it, write and let me know!
  “If I make mis -- takes in “spell -- ing,” Mol -- ly dear,” said he,
  “Re -- mem -- ber it’s the pen that's bad, don’t  lay the blame on me”
}
lyricsSnippetC = \lyricmode {
  \set stanza = #"3. "
  Mol -- ly wrote a neat re -- ply to Ir -- ish Pad -- dy O’,
  say -- ing, “Mike Ma -- lon -- ney wants to mar -- ry me, and so
  Leave the Strand and Pic -- ca -- dil -- ly, or you’ll be to blame,
  For love has fair -- ly drove me sil -- ly hop -- ing you’re the same!”
}
lyricsSnippetD = \lyricmode {
  “It’s a long way to Tip -- per -- ar -- y,
  It’s a long way to go;
  It’s a long way to Tip -- per -- ar -- y,
  To the sweet -- est girl I know!
  Good -- bye Pic -- ca -- dil -- ly,
  Fare -- well, Leices -- ter Square,
  It’s a long, long way to Tip -- per -- ary,
  But my heart’s right
}
lyricsSnippetE = \lyricmode {
 there!”
}
lyricsSnippetF = \lyricmode {
  “It’s a
}

% -------------------------------------------
% combine the snippets for the various books
% -------------------------------------------

% music (with folded repeats)
singer = {
  \singerA
  \repeat segno 3 {
    \repeat volta 2 { \singerB }
    \singerC
    \repeat volta 2 { \singerD }
    \alternative { { \singerE } { \singerF } }
  }
}
pianoUpper = {
  \pianoUpperA
  \repeat segno 3 {
    \repeat volta 2 { \pianoUpperB }
    \pianoUpperC
    \repeat volta 2 { \pianoUpperD } \alternative { { \pianoUpperE } { \pianoUpperF } }
  }
}
pianoLower = {
  \pianoLowerA
  \repeat segno 3 {
    \repeat volta 2 { \pianoLowerB }
    \pianoLowerC
    \repeat volta 2 { \pianoLowerD } \alternative { { \pianoLowerE } { \pianoLowerF } }
  }
}
pianoDynamics = \new Dynamics {
  \pianoDynamicsA
  \repeat segno 3 {
    \repeat volta 2 { \pianoDynamicsB }
    \pianoDynamicsC
    \repeat volta 2 { \pianoDynamicsD } \alternative { { \pianoDynamicsE } { \pianoDynamicsF } }
  }
}

% music (unfolded repeats)
singerUnfolded = {
  \singerA \singerB \singerB
  \singerC \singerD \singerE \singerD \singerF
  \singerC \singerD \singerE \singerD \singerF
  \singerC \singerD \singerE \singerD \singerF
}
pianoUpperUnfolded = {
  \pianoUpperA \pianoUpperB \pianoUpperB
  \pianoUpperC \pianoUpperD \pianoUpperE \pianoUpperD \pianoUpperF  
  \pianoUpperC \pianoUpperD \pianoUpperE \pianoUpperD \pianoUpperF  
  \pianoUpperC \pianoUpperD \pianoUpperE \pianoUpperD \pianoUpperF  
}
pianoLowerUnfolded = {
  \pianoLowerA \pianoLowerB \pianoLowerB
  \pianoLowerC \pianoLowerD \pianoLowerE \pianoLowerD \pianoLowerF
  \pianoLowerC \pianoLowerD \pianoLowerE \pianoLowerD \pianoLowerF
  \pianoLowerC \pianoLowerD \pianoLowerE \pianoLowerD \pianoLowerF
}
pianoDynamicsUnfolded = \new Dynamics {
  \pianoDynamicsA \pianoDynamicsB \pianoDynamicsB
  \pianoDynamicsC \pianoDynamicsD \pianoDynamicsE \pianoDynamicsD \pianoDynamicsF
  \pianoDynamicsC \pianoDynamicsD \pianoDynamicsE \pianoDynamicsD \pianoDynamicsF
  \pianoDynamicsC \pianoDynamicsD \pianoDynamicsE \pianoDynamicsD \pianoDynamicsF
}

% lyrics, one line per stanza (for folded repeats)
lyricsLineOne   = { \lyricsSnippetA \lyricsSnippetD \lyricsSnippetE \lyricsSnippetF \lyricsSnippetE }
lyricsLineTwo   = { \lyricsSnippetB }
lyricsLineThree = { \lyricsSnippetC }

% lyrics, everything in one line (for unfolded repeats)
lyricsUnfolded    = {
  \lyricsSnippetA \lyricsSnippetD \lyricsSnippetE \lyricsSnippetD \lyricsSnippetE
  \lyricsSnippetB \lyricsSnippetD \lyricsSnippetE \lyricsSnippetD \lyricsSnippetE
  \lyricsSnippetC \lyricsSnippetD \lyricsSnippetE \lyricsSnippetD \lyricsSnippetE
}

% -----------------
% create the books
% -----------------
\book {
  \bookOutputSuffix "Piano Vocal"
  \paper {
    #(set-paper-size "a4" 'portait)
    page-count = 2
    ragged-last-bottom = ##f
    ragged-bottom = ##f
  }

  \score {
    <<
      \new Staff = "singerStaff" \with { instrumentName = #"Voice" } {
        \new Voice = "singerVoice" { \singer }
      }
      \new Lyrics \lyricsto "singerVoice" { \lyricsLineOne }
      \new Lyrics \lyricsto "singerVoice" { \lyricsLineTwo}
      \new Lyrics \lyricsto "singerVoice" { \lyricsLineThree }
      \new PianoStaff \with { instrumentName = #"Piano " } {
        <<
          \new Staff = "pianoUpper" {
            \new Voice { \pianoUpper }
          }
          \pianoDynamics
          \new Staff = "pianoLower" {
            \new Voice { \pianoLower }
          }
        >>
      }
    >>
    \layout {
      #(layout-set-staff-size 18)
      \context {
        \Score
        % proportionalNotationDuration = #(ly:make-moment 1/8)
      }
      \context {
        \Staff
        % \override VerticalAxisGroup.remove-empty = ##t
        % \override VerticalAxisGroup.remove-first = ##t
        \override TupletBracket.bracket-visibility = ##t
        % \override SpacingSpanner.common-shortest-duration = #(ly:make-moment 1/8)
      }
    }
  }
}

\book {
  \bookOutputSuffix "Banner"
  \paper {
    #(set! paper-alist (cons '("mein Format" . (cons (* 260 in) (* 3.5 in))) paper-alist))
    #(set-paper-size "mein Format" 'portait)
    page-count = 1
    oddFooterMarkup = ##f
    oddHeaderMarkup = ##f
    bookTitleMarkup = ##f
    scoreTitleMarkup = ##f
  }
  \score {
    <<
      \new Staff = "singerStaff" \with { instrumentName = #"Voice" } {
        \new Voice = "singerVoice"  { \singerUnfolded }
      }
      \new Lyrics \lyricsto "singerVoice" { \lyricsUnfolded }
      \new PianoStaff \with { instrumentName = #"Piano " } {
        <<
          \new Staff = "pianoUpper" {
            \new Voice { \pianoUpperUnfolded }
          }
          \pianoDynamicsUnfolded
          \new Staff = "pianoLower" {
            \new Voice { \pianoLowerUnfolded }
          }
        >>
      }
    >>
    \layout {
      #(layout-set-staff-size 22)
      \context {
        \Score
        proportionalNotationDuration = #(ly:make-moment 1/8)
      }
      \context {
        \Staff
        \override VerticalAxisGroup.remove-empty = ##t
        \override VerticalAxisGroup.remove-first = ##t
        \override TupletBracket.bracket-visibility = ##t
        % \override SpacingSpanner.common-shortest-duration = #(ly:make-moment 1/64)
      }
    }
  }
}

\book {
  \bookOutputSuffix "Midi"
  \score {
    \unfoldRepeats
    <<
      \new Staff = "singerStaff" \with { midiInstrument = "soprano sax" } {
        \new Voice = "melody"  { \singerUnfolded }
      }
      \new Lyrics \lyricsto "melody" { \lyricsUnfolded }
      \new PianoStaff \with { midiInstrument = "acoustic grand" } {
        <<
          \new Staff = "pianoUpper" {
            \new Voice { \pianoUpperUnfolded }
          }
          \pianoDynamicsUnfolded
          \new Staff = "pianoLower" {
            \new Voice { \pianoLowerUnfolded }
          }
        >>
      }
    >>
    \midi {
    }
  }
}

\book {
  \bookOutputSuffix "Piano with Lyrics"
  \paper {
    #(set-paper-size "a4" 'portait)
    page-count = 2
    ragged-last-bottom = ##f
    ragged-bottom = ##f
  }
  \score {
    \new PianoStaff \with { instrumentName = #"Piano " } {
      <<
        \new Staff = "pianoUpper" {
          <<
            \new Voice { \pianoUpper }
            \new NullVoice = "melody"  { \singer }
          >>
        }
        \new Lyrics \with { alignAboveContext = "pianoUpper" } \lyricsto "melody" { \lyricsLineOne }
        \new Lyrics \with { alignAboveContext = "pianoUpper" } \lyricsto "melody" { \lyricsLineTwo }
        \new Lyrics  \with { alignAboveContext = "pianoUpper" }\lyricsto "melody" { \lyricsLineThree }
        \pianoDynamics
        \new Staff = "pianoLower" {
          \new Voice { \pianoLower }
        }
      >>
    }
    \layout {
      #(layout-set-staff-size 20)
      \context {
        \Staff
        \override VerticalAxisGroup.remove-empty = ##t
        \override VerticalAxisGroup.remove-first = ##t
        \override TupletBracket.bracket-visibility = ##t
        \override SpacingSpanner.common-shortest-duration = #(ly:make-moment 1/8)
      }
    }
  }
}


Fazit

Der Tipperary-Song sieht ungefähr so aus, wie ich selber Klaviernoten gerne hätte. Ich verwende es daher als Vorlage, wenn ich ein neues Lied schreibe. Das läuft dann wie folgt ab:

  1. Die Vorlage wird in ein neues Verzeichnis kopiert und erhält einen neuen Dateinamen.
  2. Der Inhalt der \header-Sektion wird angepasst.
  3. Der Inhalt aller singerA-, singerB-Blöcke etc. wird komplett rausgelöscht.
  4. Die Struktur des Songs wird in den Variablen singer, singerUnfolded etc. festgelegt. Danach weiß man, wieviele singerA, singerB usw. Schnipsel benötigt werden.
  5. Die einzelnen Schnipsel werden angelegt und mit Inhalt gefüllt.
  6. Das Layout (Schriftgröße, Seitenzahl u.ä.) der einzelnen \books wird optimiert.
  7. Fehler werden gesucht und beseitigt.

Ansonsten gilt: Schauen sie sich an, was lilypond noch so alles kann. Die Entwickler fügen ständig nützliche neue Fähigkeiten hinzu. Deswegen schauen sie sich auch an, was es bei neuen Versionen hinzugelernt hat. Mit etwas Experimentierfreude werden sie bald ihren eigenen Stil entwickeln. Wahrscheinlich werden sie dann auch bald feststellen, dass mein Weg zum Ziel selten dämlich und umständlich ist. Sie werden es besser machen. Viel Spaß dabei.

Zurück zum sechsten Teil: Letzter Feinschliff