もともと、ブレゼンハムのアルゴリズムは、パソコンの画面に高速に直線を描画するときに使われるアルゴリズム。これをシンセのCVの生成に使えないかな、というのが狙い。
y=axの直線をグラフ化するのをイメージすれば良い。x軸方向(この場合は時間)に1ステップ進むとき、Y軸方向に変化するかどうかを足し算で蓄積していく誤差が一定値を超える稼動かのみを判断なので、ランタイムの計算コストがとても小さいのが魅力。 欠点としては、Y=aXのa(傾き)を1以上にできない事から、高速なオペレーションには不向き。少なくとも20MHzで動かす、AVRで、EGのすべてのカーブを表現するのには若干の無理があるようだ。LFOぐらいならちょうど良い感じ。
最高速の時、一番上に行って戻ってくるまで8ビット幅出力なら最小タイミング512回繰り返す。 16Hzは、62.5ms。512回ステップするのだから、、最小ステップは122us。
スピードを変えるには、Y=aXの傾きの係数aを変化させることになる。たとえば、8ビット幅出力(256段階)で0.33Hzから16Hzまで変化させるのなら、傾きが1のとき16Hz、最小タイミング、0.3Hzのときは傾きは、(16Hz/0.32Hz=)50なのだから、傾きは、1/50になれば、0.32Hzが出力できそうだ。 さらに、分母と分子をそれぞれ50倍して、分母ではなく、分子を変化させることでリニアに1から1/50までを変化させるというところがアルゴリズム的なミソ。5/255から255/255までの分子を増やしていく。
ブレゼンハムのアルゴリズムの詳細は、 http://dencha.ojaru.jp/programs_07/pg_graphic_07.html にくわしい。
|