Wavetableを使ったオシレータ1
Wavetable Synthesis
Wavetable Synthesisとは
だそうです。
今回は、サイン波1周期分をテーブル化して、そこからピッチを可変できるウェーブテーブル方式のオシレータの実装方法について考えてみます。
※サンプルコードは後日追記するかも
テーブルの作製
Sine関数の1周期をLサンプルに分割したテーブルSinTableを作製します (Fig. 1)。
サンプルレート48 kHzの環境であれば、テーブルサイズLは512サンプルもあれば十分かと。
Fig. 1 SinTable (L = 512)
オシレータ部の実装
単一のSinTableから任意の周波数fを生成する方法を考えていきます。
周波数fの1周期あたりのサンプル数pは、ホストDAWのサンプリング周波数fsを用いて、p = fs / f となります。そして、SinTableにはSine波1周期分の波形データが入っていることを考えると、SinTableから任意の周波数fを持つSine波を作るということは、
pサンプル進む間に、SinTableの頭からケツまでをちょうど読み切ればよい
ということになります (Fig. 2)。
Fig. 2 1サンプル進む毎に、テーブルの読みだし位置はL / pずつ進む
従って、周波数fの波形g(n)は、次のように生成することができる(Eq. 1, 2)。
g(n) = SinTable[m] (Eq. 1)
ここで、m = (L * n / p) mod(L) = (L * f * n / fs) mod(L) (Eq. 2)
mod(L)は周期化処理です。
ここで、mは必ずしも整数になるわけでは無いので、線形補完処理によってEq. 1を以下のように拡張します (Eq. 3)。
g(n) = d * SinTable[int(m+1)mod(L)] + (1 - d) * SinTable[int(m)] (Eq. 3)
ここで、d = m - int(m)
以上、終わり。
L = 512であれば、単純な1次線形補完でも大丈夫な感じでした。実際、商用のVAシンセ等の場合はバンドリミット補完や、ラマジャンヌ補完が用いられてるとのことなのですが、どうなんですかね。