Deutsches Lilypond Forum (Archiv)
Allgemein => Allgemeine Diskussion => Thema gestartet von: musicmaker am Mittwoch, 11. August 2010, 14:26
-
Hallo an Alle,
ich habe schon einige Wochen zuvor ein paar Lieder mithilfe des Lilypond-Noteneditors geschrieben. Nun möchte ich die einzelnen Lieder zu einem Buch zusammenführen.
Die Form dafür ist:
\paper { }
\book {
\header { }
\bookpart { \include "datei.ly" }
}
Die Unterdatei ist für gewöhnlich folgendermaßen strukturiert:
\header {}
melodiestimme = \relative c {noten}
melodietext =\lyricmode {text}
melodieharm = \chordmode {Akkorde}
\score {
<<
\new chordnames {set chordnames = ##t \melodieharm }
\new PianoStaff <<
\new Staff = "Melodie" <<
\new Voice="Melodie" { \melodiestimme}
>>
\new Lyrics \lyricsto "Melodie" {\melodietext}
>>
>>
}
Wie man hier sieht, sind die Noten, Text und Akkorde vorher in Variablen geschrieben worden. Diese Vorgehensweise hat sich innerhalb der Einzeldokumente als Gut erwiesen.
Ich möchte nun von der Buchdatei aus auf die Unterdateien zugreifen und diese einbinden. Dabei erhalte ich viele Fehlermeldungen. Wenn ich die Noten, Text und Akkorde in den Unterdateien direkt ins score schreibe, dann funktioniert alles. Hierbei setze ich aber die Lesbarkeit der Unterdatei herab.
Kann mir jemand dabei helfen.
Gruß musicmaker ::)
-
hallo
Wie man hier sieht, sind die Noten, Text und Akkorde vorher in Variablen geschrieben worden. Diese Vorgehensweise hat sich innerhalb der Einzeldokumente als Gut erwiesen.
um das beizubehalten, musst du die variablen für jedes stück eindeutig definieren - also:
melodiestimmeI = {}
melodietextI = {}
melodieharmI = {}
melodiestimmeII = {}
melodietextII = {}
melodieharmII = {}
usw.
alternativ kannst du auch die einzelnen stücke definieren mit
stueckI = \include "unterdatei1.ly"
stueckII = \include "unterdatei2.ly"
stueckIII = \include "unterdatei2.ly"
usw.
und diese dann im \book einsetzen.
da ich deinen code nicht direkt sehe, kann ich dir nur diese globalen anweisungen geben. wenn aber noch weitere schwierigkeiten auftauchen, melde dich einfach wieder!
-
Hallo nocheinmal,
ich glaube auch, dass es was mit der Variablendefinition zu tun hat. Zur Verdeutlichung hier die Buchdatei, die Unterdatei (mit Variablen), UnterdateiB (alles im Score reingeschrieben).
Übrigens werden weitere Unterdateien nacheinander mit bookpart weiter eingefügt. Jedenfalls sollte es irgendwann mal so sein. Bis jetzt jedenfalls nur mit Fehlermeldungen.
Gruß musicmaker
-
also, das ist schon ziemlich was du brauchst (beachte das B):
\bookpart { \include "UnterdateiB.ly"}
kompiliert bei mir wunderbar (ohne fehler!)
die unterdatei.ly kannst du nicht innerhalb eines score oder boooks includieren, da sie definitionen der art melodie={…} enthält; diese müssten ausserhalb des books oder scores geschehen!
hoff das hilft weiter
-
Hallo,
aber dann muss man ja prinzipiell eine andere Struktur vorsehen, um Lieder in ein Buch schreiben zu können? Beziehungsweise muss man, wenn man vor hat, die Lieder mal später in ein Buch zu bringen von vornherein eine kompatible Struktur vorsehen. Und die Lesbarkeit dabei ist stark herabgesetzt, gerade bei Stücken mit vielen Instrumenten oder Chorälen.
Ich habe mal die book-Anweisung gelöscht und das gleiche Ergebnis bekommen. Dass heißt, das Einfügen mit Include darf keine eigenen Variablen beinhalten, was aus oben genannten Gründen negativ ist.
-
Da ich noch ziemlich neu im Umgang mit lilypond bin, bitte ich um eine Struktur für ein Buch. Das was ich in der Buchdatei habe, ist aus irgendwelchen Codeschnipseln zusammengeschrieben worden. Daher können Fehler durch das Einfügen von Dateien schon entstanden sein, die selbst Variablen beinhalten.
Ich bitte um Rückmeldungen.
Gruß musicmaker
-
ich hab hier einmal deine unterdatei.ly "bereinigt" um sie dann in der buchdatei zu includieren:http://
-
Hallo,
die Idee mit der Variable in der Unterdatei finde ich gut, aber sie macht diese für die Erstellung einer PDF der Unterdatei unbrauchbar. Kann man nicht auch temporär diese Variable dort setzen? Vielleicht am Anfang Überschreiben und am Ende zurück überschreiben?
Des Weiteren müsste dies auch irgendwie automatisch gehen, indem eine Funktion die inkludierten Dateien in Reihenfolge durchgeht und Variablen setzt.
Übrigens bei der tocItem- Funktion möchte ich die subtitles der Unterdateien übergeben. Wie kann ich das realisieren?
Gruß musicmaker
-
Hallo musicmaker,
herzlich willkommen im Forum!
Da ich noch ziemlich neu im Umgang mit lilypond bin, bitte ich um eine Struktur für ein Buch.
Sicher hilft dir dieser Beitrag (https://liarchiv.joonet.de/index.php?topic=678.msg3692#msg3692) dabei.
Dass heißt, das Einfügen mit Include darf keine eigenen Variablen beinhalten, …
Das ist nicht richtig. Es gibt aber grundsätzliche, einfache Regeln für Variablen in Lily:
- Der Bezeichner (Name der Variablen) muss dokumentweit eindeutig sein (also bis zur obersten Datei, in der die Variable bspw. aus einer anderen Datei durch \include eingebunden wird).
- Die Variable muss im Quelltext vor ihrem Aufruf bereits definiert sein.
- Existieren mehrere Variablen mit dem gleichen Bezeichner, wird ab der entsprechenden Stelle der zuletzt definierte Inhalt interpretiert.
Das was ich in der Buchdatei habe, ist aus irgendwelchen Codeschnipseln zusammengeschrieben worden. Daher können Fehler durch das Einfügen von Dateien schon entstanden sein, die selbst Variablen beinhalten.
Also Vorsicht beim Verschachteln von Variablen und Einbinden von Dateien, deren Inhalt man nicht genau kennt! Wichtige und häufig gebrauchte Snippets/Variablen landen bei mir in einer separaten Datei, die zu Beginn jedes neuen Dokuments eingebunden wird und dadurch zur Verfügung steht. Alle „alten Hasen“ hier machen das ähnlich. Kann ich nur jedem Einsteiger wärmstens empfehlen! (Anfangs ist es meist nur eine unsortierte Datei, in die man lose Schnipsel kopiert und bei Bedarf in das Hauptdokument einfügt; quasi Spickzettel. Immer wieder gebrauchte Variablen sind aber in einer zentralen Include-Datei am besten aufgehoben.)
aber dann muss man ja prinzipiell eine andere Struktur vorsehen, um Lieder in ein Buch schreiben zu können?
Andere Struktur? Nö. Nur eindeutige Variablendeklaration nach obigen Grundregeln.
Beziehungsweise muss man, wenn man vor hat, die Lieder mal später in ein Buch zu bringen von vornherein eine kompatible Struktur vorsehen.
Kompatibel ist immer gut und beantwortet deine eigene Frage. Sehr gut. Allerdings (das muss man zugeben): man weiß ja vorher nicht genau oder gar nicht, in welchen Dateien außer der aktuellen die Includes später noch verwendet werden. Es ist aber recht einfach, eine Datei zu duplizieren und darin befindliche Variablen kurzerhand umzubenennen.
Und die Lesbarkeit dabei ist stark herabgesetzt, gerade bei Stücken mit vielen Instrumenten oder Chorälen.
Da muss ich dir bedingt Recht geben. Aber es liegt viel an deiner Kreativität, die Variablen kanonisch zu benennen. Ich persönlich finde es äußerst hinderlich, dass Variablennamen in Lily nur Buchstaben enthalten dürfen. Das schränkt die Kreativität in der Bezeichnung immens ein.
die Idee mit der Variable in der Unterdatei finde ich gut, aber sie macht diese für die Erstellung einer PDF der Unterdatei unbrauchbar. Kann man nicht auch temporär diese Variable dort setzen? Vielleicht am Anfang Überschreiben und am Ende zurück überschreiben?
In wie weit „unbrauchbar“? Ich schau’s mir mal kurz an. Temporär funktioniert nicht so, wie du es meinst. Anfangs setzen, dann überschreiben (das ist einfach) und auswerten und zum Schluss den vorangegangenen Wert zurück schreiben und neu auswerten geht selbst in gestandenen Programmiersprachen nicht ohne Hilfe von temporär deklarierten Variablen. Haben wir etwa Speicherknappheit??? ;)
Des Weiteren müsste dies auch irgendwie automatisch gehen, indem eine Funktion die inkludierten Dateien in Reihenfolge durchgeht und Variablen setzt.
Das ist es ja gerade: eine .ly-Eingabedatei wird doch von oben nach unten eingelesen und ausgewertet! Eine \include-Anweisung wird dabei so gehandhabt, als ob der Inhalt der Datei an dieser Stelle hineinkopiert wäre. Ist das so schwer zu verstehen? Mach dir einfach mal die Mühe und füge den Dateiinhalt 1:1 an Stelle des \include ein. Dann kannst du den Durchlauf vielleicht besser nachvollziehen.
Übrigens bei der tocItem- Funktion möchte ich die subtitles der Unterdateien übergeben.
Das dürfte per \fromproperty #'header:subtitle machbar sein (ungetestet), sofern subtitle bereits definiert wurde.
Viele Grüße, Robert
-
Also das sind ja sehr viele Anregungen für mich.
Es ist aber so, wenn man eine Datei vorher includiert, dann hat man den vollständigen Quellcode von der Unterdatei in der Buchdatei enthalten und ruft dann im bookpart -> score {Variable} den Scorepart der Unterdatei auf.
Jetzt muss man aber weiter denken, denn man will ja nicht nur eine Datei includieren. Am Besten man würde das System die Unterdateien in einem Ordner suchen lassen und einfügen oder man schreibt alle Dateilinks rein. Egal wie, auf jeden Fall muss dann jede Datei eine andere Variable für den Score besitzen. Dass heißt, man muss das immer per Hand machen. Daher hatte ich gefragt, ob man wie beim Programmieren eine Zählvariable hochlaufen lässt, um den Scorteil nacheinander einzufügen. Dies aber in verschiedenen Bookparts.
Der Hinweis für \tocItem \markup { \fromproperty #'header:subtitle \null} funktioniert leider nicht. Hierbei wird der Untertitel der Unterdatei, obwohl angegeben, transparent dargestellt (also nicht dargestellt). Die Seitenzahl ist aber zu sehen.
Mit dem unbrauchbar ist es so zu sehen: Wenn ich die Unterdateien so mit Variablen strukturiere, dann kann ich sie anschließend nicht mehr einzeln aufrufen und eine PDF erstellen!
Noch etwas:
Ich dachte, ich könnte den Header-Bereich aus der Unterdatei auch in eine Variable schreiben und einfügen. Zum Beispiel, um die TExtmarken für das Inhaltsverzeichnis zu setzen. DIes funktioniert aber nicht. Leider ist es eher so, dass sich der Header von der Buchdatei und der Unterdatei überschreiben.
-
Ich habe noch eine Frage,
viele Probleme bekam ich eben durch das Einfügen der Unterdatei, weil dort auch ein Header-Bereich notiert war. Die Probleme bekam ich dadurch, dass mit dem Include vor dem \book ein 2. Header für die Buchdatei vorhanden war. Ich habe daraufhin versucht genauso wie mit dem Score ihn in eine Variable zu schreiben und an geeigneter Stelle aufzurufen. Leider bekam ich dann Fehlermeldung, so dass nicht kompiliert worden konnte.
Kann jemand weiter helfen.
Gruß musicmaker
-
Wisst ihr keinen Weg, wie man Unterdateien in ein bookpart einfügt und trotzdem diese Unterdateien von ihrer Struktu nicht beeinflusst?
Ich möchte diese Unterdateien zwar in ein Buch einfügen, aber möchte sie auch einzeln bearbeiten und in eine PDF umwandeln können!!!
Gruß musikmaker
-
ich verstehe zwar nicht ganz was du nicht verstehst, aber vielleicht bringt dieses kleine beispiel etwas!
da ich etwas faul bin, habe ich nicht mehrere stücke geschrieben, sondern das gleiche im buch mehrfach benutzt - nur den titel habe ich geändert.
hdh!
-
Hallo musicmaker,
einige Dinge muss man vielleicht noch mal verdeutlichen, um Lily besser zu verstehen; bei anderen Sachen darf ich dich um etwas mehr Geduld und Experimentierfreude bitten.
(1) Lilypond bzw. die Eingabesyntax ist keine Programmiersprache! Es ist ähnlich wie HTML oder (La)TeX eine Art Seitenbeschreibungssprache. Deine Gedanken sind grundsätzlich nicht verkehrt, aber das „einfach so“ oder „wie bei einer Programmierung“ funktioniert in Lily nur mittels Scheme, ansonsten höchstens ansatzweise. TeX-Dokumente werden auch nicht „programmiert“, sondern „beschrieben“. Internetseiten ebenso.
(2) Es ist demzufolge nur verständlich, dass mangels Programmierspracheneigenschaft solche Konstrukte wie z.B. for- bzw. do-while-Schleifen oder if-then-Abfragen im Markup weder vorgesehen noch eingebaut sind. Arrays sind davon auch betroffen. Das Ziel ist ja gerade, die Eingabe möglichst einfach und menschlich verständlich zu halten. Ich finde das persönlich schon sehr gelungen.
(3) Bitte schau dir in Ruhe meinen Beitrag zur book-bookpart-Struktur an, vor allem die ersten Beispielzeilen, die bereits eindeutige Variablenbezeichner verwenden – das hat seinen guten Grund. Auch ding-dong hilft dir unbeirrt damit weiter!
(4) Zum Ziel führt die strikte Trennung von Musik und Layout. Falls du den entsprechenden Abschnitt in der NR noch nicht gefunden haben solltest: 3.3.2 Different editions from one source (http://lilypond.org/doc/v2.12/Documentation/user/lilypond/Different-editions-from-one-source#Different-editions-from-one-source). Es steht dir damit völlig frei, dutzende \score-Blöcke, \bookpart-Blöcke und sogar ganz andere \book-Blöcke in einem zentralen Dokument zu definieren. Man sollte sich kurz darauf einlassen und versuchen, es zu verstehen, denn dann erscheint es ganz einfach. Für mich ist es eine sehr mächtige Option, aus einer einzigen „Steuerdatei“ eine Gesamtausgabe nebst zugehöriger Einzelausgaben oder Stimmen zu erstellen. Wenn dann mal eine Korrektur fällig ist, kann ich das in der betreffenden Datei mit der Musik ändern und lasse anschließend die „Oberdatei“ mit den Includes durchlaufen, um den kompletten Satz mit der Korrektur zu erhalten.
(5) Es ist derzeit leider nicht möglich, jeden beliebigen Code als Variable zu definieren (ich kann mir denken, was du meinst). Auch in Lily gibt es vordefinierte Variablen, die nicht ohne weiteres umdefiniert werden können. \header, \paper, \score gehören z.B. dazu (okay – das sind eher Umgebungen, aber vielmehr geht es um darin befindliche Variablen wie title, line-width etc.). Seit 2.13.X ist es bspw. möglich, Änderungen durch die \with-Blöcke als Variablen abzuspeichern; vielleicht wird das irgendwann auch auf andere Umgebungen anwendbar! Zumindest käme es deinen Erwartungen sehr entgegen, oder?
Du musst also erstmal mit dem arbeiten, was Lily anbietet. Die meisten Sachen sind über die Jahre wirklich einfach handhabbar geworden, aber ein „kann-man-nicht-einfach“ ist nicht uneingeschränkt machbar.
Viele Grüße, Robert
-
Hallo an euch Beide,
danke erstmal für die zahlreichen Antworten. Ich hatte nicht gewusst, dass Lilypond so einfach wie ich gedacht hatte nicht arbeiten kann. Die Beispieldatei von ding-dong ist OK, so dass man alles mit mehreren Unterdateien zusammenfügen kann oder aber man arbeitet ohne Variablen. Das ist dann Geschmackssache. Ich hatte mir vorgestellt eine Unterdatei zu haben. Diese wollte ich eighentlich nicht weiter verschachteln. Aber Danke an Euch, ihr habt mir erst einmal mehr Einblick in die Arbeitsweise von Lilypond gegeben.
Grüße vom musicmaker
-
hey musicmaker!
lilypond arbeitet so wie es angewiesen wird.
um missverständnisse zu vermeiden: du brauchst nicht unbedingt variablen zu kreieren oder dateien zu verschachteln!
wesentlich ist, dass du dir zurechtlegst, welche struktur du über deine dateien und vor allem über dein musikstück legst - daraus kannst du dann ableiten, wie diese einzubeziehen sind. klar sind dann auch die möglichkeiten deines tools zu berücksichtigen. ich bin aber sicher, dass lilypond jede vernünftige struktur verarbeiten kann!
wie RobUr schon gezeigt hat, braucht es etwas geduld und einarbeitungszeit, um die grundstrukturen zu erlernen. versuch es mal mit einem einfachen beispiel, das du kompilieren kannst und binde es dann in ein book ein! mach das mal ganz ohne variablen! (das ist mindestens so sinnvoll wie variablen zu kreieren, die dann statisch bleiben!)
viel spass!