Hilfe beim Algorithmus zur Modulation der Oszillatortonhöhe mit LFO

8

Ich entwickle eine Software-Emulation eines analogen Synthesizers. Ich versuche, die Tonhöhe eines Oszillators mit einem LFO zu modulieren. Für jedes Sample, das dem Soundsystem des Computers zugeführt wird, berechne ich die Frequenz, die wie folgt in den Hauptoszillator eingegeben werden soll (Pseudocode):

osc_frequency = note_frequency * (1 + tuning) * (1 + lfo_y * lfo_mod_depth)

Die Variablen in dieser Anweisung werden wie folgt beschrieben:

  • note_frequency = Frequenz der zu spielenden Note in Hz
  • Tuning = Feinabstimmung des Oszillators in Prozent der gespielten Tonhöhe (Beispiel: -0,02 = Verstimmung um 2%)
  • lfo_y = aktueller y-Wert der lfo-Wellenform (reicht von -1 bis 1)
  • lfo_mod_depth = Tiefe / Intensität des Effekts, der auf den Oszillator in Prozent angewendet werden soll

Diese Berechnung liefert jedoch nicht das gewünschte Ergebnis. Ich erwarte, dass sich die Tonhöhe auf und ab moduliert, um die Mittenfrequenz herum (Note wird gespielt). Was ich bekomme, ist ein Modulationseffekt, der bewirkt, dass die Tonhöhe "wegläuft"; Ich kann nicht genau sagen, was passiert, aber es klingt wie eines davon:

  1. Die Modulationsintensität nimmt mit der Zeit zu (die durch die Modulation erreichte Hoch- / Niederfrequenzmarke wird höher / niedriger, je länger die Note gehalten wird).
  2. Während die Modulationsintensität über die Zeit konstant bleibt, steigt die Mittenfrequenz an, während die Modulation um sie herum schwingt

Benutze ich den richtigen Ansatz oder nicht? Wenn nicht, wie sollte der richtige Ansatz aussehen? Jede Hilfe dabei wird sehr geschätzt.

Gary DeReese
quelle
2
Am wichtigsten ist, was Sie mit der gewünschten Oszillatorfrequenz machen. Möglicherweise stoßen Sie auf ein ähnliches Problem wie bei dieser Frage . Sie sollten einen Phasenakkumulator haben, der die Phase des Ausgangssignals bei jedem Zeitschritt verfolgt und sie bei jedem Ausgangsprobe entsprechend der gewünschten Frequenz aktualisiert. Weitere Infos finden Sie hier .
Jason R
Ihr Hinweis auf einen Phasenakkumulator veranlasste mich, die Wavetable-Synthese anstelle des naiveren Ansatzes zu verwenden, den ich in meinem Oszillator verwendete. Nachdem ich mein Design überarbeitet hatte (einschließlich der von @pichenettes answer beschriebenen Tipps), erhielt ich die gewünschten Ergebnisse. Vielen Dank!
Gary DeReese

Antworten:

7

Wie von Jason gesagt, kann dies einfach daran liegen, dass Sie Ihren Oszillator nicht richtig implementieren - beispielsweise indem Sie die Frequenz mit der Zeit multiplizieren, anstatt sie zu integrieren.

Beachten Sie auch - und dies hat nichts mit Ihrem Thema zu tun, ist aber wirklich eine Beobachtung wert -, dass Ihre Formel für die Frequenzmodulation ein Verhalten implementiert, das sich stark von dem der meisten Synthesizer unterscheidet und für einen Musiker unheimlich klingt.

Zum Beispiel, wenn lfo_y zwischen -1 und 1 schwingt; lfo_mod_depth ist 0,5; und wenn note_frequency gleich 220 Hz ist, bewegt sich osc_frequency zwischen 110 und 330 - das heißt zwischen -1 Oktave und +1 Fünftel um die Note. Die Tonhöhenmodulation scheint also in der Hertz-Skala zentriert zu sein, aber nicht in der wahrnehmungsmäßigen Musikskala.

Das richtige Verhalten ist so etwas wie:

osc_frequency = note_frequency * 2 ** (tuning / 1200.0 + lfo_y * lfo_mod_depth)

Dann:

  • Die Stimmung wird in Cent ausgedrückt , einer musikalisch relevanten Einheit (100 Cent = 1 Halbton).
  • Ihre Tonhöhenmodulation ist "musikalisch zentriert" und lfo_mod_depth wird in Oktaven ausgedrückt .

Dies wird als "exponentielles FM" bezeichnet, und dies ist die Norm bei Synthesizern. Bei analogen Synthesizern wird dies implementiert, indem das LFO-Signal zu dem CV summiert wird, der auf den Exponentialwandler des VCO trifft. Bei digitalen Synthesizern wird dies implementiert, indem die Modulationen auf eine hochauflösende interne Darstellung der Tonhöhe angewendet werden, die sich noch auf einer musikalischen Skala befindet - bevor sie in eine Frequenz oder ein Phaseninkrement umgewandelt wird.

Pichenettes
quelle
Vielen Dank. Obwohl dies nicht der Kern meines Problems war, ist dies in der Tat eine sinnvollere Methode, um die Oszillatorfrequenz für meine Anwendung auszudrücken und zu berechnen, und scheint nach der Implementierung gut zu funktionieren.
Gary DeReese