Arduino+FM音源で遊ぶ(ソフトウェア編)

データシートの入手

ハードウェアの準備は整ったので今度は鳴らしてみます。しかし英語版の電気的仕様のデータシートはネットで入手可能ですが、レジスタレベルの詳細ドキュメントは見つかりません。そこで有名なX68000解説本であるInsideX68000に当たってみることにしました。実はX68000実機共々昔所有していたのですが、とっくの昔に捨ててしまった為再度探す羽目になってしまいました。しかしAmazonマーケットプレイスに10,000円!で出ている他はヤフオクにもBookOffにも見当たらないようです。

というわけで欲しいのはサウンド周りのセクションだけですので、図書館でコピーサービスを利用するという作戦に出ることにしました。最初は国会図書館行きか?メンドクサイナーと思っていたのですが今は蔵書を横断検索できるサイトがあり、東京都立図書館であればOutsideX68000もセットで置いてあるようなのでコピーを貰ってきました。全部で400円程度だったと思います。なぜOutsideも?と思われるかもしれませんが、この時点ではまだハード設計をしていたため、リファレンスとしてX68000の回路図も欲しかったのです。

しかし一連の資料探しで絶版本にしか存在しない情報へのアクセスは随分と考えさせられました。欲しいのは紙に書かれている情報なわけで、図書館ならあると言われても休日半分潰す覚悟で望まないといけないわけですから。しかもこれが海外からだとほぼ絶望的です、丁度Googleが絶版本をネット公開するという話が出ていた頃だったので、利用者的にはうまく版権者と話を付けてほしいと願って止みません。

ちなみにOutside~は今現在都内全検索しても数冊しか存在しません。最後の砦、国会図書館という手がありますが平日しか使えないですしね。

鳴ったっ!のでMDX

データシートも手に入ったことですし実装が済んでから早速レジスタを叩いて鳴らしてみました。何分初めて外注した基板ですので、かなり不安でしたが無事動作しているようです。

もちろんこの時点でプロジェクト終了!とするつもりは最初からありませんで、当時いろんなプロアマ含めた先人達がこのYM2151を必死に叩いて腕を競いあっていたので、何とかしてそれを再現してみたい、といわけで思いついたのが草の根BBS等で流通していたMDXというシーケンスデータフォーマットです。これの再生ドライバをArduino上で書いてしまえ、という訳で次のステップに進みます。

転送ソフトMDXImageTransferを起こす

MDXはX68000上で動作するMXDRVというシーケンサ用のデータです。Winにも移植されていますのでご存じの方は多いと思いますが、最も初期のフォーマットである故、YM2151の仕様ベッタリ、機能的にも最小限度、その代りデータサイズも非常に小さい、というArduinoに移植するにはまさしくうってつけの物件です。しかしMDXは小さいと言っても大きいデータは10kを超えてしまいますのでRAMには当然入りません。プログラム用のフラッシュメモリはDuemilanoveなら32Kありますので当然こっちにという話になりますが、プログラムに埋め込んでしまうとMDXを変えるたびにコードをリコンパイル&転送というあまり現実的でない話になってしまうので、最初からPCより別個に転送する仕様を考えます。

まず最初にトライしたのがArduino<->PCで適当なプロトコルをでっちあげて転送されたデータをプログラムフラッシュに書き込むという方法です。ところがシリアル転送は上手くいったもののフラッシュの書き込みになぜか失敗してしまいます。ちなみにフラッシュの書き込みはブートローダーのコードを参考にしました。

ATmega328Pのデータシートをよくよく見たところ、モード毎にプログラムフラッシュの書き込み許可設定を変えられるらしく、なんとArduinoではデフォルトではユーザモードからは禁止という設定になっているではないですか。うわーーー時間ムダに・・・、AVRのライタで設定をいじって許可してしまおうかとも考えたのですが、それってArduino?という話になってしまうので別の手段を考えます。

先の方法でフラッシュの書き込み手順を調べる為に読んでいたブートローダーですが、ユーザエリアからダメならこれと直接通信してしまえという訳でさらっと書いてしまいました。何分クライアントの挙動はソースで読めるので簡単です。つまりArduinoIDEがプログラムを転送するのと同じプロトコルでMDXを転送してしまうという手段です。但し、コードの書き込みだけ標準のArduinoIDEでやるのも2度手間になってしまうので、コード用のIntelHEXデータを読み込んで転送する機能もつけてみました。結果こんな感じのUI付きプログラムになりました。

ちなみにC#です、この手の小物を作るには良い環境ですよね。あとこの方法をマネしたいという方に注意ですが、ブートローダーのフラッシュ書き込みシーケンスではユーザエリアはもとよりブートローダーエリアも書き込み許可されていますので、アドレス設定をミスるとブートローダーを飛ばしてしまいますので十分注意してコーディングしてください。私は一回やってしまってAVRのISPを購入する羽目になってしまいました。秋月なら4000円で売っています。店頭でも言うと出してくれます。

MDXドライバを書く

これも苦労しました、、と言いたい所ですが今現在100%実装ではなく中途半端に鳴らせている状態ですのでまた今後のエントリーに書きたいと思います。80%位ですかねぇ、細かい挙動はオリジナルのドライバソースを参照しないとダメなので大変です。

そしてRev1.1基板へ・・

ここまで完成すると欲が出てきまして、MDX再生だけじゃつまんない!というわけで、バス制御線や割り込みをざっくり省略してAnalogINを開けた上に、MIDI入力を追加したRev1.1基板を設計&発注しまして今現在納品待ちです。

ちょっと詰め過ぎ感じですが基板設計も大分慣れてきました。

長くなりましたが以上をもってようやく現在の状況に追い付きました。brogねたは溜めこんじゃダメという結論で。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です