Aide à l'algorithme de modulation de la hauteur de l'oscillateur à l'aide du LFO

8

Je développe une émulation logicielle d'un synthétiseur analogique. J'essaie de moduler la hauteur d'un oscillateur en utilisant un LFO. Pour chaque échantillon envoyé au système audio de l'ordinateur, je calcule la fréquence à entrer dans l'oscillateur principal comme ceci (pseudocode):

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

Les variables de cette instruction sont décrites comme suit:

  • note_frequency = fréquence de la note à jouer en Hz
  • accord = réglage fin de l'oscillateur en pourcentage de la hauteur jouée (ex: -0,02 = désaccord de 2%)
  • lfo_y = valeur y actuelle de la forme d'onde lfo (varie de -1 à 1)
  • lfo_mod_depth = profondeur / intensité de l'effet à appliquer à l'oscillateur en pourcentage

Cependant, ce calcul ne donne pas le résultat souhaité. Je m'attends à entendre la hauteur moduler de haut en bas, verrouillée autour de la fréquence centrale (note jouée). Ce que j'obtiens, c'est un effet de modulation qui fait "fuir" la hauteur; Je ne peux pas dire exactement ce qui se passe, mais cela ressemble à l'un d'eux:

  1. L'intensité de la modulation augmente avec le temps (la marque de haute / basse fréquence atteinte par la modulation augmente / diminue plus la note est maintenue)
  2. Alors que l'intensité de modulation reste constante dans le temps, la fréquence centrale augmente tandis que la modulation oscille autour d'elle

Suis-je en train d'utiliser la bonne approche ou non? Sinon, quelle devrait être la bonne approche? Toute aide à cet égard est très appréciée.

Gary DeReese
la source
2
Ce qui est le plus important, c'est ce que vous faites avec la fréquence d'oscillateur souhaitée. Vous rencontrez peut-être un problème similaire à cette question . Vous devriez avoir un accumulateur de phase qui garde une trace de la phase du signal de sortie à chaque pas de temps, le mettant à jour en fonction de la fréquence souhaitée à chaque échantillon de sortie. Plus d'informations peuvent être trouvées ici .
Jason R
Votre référence à un accumulateur de phase m'a amené à chercher à utiliser la synthèse de table d'onde au lieu de l'approche plus naïve que j'utilisais dans mon oscillateur. Une fois que j'ai retravaillé ma conception (intégrant également les conseils décrits par la réponse @pichenettes), j'ai obtenu les résultats que je cherchais. Merci!
Gary DeReese

Réponses:

7

Comme l'a dit Jason, cela pourrait simplement être que vous n'implémentez pas correctement votre oscillateur - par exemple en multipliant la fréquence par le temps au lieu de l'intégrer.

Notez également - et cela n'est pas lié à votre sujet mais mérite vraiment d'être observé - que votre formule de modulation de fréquence met en œuvre un comportement très différent de celui de la plupart des synthétiseurs, et sonne étrangement pour un musicien.

Par exemple, si lfo_y oscille entre -1 et 1; lfo_mod_depth vaut 0,5; et si note_frequency est égal à 220 Hz, osc_frequency balaiera entre 110 et 330 - c'est-à-dire entre -1 octave et +1 cinquième autour de la note. Ainsi, la modulation de hauteur apparaîtra centrée sur l'échelle hertz, mais ne sera pas centrée sur l'échelle musicale perceptuelle.

Le comportement correct est d'avoir quelque chose comme:

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

Alors:

  • l'accordage est exprimé en cents , une unité musicalement pertinente (100 cents = 1 demi-ton).
  • votre modulation de hauteur est "musicalement centrée" et lfo_mod_depth est exprimé en octaves .

C'est ce qu'on appelle "FM exponentielle", et c'est la norme sur les synthétiseurs. Sur les synthétiseurs analogiques, cela est mis en œuvre en additionnant le signal LFO au CV qui frappe le convertisseur exponentiel du VCO. Sur les synthétiseurs numériques, cela est mis en œuvre en appliquant les modulations sur une représentation interne haute résolution de la hauteur qui est toujours à l'échelle musicale - avant de la convertir en fréquence ou en incrément de phase.

pichenettes
la source
Merci. Bien que ce ne soit pas au cœur de mon problème, c'est en effet un moyen plus sensé d'exprimer et de calculer la fréquence de l'oscillateur pour mon application, et après l'avoir implémentée, semble fonctionner correctement.
Gary DeReese