Liederbuch

Begonnen von Monka, Samstag, 8. Juli 2017, 23:37

« vorheriges - nächstes »

Monka

Was ich eigentlich machen will, ist eine Liedersammlung.
Was ich bis jetzt habe ist auf GitHub, ich weiß nicht, ob da jeder darauf zugreifen kann. Ich wollte es so eingestellt haben.

https://github.com/MonikaLobinger/Liederbuch

Die Liedersammlung soll "wohl strukturiert" sein.
Die Eingabedateien sollen so einfach wie es nur geht sein, damit auch Leute mit sehr wenig Erfahrung in Lilypond Lieder hinzufügen können. Diesen Punkt habe ich meines Erachtens erfüllt. Die Eingabedatei muss kompilierbar sein, es soll eine Testausgabe erzeugt werden, so daß man sehen kann, welche Noten man eingegeben hat und ob die Lyric dazupasst. Weiterhin soll es für jede Strophe Lyrics und Stanza (unterhalb des Liedes geschrieben) geben. So daß die Produktionsroutine die Wahl hat, ob und wieviel Lyrics und was dann entsprechend als Verse druntersteht. Auch das funktioniert alles.

\version "2.19.63"

\include "begin.ily"

§§Title = "Es klappert die Mühle"
§§Subtitle = "am rauschenden Bach"


§§ScoreKey =   { \key g \major }
§§ScoreMeter = { \time 6/8 }
§§ScoreTempo = { \tempo 4 = 100 }

§§HiddenVoice = {
  \partial 8  s8 | s2 s8 \breathe s8 | s2. | s |
   s | s | s2 s8 \breathe s8 |
   s2. | s | s | s2 s8 \breathe s8 | | s | s2 s8 |
}

§§NotesSopranoI = \relative c' {
\partial 8  d8 | d8 g8 g8 g8 a8 b8 | b8 a8 a8 a4  d8 | b8 r2 d,8 |
  d8 g8 g8 g8 a8 b8 | b8 a8 a8 a4  d8 | b8 r2 b16 ([c16]) |
  d8. d16 d8 d8 e8 d8 | d8 c8 c8 c4 \breathe c8 | b8. b16 b8 d8 c8 b8 |
  b8 a8 a8 a4 \breathe d8 | b8 r8 b8 a8 r8 a8 | g4 r8 r4
  \bar "|."
}

% §§NotesSopranoII = \relative c' {
%    r1 | r1 |
% }

§§Chords =  \chordmode {
  \partial 8
  s8 g2. c g8 s8 s2 g2. c g8 s8 s2 g2. c g c  g8 s4 c8 s4 g4
}

§§VerseOneSI = \lyricmode {
  \set stanza = "1."
  Es | klap -- pert die Müh -- le  am | rau -- schen -- den Bach,  | klipp, klapp!
  Bei | Tag und bei Nacht ist der | Mül -- ler stets wach, klipp, | klapp!
  Er | mah -- let uns Korn zu dem | kräf -- ti -- gen Brot, und | ha -- ben wir sol -- ches,
  dann | hat's kei -- ne Not. Klipp, | klapp, klipp, klapp, klipp, | klapp!
}
§§StanzaOne =
  "1. Es klappert die Mühle
  am rauschenden Bach,
  klipp, klapp!
  Bei Tag und bei Nacht
  ist der Müller stehts wach,
  klipp, klapp!
  Er mahlet uns Korn zu
  dem kräftigen Brot,
  und haben wir solches,
  dann hats keine Not.
  Klipp, klapp, klipp,
  klapp, klipp, klapp!"


§§VerseTwoSI = \lyricmode {
  \set stanza = "2."
  Flink | lau -- fen die Rä -- der und | dre -- hen den Stein, | klipp, klapp!
  und | mah -- len den Wei -- zen zu | Mehl uns so fein klipp | klapp!
  Der | Bäk -- ker dann Zwie -- back und | Ku -- chen d'raus bäckt, | der im -- mer den Kin -- dern
  be -- | son -- ders gut schmeckt, Klipp,  | klapp, klipp, klapp, klipp, | klapp!
}
§§StanzaTwo =
  "2. Flink laufen die Räder
  und drehen den Stein,
  klipp, klapp!
  und mahlen den Weizen
  zu Mehl uns so fein,
  klipp, klapp!
  Der Bäcker dann Zwieback
  und Kuchen d'raus bäckt,
  der immer den Kindern
  besonders gut schmeckt.
  Klipp, klapp, klipp,
  klapp, klipp, klapp!"


