[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.7 Weitere Optimierungen

@translationof Further tweaking


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.7.1 Andere Benutzung von Optimierungen

@translationof Other uses for tweaks


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

Noten zwischen unterschiedlichen Stimmen überbinden

@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,

[image of music]

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'] }
>>

[image of music]

Siehe auch

Handbuch zum Lernen: Der \once-Präfix, Die stencil-Eigenschaft (Matrize).


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

Eine Fermate in MIDI simulieren

@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 { }
}

[image of music]

 
\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 { }
}

[image of music]

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.

Siehe auch

Glossar: (music-glossary)system in Abschnitt ‘system’ in Glossar.


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.7.2 Variablen für Layout Anpassungen einsetzen

@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 }
    >>
  >>
}

[image of music]


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.7.3 Formatvorlagen

@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 |
}

[image of music]

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 |
}

[image of music]

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
  }
}

[image of music]

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
  }
}

[image of music]

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] [ ? ]

4.7.4 Mehr Information

@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:

Von lilypond.org heruntergeladen

Mit einem Paket-Manager installiert oder selber aus den Quellen kompiliert

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:

DateinameInhalt
‘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:

DateinameInhalt
‘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] [ ? ]

4.7.5 Fortgeschrittene Optimierungen mit Scheme

@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 |
}

[image of music]

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.