Arduino+FM音源で遊ぶ(MTM04無事終了しました)

来場ありがとうございました!

こんなヤッツケの出展物で特に開場直前はものすごく不安だったのですが、中々どうしてで沢山の方に楽しんで頂けたようで正直ホッとしました。ただ説明はハッキリ言ってすごくヘタで要領を得ず大変ご迷惑おかけしました、初日はフライヤーも用意できていませんでしたし。

またキット化についてはそれはそれは沢山の方に御質問頂いたので、遅くとも次のMTMまでには何らかの形で出したいと思います。ただ肝心要のYM2151+YM3012の入手が不確定なので手元に数が揃うまでは安心できませんが。

解説動画作ります
ちょっと真面目に解説動画を作ろうと考えています、カメラの手配から開始なので少し間が空きますが少々お待ちください。

Arduino+FM音源で遊ぶ(MTM04に出展しますよ編)

Googleの絶版書籍データベース化は日本語除外されてしまいましたねー、残念。未来永劫個人ベースで電子化する方向しかないのでしょうか?

Rev1.1基板が到着

前回省略してしまいましたが、Rev1.1基板の狙いとしてはまずRev1.0基板ではUSBからのノイズ混入が酷かったのでLPFを入れるというのと、限界まで小さく仕上げるという2点です。表面実装部品を使えば大幅に小型化できますが、まだそんなスキルは無いのでリード付き部品で限界近くまで詰めてみました。S/Hとバッファアンプは4回路入り単一電源、レイルtoレイルのOPアンプを使用してDCV01を省略。部品点数を減らしています。

というわけでかっちり指定納期でPCBCARTから送られてきました、えらいぞPCBCART。

Arduino風になるのを狙ってメッシュベタにしたのですが、ラインが細くてなんだか違う雰囲気になってしまいました。めげずに実装してみます。

バックアップを含めて3台仕上げてみました、今のところ不良率0。石がなぜ3台分あるかというと、万が一の為にチップワンストップ他で手配していた分が届いたからです。しかしDACのYM3012はチップワンストップでも見つからず、海外のあやしい業者から購入した物ですがマーキングが何だか変でコピー品のような感じがします。普通に鳴りますけどね。

MTM04に出展します

というわけで唐突ですがオライリーさん主催のMakeTokyoMeetingに出展します。

MAKE: Japan : Make: Tokyo Meeting 04

グループ名は’ISH’で登録してあります。実はMake誌は英語版の01から読んでいる結構なファンだったりするのですが、仕事で見に行く時間が作れなくずっと悔しい思いをしていたので、少々無理していきなり出展でデビューしてみました。しょぼい出展ですが時間があれば是非見にきてください。ついでに「アレどうなったの?アレ」といったぶっちゃけた話もオッケーです(本当にスイマセンスイマセン・・・)

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ねたは溜めこんじゃダメという結論で。