Die Darstellung der Musik

Idealerweise ist das Eingabeformat für ein komplexes Satzsystem die abstrakte Beschreibung des Inhaltes. In diesem Fall wäre das die Musik selber. Das stellt uns aber vor ein ziemlich großes Problem, denn wie können wir definieren, was Musik wirklich ist? Anstatt darauf eine Antwort zu suchen, haben wir die Frage einfach umgedreht. Wir schreiben ein Programm, das den Notensatz beherrscht und machen das Format so einfach wie möglich. Wenn es nicht mehr vereinfacht werden kann, haben wir per Definition nur noch den reinen Inhalt. Unser Format dient als die formale Definition eines Musiktextes.

Die Syntax ist gleichzeitig die Benutzerschnittstelle bei LilyPond, darum soll sie einfach zu schreiben sein; z. B. bedeutet

{
  c'4 d'8
}

dass eine Viertel c’ und eine Achtel d’ erstellt werden sollen, wie in diesem Beispiel:

[image of music]

In kleinem Rahmen ist diese Syntax sehr einfach zu benutzen. In größeren Zusammenhängen aber brauchen wir Struktur. Wie sonst kann man große Opern oder Symphonien notieren? Diese Struktur wird gewährleistet durch sog. music expressions (Musikausdrücke): indem kleine Teile zu größeren kombiniert werden, kann komplexere Musik dargestellt werden. So etwa hier:

f'4

[image of music]

Gleichzeitig erklingende Noten werden hinzugefügt, indem man alle in << und >> einschließt.

<<c4 d4 e4>>

[image of music]

Um aufeinanderfolgende Noten darzustellen, werden sie in geschweifte Klammern gefasst:

{ … }

{ f4 <<c4 d4 e4>> }

[image of music]

Dieses Gebilde ist in sich wieder ein Ausdruck, und kann daher mit einem anderen Ausdruck kombiniert werden (hier mit einer Halben), wobei <<, \\, and >> eingesetzt wird:

<< g2 \\ { f4 <<c4 d4 e4>> } >>

[image of music]

Solche geschachtelten Strukturen können sehr gut in einer kontextunabhängigen Grammatik beschrieben werden. Der Programmcode für den Satz ist auch mit solch einer Grammatik erstellt. Die Syntax von LilyPond ist also klar und ohne Zweideutigkeiten definiert.

Die Benutzerschnittstelle und die Syntax werden als erstes vom Benutzer wahrgenommen. Teilweise sind sie eine Frage des Geschmackes und werden viel diskutiert. Auch wenn Geschmacksfragen ihre Berechtigung haben, sind sie nicht sehr produktiv. Im großen Rahmen von LilyPond spielt die Eingabe-Syntax nur eine geringe Rolle, denn eine logische Syntax zu schreiben ist einfach, guten Formatierungscode aber sehr viel schwieriger. Das kann auch die Zeilenzahl der Programmzeilen zeigen: Analysieren und Darstellen nimmt nur etwa 10% des Codes ein:

Während wir die Strukturen von LilyPond entwickelten, machten wir einige Entscheidungen, die sich von anderen Programmen unterscheiden. Nehmen wir etwa die hierarchische Natur der Musiknotation:

[image of music]

In diesem Fall werden Tonhöhen in Akkorde gruppiert, die zu Takten gehören, welche wiederum zu Notensystemen gehören. Das erinnert an die saubere Struktur von geschachtelten Kästen:

nestedboxes

Leider ist die Struktur nur sauber, weil sie auf einige sehr beschränkte Annahmen basiert. Das wird offensichtlich, wenn man ein komplizierteres Beispiel heranzieht:

[image of music]

In diesem Beispiel beginnen Systeme plötzlich und enden plötzlich, Stimmen springen zwischen den Systemen herum und die Systeme haben unterschiedliche Taktarten. Viele Software-Pakte würden sehr damit zu kämpfen haben, dieses Beispiel darzustellen, weil sie nach dem Prinzip von geschachtelten Kästen aufgebaut sind. In LilyPond dagegen haben wir versucht, die Struktur und das Eingabeformat so flexibel wie möglich zu gestalten.


Aufsatz über den automatischen Musiksatz v2.25.16 (Entwicklungszweig).