ein kleiner, aber wichtiger Zwischenschritt:
nach langen Versuchen ist es mir gelungen, dass die Initialisierung von polyphoner Signalverarbeitung (poly SVA) und monophoner Signalverarbeitung (mono-SVA) ohne Eingriff durch den User automatisch erfolgt. Ein wichtiger Schritt, die Modularität so einfach wie möglich zu gestalten.
Polyphone und monophone Container (im Wesentlichen Effekte) vertragen sich nicht in einer einzigen CoreCell. Damit die Zuweisung von Parametern (Regler, Taster etc.) korrekt erfolgt, muss jeder Container eine Nummer zugewiesen werden, ebenso den Ein- und Ausgängen.
Die Nummerierung erfolgt automatisch beim Starten des Instruments über einen Eventbus. Der Eventbus übergibt seine Daten sowohl an die poly-SVA als auch an die mono-SVA.
Dabei werden die Daten von Container zu Container übergeben und entsprechend der im Container benutzten Ein- und Ausgänge erhöht. Soweit so gut, nur irgendwann kommt man an den letzten polyphonen Container; und wie übergibt man nun aus der CoreCell den Datenbus an die monophone CoreCell? Da es sich um AudioCoreCells handelt, gibt es keinen Eventausgang. Einzelne getriggerte Events lassen sich über Geralds AudioEventAusgang übergeben, eine Nachricht per Bus dagegen nicht.
Also musste ich bisher die nötigen Daten (Containerzahl C#, Ausgangszahl O# und Eingangszahl I#) des letzten poly-Containers einzeln abfragen und mir außerhalb der CoreCell ausgeben lassen.
bild_1.jpg
Diese Werte habe ich dann als Konstante für die mono SVA eingetragen. Nicht schlimm, aber extrem Benutzerunfreundlich, da ich es oft vergaß und mich wunderte, dass mein modular nichts verstand und die falschen Verknüpfungen erstellte.
Nun, es gibt einen Trick: beim Start eines modulars werden über den Bus mehrere Initialisierungsnachrichten geschickt:
die erste ist für die Nummerierungen der poly Core-Container, dann die Panels (primary-Container) und noch einiges. Die zweite Nachricht ist nur für die Primary-Container gedacht und führt dieselben Nummerierungen durch wie die Core-Initialisierung.
Ich konnte also hinter dem letzten polyContainer auf Primary-Ebene die Werte C#, O# und I# abfragen.
Soweit so gut, jetzt musste ich nur die Werte in den Bus einschleusen. Das ist nicht einfach, da der Bus ja auf dem partials framework basiert und somit in Core-Ebene streng das
Gleichzeitigkeitaxiom beachtet („
Alle Events, die aus ein und derselben Quelle entstehen, sind als gleichzeitig anzusehen und werden entsprechend verarbeitet.”).
Wenn ich nun aus der primary-Initialisierung die Daten C#, O# und I# isoliere und direkt wieder in den Bus einfügen möchte (als Nachricht), dann überschreiben sie beim nötigen merge-Modul die ursprünglichen Daten, zerstören also die Initialisierungsnachricht.
Da es in core keine order-Module und keine Iteration gibt, muss eine neue Nachricht erzeugt werden. Doch woher kommt dann der auslösende Trigger und erfolgt er zum richtigen Zeitpunkt?
Es gibt aber einen Trick. Direkt hinter der primary-Intialisierungsnachricht schicke ich eine Dummie-Nachricht (id,3,C#,O#,I#) mit den Werten C#=O#=I#=0. Gelangt nun die primary-Initialisierung an den letzten poly-Container, dann werden aus ihr die Daten für C#, O# und I# extrahiert und zwischengespeichert. Gelangt nun anschließend die Dummienachricht an denselben Container, dann kann ich die aktuellen Werte C#, O# und I# überschreiben und mit einem Merger einfädeln.
Diese Nachricht wird dann nur von der mono-SVA empfangen:
bild_2.jpg
Im Bild sieht man , wie die primary-Nachricht (mit dem Identifier 0) die Werte abfragt. Wegen der strikten Reihenfolge gelangt als nächstes die Dummienachricht (mit dem identifier -6) in die Zelle und trägt die Werte ein.
Es ist hier klar ein Vorteil, wenn alle Nachrichten über einen einzigen Bus geführt werden.
Nun sieht es also so aus:
bild_3.jpg
sehr klar und einfach.
Interessanterweise ist dies für mich immer ein Kennzeichen, dass eine Lösung (wenn sie denn funktioniert) die optimale Version erreicht hat.

Ich finde es einfach herrlich, wenn REAKTOR immer wieder zu solchen Optimierungen auffordert.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.