Noten in Capella klingend darstellen V. 2

Update: in der ersten Version war ein Fehler.

Wenn man Noten für mehrere transponierende Instrumente hat und es etwas seltsam klingt, dann kann es hilfreich sein, sich die Noten anzuschauen, wie sie klingen. In Musescore kann man mit einem Mausklick zwischen klingender und notierter Darstellung umschalten. In Capella gibt es diese Möglichkeit nicht, aber habe mir ein ein Skript geschrieben, dass eine ähnliche Funktion bietet.

Ich stelle es zur Benutzung zur Verfügung.

Voraussetzung: Capella 8, Windows 10 mit letztem Update.

Dazu muss man nur diese zip-Datei herunterladen und entzippen in die drei Dateien ChangeView.dll, Changeview.py und ChangeView.info. Alle drei Daten werden in den Capella-Skript-Ordner kopiert. In der Datei ChangeView.py findet man den Pfad zum Skript-Ordner. Eventuell muss man diesen Pfad anpassen. Ich benutze dafür Notepad++, aber jeder andere Text-Editor tut es auch. Man findet dann unter Plugin das Skript «ChangeView».

Die Benutzung macht nur Sinn mit Partituren, in denen transponierende Instrumente vorkommen und sie müssen transponierend notiert sein.

Jede Notenzeile muss einen Notenschlüssel enthalten.

Wenn z. B. eine B-Trompete vorkommt, dann muss ein d notiert sein, wenn die Trompete ein c spielen soll. Im Mustersystem muss bei der Trompete unter „transpose“ eine 2 mit einem Pfeil nach unten stehen.

Die Struktur des Skripts ist wie bei vielen Skripten: die Partitur wird in einer temporären Datei zwischengespeichert, diese Datei wird geändert und dann wieder neu geladen.

Das Skript sucht nach transpose-Werten, die ungleich 0 sind und weiß dann, dass es eine Partitur mit transponierenden Instrumenten vor sich hat. Es transponiert dann alle Stimmen entsprechend und setzt im Mustersystem transpose = 0. Weil man diese Werte später wieder braucht, werden sie in der Datei unter Schlüsselwörter abgespeichert.

Es wird der Text «klingend» über dem ersten System eingefügt.

Wenn das Instrument mehr als eine Oktave transponiert, werden Violin- uns Bassschlüssel entsprechend ausgetauscht. (Das macht Musescore nicht.)

Um wieder in die ursprüngliche Darstellung zu kommen, lässt man das Skript einfach nochmal laufen (am einfachsten mit Strg + R).

Jetzt findet das Skript in den Schlüsselworten die Transpositionszahlen und es wird einfach in die andere Richtung transponiert. Der Text „klingend“ wird durch „notiert“. Mit Strg + R lässt sich jetzt beliebig oft zwischen den beiden Darstellungsarten umschalten.

Wie erzeugt man ein CAPELLA-Skript mit C#?

Die Frage nach dem Warum wird nicht gestellt und nicht beantwortet. Getestet habe ich das Ganze unter Windows 10. Ob es auch unter anderen Systemen zum Laufen gebracht werden kann, entzieht sich meiner Kenntnis.

Welche Werkzeuge werden benutzt:

  1. Python-Skript
  2. Visual Studio Community 2019
  3. DllExport-Package

Das Python-Skript sieht typischerweise so aus:

import tempfile

import ctypes

if activeScore():

    activeScore().registerUndo(‚klingend‘)

    tempFile = tempfile.mktemp(‚.capx‘)

    activeScore().write(tempFile)

    a = ctypes.cdll.LoadLibrary(‚Klingend.dll‘)

    a.Klingend(tempFile)

    activeScore().read(tempFile)

    os.remove(tempFile)

Als erstes wird mit dem Befehl registerUndo eine Backup-Kopie der Partitur gespeichert. Mit dem Undo-Befehl kann diese Datei später wieder geladen werden.

Dann wird die aktive Partitur in einer temporären Datei abgespeichert. Danach wird diese Datei durch Code in einer DLL (hier Klingend.dll) geändert. Dazu wird die DLL geladen und dann eine Funktion (hier Klingend) aufgerufen und der Name der temporären Datei übergeben. Nach der Änderung der Datei wird diese wieder als aktive Partitur geladen. Mit dem remove-Befehl wird die temporäre Datei gelöscht.

In Visual Studio erzeugt man eine .Net-Klassenbibliothek und definiert eine Funktion, die die Befehle enthält mit der die Datei geändert und wieder gespeichert wird.

Damit die Funktion für das Python-Skript sichtbar d. h. aufrufbar wird, muss die DLL etwas geändert werden. Dafür gibt es das Paket DllExport. Man installiert es am besten über den NuGet-Manager. Beim Installieren des Pakets läuft ein Skript und erzeugt am Ende einen Dialog, in dem man einige Optionen anwählen kann.

Diese Einstellungen haben bei mir funktioniert.

Wichtig: Dabei es funktioniert, muss in Visual Studio die Software für das Entwickeln in C++ installiert sein, sonst kommt eine Fehlermeldung, dass eine Bibliothek nicht gefunden werden kann. Die DLL kann auch nicht für „AnyCPU“ erstellt werden. Man muss x86 oder x64 auswählen.

