ANZEIGE
ANZEIGE
ANZEIGE

Workshop: Replicant A – Synthesizerkonstruktion mit NI Reaktor, Teil 3

(ID: 1546)

Aber zurück zum monophonen Modus. Ein „analoger“ Mono Mode hat die Eigenart, dass bei polyphonem Legatospiel der Ton stets auf eine gehaltene Note zurückspringt, wenn man die neueste loslässt.
Auch das Gate bedarf einer Sonderbehandlung für einen analogen Mono-Mode, da es bei neuen Noten nicht neu ausgelöst werden soll, solange man Legato spielt. Reaktor hat zwar ein Single Triggered Gate, das aber im einstimmigen Modus abschaltet, wenn man die neuste Note loslässt. Im mehrstimmigen Modus funktioniert es mit dem normalen Gate und einem Select Max oder Min, aber dann spielt man unfreiwillig unisono.

Ein „analoges“ Single Triggered Gate kann man so realisieren:

ANZEIGE
Monophones Legato Gate

Monophones Legato Gate

das funktioniert auch im Poly- und (beabsichtigten) Unisonomodus, unabhängig von der eingestellten Stimmenzahl. Solange irgendeine Note gehalten wird, wird das Gate nicht neu ausgelöst.

Die Ermittlung der Mono-Note sieht so aus: Aus den polyphonen Noten wird mit einem from Voice und der Current Voice Number die monophone Note herausgefiltert und an alle Stimmen weitergeleitet (siehe oben beim Bild des MonoGP). Die Verwendung der aktuellsten Stimme in der Prioritätsschaltung ist einer Highest/Lowest-Note-Priority vorzuziehen, da sie spieltechnisch vielseitiger ist.
Die Zahl der Stimmen muss und darf im Mono Mode nicht reduziert werden, denn dann funktioniert das MonoGP nicht. Sie entspricht dem „Speicherplatz“, den die Auswertung zur Verfügung hat, man kann so viele Noten legato spielen, wie man Stimmen eingestellt hat (unisono durch die Zahl der Uni-Voices geteilt). Reduziert man auf eine Stimme, reisst der Klang wieder ab beim Loslassen der zuletzt gespielten Note.

Damit nun nicht alle Stimmen erklingen, sondern nur die Mono-Stimme, werden die Notenwerte der Poly-Noten und der Mono-Note mit einem Compare/Equal verglichen, und wenn sie übereinstimmen, wird für die entsprechende Stimme eine 1 statt einer 0 wie bei den anderen ausgegeben. Diese 0/1-Events multiplizieren wir nun als „Voice Select“ mit der Lautstärke-Envelope des VCAs und schalten damit alle Stimmen außer der Mono-Stimme ab (im Unisono-Modus sind es mehrere Stimmen, die eine 1 erhalten und damit auch erklingen). Nun kann man unser Reaktor-Instrument wie einen analogen Monosynth spielen.

Voice Select für den Mono Mode

Voice Select für den Mono Mode

Es ist nicht zwingend, das Single-Triggered-Gate im Mono-Mode zu verwenden, man kann auch ganz einfach das normale Gate nehmen und die Hüllkurven etc. bei jedem Anschlag neu starten. Um die Sache perfekt zu machen, bauen wir noch ein Retrigger-Gate, das auch beim Loslassen einer Taste neu auslöst, nur nicht bei der letzten. So wird im polyphon gespielten Mono-Mode simuliert, dass man die Note, auf die die Tonhöhe zurückspringt, neu angeschlagen hätte. Das erfordert eine spezielle Spielweise, da ja das Timing des Note-Off sehr wichtig wird, aber mit ein bisschen Übung können selbst mäßig begabte Tastendrücker (wie meine Wenigkeit) rasend schnelle Läufe spielen, die auf einen begnadeten Virtuosen vom Kaliber eines Jan Hammer oder George Duke schließen lassen.

Dafür wird das Legato-Gate durch Note Off mit einem invertierten Trigger aus einem Hold unterbrochen und mit Hilfe eines aktive-Stimmen-Zählers (Counter) die Unterbrechung bei der letzten gehaltenen Note abgeschaltet.

Gates und Triggers für ADSR, LFO und VCO

Gates und Triggers für ADSR, LFO und VCO

