電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

当ブログは…

2年前のMIDI同期LFO

id:Chuck:20050510#p1 の記事にRJBさんからトラックバックをいただいたので、ふっと、2年まえの開発ノートを引っ張り出してきた。筆者は物覚えが悪いので、自分でやったことであっても終わるとすっかり忘れてしまう。当時のMIDI-LFOの実現方法をここにまとめておこうと思う。

あ、

MFSH向けにはもっとずっと簡単なアルゴリズム・実装になりますので、製作を考えている方はご安心を。

実現方法

アルゴリズムそれ自体と実装を分けて説明しがたいので渾然としつつも、パラメータとしては以下。

  • LFO周期を512ステップとする
  • MIDIでは 1拍中に24回 F8h が送られる
  • LFOの1周期分の拍数が与えられる

その上で、

  1. F8h間の時間間隔を測定する
  2. LFOのテーブルアドレスをひとつ進めるのに必要な時間を計算する
  3. その時間でタイマ割り込みをかけて、LFOテーブルアドレスを進めつつ、LFO値を出力する
  4. LFO 1周期分の拍数で LFOのテーブルアドレスをリセットし誤差の蓄積を解消する

というのが、基本的なアルゴリズム

その外側での制御として、Song Start(FAh)、Song Stop(FBh)、Song Continue(FCh) の対処を行っている。

実装

F8h間隔から LFOテーブルアドレス更新周期を算出するのに、若干の演算が要る。具体的には、

 \frac{24}{512} × 拍数 × F8h間隔

拍数で場合わけをしてシフトと加算に分解して実装した。これは実質的には1より小さい数を掛けることになるので、F8間の時間間隔は16ビットタイマで計測し、演算の誤差に対する考慮とした。

AVR AT90S2313 (1Kワード)を gcc開発し、正弦波*1といくつかのLFO周期のものを実装したが、コード領域が溢れてしまった。そのため AT90S8515 (4Kワード)に切り替えて、LFO波形と周期、初期位相のバリエーションを増やして実装した。ブレッドボード上で試験したところで検討停止、現在に至る。

仕様

なぜ仕様の方が後にくるかというと、AVRの容量がいっぱいになったので、出来高払いの仕様であったから。

  • テンポ保証は 40~240 bpm。実力はもっとあったと思う。
  • LFO周期:1/3, 1/2, 1, 2, 3, 5, 6, 8 拍
    • 三連符・シャッフル、ワルツ対応で 1/3, 3 が必要
    • 6拍はワルツの2小節、8拍は4拍子の2小節
    • Take fiveをやるのに5拍子が必要。
  • 初期位相の変更:0°, 90°, 180°, 270°
  • LFO波形:正弦波、三角波

新版のMIDI同期LFOの構想

RJBさんが MIDI同期LFOの仕様を考えておられる(http://rjb.cocolog-nifty.com/blog/2005/05/midilfo_11ee.html)ので、筆者としては新版の構想を考えてみる。

基本路線は id:Chuck:20050515#p1 を踏襲しつつ、次の変更を加えたいと考えている。

  • 正弦波出力は二重積分法で演算生成する
  • 初期位相は 0°~ 360° 連続可変
  • LFO波形に鋸歯状波を加える

演算によりLFO波形を得るというのは、Rossler や Lorenz*2の Attractor の Chaotic *3LFO へ繋げたいと考えているためだが、実装できるかなぁ?

*1:1/4周期 128ステップのみEEPROM記録、折り返して1周期 512ステップを作った。

*2除算あり。 誤り訂正。

*3http://astronomy.swin.edu.au/~pbourke/fractals/lorenz/