@c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely @ignore Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322 When revising a translation, copy the HEAD committish of the version that you are working on. See TRANSLATION for details. @end ignore @c \version "2.11.61" @node Working on LilyPond projects @chapter Working on LilyPond projects Dieses Kapitel erklärt, wie bestimmte häufige Probleme zu lösen oder ganz zu vermeiden sind. Wenn Sie schon Programmiererfahrung mitbringen, erscheinen diese Hinweise vielleicht überflüssig, aber es wird dennoch empfohlen, dieses Kapitel zu lesen. @menu * Suggestions for writing LilyPond input files:: * When things don't work:: * Scores and parts:: @end menu @node Suggestions for writing LilyPond input files @section Suggestions for writing LilyPond input files Jetzt sind Sie so weit, größere Stücke mit LilyPond zu schreiben -- nicht nur die kleinen Beispiele aus der Übung, sondern ganze Stücke. Aber wie geht man das am besten an? Solange LilyPond Ihre Dateien versteht und die Noten so setzt, wie Sie das wollen, spielt es eigentlich keine Rolle, wie Ihre Dateien aussehen. Es gibt aber trotzdem ein paar Dinge, die man beim Schreiben von LilyPond-Code berücksichtigen sollte. @itemize @bullet @item Was ist, wenn Sie einen Fehler machen? Die Struktur einer LilyPond-Datei kann es erleichtern (oder erschweren), bestimmte Fehler zu finden. @item Was ist, wenn Sie Ihre Dateien mit jemandem austauschen wollen? Oder Ihre Dateien nach einige Jahren noch einmal überarbeiten wollen? Manche LilyPond-Dateien versteht man auf den ersten Blick, über anderen muss man eine Stunde grübeln, um die Struktur zu ahnen. @item Was ist, wenn sie Ihre Dateien auf eine neuere LilyPond-Version aktualisieren wollen? Die Syntax der Eingabesprache verändert sich allmählich mit Verbesserungen im Programm. Die meisten Veränderungen können automatisch durch @code{convert-ly} gelöst werden, aber bestimmte Änderungen brauchen Handarbeit. LilyPond-Dateien können strukturiert werden, damit sie einfacher aktualisierbar sind. @end itemize @menu * General suggestions:: * Typesetting existing music:: * Large projects:: * Saving typing with variables and functions:: * Style sheets:: @end menu @node General suggestions @subsection General suggestions Hier einige Vorschläge, wie Sie Probleme vermeiden oder lösen können: @itemize @bullet @item @strong{Schreiben Sie immer mit @code{\version} die Versionsnummer in jede Datei}. Beachten Sie, dass in allen Vorlagen die Versionsnummer @code{\version "2.11.61"} eingetragen ist. Es empfiehlt sich, in alle Dateien, unabhängig von ihrer Größe, den @code{\version}-Befehl einzufügen. Persönliche Erfahrung hat gezeigt, dass es ziemlich frustrierend sein kann zu erinnern, welche Programmversion man etwa vor einem Jahr verwendet hat. Auch @code{convert-ly} benötigt die Versionsnummer. @item @strong{Benutzen Sie Überprüfungen}: @ruser{Octave checks}, und @ruser{Bar and bar number checks}. Wenn Sie hier und da diese Überprüfungen einfügen, finden Sie einen möglichen Fehler weit schneller. Wie oft aber ist @qq{hier und da}? Das hängt von der Komplexität der Musik ab. ei einfachen Stücken reicht es vielleicht ein- oder zweimal, in sehr komplexer Musik sollte man sie vielleicht in jeden Takt einfügen. @item @strong{Ein Takt pro Textzeile}. Wenn irgendetwas kompliziertes vorkommt, entweder in der Musik selber oder in der Anpassung der Ausgabe, empfiehlt es sich oft, nur einen Takt pro Zeile zu schreiben. Bildschirmplatz zu sparen, indem Sie acht Takte in eine Zeile zwängen, hilft nicht weiter, wenn Sie ihre Datei @qq{debuggen} müssen. @item @strong{Kommentieren Sie ihre Dateien}. Benutzen Sie entweder Taktnummern (in regelmäßigen Abständen) oder Verweise auf musikalische Themen (@qq{Zweites Thema in den Geigen}, @qq{vierte Variation} usw.). Sie brauchen diese Kommentare vielleicht noch nicht, wenn Sie das Stück notieren, aber spätestens wenn Sie nach ein paar Jahren etwas verändern wollen oder Sie den Quelltext an einen Freund weitergeben wollen, ist es weitaus komplizierter, die Dateistruktur ohne Kommentare zu verstehen, als wenn Sie sie rechtzeitig eingefügt hätten. @item @strong{Schreiben Sie Klammern mit Einrückung}. Viele Probleme entstehen durch ungerade Anzahl von @code{@{} and @code{@}}-Klammern. @item @strong{Schreiben Sie Tondauerangaben} am Anfang von Abschnitten und Bezeichnern. Wenn Sie beispielsweise @code{c4 d e} am Anfang eines Abschnittes schreiben, ersparen Sie sich viele Probleme, wenn Sie ihre Musik eines Tages umarrangieren wollen. @item @strong{Trennen Sie Einstellungen} von den eigentlichen Noten. Siehe auch @ref{Saving typing with variables and functions} und @ref{Style sheets}. @end itemize @node Typesetting existing music @subsection Typesetting existing music Wenn Sie Musik aus einer fertigen Partitur kopieren (z. B. die LilyPond-Eingabe einer gedruckten Partitur): @itemize @bullet @item Schreiben Sie ein System ihrer Quelle nach dem anderen (aber trotzdem nur einen Takt pro Textzeile) und überprüfen Sie jedes System, nachdem Sie es fertig kopiert haben. Mit dem @code{showLastLength}- oder @code{showFirstLenght}-Befehl können Sie den Übersetzungsprozess beschleunigen. Siehe auch @ruser{Skipping corrected music}. @item Definieren Sie @code{mBreak = @{ \break @}} und schreiben Sie @code{\mBreak} in der Quelldatei immer dann, wenn im Manuskript ein Zeilenumbruch vorkommt. Das macht es einfacher, die gesetzte Zeile mit den ursprünglichen Noten zu vergleichen. Wenn Sie die Partitur fertig gestellt haben, könne Sie @code{mBreak = @{ @}}, also leer definieren, um diese manuellen Zeilenumbrüche zu entfernen. Damit kann dann LilyPond selber entscheiden, wohin es passende Zeilenumbrüche platziert. @end itemize @node Large projects @subsection Large projects Besonders wenn Sie an größeren Projekten arbeiten, ist es unumgänglich, dass Sie ihre LilyPond-Dateien klar strukturieren. @itemize @bullet @item @strong{Verwenden Sie Variablen für jede Stimme}, innerhalb der Definition sollte so wenig Struktur wie möglich sein. Die Struktur des @code{\score}-Abschnittes verändert sich am ehesten, während die @code{violine}-Definition sich wahrscheinlich mit einer neuen Programmversion nicht verändern wird. @example violine = \relative c'' @{ g4 c'8. e16 @} ... \score @{ \new GrandStaff @{ \new Staff @{ \violine @} @} @} @end example @item @strong{Trennen Sie Einstellungen von den Noten}. Diese Empfehlung wurde schon im Abschnitt @ref{General suggestions} gegeben, aber für große Projekte ist es unumgänglich. Muss z. B. die Definition für @code{fdannp} verändert werden, so braucht man es nur einmal vorzunehmen und die Noten in der Geigenstimme, @code{violin}, bleiben unberührt. @example fdannp = _\markup@{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} violin = \relative c'' @{ g4\fdannp c'8. e16 @} @end example @end itemize @node Saving typing with variables and functions @subsection Saving typing with variables and functions @cindex Variable @cindex Bezeichner Bis jetzt haben Sie immer etwa solche Noten gesehen: @lilypond[quote,verbatim,ragged-right] hornNotes = \relative c'' { c4 b dis c } \score { { \hornNotes } } @end lilypond Das könnte auch nützlich in Minimal-Music sein: @lilypond[quote,verbatim,ragged-right] fragmentA = \relative c'' { a4 a8. b16 } fragmentB = \relative c'' { a8. gis16 ees4 } violin = \new Staff { \fragmentA \fragmentA \fragmentB \fragmentA } \score { { \violin } } @end lilypond Sie können diese Bezeichner oder Variablen aber auch für (eigene) Einstellungen verwenden: @lilypond[quote,verbatim,ragged-right] dolce = \markup{ \italic \bold dolce } padText = { \once \override TextScript #'padding = #5.0 } fthenp=_\markup{ \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } violin = \relative c'' { \repeat volta 2 { c4._\dolce b8 a8 g a b | \padText c4.^"hi there!" d8 e' f g d | c,4.\fthenp b8 c4 c-. | } } \score { { \violin } \layout{ragged-right=##t} } @end lilypond Die Variablen haben in diesem Beispiel deutlich die Tipparbeit erleichtert. Aber es lohnt sich, sie zu einzusetzen, auch wenn man sie nur einmal anwendet, denn sie vereinfachen die Struktur. Hier ist das vorangegangene Beispiel ohne Variablen. Es ist sehr viel komplizierter zu lesen, besonders die letzte Zeile. @example violin = \relative c'' @{ \repeat volta 2 @{ c4._\markup@{ \italic \bold dolce @} b8 a8 g a b | \once \override TextScript #'padding = #5.0 c4.^"hi there!" d8 e' f g d | c,4.\markup@{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} b8 c4 c-. | @} @} @end example @c TODO Replace the following with a better example -td @c Skylining handles this correctly without padText Bis jetzt wurde nur statische Substitution vorgestellt -- wenn LilyPond den Befehl @code{\padText} findet, wird er ersetzt durch durch unsere vorherige Definition (alles, was nach dem @code{padtext =} kommt). LilyPond kennt aber auch nicht-statische Substitutionen (man kann sie sich als Funktionen vorstellen). @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function (parser location padding) (number?) #{ \once \override TextScript #'padding = #$padding #}) \relative c''' { c4^"piu mosso" b a b \padText #1.8 c4^"piu mosso" d e f \padText #2.6 c4^"piu mosso" fis a g } @end lilypond Die Benutzung von Variablen hilft auch, viele Schreibarbeit zu vermeiden, wenn die Eingabesyntax von LilyPond sich verändert (siehe auch @ref{Updating old files}). Wenn nur eine einzige Definition (etwa @code{\dolce}) für alle Dateien verwendet wird (vgl. @ref{Style sheets}), muss nur diese einzige Definition verändert werden, wenn sich die Syntax ändert. Alle Verwendungen des Befehles beziehen sich dann auf die neue Definition. @node Style sheets @subsection Style sheets Die Ausgabe, die LilyPond erstellt, kann sehr stark modifiziert werden, siehe @ref{Tweaking output} für Einzelheiten. Aber wie kann man diese Änderungen auf eine ganze Serie von Dateien anwenden? Oder die Einstellungen von den Noten trennen? Das Verfahren ist ziemlich einfach. Hier ist ein Beispiel. Es ist nicht schlimm, wenn Sie nicht auf Anhieb die Abschnitte mit den ganzen @code{#()} verstehen. Das wird im Kapitel @ref{Advanced tweaks with Scheme} erklärt. @lilypond[quote,verbatim,ragged-right] mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) #:line(#:dynamic "mp" #:text #:italic "dolce" ))) tempoMark = #(define-music-function (parser location markp) (string?) #{ \once \override Score . RehearsalMark #'self-alignment-X = #left \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) \mark \markup { \bold $markp } #}) \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 \tempoMark "Poco piu mosso" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 } @end lilypond Es treten einige Probleme mit überlappenden Symbolen auf. Sie werden beseitigt mit den Tricks aus dem Kapitel @ref{Moving objects}. Aber auch die @code{mpdolce} und @code{tempoMark}-Definitionen können verbessert werden. Sie produzieren das Ergebnis, das gewünscht ist, aber es wäre schön, sie auch in anderen Stücken verwenden zu können. Man könnte sie natürlich einfach kopieren und in die anderen Dateien einfügen, aber das ist lästig. Die Definitionen verbleiben auch in der Notendatei und diese @code{#()} sehen nicht wirklich schön aus. Sie sollen in einer anderen Datei versteckt werden: @example %%% speichern in einer Datei "definitions.ly" mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) #:line(#:dynamic "mp" #:text #:italic "dolce" ))) tempoMark = #(define-music-function (parser location markp) (string?) #@{ \once \override Score . RehearsalMark #'self-alignment-X = #left \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) \mark \markup @{ \bold $markp @} #@}) @end example Jetzt muss natürlich noch die Notendatei angepasst werden (gespeichert unter dem Namen @file{"music.ly"}). @c We have to do this awkward example/lilypond-non-verbatim @c because we can't do the \include stuff in the manual. @example \include "definitions.ly" \relative c'' @{ \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 \once \override Score.RehearsalMark #'padding = #2.0 \tempoMark "Poco piu mosso" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 @} @end example @lilypond[quote,ragged-right] mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) #:line(#:dynamic "mp" #:text #:italic "dolce" ))) tempoMark = #(define-music-function (parser location markp) (string?) #{ \once \override Score . RehearsalMark #'self-alignment-X = #left \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) \mark \markup { \bold $markp } #}) \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 \once \override Score.RehearsalMark #'padding = #2.0 \tempoMark "Poco piu mosso" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 } @end lilypond Das sieht schon besser aus, aber es sind noch einige Verbesserungen möglich. Das Glissando ist schwer zu sehen, also soll es etwas dicker erscheinen und dichter an den Notenköpfen gesetzt werden. Das Metronom-Zeichen soll über dem Schlüssel erscheinen, nicht über der ersten Note. Und schließlich kann unser Kompositionsprofessor @qq{C}-Taktangaben überhaupt nicht leiden, also müssen sie in @qq{4/4} verändert werden. Diese Veränderungen sollten Sie aber nicht in der @file{music.ly}-Datei vornehmen. Ersetzen Sie die @file{definitions.ly}-Datei hiermit: @example %%% definitions.ly mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) #:line( #:dynamic "mp" #:text #:italic "dolce" ))) tempoMark = #(define-music-function (parser location markp) (string?) #@{ \once \override Score . RehearsalMark #'self-alignment-X = #left \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) \mark \markup @{ \bold $markp @} #@}) \layout@{ \context @{ \Score \override MetronomeMark #'extra-offset = #'(-9 . 0) \override MetronomeMark #'padding = #'3 @} \context @{ \Staff \override TimeSignature #'style = #'numbered @} \context @{ \Voice \override Glissando #'thickness = #3 \override Glissando #'gap = #0.1 @} @} @end example @lilypond[quote,ragged-right] mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) #:line( #:dynamic "mp" #:text #:italic "dolce" ))) tempoMark = #(define-music-function (parser location markp) (string?) #{ \once \override Score . RehearsalMark #'self-alignment-X = #left \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) \mark \markup { \bold $markp } #}) \layout{ \context { \Score \override MetronomeMark #'extra-offset = #'(-9 . 0) \override MetronomeMark #'padding = #'3 } \context { \Staff \override TimeSignature #'style = #'numbered } \context { \Voice \override Glissando #'thickness = #3 \override Glissando #'gap = #0.1 } } \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 \once \override Score.RehearsalMark #'padding = #2.0 \tempoMark "Poco piu mosso" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 } @end lilypond Das sieht schon besser aus! Aber angenommen Sie möchten dieses Stück jetzt veröffentlichen. Ihr Kompositionsprofessor mag die @qq{C}-Taktangaben nicht, aber Sie finden sie irgendwie schöner. Also kopieren Sie die Datei @file{definitions.ly} nach @file{web-publish.ly} und verändern diese. Weil die Noten in einer PDF-Datei auf dem Bildschirm angezeigt werden sollen, bietet es sich auch an, die gesamte Ausgabe zu vergrößern. @example %%% definitions.ly mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) #:line( #:dynamic "mp" #:text #:italic "dolce" ))) tempoMark = #(define-music-function (parser location markp) (string?) #@{ \once \override Score . RehearsalMark #'self-alignment-X = #left \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) \mark \markup @{ \bold $markp @} #@}) #(set-global-staff-size 23) \layout@{ \context @{ \Score \override MetronomeMark #'extra-offset = #'(-9 . 0) \override MetronomeMark #'padding = #'3 @} \context @{ \Staff @} \context @{ \Voice \override Glissando #'thickness = #3 \override Glissando #'gap = #0.1 @} @} @end example @lilypond[quote,ragged-right] mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) #:line( #:dynamic "mp" #:text #:italic "dolce" ))) tempoMark = #(define-music-function (parser location markp) (string?) #{ \once \override Score . RehearsalMark #'self-alignment-X = #left \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) \mark \markup { \bold $markp } #}) #(set-global-staff-size 23) \layout{ \context { \Score \override MetronomeMark #'extra-offset = #'(-9 . 0) \override MetronomeMark #'padding = #'3 } \context { \Voice \override Glissando #'thickness = #3 \override Glissando #'gap = #0.1 } } \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 \once \override Score.RehearsalMark #'padding = #2.0 \tempoMark "Poco piu mosso" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 } @end lilypond In der Notendatei muss jetzt nur noch @code{\include "definitions.ly"} durch @code{\include "web-publish.ly"} ausgetauscht werden. Das könnte man natürlich noch weiter vereinfachen. Also eine Datei @file{definitions.ly}, die nur die Definitionen von @code{mpdolce} und @code{tempoMark} enthält, eine Datei @file{web-publish.ly}, die alle die Änderungen für den @code{\layout}-Abschnitt enthält und eine Datei @file{university.ly} für eine Ausgabe, die den Wünschen des Professors entspricht. Der Anfang der @file{music.ly}-Datei würde dann so aussehen: @example \include "definitions.ly" %%% Nur eine der beiden Zeilen auskommentieren! \include "web-publish.ly" %\include "university.ly" @end example Durch diese Herangehensweise kann auch bei der Erstellung von nur einer Ausgabeversion Arbeit gespart werden. Ich benutze ein halbes Dutzend verschiedener Stilvorlagen für meine Projekte. Jede Notationsdatei fängt an mit @code{\include "../global.ly"}, welches folgenden Inhalt hat: @example %%% global.ly \version "2.11.61" #(ly:set-option 'point-and-click #f) \include "../init/init-defs.ly" \include "../init/init-layout.ly" \include "../init/init-headers.ly" \include "../init/init-paper.ly" @end example @node When things don't work @section When things don't work @menu * Updating old files:: * Troubleshooting (taking it all apart):: * Minimal examples:: @end menu @node Updating old files @subsection Updating old files Die Syntax von LilyPond verändert sich ab und zu. Wenn LilyPond besser wird, muss auch die Syntax (Eingabesprache) entsprechend angepasst werden. Teilweise machen diese Veränderungen die Eingabesprache einfacher lesbar, teilweise dienen sie dazu, neue Eigenschaften des Programmes benutzbar zu machen. LilyPond stellt ein Programm bereit, das Aktualisierungen vereinfacht: @code{convert-ly}. Einzelheiten zur Programmbenutzung finden sich in @rprogram{Updating files with convert-ly}. Leider kann @code{convert-ly} nicht alle Veränderungen der Syntax berücksichtigen. Hier werden einfache @qq{Suchen und Ersetzen}-Veränderungen vorgenommen (wie etwa @code{raggedright} zu @code{ragged-right}), aber einige Veränderungen sind zu kompliziert. Die Syntax-Veränderungen, die das Programm nicht berücksichtigt, sind im Kapitel @rprogram{Updating files with convert-ly} aufgelistet. Zum Beispiel wurden in LilyPond 2.4 und früheren Versionen Akzente und Umlaute mit LaTeX-Befehlen eingegeben, ein @qq{No\"el} etwa ergäbe das französische Wort für Weihnachten. In LilyPond 2.6 und höher müssen diese Sonderzeichen direkt als utf-8-Zeichen eingegeben werden, in diesem Fall also @qq{ë}. @code{convert-ly} kann nicht alle dieser LaTeX-Befehle verändern, das muss manuell vorgenommen werden. @node Troubleshooting (taking it all apart) @subsection Troubleshooting (taking it all apart) Früher oder später werden Sie in die Lage kommen, dass LilyPond Ihre Datei nicht kompilieren will. Die Information, die LilyPond während der Übersetzung gibt, können Ihnen helfen, den Fehler zu finden, aber in vielen Fällen müssen Sie nach der Fehlerquelle auf die Suche gehen. Die besten Hilfsmittel sind in diesem Fall das Zeilen- und Blockkommentar (angezeigt durch @code{%} bzw. @code{%@{ ... %@}}). Wenn Sie nicht bestimmen können, wo sich das Problem befindet, beginnen Sie damit, große Teile des Quelltextes auszukommentieren. Nachdem Sie einen Teil auskommentiert haben, versuchen Sie, die Datei erneut zu übersetzen. Wenn es jetzt funktioniert, muss sich das Problem innerhalb der Kommentare befinden. Wenn es nicht funktioniert, müssen Sie weitere Teile auskommentieren bis sie eine Version haben, die funktioniert. In Extremfällen bleibt nur noch solch ein Beispiel übrig: @example \score @{ << % \melody % \harmony % \bass >> \layout@{@} @} @end example @noindent (also eine Datei ohne Noten). Geben Sie nicht auf, wenn das vorkommen sollte. Nehmen Sie das Kommentarzeichen von einem Teil wieder weg, sagen wir der Bassstimme, und schauen Sie, ob es funktioniert. Wenn nicht, dann kommentieren Sie die gesamte Bassstimme aus, aber nicht den @code{\bass}-Befehl in dem @code{\score}-Abschnitt: @example bass = \relative c' @{ %@{ c4 c c c d d d d %@} @} @end example Jetzt beginnen Sie damit, langsam Stück für Stück der Bassstimme wieder hineinzunehmen, bis Sie die problematische Zeile finden. Eine andere nützliche Technik zur Problemlösung ist es, @ref{Minimal examples} zu konstruieren. @node Minimal examples @subsection Minimal examples Ein Minimalbeispiel ist eine Beispieldatei, die so klein wie möglich ist. Diese Beispiele sind sehr viel einfacher zu verstehen als die langen Originaldateien. Minimalbeispiele werden benutzt, um @itemize @item Fehlerberichte zu erstellen, @item eine Hilfeanfrage an die E-Mail-Liste zu schicken, @item Ein Beispiel zur @uref{http://lsr@/.dsi@/.unimi@/.it/,LilyPond Schnipselsammlung} hinzuzufügen. @end itemize Um ein Beispiel zu konstruieren, das so klein wie möglich ist, gibt es eine einfache Regel: Alles nicht Notwendige entfernen. Wenn Sie unnötige Teile einer Datei entfernen, bietet es sich an, sie auszukommentieren und nicht gleich zu löschen. Auf diese Weise können Sie eine Zeile leicht wieder mit aufnehmen, sollten Sie sie doch brauchen, anstatt sie von Anfang an neu zu schreiben. Es gibt zwei Ausnahmen dieser @qq{So klein wie möglich}-Regel: @itemize @item Fügen Sie immer einen @code{\version}Befehl ein. @item Wenn es möglich ist, benutzen Sie @code{\paper@{ ragged-right = ##t @}} am Beginn des Beispiels. @end itemize Der Sinn der Minimalbeispiele ist, dass sie einfach lesbar sind: @itemize @item Vermeiden Sie es, komplizierte Noten, Schlüssel oder Taktangaben zu verwenden, es sei denn, Sie wollen genau an diesen Elementen etwas demonstrieren. @item Benutzen Sie keine @code{\override}-Befehle, wenn sie nicht der Zweck des Beispieles sind. @end itemize @node Scores and parts @section Scores and parts Orchesternoten werden alle zweimal gesetzt. Erstens als Stimmen für die Musiker, und dann als große Partitur für den Dirigenten. Mit Variablen kann hier doppelte Arbeit erspart werden. Die Musik muss nur einmal eingegeben werden und wird in einer Variable abgelegt. Der Inhalt dieser Variable wird dann benutzt, um sowohl die Stimme als auch die Partitur zu erstellen. Es bietet sich an, die Noten in eigenen Dateien zu speichern. Sagen wir beispielsweise, dass in der Datei @file{Horn-Noten.ly} die folgenden Noten eines Duetts für Horn und Fagott gespeichert sind: @example HornNoten = \relative c @{ \time 2/4 r4 f8 a cis4 f e d @} @end example @noindent Daraus wird dann eine eigene Stimme gemacht, indem folgende Datei erstellt wird: @example \include "Horn-Noten.ly" \header @{ instrument = "Horn in F" @} @{ \transpose f c' \HornNoten @} @end example Die Zeile @example \include "Horn-Noten.ly" @end example @noindent setzt den Inhalt der Datei @file{Horn-Noten.ly} an die Stelle des Befehls in die aktuelle Datei. Damit besteht also eine Definition für @code{HornNoten}, so dass die Variable verwendet werden kann. Der Befehl @code{\transpose f@tie{}c'} zeigt an, dass das Argument, also @code{\HornNoten}, um eine Quinte nach oben transponiert wird. Klingendes @q{f} wird also als @code{c'} notiert. Das entspricht der Notation eines Waldhorns in F. Die Transposition zeigt die folgende Ausgabe: @lilypond[quote,ragged-right] \transpose f c' \relative c { \time 2/4 r4 f8 a cis4 f e d } @end lilypond In der Musik für mehrere Instrumente kommt es oft vor, dass eine Stimme für mehrere Takte nicht spielt. Das wird mit einer besonderen Pause angezeigt, dem Pausenzeichen für mehrere Takte (engl. multi-measure rest). Sie wird mit dem @emph{großen} Buchstaben @samp{R} eingegeben, gefolgt von einer Dauer (@code{1}@tie{}für eine Ganze, @code{2}@tie{} für eine Halbe usw.). Indem man die Dauer multipliziert, können längere Pausen erstellt werden. Z. B. dauert diese Pause drei Takte eines 2/4-Taktes: @example R2*3 @end example Wenn die Stimme gedruckt wird, müssen diese Pausen zusammengezogen werden. Das wird durch eine Variable erreicht: @example \set Score.skipBars = ##t @end example @noindent Dieser Befehl setzt die Eigenschaft des @code{skipBars} (@qq{überspringe Takte}) auf wahr (@code{##t}). Wenn diese Option und die Pause zu der Musik des Beispiels gesetzt wird, erhält man folgendes Ergebnis: @lilypond[quote,ragged-right] \transpose f c' \relative c { \time 2/4 \set Score.skipBars = ##t R2*3 r4 f8 a cis4 f e d } @end lilypond Die Partitur wird erstellt, indem alle Noten zusammengesetzt werden. Angenommen, die andere Stimme trägt den Namen @code{FagottNoten} und ist in der Datei @file{Fagott-Noten.ly} gespeichert. Die Partitur sieht dann folgendermaßen aus: @example \include "Fagott-Noten.ly" \include "Horn-Noten.ly" << \new Staff \HornNoten \new Staff \FagottNoten >> @end example @noindent Und mit LilyPond übersetzt: @lilypond[quote,ragged-right] \relative c << \new Staff { \time 2/4 R2*3 r4 f8 a cis4 f e d } \new Staff { \clef bass r4 d,8 f | gis4 c | b bes | a8 e f4 | g d | gis f } >> @end lilypond