Aiuto con l'algoritmo per la modulazione del pitch dell'oscillatore usando LFO


8

Sto sviluppando un'emulazione software di un sintetizzatore analogico. Sto cercando di modulare l'intonazione di un oscillatore usando un LFO. Per ogni campione alimentato al sistema audio del computer, sto calcolando la frequenza da immettere nell'oscillatore principale in questo modo (pseudocodice):

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

Le variabili in questa affermazione sono descritte come segue:

  • note_frequency = frequenza della nota da suonare in Hz
  • tuning = fine tuning dell'oscillatore in percentuale del pitch suonato (es: -0.02 = detune del 2%)
  • lfo_y = valore y corrente della forma d'onda lfo (range da -1 a 1)
  • lfo_mod_depth = profondità / intensità dell'effetto da applicare all'oscillatore in percentuale

Tuttavia, questo calcolo non produce il risultato desiderato. Mi aspetto di sentire il pitch modulare su e giù, bloccato attorno alla frequenza centrale (nota suonata). Quello che sto ottenendo è un effetto di modulazione che fa "scappare" il tono; Non so dire esattamente cosa stia succedendo, ma sembra uno di questi:

  1. L'intensità della modulazione aumenta nel tempo (il segno di alta / bassa frequenza raggiunto dalla modulazione aumenta / diminuisce più a lungo si tiene la nota)
  2. Mentre l'intensità della modulazione rimane costante nel tempo, la frequenza centrale aumenta mentre la modulazione oscilla attorno ad essa

Sto usando l'approccio corretto o no? In caso contrario, quale dovrebbe essere l'approccio corretto? Qualsiasi aiuto con questo è molto apprezzato.


2
La cosa più importante è ciò che fai con la frequenza dell'oscillatore desiderata. Potresti riscontrare un problema simile a questa domanda . È necessario disporre di un accumulatore di fase che tenga traccia della fase del segnale di uscita in ogni fase temporale, aggiornandolo in base alla frequenza desiderata in ciascun campione di uscita. Maggiori informazioni possono essere trovate qui .
Jason R,

Il tuo riferimento ad un accumulatore di fase mi ha portato a esaminare la sintesi wavetable anziché l'approccio più ingenuo che stavo usando nel mio oscillatore. Dopo aver rielaborato il mio progetto (incorporando anche i suggerimenti indicati dalla risposta di @pichenettes), ho ottenuto i risultati che stavo cercando. Grazie!
Gary DeReese,

Risposte:


7

Come detto da Jason, questo potrebbe semplicemente essere che non stai implementando correttamente il tuo oscillatore, ad esempio moltiplicando la frequenza per tempo invece di integrarla.

Nota anche - e questo non è correlato al tuo argomento, ma vale davvero la pena di osservarlo - che la tua formula per la modulazione di frequenza implementa un comportamento molto diverso da quello della maggior parte dei sintetizzatori e suonerà inquietante per un musicista.

Ad esempio, se lfo_y oscilla tra -1 e 1; lfo_mod_depth è 0,5; e se note_frequency è uguale a 220 Hz, osc_frequency passerà tra 110 e 330 - vale a dire tra -1 ottava e +1 quinta attorno alla nota. Quindi la modulazione del pitch apparirà centrata nella scala hertz, ma non sarà centrata nella scala musicale percettiva.

Il comportamento corretto è avere qualcosa di simile:

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

Poi:

  • l'accordatura è espressa in centesimi , un'unità musicalmente rilevante (100 centesimi = 1 semitono).
  • la modulazione del pitch è "musicalmente centrata" e lfo_mod_depth è espresso in ottave .

Questo si chiama "FM esponenziale", e questa è la norma sui sintetizzatori. Sui sintetizzatori analogici, questo viene implementato sommando il segnale LFO al CV che colpisce il convertitore esponenziale del VCO. Sui sintetizzatori digitali, questo viene implementato applicando le modulazioni su una rappresentazione interna ad alta risoluzione del pitch che è ancora su una scala musicale - prima di convertirla in una frequenza o un incremento di fase.


Grazie. Mentre questo non era al centro del mio problema, questo è davvero un modo più ragionevole per esprimere e calcolare la frequenza dell'oscillatore per la mia applicazione, e dopo averlo implementato, sembra funzionare bene.
Gary DeReese,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.