Ayuda con algoritmo para modular el tono del oscilador usando LFO

8

Estoy desarrollando una emulación de software de un sintetizador analógico. Estoy tratando de modular el tono de un oscilador usando un LFO. Para cada muestra alimentada al sistema de sonido de la computadora, estoy calculando la frecuencia que se ingresará en el oscilador principal de esta manera (pseudocódigo):

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

Las variables en esta declaración se describen a continuación:

  • note_frequency = frecuencia de la nota que se reproducirá en Hz
  • afinación = ajuste fino del oscilador en porcentaje del tono jugado (ej .: -0.02 = desintonizar en 2%)
  • lfo_y = valor actual y de la forma de onda lfo (rangos de -1 a 1)
  • lfo_mod_depth = profundidad / intensidad del efecto a aplicar al oscilador en porcentaje

Sin embargo, este cálculo no produce el resultado deseado. Espero escuchar el tono modular arriba y abajo, bloqueado alrededor de la frecuencia central (se reproduce la nota). Lo que obtengo es un efecto de modulación que hace que el tono "se escape"; No puedo decir exactamente qué está sucediendo, pero parece uno de estos:

  1. La intensidad de la modulación aumenta con el tiempo (la marca de frecuencia alta / baja alcanzada por la modulación aumenta / disminuye cuanto más tiempo se mantenga la nota)
  2. Mientras que la intensidad de la modulación permanece constante a lo largo del tiempo, la frecuencia central aumenta mientras la modulación oscila a su alrededor.

¿Estoy usando el enfoque correcto o no? Si no, ¿cuál debería ser el enfoque correcto? Cualquier ayuda con esto es muy apreciada.

Gary DeReese
fuente
2
Lo más importante es lo que haces con la frecuencia del oscilador deseada. Es posible que tenga un problema similar a esta pregunta . Debe tener un acumulador de fase que realice un seguimiento de la fase de la señal de salida en cada paso de tiempo, actualizándola de acuerdo con la frecuencia deseada en cada muestra de salida. Más información se puede encontrar aquí .
Jason R
Su referencia a un acumulador de fase me llevó a considerar el uso de síntesis de tabla de ondas en lugar del enfoque más ingenuo que estaba usando en mi oscilador. Una vez que reelaboré mi diseño (también incorporando los consejos descritos por @pichenettes answer), obtuve los resultados que estaba buscando. ¡Gracias!
Gary DeReese

Respuestas:

7

Como dijo Jason, esto podría ser simplemente que no está implementando su oscilador correctamente, por ejemplo, multiplicando la frecuencia por el tiempo en lugar de integrarlo.

Tenga en cuenta también, y esto no está relacionado con su tema, pero realmente vale la pena observarlo, que su fórmula para la modulación de frecuencia implementa un comportamiento muy diferente al de la mayoría de los sintetizadores y sonará extraño para un músico.

Por ejemplo, si lfo_y oscila entre -1 y 1; lfo_mod_depth es 0.5; y si note_frequency es igual a 220 Hz, osc_frequency barrerá entre 110 y 330, es decir, entre -1 octava y +1 quinto alrededor de la nota. Por lo tanto, la modulación de tono parecerá estar centrada en la escala hertzial, pero no estará centrada en la escala musical perceptiva.

El comportamiento correcto es tener algo como:

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

Entonces:

  • La afinación se expresa en centavos , una unidad musicalmente relevante (100 centavos = 1 semitono).
  • su modulación de tono está "centrada musicalmente", y lfo_mod_depth se expresa en octavas .

Esto se llama "FM exponencial", y esta es la norma en los sintetizadores. En los sintetizadores analógicos, esto se implementa sumando la señal del LFO al CV que golpea el convertidor exponencial del VCO. En los sintetizadores digitales, esto se implementa aplicando las modulaciones en una representación interna de tono de alta resolución que todavía está en una escala musical, antes de convertir a una frecuencia o un incremento de fase.

pichenettes
fuente
Gracias. Si bien esto no era el centro de mi problema, esta es una forma más sensata de expresar y calcular la frecuencia del oscilador para mi aplicación, y después de implementarlo, parece funcionar bien.
Gary DeReese