| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
@translationof Further tweaking
| 4.7.1 Andere Benutzung von Optimierungen | ||
| 4.7.2 Variablen für Layout Anpassungen einsetzen | ||
| 4.7.3 Formatvorlagen | ||
| 4.7.4 Mehr Information | ||
| 4.7.5 Fortgeschrittene Optimierungen mit Scheme |
| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
@translationof Other uses for tweaks
| Noten zwischen unterschiedlichen Stimmen überbinden | ||
| Eine Fermate in MIDI simulieren |
| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
@translationof Tying notes across voices
Das nächste Beispiel zeigt, wie man Noten von verschiedenen Stimmen miteinander verknüpfen kann, indem man Bindebögen für Überbindungen benutzt. Normalerweise können nur zwei Noten der gleichen Stimme über gebunden werden. Wenn man zwei Stimmen benutzt, wobei die überbundenen Noten sich in der selben befinden,
und dann den ersten Hals nach oben unsichtbar macht, sieht es so aus, als ob die Überbindung zwischen den Stimmen stattfindet:
<< { \once \omit Stem \once \omit Flag b'8~ 8\noBeam } \\ { b'8[ g'] } >>
Handbuch zum Lernen:
Der \once-Präfix,
Die stencil-Eigenschaft (Matrize).
| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
@translationof Simulating a fermata in MIDI
Für Objekte außerhalb des Notensystems ist es normalerweise
besser, die stencil-Eigenschaft anstelle der
transparent-Eigenschaft zu verändern, wenn man
sie vom fertigen Notensatz entfernen will. Indem die
stencil-Eigenschaft auf falsch (#f) gesetzt
wird, wird das entsprechende Objekt vollständig entfernt.
Das bedeutet, dass es die Positionierung der anderen Objekte
nicht beeinflusst.
Auf diese Art kann etwa das Tempo geändert werden, damit
in der MIDI-Ausgabe eine Fermate zu hören ist, ohne dass
im Notensatz etwas von diesen Tempoänderungen zu sehen
ist. Die Metronombezeichnung soll auch nicht die Position
von Text an der gleichen Stelle oder die Abstände zwischen
zwei Systemen beeinflussen. Darum ist es am besten,
stencil auf #f zu setzen. Im Beispiel wird
der Unterschied zwischen einem unsichtbaren Objekt und
einem entfernten Objekt gezeigt:
\score { \relative { % Visible tempo marking \tempo 4=120 a'4 a a \once \hide Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 a4\fermata | % New tempo for next section \tempo 4=100 a4 a a a | } \layout { } \midi { } }
\score { \relative { % Visible tempo marking \tempo 4=120 a'4 a a \once \omit Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 a4\fermata | % New tempo for next section \tempo 4=100 a4 a a a | } \layout { } \midi { } }
Mit beiden Methoden wird die Tempobezeichnung entfernt, mit
der die Fermate verlängert wird, und beide beeinflussen die
MIDI-Ausgabe wie gewünscht. Die unsichtbare Metronombezeichnung
schiebt aber die folgende Bezeichnung in die Höhe, während
das im zweiten Beispiel, in dem der stencil entfernt
wurde, nicht passiert.
Glossar: (music-glossary)system in Abschnitt ‘system’ in Glossar.
| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
@translationof Using variables for layout adjustments
\override-Befehle sind oft lang und mühsam zu
tippen, und sie müssen immer absolut richtig sein. Wenn
derselbe Befehl mehrere Male benutzt werden muss, lohnt
es sich oft schon, eine Variable zu definieren, in der er
sich befindet.
Als Beispiel sollen einige Worte im
Gesangstext fett und kursiv hervorgehoben werden.
Die Befehle \italic und \bold funktionieren
im Gesangstext-Kontext nur, wenn sie gleichzeitig mit den Wörtern,
auf die sie angewendet werden sollen, zusätzlich
in eine \markup-Umgebung eingeschlossen
werden. Durch diese Einbettung können einzelne Wörter nicht
einfach zu einer Variable umgeformt werden. Als
Alternative versuchen wir, einen Befehl mit
\override und \revert zu konstruieren.
\override Lyrics.LyricText.font-shape = #'italic \override Lyrics.LyricText.font-series = #'bold \revert Lyrics.LyricText.font-shape \revert Lyrics.LyricText.font-series |
Das wäre natürlich noch viel mühsamer, wenn viele Wörter eine
Hervorhebung benötigen. Anstelle dieser Befehlsketten können
wir jedoch zwei Variablen definieren. Mit ihnen und dem entsprechenden
Wort in geschweiften Klammern erreichen wir den gewünschten Effekt.
Ein weiterer Vorteil ist, dass in diesem Fall die Leerzeichen um die
Punkte herum nicht benötigt werden, weil sie nicht innerhalb des
lyricmode-Kontextes interpretiert werden. Hier ein Beispiel;
die Bezeichnungen können natürlich auch kürzer sein,
um noch weniger schreiben zu müssen:
emphasize = { \override Lyrics.LyricText.font-shape = #'italic \override Lyrics.LyricText.font-series = #'bold } normal = { \revert Lyrics.LyricText.font-shape \revert Lyrics.LyricText.font-series } global = { \key c \major \time 4/4 \partial 4 } SopranoMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyricmode { E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, } VerseTwo = \lyricmode { O | \once \emphasize Christ, whose voice the | wa -- ters heard, } VerseThree = \lyricmode { O | \emphasize Ho -- ly Spi -- rit, | \normal who didst brood } VerseFour = \lyricmode { O | \emphasize Tri -- ni -- ty \normal of | love and pow'r } \score { \new ChoirStaff << \new Staff << \clef "treble" \new Voice = "Soprano" { \voiceOne \global \SopranoMusic } \new Voice = "Alto" { \voiceTwo \AltoMusic } \new Lyrics \lyricsto "Soprano" { \VerseOne } \new Lyrics \lyricsto "Soprano" { \VerseTwo } \new Lyrics \lyricsto "Soprano" { \VerseThree } \new Lyrics \lyricsto "Soprano" { \VerseFour } >> \new Staff << \clef "bass" \new Voice = "Tenor" { \voiceOne \TenorMusic } \new Voice = "Bass" { \voiceTwo \BassMusic } >> >> }
| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
@translationof Style sheets
Die Ausgabe von LilyPond kann sehr stark verändert werden, siehe zu Einzelheiten Die Ausgabe verbessern. Aber was ist, wenn man mehrere Eingabedateien hat, die die gleichen Anpassungen erfahren sollen? Oder wenn Sie einfach nur die Anpassungen von der eigentlichen Musik trennen wollen? Das lässt sich recht einfach erreichen.
Schauen wir uns ein Beispiel an. Sorgen Sie sich nicht, wenn Sie
den Abschnitt mit den vielen #() nicht verstehen. Das wird
in Fortgeschrittene Optimierungen mit Scheme erklärt.
mpdolce = \tweak self-alignment-X #-0.6 #(make-dynamic-script #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) inst = #(define-music-function (string) (string?) #{ <>^\markup \bold \box #string #}) \relative { \tempo 4=50 a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 | }
Vielleicht können die Definitionen von mpdolce und inst noch
etwas verbessert werden.
Sie erstellen die gewünschte Ausgabe, aber wir wollen sie vielleicht
auch in einem anderen Stück verwenden. Wir könnten sie immer wieder
kopieren und oben in jedes Stück einfügen, aber das ist sehr aufwändig.
Dadurch werden die Definitionen auch in der Eingabedatei belassen,
und ich finde diese #() irgendwie hässlich. Verstecken
wir sie also:
%%% in Datei "definitions.ily" speichern
mpdolce =
\tweak self-alignment-X #-0.6
#(make-dynamic-script
#{ \markup { \dynamic mp \normal-text \italic \bold dolce } #})
inst =
#(define-music-function
(string)
(string?)
#{ <>^\markup \bold \box #string #})
|
Diese Datei wir mit dem \include-Befehl ziemlich weit oben
in der Datei eingefügt. (Die Erweiterung ‘.ily’ wird benutzt,
um diese Datei als eine eingefügte, inkludierte zu kennzeichnen, die
man nicht alleinstehend kompilieren kann). Jetzt ändern wir die
Noten (in der Datei ‘music.ly’).
\include "definitions.ily"
\relative {
\tempo 4=50
a'4.\mpdolce d8 cis4--\glissando a |
b4 bes a2 |
\inst "Clarinet"
cis4.\< d8 e4 fis |
g8(\! fis)-. e( d)-. cis2 |
}
|
Das sieht schon besser aus, aber einige Änderungen könnten wir noch vornehmen. Das Glissando ist kaum sichtbar, machen wir es also etwas dicker und näher an den Notenkopf. Die Metronombezeichnung soll über dem Schlüssel stehen, anstatt über der ersten Note. Und schließlich mag mein Kompositionsprofessor keine „C“-Taktangaben, das ändern wir also in „4/4“.
Ändern Sie jetzt jedoch nicht ‘music.ly’. Ändern Sie die ‘definitions.ily’ mit dem Folgenden:
%%% definitions.ily
mpdolce =
\tweak self-alignment-X #-0.6
#(make-dynamic-script
#{ \markup { \dynamic mp \normal-text \italic \bold dolce } #})
inst =
#(define-music-function
(string)
(string?)
#{ <>^\markup \bold \box #string #})
\layout{
\context {
\Score
\override MetronomeMark.extra-offset = #'(-5 . 0)
\override MetronomeMark.padding = #'3
}
\context {
\Staff
\override TimeSignature.style = #'numbered
}
\context {
\Voice
\override Glissando.thickness = #3
\override Glissando.gap = #0.1
}
}
|
Das sieht besser aus! Aber nehmen wir an, Ich will dieses Stück publizieren. Mein Professor mag die „C“-Taktangabe nicht, mir gefällt sie aber sehr gut. Kopieren wir also die Datei ‘definitions.ily’ nach ‘web-publish.ily’ und verändern diese. Weil die Noten als PDF auf dem Monitor dargestellt werden sollen, wird auch die Notengröße global geändert.
%%% web-publish.ily
mpdolce =
\tweak self-alignment-X #-0.6
#(make-dynamic-script
#{ \markup { \dynamic mp \normal-text \italic \bold dolce } #})
inst =
#(define-music-function
(string)
(string?)
#{ <>^\markup \bold \box #string #})
#(set-global-staff-size 23)
\layout{
\context {
\Score
\override MetronomeMark.extra-offset = #'(-5 . 0)
\override MetronomeMark.padding = #'3
}
\context {
\Staff
}
\context {
\Voice
\override Glissando.thickness = #3
\override Glissando.gap = #0.1
}
}
|
In der Eingabedatei muss jetzt nur noch die Zeile
\include "definitions.ily" mit
\include "web-publish.ily" ersetzt werden. Das könnte
man natürlich noch besser machen. Es könnte eine Datei
‘definitions.ily’ mit allen Definitionen (also
mpdolce und inst) geben, eine Datei
‘web-publish.ily’, die nur die \layout-Veränderung
enthält und eine Datei ‘university.ily’, die nur die
Prozedur enthält, die Ausgabe meinem Professor angenehm zu machen.
Der Anfang von ‘music.ly’ würde dann folgendermaßen aussehen:
\include "definitions.ily" %%% nur eine der zwei Zeilen auskommentieren! \include "web-publish.ily" %\include "university.ily" |
Diese Herangehensweise kann auch schon nützlich sein, wenn man
nur ein paar Stimmen schreiben will. Ich habe eine ganze Anzahl
an „Formatvorlagen“ (engl. Stylesheets) für meine Projekte. Ich fange jede Datei mit
der Zeile \include "../global.ily" an, die etwa folgendes
einbindet:
%%% global.ily \version "2.21.3" #(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" |
| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
@translationof Other sources of information
Die Programmreferenz enthält sehr viel Information über LilyPond, aber noch mehr Information findet sich in den internen LilyPond-Dateien. Um sie erforschen zu können, müssen Sie erst das richtige Verzeichnis auf Ihrem System finden. Die Position hängt a) davon ab, ob Ihre LilyPond-Installation mit der vorkompilierten Version von der LilyPond-Internetseite vorgenommen wurde oder Sie die Version durch Ihren Paketmanager installiert haben (also z. B. in einer GNU/Linux-Distribution oder unter fink oder cygwin installiert), und b) auf welchem Betriebssystem Sie das Programm benutzen:
Wechseln Sie in das Verzeichnis
‘INSTALL_VERZ/lilypond/usr/share/lilypond/current/’ |
Wechseln Sie in das Verzeichnis
‘INSTALL_VERZ/LilyPond.app/Contents/Resources/share/lilypond/current/’ |
indem Sie entweder mit dem Befehl cd vom Terminal aus
in das Verzeichnis wechseln, oder mit Control-Klick auf das
LilyPond-Programmsymbol gehen und „Show Package Contents“
auswählen.
Wechseln Sie mit dem Windows Explorer ins Verzeichnis
‘INSTALL_VERZ/LilyPond/usr/share/lilypond/current/’ |
Wechseln Sie in das Verzeichnis
‘PREFIX/share/lilypond/X.Y.Z/’, wobei
PREFIX bei Ihrem Paket-Manager oder dem
configure-Skript gesetzt wird, und X.Y.Z
die LilyPond-Versionsnummer.
In diesem Ordner sind die zwei interessanten Unterordner:
Schauen wir uns zuerst einige Dateien in ‘ly/’ an.
Öffnen Sie ‘ly/property-init.ly’ in einem Texteditor.
Der, den Sie normalerweise für ‘.ly’-Dateien benutzen,
genügt. Diese Datei enthält die Definitionen aller vordefinierten
Befehle für LilyPond, wie etwa \stemUp und
\slurDotted. Sie können sehen, dass es sich um
nichts mehr handelt als Definitionen von Variablen, die eine
oder mehrere \override-Befehle enthalten. Der
Befehl \tieDotted etwa wird folgendermaßen definiert:
tieDotted = {
\override Tie.dash-period = #0.75
\override Tie.dash-fraction = #0.1
}
|
Wenn Sie diese Voreinstellungen der vordefinierten Befehl nicht mögen, können Sie sie ganz einfach umdefinieren, genauso wie jede andere Variable auch, indem Sie sie an den Anfang Ihrer Quelldatei schreiben.
Hier sind die wichtigsten Dateien, die sich im Ordner ‘ly/’ befinden:
| Dateiname | Inhalt |
|---|---|
| ‘ly/engraver-init.ly’ | Definitionen von Engraver-Kontexten |
| ‘ly/paper-defaults-init.ly’ | Spezifikationen von Voreinstellungen für Papiermaße |
| ‘ly/performer-init.ly’ | Definitionen von Performer-Kontexten |
| ‘ly/property-init.ly’ | Definitionen aller vordefinierten Befehle |
| ‘ly/spanner-init.ly’ | Definitionen aller vordefinierten Strecker-Befehle |
Andere Einstellungen (wie die Definitionen von Beschriftungsbefehlen) sind in ‘.scm’-(Scheme)-Dateien gespeichert. Die Scheme-Programmiersprache wird benutzt, um eine programmierbare Schnittstelle zu den internen Operationen von LilyPond zu haben. Eine weitere Erklärung dieser Dateien ist im Moment außerhalb des Rahmens dieses Handbuchs, denn sie erfordern einige Kenntnis der Scheme-Sprache. Die Warnung ist hier angebracht, dass des ein gutes technisches Verständnis oder sehr viel Zeit braucht, um Scheme und diese Dateien zu verstehen (siehe auch (extending)Scheme-Tutorium in Abschnitt ‘Scheme-Tutorium’ in Extending).
Wenn Sie sich mit Scheme auskennen, sind hier mögliche interessante Dateien:
| Dateiname | Inhalt |
|---|---|
| ‘scm/auto-beam.scm’ | Sub-Balken-Voreinstellungen |
| ‘scm/define-grobs.scm’ | Voreinstellungen für Grob-Eigenschaften |
| ‘scm/define-markup-commands.scm’ | Definition aller Markup-Beschriftungsbefehle |
| ‘scm/midi.scm’ | Voreinstellung für die MIDI-Ausgabe |
| ‘scm/output-lib.scm’ | Einstellungen mit Einfluss auf die Darstellung von Bunddiagrammen, Farben, Versetzungszeichen, Taktlinien usw. |
| ‘scm/parser-clef.scm’ | Definitionen der unterstützten Schlüssel |
| ‘scm/script.scm’ | Voreinstellungen für Artikulationszeichen |
| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
@translationof Advanced tweaks with Scheme
Auch wenn viele Sachen mit \override und \tweak
möglich sind, gibt es eine sehr viel mächtigere Möglichkeit, die
Arbeitsweise von LilyPond mit Hilfe der programmierbaren Schnittstelle
zu beeinflussen. Code, der in der Scheme-Programmiersprache
geschrieben ist, kann direkt in die interne Satzmaschine von LilyPond
eingefügt werden. Natürlich brauchen Sie dazu wenigstens ein
grundlegendes Verständnis von Scheme. Eine Einleitung finden
Sie in der
(extending)Scheme-Tutorium in Abschnitt ‘Scheme-Tutorium’ in Extending.
Zur Illustration der vielen Möglichkeiten soll gezeigt werden, dass eine Eigenschaft nicht nur auf eine Konstante, sondern auch auf eine Scheme-Prozedur gesetzt werden kann, die dann jedes Mal aufgerufen wird, wenn die Eigenschaft von LilyPond benutzt wird. Die Eigenschaft kann damit dynamisch auf einen Wert gesetzt werden, der durch die Prozedur jedes Mal neu bestimmt wird. In diesem Beispiel wird die Farbe der Notenköpfe entsprechend zu ihrer Position innerhalb der Tonleiter gesetzt.
#(define (color-notehead grob) "Color the notehead according to its position on the staff." (let ((mod-position (modulo (ly:grob-property grob 'staff-position) 7))) (case mod-position ;; Return rainbow colors ((1) (x11-color 'red )) ; for C ((2) (x11-color 'orange )) ; for D ((3) (x11-color 'yellow )) ; for E ((4) (x11-color 'green )) ; for F ((5) (x11-color 'blue )) ; for G ((6) (x11-color 'purple )) ; for A ((0) (x11-color 'violet )) ; for B ))) \relative { % Arrange to obtain color from color-notehead procedure \override NoteHead.color = #color-notehead a2 b | c2 d | e2 f | g2 a | }
Weiter Beispiele, die die Benutzung dieser programmierbaren Schnittstelle zeigen, finden sich in (extending)Callback-Funktionen in Abschnitt ‘Callback-Funktionen’ in Extending.
| [ < ] | [ > ] | [ << ] | [ Nach oben ] | [ >> ] |
Dieses Dokument wurde erzeugt von gub am 13. Juli 2020 durch texi2html 1.82.
Andere Sprachen: English, català, česky, español, français, italiano, 日本語, nederlands.
Über die automatische Sprachauswahl.