Ältere Beiträge Neuere Beiträge
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:
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)