§§VerseThrSI  = \lyricmode {
  \set stanza = "3."
  Wenn | reich -- lich -- e Kör -- ner das | Ak -- ker -- feld trägt,  | klipp, klapp!
  Die | Mü -- le dann flink ih -- re | Rä -- der be -- wegt, klipp | klapp!
  Und schenkt uns der Him -- mel nur | im -- mer -- dar Brot, so | sind wir ge -- bor --gen
  und | lei -- den nicht Not!  Klipp,  | klapp, klipp, klapp, klipp, | klapp!
}

§§StanzaThr =
  "3. Wenn reichliche Körner
  das Ackerfeld trägt,
  klipp, klapp!
  Die Mühle dann flink
  ihre Räder bewegt,
  klipp, klapp!
  Und schenkt uns der Himmel
  nur immerdar Brot,
  so sind wir geborgen
  und leiden nicht Not!
  Klipp, klapp, klipp,
  klapp, klipp, klapp!"


\include "end.ily"


Am "anderen Ende" sind die Ausgabeproduktionsdateien, im Moment einfach für ein Buch und einzelBlätter - für jedes Lied muß es ein Einzelblatt geben, wenn man Einzelblätter will, logisch. Im Buch werden mehrere Lieder zusammengefasst. Alle Ausgaben greifen auf die selben Eingaben zu. Das funktioniert auch soweit, ist ja auch nicht schwierig, weil der "Hauptcode" liegt in der Mitte.
Eine Produktionsdatei für "Es klappert die Mühle" ist hier: \version "2.19.63"

\include "../layout/midi.ily"
\include "../layout/sheetA4.ily"
ShowTempo  = ##t
ShowChords = ##t
\include "../scores/Score Es klappert die Muehle.ily"

\layout {
   \bookOutputName  "../_out/Es klappert die Muehle"
}

\ScoreSheetEsKlappertDieMuehle
\StanzaTrailingEsKlappertDieMuehleII
\pieceseparator


Die "Mitte" ist so gestaltet, daß ein "Block" das Layout (Schrift, Papiergröße, Ränder, Zweiseitig, Notengröße, ...) bereitstellt, dieser Block ist nur abhängig von der Produktionsdatei und einer den Score und die angehängten Strophen als Markup erzeugt. Mit dem Score bin ich zufrieden.

Die Strophen machen mich verrückt. Also nicht die Lyrics (die unter die Stimme kommt), nein die Markup Strophen, die unter das gesamte Lied kommen.