Der Zähler ist eine etwas stupide Schaltung, es werden  die 0-1-Gatesignale der Stimmen mit from Voice isoliert und aufaddiert.

Der Stimmenzähler (Counter)

Der Stimmenzähler (Counter)

Eigentlich geht das eleganter mit dem Counter-Modul, das aber bei Umschaltungen mit nachfolgenden Schaltern irgendwelche Events auf die Eingänge bekommt, die die Zählung verpfuschen. Eine Konstruktion aus Audio Combiner (auch die addiert die Werte aller Stimmen) mit anschließender A/E-Wandlung verzögert das Zählersignal, so dass es dann ebenfalls für unsere Zwecke unbrauchbar wird.
Also ist unser Counter etwas primitiv, aber er tut was er soll. Nur die Zahl der ausgewerteten Stimmen ist begrenzt, hier auf 32, aber das lässt sich problemlos erweitern.

Wir brauchen auch verschieden aufbereitete Gates, da die LFOs und Oszis zwingend einen Nulldurchgang, aber nur einen kurzen Trigger für die Synchronisation brauchen. Die Envelopes können auf den Nulldurchgang verzichten, brauchen aber ein Gate. Mit einem weiteren Hold-Modul machen wir also aus den Gates kurze Trigger-Pulse. Ihre Dauer ist abhängig von der Control Rate, da sie ja nicht kürzer sein darf als ein Rechenzyklus, sonst passiert nichts.
Für den Mono-Mode sind die normalen Trigger auch anders, da sie „monophonisiert“ an die jeweiligen Empfänger aller Stimmen geleitet werden müssen, damit diese sich wie ein Mono-Modul verhalten. Mit einem Poly-Trigger würden diese unterschiedliche Zustände annehmen.

ANZEIGE

Für den Retrigger braucht man neben der Zahl der gehaltenen Stimmen aus unserem Counter auch die Zahl eventueller Unisono-Stimmen. Die wird leider weder vom entsprechenden Wert in den Instrument Properties noch vom Voice Info-Modul korrekt angegeben! Ein Bug, der uns nun schon über einige Updates erhalten geblieben ist… wir berechnen das also richtig als R(eal)Max und verarzten nebenbei das Spread so, dass es unabhängig von der Stimmenzahl einen konstanten Bereich hat und symmetrisch um den Nullwert verteilt wird.

Unisono Detune und Unisono Voice Counter (RMax)

Unisono Detune und Unisono Voice Counter (RMax)

Die verschiedenen Trigger/Gate-Signale sind dann auf dem Panel folgendermaßen bezeichnet:

Legato = nur bei non-Legato-Noten wird neu ausgelöst
Trigger = bei jeder Note wird neu ausgelöst
Retrigger = bei jeder Note und bei jedem Note Off außer dem letzten wird neu ausgelöst

Bei den Envelopes ist es natürlich ein Gate, aber der Einfachheit halber vereinheitlichen wir die Bezeichnungen mal, da die Unterscheidung hier nur technisch relevant ist.

Legato und Retrigger sind für den Mono-Mode gedacht, aber es stehen alle Trigger in beiden Modi zur Verfügung. Das ist durchaus einsetzbar, man kann z.B. im Poly-Mode das Filter mit einer Legato-getriggerten Hüllkurve steuern und so über legato gespielte Noten einen Sweep fahren, zusätzlich zu einer normal getriggerten Hüllkurve, da der Trigger bei jeder Envelope individuell wählbar ist. Damit man nun nicht bei jedem Mono/Poly-Wechsel alle Trigger neu einrichten muss, sind die Trigger-Umschalt-Menüs in allen getriggerten Modulen (VCOs, LFOs und Envelopes) für beide Modi separat vorhanden und werden mit dem Mono-Poly-Schalter als Master umgeschaltet und gleichzeitig mittels Stacked Macro ein- und ausgeblendet. Es sind also völlig unterschiedliche Settings für Mono- und Poly-Modus.

Der Mono-Poly-Schalter ist auch der einzige Schalter im ganzen Instrument, der modulübergreifend verkoppelt ist (Modul hier im Sinne von Synthesizer-, nicht Reaktor-Modul), alle anderen sind nur innerhalb der Module miteinander verknüpft.

