Automatisch komponieren mit Python



Einführung

In diesem Kapitel des Python-Kurses stellen wir Tutorial für Musik-Geprägte vor. Wir benutzen Python um eine Input-Datei zu erstellen für das Musik-Programm Lilypond. Unser Python-Programm wird einen beliebigen Text in Musik-Noten übersetzen, d.h. aus Text automatisch ein Musikstück erzeugen. Zu diesem Zweck wird jedes Zeichen des Alphabets durch unser Programm in ein oder mehrere Noten eines Musik-Stücks gewandelt.

Lilypond

Lilypond Bevor wir mit der Implementierung starten, müssen wir Ihnen kurz einige Informationen über Lilypond geben.
Was ist Lilypond? Die Entwickler von Lilypond definieren es folgendermaßen auf lilypond.org:

"LilyPond is a music engraving program, devoted to producing the highest-quality sheet music possible. It brings the aesthetics of traditionally engraved music to computer printouts."

Weiterhin wird das Ziel wie folgt beschrieben:

"LilyPond came about when two musicians wanted to go beyond the soulless look of computer-printed sheet music. Musicians prefer reading beautiful music, so why couldn't programmers write software to produce elegant printed parts?

The result is a system which frees musicians from the details of layout, allowing them to focus on making music. LilyPond works with them to create publication-quality parts, crafted in the best traditions of classical music engraving."

Ein einfaches Beispiel um mit Lilypond zu beginnen:
\version "2.12.3"
{
  c' e' g' a'
}
Wenn wir den Code in der Datei simple.ly speichern, können wir Lilypond über die Kommando-Zeile starten:
lilypond simple.ly
Folgende Ausgabe wird dabei generiert:
GNU LilyPond 2.12.3
Processing `simple.ly'
Parsing...
Interpreting music... 
Preprocessing graphical objects...
Finding the ideal number of pages...
Fitting music on 1 page...
Drawing systems...
Layout output to `simple.ps'...
Converting to `./simple.pdf'...
Das Ergebnis wird in der PDF-Datei "simple.pdf" gespeichert und sieht in etwa so aus: Score-Beispiel
An dieser Stelle möchten wir kein komplettes Lilypond-Tutorial bereitstellen und empfehlen diese Lern-Hilfe.

Python mit Lilypond

Beispiel Wir schreiben ein Programm, welches eine beliebige Zeichen-Kette ein Musik-Stück wandelt. Dieses Musik-Stück kann z.B. jemand auf dem Piano spielen. Um das zu erreichen wird jeder Buchstabe des lateinischen Alphabets auf zwei Viertel einer vier-vierten Zeit abgebildet, und zwar sowohl für die linke als auch für die rechte Seite eines Klavierauszuges.
Das Bild auf der rechten Seite stellt die Zeichen-Kette "Python" dar. Wir verwenden eine pentatonische Skala, um sicherzugehen, dass das Ergebnis nicht zu schlecht klingen wird.

Wir implementieren das Mapping mit einem Python-Dictionary:
char2notes = { 
  ' ':("a4 a4 ", "r2 "),
  'a':("<c a>2 ", "<e' a'>2 "),
  'b':("e2 ", "e'4 <e' g'> "),
  'c':("g2 ", "d'4 e' "),
  'd':("e2 ", "e'4 a' "),
  'e':("<c g>2 ", "a'4 <a' c'> "),
  'f':("a2 ", "<g' a'>4 c'' "),
  'g':("a2 ", "<g' a'>4 a' "),
  'h':("r4 g ", " r4 g' "),
  'i':("<c e>2 ", "d'4 g' "),
  'j':("a4 a ", "g'4 g' "),
  'k':("a2 ", "<g' a'>4 g' "),
  'l':("e4 g ", "a'4 a' "),
  'm':("c4 e ", "a'4 g' "),
  'n':("e4 c ", "a'4 g' "),
  'o':("<c a g>2  ", "a'2 "),
  'p':("a2 ", "e'4 <e' g'> "),
  'q':("a2 ", "a'4 a' "),
  'r':("g4 e ", "a'4 a' "),
  's':("a2 ", "g'4 a' "),
  't':("g2 ", "e'4 c' "),
  'u':("<c e g>2  ", "<a' g'>2"),
  'v':("e4 e ", "a'4 c' "),
  'w':("e4 a ", "a'4 c' "),
  'x':("r4 <c d> ", "g' a' "),
  'y':("<c g>2  ", "<a' g'>2"),
  'z':("<e a>2 ", "g'4 a' "),
  '\n':("r1 r1 ", "r1 r1 "),
  ',':("r2 ", "r2"),
  '.':("<c e a>2 ", "<a c' e'>2")
}
Die Abbildung eines Strings auf die Noten kann mit einer einfachen Schleife in Python realisiert werden:
txt = "Love one another and you will be happy. It is as simple as that."

upper_staff = ""
lower_staff = "" 
for i in txt.lower():
    (l,u) = char2notes[i]
    upper_staff += u
    lower_staff += l
Folgender Code bindet die Strings upper_staff und lower_staff in ein Lilypond-Format ein, welches dann von Lilypond verarbeitet werden kann:
staff = "{\n\\new PianoStaff << \n"
staff += "  \\new Staff {" + upper_staff + "}\n"  
staff += "  \\new Staff { \clef bass " + lower_staff + "}\n"  
staff += ">>\n}\n"

title = """\header {
  title = "Love One Another"
  composer = "Bernd Klein using Python"
  tagline = "Copyright: Bernd Klein"
}"""

print title + staff
Wenn wir den Code unter text_to_musik.py speichern, können wir unseren Klavier-Auszug über folgendes Kommando erstellen:
python text_to_music.py > piano_score.ly
Wir erhalten eine PDF-Datei mit dem Namen piano_score.pdf.