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シンセ等の場合はバンドリミット補完や、ラマジャンヌ補完が用いられてるとのことなのですが、どうなんですかね。
JUCE-AudioProcessorParameter Classを使ったパラメータ管理あれこれ 1
AudioProcessorParameter Class
JUCEには、パラメータを管理するクラスとしてAudioProcessorParameter Classが用意されている。どうやら、利用したいパラメータの数だけこのオブジェクトを用意してやれば、簡単にパラメータの数を追加できるっぽい。
パラメータの追加
今回は、整数値を取り扱うパラメータを追加してみる。int型のパラメータを取り扱うためのAudioParameterInt Classのオブジェクト (AudioProcessorParameterの派生Class)を作製し登録すると、パラメータが追加される (Source 1 and Fig. 1)。
Fig. 1: 1 ~ 3の値が設定できるパラメータparamAが追加された
パラメータテキストに設定した数値以外の値を返す
ここから本題。このパラメータ管理、デフォルトだとパラメータテキストの欄に設定した数値がそのまま返ってくる。すなわち、オブジェクト作製時に指定した、最小値1から最大値3までの整数しか表示されない。地味に困る。
そこで、雑なやり方ではあるが設定したパラメータ(値)に対応した文字列を返す方法をメモしておく。試しにparamA = 1のとき "a"、paramA = 2のとき"b"、paramA = 3のとき"c"の文字列を返すということを行ってみる(Source 2 and Fig. 2)。
- 各パラメータの表示用文字列を格納する配列textDeta[n]を用意。nは全パラメータ数。
- パラメータテキストをホストに伝える関数String getParameterText(int index, int)をoverrideし、指定されたパラメータ番号(index)に対応した、textDetaの要素をホストに返すようにする
- textDeta[index]に要素を代入する。paramObjPtr->get()で、paramObjPtrの現在の値が取得できる。また、paramObjPtr-> getParameterIndex()で、paramObjPtrのindex番号が取得できるので、この辺使えば何とかなる。
Fig. 2: スライダーの位置に応じた文字列を返す。
getParameterIndex()のおかげで、パラメータ数が増えてもいけるはず。
ステップシーケンサー実装メモ1
概要
JUCEでステップシーケンサーを実装します。とりあえず、音階指定は無しで各ステップのノートのON/OFFを切り替えるだけの原始的なやつ 。
機能的には、1) 現在のステップがON状態だったら、holdTime (sec)だけON音信号を出力し、2) sizeStep (sec)経過したら、次のステップに移る。この1), 2)を繰り返すだけ。
実装
解説することが無い。追記)JUCE関係ねぇはコレ。