Für ein amtliches Vintage-Solo braucht man natürlich auch noch Portamento. Ein Constant-Rate-Portamento mit Halbton/Sekunde-Skalierung realisiert man mit einem Slew-Limiter, mit einem nachgeschalteten Quantizer wird daraus ein Glissando.
Ein Constant-Time-Portamento realisiert man mit einem Lopassfilter. In der Library findet man auch einen einstellbaren Smoother, ein Core-Modul. Er hat aber eine sehr exponentielle Kennlinie, das ist hier eher unschön.

Portamento/Glissando mit Constant Rate/Time

Portamento/Glissando mit Constant Rate/Time

Leider haben alle Filter und EQs wie auch der einstellbare Smoother Probleme, den Zielwert sauber zu erreichen (ein „Gleichstrom“-Problem der Filter), sie geben bei hohen Portamento-Zeiten einen Offset auf den Notenwert, der durchaus einige Cent erreichen kann. Den herauszurechnen ist praktisch unmöglich, da er von der Reihenfolge der eintreffenden Noten abhängig ist. Die einzige Lösung ist, das Portamento mit einem Hold-Modul, das mit der Note getriggert wird, nach Ablauf der Gleitzeit abzuschalten.
Das Poly-Portamento ist besonders knifflig. Aufgrund der etwas chaotischen Noten/Stimmenzuordnung in Reaktor ist es schwer zu steuern, welche Note wann wohin gleitet, und es ist abhängig von der Spielweise und der Assign-Einstellung in den Instrument Properties. Das kann man besser machen, es wird nur ein wenig kompliziert. Im Prinzip funktioniert es folgendermaßen:
Die Mono-Noten laufen durch das Portamento, werden in einem Merger mit den Poly-Noten zusammengeführt und die beiden Datenströme überschreiben sich durch verschieden getriggerte Value-Module gegenseitig.

Um das Portamento auf die richtige Note (bzw. die Noten im Unsiono-Mode) zu leiten, wird wieder mit einem Compare/Equal-Modul der Poly- mit dem Mono-Notenwert verglichen, und das schaltet das Portamento per Relais durch. Dafür brauchen wir die Newest Voice Number, die so ermittelt wird:

Newest Voice Detector

Newest Voice Detector

Das Poly-Portamento-Assign sieht dann so aus …

Die Poly-Portamento-Schaltung

Die Poly-Portamento-Schaltung

… und liefert zwei Modi. Bei einem läuft das Portamento von der vorigen zur neuesten Note und auch wieder zurück, nicht jedoch zu einer noch älteren, wenn das Portamento seinen Zielwert erreicht hat. Das ist natürlich nur hörbar, wenn eine Release-Phase bei der Lautstärkehüllkurve eingestellt ist. Wird die neue Note losgelassen, bevor das Portamento sie erreicht hat, tut dieses genau das, was man erwartet, es läuft vom aktuell erreichten Wert zur älteren Note zurück.
Beim anderen Modus läuft das Portamento ausschließlich von der vorigen zur neuesten Note, aber nicht zurück. Damit man nun bei unterbrochenem Portamento in Release-Phasen nicht auf halbem Weg hängen bleibt, wird es vom Notenwert der losgelassenen neusten Note überschrieben, es springt dann also auf den korrekten Zielwert.

Ein „echtes“ Poly-Portamento, bei dem mehrere Noten gleichzeitig gleiten, ist das so nicht. Es gibt noch andere Implikationen beim Poly-Portamento, je nach Timing und Reihenfolge der gespielten Noten. Ich habe mal diversen Synths in dieser Hinsicht auf den Zahn gefühlt, bei manchen ist es ganz brauchbar, andere drücken sich drum herum und bieten nur monophones Portamento (wie einige der NI-Synths…!), anscheinend bereitet das Thema auch den Profis ein wenig Kopfzerbrechen. Aber vielleicht stehe ich ja nur auf dem Schlauch und jemand hat ein geniales Macro gebastelt, das er für unser Projekt zur Verfügung stellt. Also mache ich mal den Captain Picard, frage in die Runde: „Vorschläge?“ und warte auf die Ideen der Mannschaft… („Wir müssen nur die Sensorenphalanx rekalibrieren und den Deflektorschirm mit einer rotierenden Modulation versehen, Sir.“ – „Machen Sie es so!“).

