アナログシンセ掲示板ログ閲覧所
Library of BBS for DIYers of Analog Synth

[ トップページへ / 一覧表示 / 最新記事 / 管理用 ]
[ to Top Page / Title List ]


設計と製作 ソフトウエアEGのアルゴリズム
#8760
この記事の投稿者にメールを送信 takeda (2007年12月21日20時54分)
RJBさんがソースを公開くださってるんだけど、ちょっと難しげなんで、なんか、簡単なのねーかなと、ひねって、ブレゼンハムのアルゴリズムという、デジタルの画面に線分を描画するアルゴリズムが、ソフトウエアEGに使えるかどうか、ちょっと書いてみた。

ADSR包絡線をX軸を時間に、Y軸を出力レベルに見立てたグラフを描画してみようという狙い。
簡単に言えば、一定時間を単位時間に分割して、その時間の変わり目に出力をワンステップアップするかどうかを判断するという技法。単位時間内にしなきゃいけない演算が少なくて、ローコストなアルゴリズムかなと。線分の傾きがそのままADRのタイミングになります。アルゴリズム自体の解説はこちらに詳しい。
http://dencha.ojaru.jp/programs_07/pg_graphic_07.html
包絡線は、あくまで直線として表現。コンデンサの放電曲線とかは無視状態。

http://www.aleph.co.jp/~takeda/radio/parm/software/eg.c
http://www.aleph.co.jp/~takeda/radio/parm/software/lfo.c

時間軸上に描画するグラフの線分の始点と終点のy座標は、0か、最大値で固定。X軸はADコンバートでえた時間の長さ。256点しかないのだから傾きの計算に必要な割り算はあらかじめやっておいてテーブル化しちゃう。上記URLの草案2というソース内の、eという変数。
もう、足し算と引き算だけ、まるでひらがなだけで書くソフトウエア、takeda向きだよね。

欠点は、最少のタイミングをそんなに早く出来ない点。割り込み周期の256倍以下にはできない。最長は結構色々作れそう。
ハードがまだないので(mega48にMIDI-CVと一緒に載せられるかなー)、基本アルゴリズムのチェックだけ、普通にCで書いてみた。適当にコンパイルしてそのまま走らせるとテキストで、出力を数字でダーっと表示するので、リダイレクトしてファイル化し、エクセルに突っ込んでグラフを描画させると動作が見える。LFOのデータはEGのまま。多分使いにくい。

このサンプルは、最少割り込みタイミングを40usとして、最短アタックタイムが10mS、最長は5s。を想定してテーブル作ってみた。数字を色々いじれば、つまみの回し具合の感じも色々つくれそう。
ただ、ちびCPUの癖にメモリー湯水のように使って大丈夫なのか?!ATTINY2313は、メモリー2kByte、ATMEGA48は4kByte.16ビットのデータ256個のテーブル二つ持っちゃったら、そんだけで1k、っちゅーか乗るのかな。MIDI-CV乗らないかも。...LFOと共存させるのは無理なのかな。なんか、実用にはならないかも..。実装目指していじってみますー。

[この記事の元になった記事]

pARM ver2.0 開発始動(か?) : takeda (2007年12月04日19時20分)

[この記事に対する返事]

Re:ソフトウエアEGのアルゴリズム : gan (2007年12月21日22時32分)Re:ソフトウエアEGのアルゴリズム : アルゴ算法堂 (2007年12月22日13時03分)ソフトウエアEG再挑戦! : takeda (2008年05月01日23時30分)