2010-11-21 17 views
1

Bir okul mezuniyet projesi için bir dijital sent programlamak zorundayım ve genel olarak synthesizer ile ilgili teorinin çoğunu bildiğim halde, bir programlama acemi olduğunu itiraf etmeliyim. Başlığında belirtildiği gibi bunu C içinde yapmak zorundayım. Bunu yapmanın en basit yolu, dalgalı osilatörler ile olduğu gibi, bir ADSR zarfı için bir rampa dalgasını da kullanabiliyorum. Bununla birlikte, doğru aralıkta olduğundan emin olmanın nasıl bir şey olduğunu bilmiyorum. Arttırma sayacını değiştirerek osilatörün göreceli perdesini değiştirmek kolaydır, ancak osilatörün mutlak eğimini nasıl belirleyebilirim?Basit bir dalgalanabilir osilatör C

J.Midtgaard

cevap

4

Sen üreten konum ses akışının sample rate bilmemiz gerekir. senin örnekleme hızı fs olduğunu ve f bir frekans ile bir tonu üretmeye çalışıyorsanız, o zaman numuneler f her fs/tam döngüsü (periyodunu) üretmek gerekir. Alternatif olarak, her ses örneğinde bir döngüden f/fs ilerlemelisiniz. senin Wavetable tamamen döngüsünü temsil etmek n giriş vardır Yani eğer, o zaman/fs ses numune başına girişleri f n * tarafından ilerlemek gerekiyor. fs = 44,1, = 1 kHz f için örneğin

, N = 1024 , daki artış numune başına 1024 * 1000/44100 = 23.22 girişleri olmalıdır.

Genellikle tamsayı olmayan bir artış değeri elde edeceğinizi unutmayın. Doğru perdeyi elde etmek için, artırırken bu değeri yuvarlamamalısınız. Bunun yerine, yalnızca akümülatör değerinizi tablo dizini değerine dönüştürürken yuvarlanmanız gerekir. (Daha karmaşık bir yaklaşım, girişler arasında bir tür enterpolasyontur.)