Inkremental
Abb.15.JPG
Abb.15 zeigt, welche Module zur Errechnung des Inkrementals aus der Ursprungsstruktur aus Abb.03 (grüner Rand) durch Reaktor-eigene Makros (gelber Rand) ersetzt wurden.
Die über Midi eingebene Tonhöhe ist logarithmisch in Halbtöne eingeteilt und wird im P2F-Konvertierer in eine lineare Frequenzeinteilung in Hertz gewandelt. Die Frequenz wird durch die Samplerate geteilt und ergibt dann den Inkrementalwert.
Die Erhöhung pro Sample ist unter Anderem anghängig von der Samplerate. Je öfter die SR.C pro Sekunde tickt, desto geringer muss der Inkrementalwert sein und vice versa, um die resultierende Oszillatorfrequenz bei Änderung der Samplerate nicht zu verschieben.
Eine stets aktuelle Information über die Samplerate (
SR.R) liefert uns der Samplerate-Bus.
Außerdem muss
max bekannt sein und auch in die Inkrementalberechnung einfließen.
Das Ganze ermittelt sich dann mit folgender Formel:
inc = 2*max*f/fSR, wobei
max der maximale Amplitudenwert der Phase (bzw den halben Werteumfang des gefalteten Zahlenbereichs),
f die Frequenz des Oszillators in Hertz und
fSR die Samplerate ausdrückt.
Nur wenn all diese Werte in die Inkrementalberechnung einfließen, wird der Oszillator in der korrekten Tonlage zählen.
Aber die Formel will irgendwie nicht zu ihrer Implementation in unserer Struktur passen und trotzdem wird die Tonlage "korrekt" wiedergegeben. Die Anzahl der Terme stimmt nicht überein.
Abb.16.JPG
Wer gut aufgepasst hat, wird auch gleich sehen, dass die Struktur so sehr richtig gedacht ist, wenn man einfach mal die gegebenen Werte in die Formel einsetzt:
geg: max = 0.5; f
SR= SR.R
inc = 2 * 0.5 * f / SR.R = f/SR.R
So stimmt die Anzahl der Terme mit der Struktur überein. Zu beachten ist nur, dass der halbe Werte-Umfang des gefalteten Signals in der Zählschleife mit
max übereinstimmt. Zur Erinnerung: das Faltungsmakro soll das Signal um
2*max abfallen lassen, wenn
max überschritten wird.
Die Faltung hängt also unmittelbar mit der Inkrementalberechnung zusammen.
Die Herleitung der Inkrementalformel ist auch nicht schwer:
Wir wissen, dass die
SR.C in unserem Beispiel 48000 also
SR.R mal in der Sekunde tickt (Abb.07).
Ein Inkremental von
inc = 1/SR.R bewirkt also grob gesagt, dass die
Amplitude der Phase
auf dem ersten Tick
A = 1/SR.R (= 1*inc),
und auf dem SR.R.ten (48000.) Tick
A(ungefaltet) = SR.R/SR.R = 1 (= SR.R*inc) ist.
Die ungefaltete Amplitude der Phase erhöht sich in einer Sekunde von ihrem Minimum auf ihr Maximum, hat also eine Frequenz von f = 1Hz.
Also kann man sagen, dass der Inkremental
2*max/SR.R eine Frequenz von 1Hz ergibt. Dieser Inkremental ist jetzt einfach mit der gewünschten linearen Frequenzangabe zu multiplizieren. Es gilt also
inc =2*max/SR.R * f, wobei wir einfach umgestellt wieder bei der oben genannten Formel
inc = 2*max*F/SR.R sind.
Man kann
max, entsprechend den Primary-Oszillatoren, mit
A bezeichnen. Es steht ja für den maximalen Amplitudenwert. Von daher sagen wir ab jetzt
max = A!
Also
inc = 2*A*F/SR.R
Eine Division erfordert höhere Rechenleistung als andere arithmetische Rechnungen. Solange man Divisionen durch "komplexere" Zahlen vermeiden kann, dann macht man das. Um die CPU etwas zu entlasten wird der Divisionsterm auch hier "vereinfacht".
Anstatt die eingegebene (variable) Frequenz durch die Samplerate zu teilen, multipliziert man die Frequenz mit dem Kehrwert der Samplerate, und erreicht so eine konstante Division, sprich: (2*A/f
SR) * f =
(1 / SR.R) * F (für A=0.5)
P2F-Makro
Das P2F-Makro (Abb.15) beinhaltet eine Exponentialfunktion, welche die logarithmische Tonhöhenangabe in Halbtönen in eine lineare Frequenzangabe in Hertz umwandelt und lautet: (1.05946^P) * 8.17742 = F, wobei P die logarithmische Tonhöhenangabe ist.
~1.05946 ist die ungefähre 12. Wurzel aus 2 und beschreibt das Verhältnis der Frequenz zweier benachbarter Halbtöne.
Also A#3 : A3 = 466,1616377615... Hz : 440 Hz = 1.059463094... : 1
~8.17742 ist die ungefähre Frequenz bei P = 0. Und so birgt das Reaktor-Makro ein paar Rundungsfehler. Es sind nur ungefähre Werte und die Funktion ist nur eine vereinfachte Darstellung der Formel.
Abb.17.JPG
Abb.17: links die Formel zur nahezu exakten Umrechnung der Tonhöhe P(log) in die Frequenz F(lin)
rechts das "gerundete" Reaktor-eigene P2F-Makro
Die Basis in der Expontialfunktion und die Konstante als Faktor hinter exp(x) können nicht beliebig viele Nachkommastellen darstellen. Wenn einem höchste Tonhöhengenauigkeit wichtig ist, dann wählt man den Ausdruck mit der 2 als Basis, also
F(P) = 2 ^ [(P - 69) / 12] * 440Hz
Core-Modul:
~exp(x): Built-In Module -> Math -> ...[/i]