当ブログは…
2年前のMIDI同期LFO
id:Chuck:20050510#p1 の記事にRJBさんからトラックバックをいただいたので、ふっと、2年まえの開発ノートを引っ張り出してきた。筆者は物覚えが悪いので、自分でやったことであっても終わるとすっかり忘れてしまう。当時のMIDI-LFOの実現方法をここにまとめておこうと思う。
あ、
MFSH向けにはもっとずっと簡単なアルゴリズム・実装になりますので、製作を考えている方はご安心を。
実現方法
アルゴリズムそれ自体と実装を分けて説明しがたいので渾然としつつも、パラメータとしては以下。
その上で、
- F8h間の時間間隔を測定する
- LFOのテーブルアドレスをひとつ進めるのに必要な時間を計算する
- その時間でタイマ割り込みをかけて、LFOテーブルアドレスを進めつつ、LFO値を出力する
- LFO 1周期分の拍数で LFOのテーブルアドレスをリセットし誤差の蓄積を解消する
というのが、基本的なアルゴリズム。
その外側での制御として、Song Start(FAh)、Song Stop(FBh)、Song Continue(FCh) の対処を行っている。
実装
F8h間隔から LFOテーブルアドレス更新周期を算出するのに、若干の演算が要る。具体的には、
拍数で場合わけをしてシフトと加算に分解して実装した。これは実質的には1より小さい数を掛けることになるので、F8間の時間間隔は16ビットタイマで計測し、演算の誤差に対する考慮とした。
AVR AT90S2313 (1Kワード)を gcc で開発し、正弦波*1といくつかのLFO周期のものを実装したが、コード領域が溢れてしまった。そのため AT90S8515 (4Kワード)に切り替えて、LFO波形と周期、初期位相のバリエーションを増やして実装した。ブレッドボード上で試験したところで検討停止、現在に至る。
仕様
新版のMIDI同期LFOの構想
RJBさんが MIDI同期LFOの仕様を考えておられる(http://rjb.cocolog-nifty.com/blog/2005/05/midilfo_11ee.html)ので、筆者としては新版の構想を考えてみる。
基本路線は id:Chuck:20050515#p1 を踏襲しつつ、次の変更を加えたいと考えている。
演算によりLFO波形を得るというのは、Rossler や Lorenz*2の Attractor の Chaotic *3LFO へ繋げたいと考えているためだが、実装できるかなぁ?