ANZEIGE
Forum
  1. Profilbild
    herw RED

    Hallo Holger,

    vielen Dank für deine sehr umfangreiche Reihe über Reaktor. Ich habe bisher nur quer lesen können und einen kurzen Blick in die Struktur geworfen; trotzdem kann man unschwer erkennen, dass viel Arbeit dahinter steckt. Ich werde noch intensiv nachlesen.
    Mir ist aufgefallen, dass du an genau den Stellen über REAKTOR Kritik äußerst, an denen es um Event-Verarbeitung geht.
    Dies ist kein Wunder, da du, so weit ich das überblicke, ausschließlich auf dem Primary-Level arbeitest.
    Hier ist die Reihenfolge der Events nun mal nicht (logisch) gleichzeitig, sondern „nur” sequentiell.
    Die Reihenfolge, mit der Events verarbeitet werden, ist hoch komplex und auf der primary-Ebene nur schwer und umständlich zu kontrollieren.
    Nicht alles, was logisch hintereinander ausgeführt erscheint, hat auch genau diese Reihenfolge.
    Zu unterscheiden sind GUI-events, die völlig unabhängig zu jeder Zeit geschehen, audio-basierte Events (meist getaktet mit 400Hz) und natürlich audio-getaktete events mit sample-Rate 44100Hz z.B.
    Wenn man absolute (und eher einfache) Kontrolle über die Reihenfolge von Events haben möchte, muss man meiner Ansicht nach auf die Core-Ebene übergehen.
    Nichtsdestotrotz ist dein Ensemble sehr interessant und gibt viel Freiraum für Experimente.

    Danke!

    herw

    • Profilbild
      h.gerdes AHU

      @herw Hi herw, Dank zurück für das Feedback. Jep, da steckt die Freizeit von drei Monaten drin…
      Für Core-Ebene braucht man solide DSP-Kenntnisse, oder halt viel Einarbeitungszeit. Als eigentlich-Musiker möchte ich da nicht Jahre mit verbringen, und ich denke, viele Andere auch nicht. Das ist eher die Domäne von Programmierern. Wenn man sich die Events mit dem „Event History“ genau anguckt, dann kann man auch auf dem Primary Level gezielt einzelne Daten filtern, verzögern usw. Aber alles kriegt man da nicht gebacken, das stimmt. Umso dankbarer bin ich für Macros wie das „Mono GP“, das hat ein Riesenproblem beseitigt. Und es zeigt, wie knifflig scheinbar einfache Prozesse sein können…
      Dann noch viel Spaß beim Lesen, im letzten Teil kommt die Wavetable- und Phase Distortion- Abteilung dran.

  2. Profilbild
    herw RED

    kleiner Nachtrag zu den Send-Reiceive-Verbindungen:
    dies wird leider ein schon seit Jahren vernachlässigt.
    Sie sind vom Konzept her völlig falsch implemetiert, insbesondere das Kopieren liefert keine Kopie, sondern ein Durcheinander in den receive-Listen.
    Schade, ein sehr mächtiges Werkzeug wird hier stiefmütterlich behandelt.
    So hilft es nur, wie du beschreibst, selbst Hand anzulegen, oder höchste Disziplin beim Kopieren, Einfügen und Nichtlöschen einmal eingesetzter Send-Module.

    herw

    • Profilbild
      h.gerdes AHU

      @herw Immerhin sind die Send/Receive jetzt einigermaßen editierbar, das war in der letzten Version ja eine Katastrophe. Und wenn man das Häkchen entfernt bei „automatic use of new sends“, dann klappt auch das Kopieren. Bleibt zu hoffen, dass NI das noch verbessert und weiterentwickelt, so dass man auch Events zusammen mit Audio damit routen kann, ohne den Overload zu verursachen.

Kommentar erstellen

Die AMAZONA.de-Kommentarfunktion ist Ihr Forum, um sich persönlich zu den Inhalten der Artikel auszutauschen. Sich daraus ergebende Diskussionen sollten höflich und sachlich geführt werden. Politische Inhalte und Statements werden durch die Redaktion gelöscht.

Haben Sie eigene Erfahrungen mit einem Produkt gemacht, stellen Sie diese bitte über die Funktion Leser-Story erstellen ein. Für persönliche Nachrichten verwenden Sie bitte die Nachrichtenfunktion im Profil.

ANZEIGE
ANZEIGE
ANZEIGE
ANZEIGE
X
ANZEIGE X