Die zu exportierende Funktion muss etwa folgendermassen beginnen:

        [DllExport(CallingConvention = CallingConvention.Cdecl, ExportName = „Klingend“)]

        static public void Klingend(string fn)

Transponieren mit dem Computer

Das Notensystem mit den Noten von C bis H bzw. B ist nicht gerade zum Rechnen gemacht worden. Ich habe mich mit dem Problem beschäftigt, mit einem Programm Noten zu transponieren.

Wozu das gut sein soll? Ich habe ein Notenschreibprogramm (CAPELLA), mit dem ich eigentlich sehr zufrieden bin. Aber manchmal habe ich Übungen, von denen nur 1 oder 2 Takte notiert sind und dann der nette Hinweis man möge diese Übung doch in alle Tonarten transponieren. Am besten macht man das Transponieren im Kopf (weil das übt). Aber die Noten als Gedächtnisstütze sind auch nicht zu verachten.

Wie bringt man dem Computer das Transponieren bei? Wie weiß er, dass er auf einem Gb gelandet ist und nicht auf einem F#.

Hilfreich dabei ist die sogenannte «line of fifths» [LoF]. Sie ist aus dem Quintenzirkel abgeleitet, aber eine unendliche Linie. Der mittlere Teil sieht folgendermassen aus:

F##B#E#A#D#G#C#F#BEADGCFBbEbAbDbGbCbFbBbb

Als erstes bestimmt man den Abstand zwischen der Ausgangs- und der Zieltonart. Beispiel: wir wollen von Eb nach G transponieren. Dazu müssen wir in der LOF um 4 Positionen nach links gehen.

Jetzt wenden wir dies auf jeden Ton an. Beispiel: aus Db wird F, aus A wird C#.

Computer brauchen aber Zahlen, also ordnen wir jeder Note in der LoF in Zahl zu, welche ist egal, aber ich habe aus einer Quelle übernommen, dass F eine Null bekommt und dass die positiven Zahlen links, die negativen Zahlen nach rechts laufen. Das sieht dann so aus:

F##B#E#A#D#G#C#F#BEADGCFBbEbAbDbGbCbFbBbb
14131211109876543210-1-2-3-4-5-6-7-8

Bei Instrumenten ist gewöhnlich angegeben, um wieviel sie transponieren. Wenn ein Instrument x Halbtonschritte transponiert, dann ergeben sich die Schritte in der LoF aus dieser Formel:

(x * 7) modulo 12. Beispiel: Ein Instrument transponiert um eine große Sexte nach oben, X ist also 9.

9 * 7 = 63. Davon solange 12 abgezogen, bis ein Rest bleibt: 63 – 5 * 12 = 3. Wir müssen also in der LoF 3 Schritte nach rechts gehen.

Die modulo-Funktion ist nicht immer gleich definiert. Die Funktion in Python liefert für uns den richtigen Wert, in C# liefert sie ein für uns falsches Ergebnis.

Das Altsaxophon, dass 9 Halbtöne nach unten transponiert, muss man rechnen: -9 * 7 = -63. Dann wird solange 12 addiert, bis ein Rest bleibt. In diesem Fall -3. Wir müssen also in der LoF 3 Schritte nach links gehen.

Jetzt kommt noch eine zusätzliche Komplikation, dass wir in der Regel nicht mehr als 6 Vorzeichen wollen. Bei mehr Vorzeichen wählen wir eine enharmonische Verwechslung. Man kann sich die ganzen Überlegungen sparen, in dem man sich einmal eine Tabelle macht:

Transposition123456789101112
LoF-Schritte523416143250

Jetzt kommen wir zum Transponieren der einzelnen Noten. In meinem Fall lagen die Noten als Buchstaben vor, also als C,D,E,etc.

Zuerst brauchen wir für jede Note eine Zahl. Die Zahl holen uns aus einer Tabelle, die der LoF entspricht: F =0, C =1, G = 2, etc.

Ausserdem müssen wir noch die Vorzeichen einer Zahl zu ordnen. Ein Kreuz entspricht 1, zweite Kreuze 2, ein B -1, zwei Bs -2, etc.

Mit folgender Formel können wir dann jeder Note eine Position (= eine Zahl) zuordnen:

Position = Notenzahl + 7 * Vorzeichenzahl (siehe LoF-Tabelle)

Um die transponierte Position zu erhalten, addieren wir einfach die LoF-Schritte.

NeuePosition = Position + LoF-Schritte.

Die neue Note erhält man durch: NeuePosition modulo 7.

Die Anzahl der Vorzeichen durch (NeuePosition + 7) / 7 – 1 (Ganzzahl-Division)

Jetzt fehlt nur noch die Bestimmung der richtigen Oktave. Dazu ein andermal.

Nutville (2)

Als erstes das ganze Stück per Computer erzeugt und im normalen Tempo (200):

Schwierig ist der Teil G, vor allem für Trompeten und Saxophone. Daher der Teil G langsamer nur mit den Trompeten:

Nun der Teil G nur für die Saxophone (Alto und Tenor):

und jetz alle zusammen: