Ajuda com algoritmo para modular a inclinação do oscilador usando LFO

8

Estou desenvolvendo uma emulação de software de um sintetizador analógico. Estou tentando modular o tom de um oscilador usando um LFO. Para cada amostra fornecida ao sistema de som do computador, estou calculando a frequência a ser inserida no oscilador principal como este (pseudocódigo):

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

As variáveis ​​nesta declaração são descritas a seguir:

  • note_frequency = frequência da nota a ser tocada em Hz
  • tuning = ajuste fino do oscilador em porcentagem da afinação tocada (ex: -0,02 = desafinação em 2%)
  • lfo_y = valor y atual da forma de onda lfo (varia de -1 a 1)
  • lfo_mod_depth = profundidade / intensidade do efeito a aplicar ao oscilador em porcentagem

No entanto, esse cálculo não produz o resultado desejado. Espero ouvir o tom modular para cima e para baixo, bloqueado em torno da frequência central (nota sendo tocada). O que estou recebendo é um efeito de modulação que faz com que o tom "fuja"; Não sei exatamente o que está acontecendo, mas parece um destes:

  1. A intensidade da modulação aumenta com o tempo (a marca de frequência alta / baixa alcançada pela modulação aumenta / diminui quanto mais tempo a nota é mantida)
  2. Enquanto a intensidade da modulação permanece constante ao longo do tempo, a frequência central aumenta enquanto a modulação oscila em torno dela

Estou usando a abordagem correta ou não? Caso contrário, qual deve ser a abordagem correta? Qualquer ajuda com isso é muito apreciada.

Gary DeReese
fonte
2
O mais importante é o que você faz com a frequência desejada do oscilador. Você pode estar com um problema semelhante a esta pergunta . Você deve ter um acumulador de fase que rastreie a fase do sinal de saída a cada etapa do tempo, atualizando-o de acordo com a frequência desejada em cada amostra de saída. Mais informações podem ser encontradas aqui .
Jason R
Sua referência a um acumulador de fases me levou a estudar a síntese de ondas de onda em vez da abordagem mais ingênua que eu estava usando no meu oscilador. Depois de reformular meu design (incorporando também as dicas descritas na resposta @pichenettes), obtive os resultados que estava procurando. Obrigado!
Gary DeReese

Respostas:

7

Como disse Jason, pode ser simplesmente que você não esteja implementando seu oscilador corretamente - por exemplo, multiplicando a frequência pelo tempo, em vez de integrá-lo.

Observe também - e isso não está relacionado ao seu tópico, mas realmente vale a pena observar - que sua fórmula para modulação de frequência implementa um comportamento muito diferente do da maioria dos sintetizadores, e parecerá estranho para um músico.

Por exemplo, se lfo_y oscilar entre -1 e 1; lfo_mod_depth é 0,5; e se note_frequency for igual a 220 Hz, osc_frequency varrerá entre 110 e 330 - ou seja, entre -1 oitava e +1 quinto ao redor da nota. Portanto, a modulação do tom parecerá centralizada na escala hertz, mas não será centralizada na escala musical perceptiva.

O comportamento correto é ter algo como:

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

Então:

  • o ajuste é expresso em centavos , uma unidade musicalmente relevante (100 centavos = 1 semitom).
  • sua modulação de afinação é "musicalmente centralizada" e lfo_mod_depth é expresso em oitavas .

Isso é chamado de "FM exponencial" e é a norma nos sintetizadores. Nos sintetizadores analógicos, isso é implementado somando o sinal LFO ao CV que atinge o conversor exponencial do VCO. Nos sintetizadores digitais, isso é implementado aplicando as modulações em uma representação interna de alta resolução de afinação que ainda está em uma escala musical - antes de converter para uma frequência ou um incremento de fase.

pichenettes
fonte
Obrigado. Embora isso não esteja no cerne do meu problema, essa é realmente uma maneira mais sensata de expressar e calcular a frequência do oscilador para minha aplicação e, após implementá-la, parece funcionar bem.
Gary DeReese 15/05