Förderjahr 2018 / Project Call #13 / ProjektID: 3157 / Projekt: OSME - Open Sheet Music Education
Mit dem, im Rahmen von OpenSheetMusicEducation (OSME) entwickelten Übungsgenerator kann man musikalische Übungen für die Fingerfertigkeit am Instrument oder fürs Blattlesen usw. erstellen. Die gewünschten musikalischen Parameter: beispielsweise der Notenschlüssel, die Taktart, der Tonumfang, die Anzahl der Takte, können im Interface eingestellt werden, um dann per Knopfdruck eine Übung zu generieren und am Bildschirm mit OpenSheetMusicDisplay (OSMD) darzustellen.
Um die generierte Übung nun mit anderen Personen zu teilen oder einfach nur zu archivieren, muss diese in einem dafür passenden Format gespeichert werden. Im Bereich der Musiknoten hat sich hier das Format musicXML durchgesetzt, welches auch von OSMD unterstützt wird.
Wie sieht nun der technische Ablauf dafür hinter den Kulissen aus?
Der OSME Übungsgenerator verwendet das OSMD Objektmodell, um die nötigen musikalischen Objekte wie z.B. Takt, Notenschlüssel und die einzelnen Noten zu erzeugen. D.h. je nach den Parametereinstellungen des Generators und des darin befindlichen Algorithmus, der mit einer gewisser Zufallskomponente arbeitet, werden die nötigen musikalischen Objekte errechnet und dann mittels der Definitionen im OSMD Objektmodell erzeugt. Die nachfolgende Abbildung zeigt links einen Teil der Objekte aufgelistet und rechts daneben den entsprechenden Source Code (hier für eine Note in einem Takt). Die komplette Auflistung aller Objekte findet man in der OSMD Klassendokumentation, die automatisch aus dem Source Code generiert wird: https://opensheetmusicdisplay.github.io/classdoc/globals.html
Betrachten wir nun beispielsweise folgende Übung die mit dem Generator erzeugt werden könnte:
Es werden hier 4 Takte benötigt. Im ersten Takt gibt es eine Angabe des Notenschlüssels und der Taktart gefolgt von den einzelnen Noten.
Wie sieht das nun im Bezug auf das Objektmodell aus - hier eine Auflistung der nötigen Anweisungen:
-
erstelle Takt 1 (= Measure)
-
erstelle Notenschlüssel (=ClefInstruction) und füge zu Takt hinzu
-
erstelle Taktart (=RhythmInstruction) und füge zu Takt hinzu
-
erstelle Note D und füge zu Takt hinzu
-
erstelle Note H und füge zu Takt hinzu
-
erstelle Note A und füge zu Takt hinzu
-
...
-
-
erstelle Takt 2 (= Measure)
-
...
Das fertig aufgebaute Objektmodell kann nun mit OSMD dargestellt werden und würde dann das obige Bild am Bildschirm erzeugen.
Um das Objektmodell aber nun abzuspeichern, ist es notwendig einen allgemein lesbaren Standard wie musicXML zu verwenden. Das Objektmodell muss also in ein musicXML geschrieben bzw. konvertiert werden.
Dafür muss das Objektmodell hierachisch durchlaufen (iteriert) werden - also beginnend mit Takt 1, dann alle Objekte innerhalb Takt 1, dann Takt 2, usw. - um parallel zu jedem Objekt die nötigen textuellen XML-Anweisungen zu erzeugen.
Der Notenschlüssel wird beispielsweise in folgende Anweisungen übersetzt:
<clef>
<sign>G</sign>
<line>2</line>
</clef>
Nach dem vollständigen Übersetzen des Objektmodells und Hinzufügen von weiteren nötigen Parametern wie XML-Header und evtl. Titelangabe usw. wird folgende, dem musicXML Standard entsprechende Textdatei erzeugt:
Diese musicXML Datei kann nun geteilt und von einer Vielzahl von Noten- und Musikprogrammen sowie mit OSMD geöffnet werden.
Falls man sich nun fragt, warum man nicht einfach gleich das musicXML direkt vom Übungsgenerator erstellen lässt: Das wäre natürlich auch möglich. Jedoch braucht man auch dafür ein eigenes Objektmodell - man müsste also dafür ein zweites Objektmodell definieren - und zusätzlich bietet die beschriebene Lösung noch weitere Vorteile: man hat nun nämlich alle nötigen Komponenten um ein eingelesenes musicXML grafisch in OSMD zu editieren. Ein Beispiel dazu wäre:
-
musicXML einlesen und darstellen
-
Eine Note anklicken und vertikal verschieben
-
das veränderte musicXML mit dem XML-Exporter speichern
Die Editier-Funktionalität wäre sehr willkommen in der OSMD Community und wurde auch schon mehrfach angefragt.