情弱

情弱のVST作製メモ

Wavetableを使ったオシレータ1

Wavetable Synthesis

Wavetable Synthesisとは

偏ったDTM用語辞典 - ウェーブテーブルオンゲン ウェーブテーブル音源:Wave Table Synthesisとは - DTM / MIDI 用語の意味・解説 | g200kg Music & Software

だそうです。

今回は、サイン波1周期分をテーブル化して、そこからピッチを可変できるウェーブテーブル方式のオシレータの実装方法について考えてみます。

※サンプルコードは後日追記するかも

テーブルの作製

Sine関数の1周期をLサンプルに分割したテーブルSinTableを作製します (Fig. 1)。

サンプルレート48 kHzの環境であれば、テーブルサイズLは512サンプルもあれば十分かと。

f:id:aogiri_m2d:20170306220026j:plain

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)。

f:id:aogiri_m2d:20170306222402j:plain

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シンセ等の場合はバンドリミット補完や、ラマジャンヌ補完が用いられてるとのことなのですが、どうなんですかね。