(Version 2022_01_03)
In diesem Tutorial werden Möglichkeiten
Beide Bereiche werden anhand von Musikbeispielen vorgestellt. Dabei geht es immer auch um die Formulierung bestimmter analytischer Fragestellungen und die Interpretation der jeweiligen Ergebnisse. Das Durcharbeiten und Nachvollziehen des Tutoriums soll es Ihnen ermöglichen, eigene Musikbeispiele (Notendateien) zu untersuchen und Vergleiche zwischen verschiedenen Musikstücken durchzuführen.
Jeder Start eines Jupyter Notebooks, in dem die Python-Bibliothek music21 verwendet wird, beginnt mit dem Import von music21 - und zwar durch diesen einfachen Befehl:
from music21 import *
# mit diesem Befehl werden die music21-Bibliothek geladen:
# Klicken Sie also in die Zelle und dann auf den Button 'Run'!
# Dieser Befehl muss IMMER gestartet werden,
# wenn mit einem Notebook gearbeitet wird.
Um aus dem Internet eine Datei zu aus dem Internet zu laden, müssen Sie lediglich mit der folgenden Syntax die Internet-Adresse des Files einfügen (rot markierter URL). Der URL kann der Notendatenbank entnommen werden, z.B. https://analyse.hfm-weimar.de/doku.php?id=mowo (Maus-Rechts-Klick auf den Link: "Link-Adresse kopieren"). Wir laden nun den ersten Satz des Streichquartetts No. 1, D-Dur, KV 80, von Wolfgang Amadeus Mozart.
mozart = converter.parse('https://analyse.hfm-weimar.de/database/03/MoWo_K155_COM_1-3_StringQuar_003_00842.xml')
# Damit ist 'mozart' nun als Variablenname für die Notendatei festgelegt.
# Sie können die Datei auch auf Ihrem PC speichern.
# Dann müssen Sie anschließend Ihren lokalen Datei-Pfad eingeben (z.B. C:/analyse/MoWo_K155_COM_1-3_StringQuar_003_00842.xml)
Sie können sich das Stück auch im Browser anhören - allerdings nur in einer Version mit MIDI-Klängen und wenn als Browser Firefox oder Chrome verwendet wird.
mozart.show('midi')
# Wenn einem die MIDI-Sounds nicht gefallen und man sich andere Sounds einstellen will, muss man diese Einstellungen im xml-Datei vornehmen.
# Sie können den Befehl immer einsetzen, wenn Sie sich etwas anhören wollen;
mozart.plot('pianoroll')
# Durch diesen einfachen Befehl wird eine pianoroll-Darstellung im Browser erzeugt.
Was lässt sich durch diese Darstellungsweise erkennen?
Zu Vergrößerung können entweder einzelne Abschnitte und Takte ausgewählt werden (s. 2.2), oder man aktiviert das Zusatzmodul MatPlotlib, wodurch sich ein Popup-Fenster öffnet.
%matplotlib
# Durch diesen Befehl werden alle grafischen Darstellungen (außer Noten)
# in einem extra Pop-Up-Fenster der Python-Library MatPlotLib geöffnet (s. Taskleiste unten).
# Zunächst muss der Pianorollen-Befehl wiederholt werden:
mozart.plot('pianoroll')
Using matplotlib backend: Qt5Agg
Wählen Sie im Pop-Up-Fenster das Lupensymbol. Wenn Sie nun einen Ausschnitt mit der Mouse markieren, so wird der Ausschnitt vergrößert. Mit dem Kreuzsymbol kann der Ausschnitt sodann verschoben werden.
%matplotlib inline
# Durch diesen Befehl wird Matplotlib wieder "ausgeschaltet" und die Grafiken erscheinen wieder im Browser
# Sie können sich natürlich auch von den einzelnen Stimmen Pianorollen darstellen lassen.
# Zum Beispiel von der Cellostimme:
mozart.parts[3].plot('pianoroll')
# Die anderen Stimmen zeigen Sie an, indem Sie die Zahl im Befehl von 0 - 3 ändern.
# Erste Violine = 0
# Zweite Violine = 1
# Viola = 2
# Cello = 3
Hinweis: Pianorollen können auch im Sonic Visualiser generiert werden. Dort können die entsprechenden Notendateien zugleich angehört werden, während die Pianorolle von rechts nach links läuft. Vgl. https://analyse.hfm-weimar.de/doku.php?id=sv-pianoroll.
Falls in der Partitur Dynamikbezeichnungen (pp, p, mf, f, ff usw.) vorhanden sind, können diese mit dem folgenden Code in eine visuelle Darstellung der Stimmen integriert werden. Das dies im Mozart-Streichquartett nicht der Fall ist, laden wir hierfür die Ballade h-moll Franz Liszt:
liszt = converter.parse('https://analyse.hfm-weimar.de/database/03/LiFra_S171_COM_COM_BalladeNo2_003_00822.xml')
# damit 'mozart' (also der Mozart-Satz) nicht überschrieben wird, wählen wir die neue Variabel 'liszt'.
liszt.plot('dolan')
Durch diese Darstellung lässt sich recht schön der Dynamikverlauf der Ballade nachverfolgen, inkl. Pausen. Da die Dynamik-Symbole an das Notensystem der rechten Hand geknüpft sind, sich aber auf den gesamten Notentext beziehen, wird die linke Hand nur als vertikaler Balken dargestellt. Durch Hinzufügen des Befehls '%matplotlib' lässt sich die Grafik extern öfnnen.
Zur Verwendung in anderen Computeranwendungen (Word, Powerpoint) können die Grafiken (als png-Datei) selbstverständlich exportiert werden:
Mit den Chordify-Befehl lässt sich auf einfache Weise ein Klavierauszug erstellen. Wir kommen nun zurück auf Mozarts Streichquartett.
klavierauszug = mozart.chordify()
klavierauszug.show()
# Durch den chordify-Befehl wird ein Klavierauszug (neue Variable: 'klavierauszug') erstellt.
# Durch show lässt sich der Klavierauszug darstellen.
klavierauszug.write()
# Mit dem write-Befehl wird der Klavierauszug als xml-Datei abgespeichert,
# der Dateiname und -pfad wird angezeigt.
# Alternativ können Sie einen eigenen Pfad und Namen festlegen, s. oben, z.B.:
# klavierauszug.write(fp="D:/Dokumente/mozart_klavierauszug.xml")
WindowsPath('C:/users/Martin/Fellowship/music21/tmp7py2ew3p.xml')
Manchmal ist es übersichtlicher, die Akkorde auf zwei Systeme zu verteilen. Dafür muss jedoch die Stimmverteilung für das obere und das untere System manuell definiert werden.
# Zunächst werden die vier Stimmen benannt:
Violine1 = mozart.parts[0]
Violine2 = mozart.parts[1]
Viola = mozart.parts[2]
Cello = mozart.parts[3]
# Dann wird eine neue Partitur mit den vier Stimmen angelegt:
newScore = stream.Score()
newScore.insert(0, Violine1)
newScore.insert(0, Violine2)
newScore.insert(0, Cello)
newScore.insert(0, Viola)
# Das Cello muss hier vor der Viola stehen, damit ein Bassschlüssel vorgezeichnet wird.
klavierauszug_neu = stream.Opus()
r = newScore.measures(0, len(mozart.getElementsByClass(stream.Part)[0].getElementsByClass(stream.Measure)))
klavierauszug_neu.insert(0, r.implode())
NotenV1 = Violine1.recurse().notes
NotenV2 = Violine2.recurse().notes
NotenV = Viola.recurse().notes
NotenC = Cello.recurse().notes
# Zum Schluss müssen noch die Notenhälse in die richtige Richtung gedreht werden:
for noten in NotenV1:
noten.stemDirection = 'up'
for noten in NotenV2:
noten.stemDirection = 'down'
for noten in NotenV:
noten.stemDirection = 'up'
for noten in NotenC:
noten.stemDirection = 'down'
klavierauszug_neu.show()
klavierauszug_neu.write()
# Auch dieser Klavierauszug kann mit dem write-Befehl als xml-Datei abgespeichert,
# der Dateiname und -pfad wird angezeigt.
WindowsPath('C:/users/Martin/Fellowship/music21/tmpod7fqyjt.xml')
Music21 bietet die Möglichkeit, einen Klavierauszug mit der Bezifferung der Akkordstellung zu versehen. Dabei werden jedoch nicht alle Stimmen berücksichtigt. Dennoch kann diese vereinfachte Anzeige bei einer harmonischen Analyse hilfreich sein.
Akkordstellung = mozart.chordify()
for c in Akkordstellung.recurse().getElementsByClass('Chord'):
c.closedPosition(forceOctave=4, inPlace=True)
c.annotateIntervals()
# Die neue Variable heißt 'Akkordstellung'
Akkordstellung.measures(0, 3).show()
# nur die ersten drei Takte werden angezeigt. 'Akkordstellung' ist eine neue Variable.
Music21 bietet außerdem die Möglichkeit, eine Notendatei mit einer Stufenbezifferung zu versehen. Dabei wird der Notentext allerdings nur auf ganz oberflächliche Weise ausgewertet, eine wirkliche harmonische Analyse wird nicht durchgeführt. Dennoch kann eine solche Bezifferung bisweilen hilfreich sein - als erster Schritt in Hinsicht auf eine wirkliche Harmonieanalyse.
ACHTUNG: Die Stufenbezifferung richtet immer nach der Grundtonart, die Sie mit dem Befehl key.Key(' ') festlegen, z.B. 'key.Key('Dm') oder 'key.Key('D') für d-moll bzw. D-Dur. Modulationen und andere harmonische Bewegungen werden nicht berücksichtigt.
ANMERKUNG: Leider kann nur der Klavierauszug in einem System ('klavierauszug') dargestellt werden - nicht derjenige in zwei Systemen ('klavierauszug_neu').
for c in klavierauszug.recurse().getElementsByClass('Chord'):
rn = roman.romanNumeralFromChord(c, key.Key('D'))
c.addLyric(str(rn.figure))
# Mit 'key.Key('D') in der zweiten Zeile haben wir die Tonart D-Dur festgelegt.
# Sie können dort versuchsweise auch eine andere Tonart eintragen, z.B. 'Dm'.
# Entsprechend ändert sich die Stufenbezeichnung
klavierauszug.measures(0, 6).show()
# Wir lassen uns die ersten 7 Takte anzeigen.
Die Akkordstellungs-Ansicht (s. oben) kann natürlich auch mit der Stufenbezeichnung kombiniert werden. Diese Ansicht ist leichter lesbar:
for c in Akkordstellung.recurse().getElementsByClass('Chord'):
rn = roman.romanNumeralFromChord(c, key.Key('D'))
c.addLyric(str(rn.figure))
Akkordstellung.measures(0, 4).show()
Zum Abschluss der etwas komplexere Klavierauszug einer Haydn-Sinfonie:
haydn = converter.parse('https://analyse.hfm-weimar.de/database/03/HayFraJo_HobI99_COM_1-4_LondonSymp_003_00776.xml')
# Dieser Befehl ist nicht notwendig, wenn die Haydn-Sinfonie bereits oben geladen (geparst) wurde.
klavierauszug = haydn.chordify()
klavierauszug.show()
Laden Sie Notendateien Ihrer Wahl aus dem Notenarchiv (https://analyse.hfm-weimar.de/doku.php?id=komponisten). Testen Sie an diesen Dateien die hier vorgestellten Visualisierungsmöglichkeiten.