anbei die Gründe warum ich einen Plugin Manager (für mich) schrieb:
- Ich benutze nicht Cubase, sondern Sonar, Ableton Live, FL Studio, Reaper, Vienna Ensemble Pro, Kore2, Maschine etc., also viele verschiedene Plugin Hosts, und ich war es Leid, mehrere VST2 Plugin Paths zu managen/organisieren, für unterschiedliche Host-Architekturen (x32, x64). Jeder Hersteller kocht sein eigenes Süppchen, wo er welches Plugin hininstalliert, wie er x64/x32-Installation trennt etc…
Ich wollte Plugins installieren, und gut is. Also hab ich ein einziges Root-Verzeichnis "…\Native", unter dem ich je Hersteller und Plugin die jeweilige Installation vornehme, ob es nun ein simples dll-kopieren ist, oder ein kompletter Installer.
Ich wollte nach einer Installation keine Dateien mehr verschieben, umbenennen oder sonst wie ändern. Einfach Plugin installieren, der PluginManager soll sich um den Rest kümmern. Dateien im originalen Installations-Path / Scan-Path sollen schlicht nicht mehr angefasst werden müssen.
Meine App erstellt neue Plugins, die lediglich auf die im Installations-/Scan-Path liegenden Plugins verweisen. Der Host scannt dann die neuen Plugins, nicht mehr die im Installations-Path.
2) jBridge
jBridge funktioniert wunderbar. Es hat nur einen Haken: jBridge speichert seine Plugin-spezifischen Einstellungen in einer .jbridge-Datei im selben Ordner, wie das gebridgte Plugin. Ein Plugin das in Host A mit bestimmten Einstellungen läuft, läuft mit den gleichen Einstellungen in Host B aber nicht unbedingt. Ich brauchte also die Möglichkeit für ein Plugin in unterschiedliche Hosts auch unterschiedliche Settings zuzulassen.
Daher “erstellt” meine App JE HOST ein Root-Verzeichnis mit Plugins. Jeder Host hat “seine eigenen” Plugins und jBridge speichert seine Plugin-Einstellungen Host-abhängig
- unterschiedliche Namensgebung eines Plugins
Viele Hersteller nennen Ihre x64-Plugins anders als Ihre x32-Plugins. Cakewalks “Rapture LE” z.B. heißt in der x32-Fassung “Rapture32LE” und in der x64-Fassung “Rapture64LE”. TyrellN6 heißt x32 “TyrellN6” und in der x64-Fassung “TyrellN6 (x64)”.
Macht ja erst mal nix, aber wenn man z.B. ein einem x32 Plugin ein Preset speichert, dann “findet” man es in der x64-Fassung nicht. Die meisten Hosts speichern nämlich presets für ein Plugin in Abhängigkeit vom Plugin-Namen.
Ich wollte also dass ein Plugin, egal in welcher Architektur, immer gleich heißt.
Nun kann man Plugin-DLLs ja umbenennen. Aber manche Plugins funktionieren nicht mehr, wenn man sie umbenennt. Außerdem führt das nur wieder zu erheblichem Mehraufwand, wenn z.B. ein Update der DLL vorgenommen wird. Plugins müssen wieder umbenannt werden etc… Plötzlich hat man ein Plugin doppelt im Host, weil man’s nicht umbenannt hat, oder es wird das falsche, veraltete gescanned, weil gleiche VST-ID etc…
Ich wollte das automatisiert haben. Meine App macht das. Man vergibt nur einmal einen Namen, wenn überhaupt, und schon heißt das Plugin in jedem Host gleich, egal welche Architektur. Da dieses Plugin lediglich ein “Verweis” auf das “echte” Plugin ist, bleibt das “echte” vom Namen her unangetastet. Das “neue” Plugin kann benamst werden wie man will…
- Das gleiche ist auch bei Einsatz von Automap der Fall: Jedes automap gewrappte “Plugin” bekommt die Endung “Plugin (Automap)”. Presets des “Plugin” sind für “Plugin (Automap)” nicht mehr vorhanden, und andersrum. Außerdem nervt’s dass überall im Host “Automap” steht.
Umebennen kann man automap gewrappte Plugs nicht, da die DLL dann nicht mehr funktioniert.
Meine App erzeugt für Automap-Plugins eine neue DLL, die lediglich eine andere DLL lädt. Die ursprüngliche DLL bleibt also völlig unverändert, die neue DLL kann benamst werden wie man will. Instantiert man “TyrellN6” in Cubase, wird automatisch “TyrellN6 (Automap)” instantiiert.
- Kategorisieren
Ich bin ein Plugin-Junkie und probier so ziemlich jedes Plugin zumindest mal aus. Dadurch sammeln sich einige hundert Plugins, in unterschiedlichen Architekturen, Versionen etc. manche müssen gejbridged werden, wodurch nochmal ein paar hundert DLLs erzeugt werden. Ich benutze die meisten DLLs automap gewrapped, wodurch nochmals einige hundert DLLs dazukommen. Das alles per Hand zu managen ist mir einfach zu kompliziert. Das ganze dann auch noch schön in Ordner kategorisiert artet in so viel Organisationsaufwand bei Neuinstallationen und Updates aus, dass es fast unmöglich, geschweige denn der Zeitaufwand…
Ich wollte eine Möglichkeit ein Plugin einmal zu kategorisieren, in einen bestimmten Ordner zu stellen, und dann nicht mehr anzufassen. Höchstens später mal ne andere Kategorie wählen, wie z.B. Favoriten, einfach in dem ich nur eine einzige Datei in einen anderen Ordner verschiebe und nicht dutzende, x32/x64/gejbridgtex32/gejbridgtex64/automapx32/automapx64/automapUndGejbridgte etc…
Das macht meine App.
Sie scannt die in den ScanPaths angegebenen DLLs, ermittelt, ob sie x32 oder x64 sind, ob es überhaupt plugins sind, ob es eine Automap-Dll ist, etc. und erzeugt für so eine DLL dann einen “Identifier”. Im Prinzip ist dieser “Identifier” der Name des Plugins, allerdings ohne " (Automap), und ohne Architektur-Unterschiede im Namen (also ohne “x64”):
Aus “Vienna Ensemble Pro” wird so der Identifer “viennaensemblepro”.
Aus “Vienna Ensemble Pro x64” wird AUCH der Identifier “viennaensemblepro”
Aus “Vienna Ensemble Pro x64 (Automap)” wird ebenfalls der identifiert “viennaensemblepro”… etc…
für jeden Identifier wird dann NUR EINE EINZIGE .ini-Datei erzeugt: “viennaensemblepro.ini”
In dieser Datei stehen dann u.a. die Pfade zu allen DLLs die zu diesem Identifier gehören.
Außerdem steht in dieser Datei der Name des Plugins, wie er später im Host erscheinen soll. Dabei verwende ich defaultmäßig den Namen der nativen x32 dll. Im o.a. Beispiel also “Vienna Ensemble Pro”, egal ob es sich um die x64 version handelt, oder um eine automap gewrappte DLL, das Plugin wird im Host später IMMER “Vienna Ensemble Pro” heißen.
Man kann aber auch einen komplett anderen Namen verwenden. Z.B. “VEPro5”. Oder man kann für bestimmte Hosts einen anderen Namen vergeben, wenn man denn möchte. Wichtig ist: Das durch meine App später erzeugte Plugin, die DLL wird dann so heißen, wie in der .ini-Datei angegeben. Dieses Plugin lädt aber beim Instantiieren im Host aber dann die “richtige” DLL. Wenn also “VEPro5” in Cubase6x64 instantiiert wird, wird z.B. “Vienna Ensemble Pro x64 (Automap)” geladen.
Manchmal können Architektur-Unterschiede im Namen nicht korrekt eliminiert werden. Mir fällt jetzt grad kein Beispiel ein, ich nehm einfach mal die beiden Namen “Ex32 ample32 LS” und “Ex64 ample32 LS”. Ein und das selbe Plugin in unterschiedlichen Architekturen x32/x64. Dafür würden dann zwei .ini-Dateien erzeugt werden: “ex32amplels” und “ex64amplels”. In so einem Fall dann einfach die Pfad-Angaben aus einer der beiden .ini-Datei A an die andere .ini-Datei B anhängen und die .ini-Datei A löschen. Man muß das nur ein einziges Mal machen. Beim nächsten scannen weiß der PluginManager dann aufgrund dessen dass die Pfade in nur einer .ini-Datei stehen, welche DLLs zum Identifier, zur .ini-Datei gehört.
Manchmal ist der defaultmäßig verwendete Name eines Plugins Architekturabhängig. Z.B. wird bei Rapture32LE und Rapture64LE, der x32-Name verwendet, also Rapture32LE. In einem x64-Host würde also das Rapture32LE plugin zur Verfügung stehen, obwohl das Rapture64LE geladen wird. In diesem Fall einfach den Namen des Plugins in der .ini-Datei ein einziges mal ändern auf “Rapture LE”, und schon heißt das Plugin, egal in welchem Host, egal in welcher Architektur “Rapture LE”.
Die Identifier- .ini-Dateien können nach belieben in Unterordner sortiert werden. Das ganze macht man einmal und muss es dann nie wieder machen.
Jedesmal wenn ich nun ein Update eines Plugins mache, oder ein neues Plugin installiere starte ich lediglich meine “PluginManager.vbs”. Diese scannt dann den Installationspfad nach Neuzugängen und Änderungen und gleicht diese mit den vorhandenen .ini-Dateien ab. Sollte eine neue .ini-Datei hinzukommen erscheint ein Dialog in der man die neue .ini-Datei in einen Kategorie-Unterordner verschiebt.
Danach erstellt die App die Plugin-Pfade und Unterordner für jeden Host neu, gemäß der Kategorisierung der .ini-Dateien.
Also: Nur noch neue Plugins installieren, Updates machen, die Installationen sonst nie mehr anrühren, außer vielleicht die Plugins bei Bedarf mit Automap wrappen. Dann den PluginManager starten und schon steht das Plugin mit einheitlichem Namen für Presets und mit je host individuell möglichen jBridge-Einstellungen wie gewünscht sortiert in den Hosts zur Verfügung.