Ich habe mich inzwischen dafür entschieden, daß jede Strophe als String eingegeben wird. Ich hab ne Scheme Routine "str2mlist ", die mir aus diesem String Markups erzeugt. (define (str2mlist argIn)
      (define resultMarkupList (list))
      (define arg (string))
      (define lineList (list))
      (set! arg argIn)
      (set! lineList (string-split arg #\newline))
      (for-each
          (lambda (line)
                  (set! resultMarkupList
                        (append resultMarkupList (list (make-simple-markup line)))))
          lineList)
      resultMarkupList)
Ich hätte auch eine andere, die mir jedes Newline verdoppelt, aber mit \wordwrap-string war ich nicht zufrieden. Im Prinzip bin ich mit den Möglichkeiten von jeglichem Markup nicht zufrieden.

Ich sehe daß man damit richtig gute Sachen machen kann, wenn man sich auf konkrete Eingabe bezieht.

Ich will aber bei unbekannter Eingabe eine Ausgabe erreichen, die Rahmenbedingungen erfüllt. Und da auch noch je nach Produktionszweig verschiedene.

Konkrete Fragen werde ich in nachfolgenden Postings stellen.


Monka

#1
1.) Ich möchte die line-width eines Markups nach den Voreinstellungen berechnen - kann ich im Lilypond code darauf zugreifen?

Also in folgendem Beispiel
§StanzaTrailingII = \markup  \override-lines #'(line-width . 70) { \vspace #1.2
   \on-the-fly #MarkupStrophesAsLyrics {
   
        \stanza \column {
          #(str2mlist §§StanzaFou) #(str2mlist §§StanzaSix) #(str2mlist §§StanzaEig) #(str2mlist §§StanzaTen)
          #(str2mlist §§StanzaTwe) #(str2mlist §§StanzaFoT) #(str2mlist §§StanzaSiT) #(str2mlist §§StanzaEiT)
          #(str2mlist §§StanzaTWe) #(str2mlist §§StanzaTTw) #(str2mlist §§StanzaTFo) #(str2mlist §§StanzaTSi)
          #(str2mlist §§StanzaTEi)
         }
         \column { "   " }
         \stanza \column {
          #(str2mlist §§StanzaFiv) #(str2mlist §§StanzaSev) #(str2mlist §§StanzaNin) #(str2mlist §§StanzaEle)
          #(str2mlist §§StanzaThi) #(str2mlist §§StanzaFiT) #(str2mlist §§StanzaSeT) #(str2mlist §§StanzaNiT)
          #(str2mlist §§StanzaTOn) #(str2mlist §§StanzaTTh) #(str2mlist §§StanzaTFi) #(str2mlist §§StanzaTSe)
          #(str2mlist §§StanzaTNi)
          }
      }
   \on-the-fly #MarkupStrophesAsStanza {
        \stanza \column { #(str2mlist §§StanzaTwo)
          #(str2mlist §§StanzaFou) #(str2mlist §§StanzaSix) #(str2mlist §§StanzaEig) #(str2mlist §§StanzaTen)
          #(str2mlist §§StanzaTwe) #(str2mlist §§StanzaFoT) #(str2mlist §§StanzaSiT) #(str2mlist §§StanzaEiT)
          #(str2mlist §§StanzaTWe) #(str2mlist §§StanzaTTw) #(str2mlist §§StanzaTFo) #(str2mlist §§StanzaTSi)
          #(str2mlist §§StanzaTEi)
         }
         \column { "   " }
         \stanza \column { #(str2mlist §§StanzaThr)
          #(str2mlist §§StanzaFiv) #(str2mlist §§StanzaSev) #(str2mlist §§StanzaNin) #(str2mlist §§StanzaEle)
          #(str2mlist §§StanzaThi) #(str2mlist §§StanzaFiT) #(str2mlist §§StanzaSeT) #(str2mlist §§StanzaNiT)
          #(str2mlist §§StanzaTOn) #(str2mlist §§StanzaTTh) #(str2mlist §§StanzaTFi) #(str2mlist §§StanzaTSe)
          #(str2mlist §§StanzaTNi)
          }
      }
}


möchte ich die line-width von 70 nicht fix eingeben. Sondern die hängt ja vom Rand ab, der Schriftgröße usw.

2) Mir kommt es so vor, als ob ein Markup sich nicht für die line-width interessiert. Falls die Eingabe ohne newline länger ist, als sogar das Blatt breit ist, wird nicht umgebrochen, sondern über den Rand hinausgeschrieben. Da gibt es die wrap funktionen, ja, aber die machen mir die Formatierung der Verszeilen kaputt. Gibt es irgendeinen magischen Schalter von \markup, den ich noch nicht verstanden habe? Oder erledige ich das alles am besten mit Scheme?

(Editiert) PS: Mit Scheme könnte ich die Stanzas auch aus der Lyrics erzeugen, dann wäre die Eingabe noch einfacher

harm6

Hallo Monika,

nur ein paar Anmerkungen.
Dein Code ist hier nicht kompilerbar, da zu viele Variablen fehlen.
Bitte poste minimal Examples. http://lilypond.org/website/tiny-examples.de.html

'str2mlist' ist einfacher so:
#(define (str2mlist argIn) (string-split argIn #\newline))

Außerdem ist es verpönt zahlreiche innere (define ..) mittels (set! ...) neu zu setzen.
Dafür gibt es let und let*.

Gruß,
  Harm

Manuela

Zitat von: Monka am Samstag,  8. Juli 2017, 23:37
Was ich bis jetzt habe ist auf GitHub, ich weiß nicht, ob da jeder darauf zugreifen kann. Ich wollte es so eingestellt haben.

Soviel ich weiß, geht das auf GitHub gar nicht anders, private Inhalte gibt es nur, wenn du extra dafür zahlst.

Habe ich richtig verstanden, dass du direkt aus GitHub kompilieren lässt? Ich steige bei GitHub nicht durch bisher...

Ich habe auch ein Liederbuch erstellt, allerdings eher quick & dirty.

Im Archiv gibt es eine Menge Threads zum Thema Liederbuch/-heft, z.B.

Liederheft erzeugen

Liederbuch mit Lilypond - meine Erfahrungen
Danke für eure Hilfe
viele Grüße
-- Manuela