開発履歴 / バグ / To Do
● 開発履歴
開発は次のような順番で行いました。
- デザインウェーブマガジン 2006 年 3 月号付属基板 ADuC7026
- 秋月 H8/3048 ボード
- インターフェース 2006 年 6 月号付録基板 SH7144F
- デザインウェーブマガジン 2006 年 3 月号付属基板 ADuC7026
- Atmel ATtiny2313
- Atmel ATmega168
- インターフェース 2007 年 5 月号付属基板 V850ES/JG2
この開発の発端は、(1) の ADuC7026 基板です。 LED チカチカ程度はうまく動くのに、記事にしたがって gdb でデバッグしようとすると、 不安定に悩まされていました。
その後、ネット上の情報で、デカップリング・コンデンサが不足していることが分かりました。 コンデンサを追加して安定に動くようになったので、内蔵 12 ビット DAC を利用して 何か音の出るものを作りたいなと思ったのがきっかけです。
はやりのサンプリング音源では ROM 容量の問題や、サンプリングする「音ネタ」の問題が あるので、旧式ですが原理は極めて簡単な FM 音源方式を採用しました。
開発の当初は、「遅いチップ」が実装されている基板を使っていました。 この基板上で、サンプリング周波数が約 15 kHz、同時発音数3音の性能が得られました。
(2)の H8/3048 については、フラッシュ ROM に書き込んだルネサス・モニタで、 外部に設けた 8 ビット幅の RAM 上にプログラムをダウンロードして 実行させる方式をとりました。
当然、メモリアクセスに時間がかかるので性能が落ちます。 また、C コンパイラに gcc を使ったこともあって、十分な性能が得られず、 予備的な実験の段階で同時発音数2音以上になる見込みがないことから、 プログラムの移植は断念しました。
次に、(3) の SH2 基板に移植を試みました。SH2 基板には、裏面に高速 SRAM 用のパターンが 用意されていますが、指定の SRAM は高価なので、この本来の方法は使っていません。
代わりに、手持ちの 486 時代のマザーボードから外した 32K x 8 ビットのキャッシュ用 SRAM 2個を使って外部 RAM を増設しました。
H8/3048 の時と同様に、SH2 でもフラッシュ ROM にはルネサス・モニタを書込み、プログラムを 外部 RAM にダウンロードして実行させる方式をとりました。
ボード上にフォトカプラを使った MIDI インターフェースを実装したり、 ディジタル・オーディオ用 DAC を載せたりと、 ハードウェア的には最も豪華なものとなっています。
移植の結果は、同時発音数3音程度の性能が得られました。 この当時の FM 音源プログラムは、現在のものとは違っており表現力が低いのと、 また、ハードウェアの環境が特殊なため、今回は SH2 版のプログラムの公開は見送りました。
その後は、(4) の ADuC7026 版に戻って、プログラムの改良に取り組みました。 特に、エンベロープ・ジェネレータは全面的に書き換え、現在の形になりました。
LCD サポートを付けたのもこの頃です。 デバッグに役立ちましたが、この時期には、すでに プログラムの大部分が出来上がった状態でしたから、もっと早く LCD を付けていれば良かったと 感じました。
そのうちに、秋月で ATtiny2313 が単価 120 円で売られていることを知り、 それまで何となく手を出せないでいた AVR を、ものは試しと買ってきました。
フラッシュ書込みには自作 ByteBlaster MV 互換ケーブルを使うつもりでしたが、 それまで、ほとんど使っていなかった「MINI EZ-USB」が AVR 書込みに使えることを思い出し、 利用することにしました。
MINI EZ-USB 側から +5V 電源、24 MHz クロック、シリアル入出力を供給できるので、 回路の組み立てで手数を省けました。
(5) の ATtiny2313 版では、スピードの制約よりも、メモリの制約のほうが先にきて、 「ピッチベンド」は実装することができましたが、同時発音数1音、 しかも音色の変更や、エンベロープの変化を付けられない状態になりました。
そんなわけで、今回は ATtiny2313 版のプログラムの公開は見送りました。 なんとか、もう少しプログラムを整理して、「MIDI 音源」は無理でも、 「MIDI オルゴール」程度のものにして公開したいと思います。
ATtiny2313 では、満足のいく結果が得られなかったので、ATmega168 を購入して、 (6) の ATmega への移植を試みました。
AVR は 8 ビットプロセッサですから、32 ビット RISC である ADuC7026 用のコードでは速度が出ず、 かなりの部分を 8 ビット向けに書き直し、さらには、一部をアセンブラで書きました。
結果としては、ROM 容量の制約から、LCD サポートと内蔵デモ曲は両立しませんでしたが、 性能は、24 MHz クロック時、サンプリング周波数が約 16 kHz で同時発音数2音となりました。
(7) の V850 暫定版では、まず最初にプロセッサの能力を知りたくて、 付属基板上に外部回路を組んでプログラムの移植を進めました。 その結果、サンプリング周波数が約 17 kHz で同時発音数6音となりました。
その後 LCD サポートを加え、V1.01 となりました。 V850 版が現状では最も性能がいいので、 今後は ADuC7026 版メインから V850 版メインに移行したいと思っています。
● バグ
V1.00 では「クリック」と「長押し」のしきい値を約 400 ms に設定したつもりが、 実際は、もっと長くなっていたのを V1.01 で修正しました。
発音中の音をオールノート・オフ・メッセージで消音する際に異音が生じる場合が あったのを V1.01 で修正しました。 ただし、ATmega 版ではプログラムメモリ容量が足りず、修正は施していません。
MIDI ランニング・ステータスの処理を簡略化しているため、正しい MIDI データは 正しく解釈しますが、エラーを含む正しくない MIDI データに対しては、エラーと認識せず、 正しくない応答をします。
MIDI 規格では、ランニング・ステータスはチャンネル・メッセージだけに許されていますが、 本 FM 音源プログラムでは、簡単のため、すべてのメッセージに対してランニング・ステータスを 許しています。
そのため、規格上は正しくない MIDI データに対しても間違った解釈を実行してしまいます。
ATmega 版のプログラムでは、アタックの途中でノート OFF になると、正しいレートの リリースに移行せず、いきなり、スパッとエンベロープが 0 に落ちてしまいます。
ATmega 版のプログラムでは、モジュレータのフィードバックの変調度が大きい場合に、fs/2 の 周波数の振動が生じて、異音を発生する現象がありました。(シンセ・ベースなど)
変調度が小さい場合は現象が生じません。 サイン波テーブルの「刻み」が細かい ADuC7026 版 では問題がないことから、サイン波テーブルの離散化ステップや量子化ステップが大きい ことによる非線形な原因によるものではないかと思われます。
まだ、原因は詳しく調べておらず、対症療法的に、フィードバックする信号の 経路に fs/2 に零点を もつ FIR フィルタを挿入して振動を抑えています。 具体的には、隣り合う2つのサンプルの平均を取っています。
● To Do (予定は未定)
V850 最大構成版の製作。 LCD サポートがない、現在の暫定版では 17 kHz サンプリングで同時発音数 6、 13 kHz サンプリングで同時発音数 8 と、 ADuC7026 版より高性能。(V1.01 で実現。同時発音数 6 でサンプリング周波数 16 kHz、同時発音数 8 でサンプリング周波数 12 kHz)また、デバッガを利用すれば、ボード上のジャンパを抜き差しせずに、 ツール上の操作だけで、フラッシュ書込み、プログラム実行、停止などができるので便利だ。
そういうわけで、今後は、開発の主体を ADuC7026 から V850 に切り換えていきたい。
ドキュメントの充実。 現在はプログラムの内容の説明まで手が回っていない。
アナログシンセ CV インターフェース回路の製作。
インターフェース誌付録 SH2 (SH7144) 基板への移植。 途中の段階の ADuC7026 版を移植して放置してある SH2 版を、アップデートしたい。
トランジスタ技術誌付録の H8/3694 基板、M8C/15 基板への移植。
-
ATtiny2313 版の「MIDI オルゴール」の製作。 現在、放置中の ATtiny2313 版を、もう少し体裁を整えて、 「音源」とは呼べなくても「オルゴール」程度の物にしたい。
プログラム・ソース・ファイルの統一。 現在は機種別に一部異なるソースとなっているのを、 一組のソースで異なるコンパイラや多機種に対応できるものにしたい。 少なくとも、32 ビット RISC 版、AVR 版、その他の 8/16 ビット版の、 3組くらいで全てをカバーしたい。
エンベロープ・ジェネレータの改良。(特にアタック)
同時発音数 3 ぐらいでは必要を感じないが、同時発音数 6 とか 8 とかになってくると、 ボイス・アサイナの搭載が現実味を帯びてくる。