Bantuan dengan algoritma untuk memodulasi nada osilator menggunakan LFO

8

Saya mengembangkan perangkat lunak emulasi synthesizer analog. Saya mencoba memodulasi nada osilator menggunakan LFO. Untuk setiap sampel yang dimasukkan ke sound system komputer, saya menghitung frekuensi yang akan dimasukkan ke osilator utama seperti ini (pseudocode):

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

Variabel dalam pernyataan ini dijelaskan sebagai berikut:

  • note_frequency = frekuensi not untuk dimainkan dalam Hz
  • tuning = osilator fine-tuning dalam persen dari pitch yang dimainkan (mis: -0,02 = detune sebesar 2%)
  • lfo_y = nilai y saat ini dari bentuk gelombang lfo (berkisar dari -1 hingga 1)
  • lfo_mod_depth = kedalaman / intensitas efek untuk diterapkan ke osilator dalam persen

Namun, perhitungan ini tidak menghasilkan hasil yang diinginkan. Saya berharap untuk mendengar nada memodulasi ke atas dan ke bawah, terkunci di sekitar frekuensi tengah (nada dimainkan). Apa yang saya dapatkan adalah efek modulasi yang menyebabkan nada "lari"; Saya tidak tahu persis apa yang terjadi, tetapi ini terdengar seperti ini:

  1. Intensitas modulasi meningkat dari waktu ke waktu (tanda frekuensi tinggi / rendah yang dicapai oleh modulasi semakin tinggi / semakin rendah, semakin lama nada tersebut ditahan)
  2. Sementara intensitas modulasi tetap konstan dari waktu ke waktu, frekuensi pusat meningkat sementara modulasi berosilasi di sekitarnya

Apakah saya menggunakan pendekatan yang benar atau tidak? Jika tidak, apa pendekatan yang tepat? Setiap bantuan dengan ini sangat kami hargai.

Gary DeReese
sumber
2
Yang paling penting adalah apa yang Anda lakukan dengan frekuensi osilator yang diinginkan. Anda mungkin mengalami masalah serupa dengan pertanyaan ini . Anda harus memiliki akumulator fase yang melacak fase sinyal output pada setiap langkah waktu, memperbaruinya sesuai dengan frekuensi yang diinginkan pada setiap sampel output. Info lebih lanjut dapat ditemukan di sini .
Jason R
Referensi Anda ke akumulator fase membuat saya melihat ke dalam menggunakan sintesis wavetable bukan pendekatan yang lebih naif yang saya gunakan dalam osilator saya. Setelah saya mengerjakan ulang desain saya (juga memasukkan tips yang diuraikan oleh jawaban @pichenettes), saya mendapatkan hasil yang saya cari. Terima kasih!
Gary DeReese

Jawaban:

7

Seperti yang dikatakan oleh Jason, ini mungkin karena Anda tidak mengimplementasikan osilator dengan benar - misalnya dengan mengalikan frekuensi berdasarkan waktu alih-alih mengintegrasikannya.

Perhatikan juga - dan ini tidak terkait dengan topik Anda tetapi benar-benar layak untuk diamati - bahwa rumus Anda untuk modulasi frekuensi menerapkan perilaku yang sangat berbeda dengan kebanyakan synthesizer, dan akan terdengar aneh bagi seorang musisi.

Misalnya, jika lfo_y berosilasi antara -1 dan 1; lfo_mod_depth adalah 0,5; dan jika note_frequency sama dengan 220 Hz, osc_frequency akan menyapu antara 110 dan 330 - artinya antara -1 oktaf dan +1 kelima di sekitar note. Jadi modulasi nada akan tampak terpusat pada skala hertz, tetapi tidak akan terpusat pada skala musik perseptual.

Perilaku yang benar adalah memiliki sesuatu seperti:

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

Kemudian:

  • penyetelan diekspresikan dalam sen , unit yang relevan secara musik (100 sen = 1 semitone).
  • modulasi nada Anda "terpusat pada musik", dan lfo_mod_depth diekspresikan dalam oktaf .

Ini disebut "FM eksponensial", dan ini adalah norma pada synthesizer. Pada synthesizer analog, ini diterapkan dengan menjumlahkan sinyal LFO ke CV yang mengenai konverter eksponensial dari VCO. Pada synthesizer digital, ini diterapkan dengan menerapkan modulasi pada representasi pitch resolusi tinggi internal yang masih dalam skala musik - sebelum mengkonversi ke frekuensi atau fase kenaikan.

pichenettes
sumber
Terima kasih. Walaupun ini bukan inti dari masalah saya, ini memang cara yang lebih masuk akal untuk mengekspresikan dan menghitung frekuensi osilator untuk aplikasi saya, dan setelah mengimplementasikannya, tampaknya berfungsi dengan baik.
Gary DeReese