最近のMIDI機器は既にUSB化されて久しいのですが、残念なことに私の手元にはUSB化されていない機器がいっぱい残ってます。単純な変換ケーブルで繋ぐだけでPCとMIDI機器が簡単に接続できたのですけど、最近のPCにはこのゲームポートも付いてません。これはウチにあるおもちゃのMIDIキーボードの背面写真です。左側にある丸い端子がそれぞれMIDI-IN、MIDI-OUT。普通ならここに各種のMIDI機器をズラズラと直列的に簡単に繋げちゃう。MIDI-OUTをMIDI-INにズラズラつないでいく分には迷うことなし。具合に、昔ながらのMIDI信号はマイコンでも扱いが簡単な一方通行のシリアルi/fの規格なのに対し、USB機器は扱いがかなり面倒です。USBは片方向のI/Fじゃなくて「バス」だから、扱いがちょっと変わっちゃう...。パッケージ的にはKORGのnanoKEYなんかとても魅力的なのに...。OSやPCの型が新しくなる毎に付属品まで一緒に買い換えさせられるのはなんとなく癪だしイヤ。フォーマットなので、マイコンで扱うにはもってこいです。実際マイコンとMIDI機器を接続する製作例はたくさん公開されています。工作物のテストをする際にPC上でやり取りする信号をモニタできれば作業も捗るかなぁとかたくらんでます。USB-MIDI変換ケーブルじゃぁシリアル接続ほど簡単にモニターできそうに無いからやっぱりヤダ。いうわけで、なんとかシリアルケーブル経由でMIDI機器と接続したいと妄想していました。HOSTとかかれているミニDIN8ピン端子...は、PCとRS232C経由で接続するためのコネクタです。この端子には論理的にはMIDIと同じ信号が流れていています。PC側はシリアル端子(いわゆる9ピンRS232C)に接続する...という方向で。制御チップの仕様制約により、同じ8n1であってもMIDIと同じ速度の通信が出来ません。9600bpsや115200bpsなど数種類の決められた速度から選択することしか出来ないためです。もこの仕様によってMIDIの通信速度に近い38400bpsとなっているようです。HOST端子)で扱う信号は38400bps(※)と、速度の点で互換性がありません。(※:実際は繋ぐPCやMIDI機器によって異なるので一概には言えませんが...)逆にいうと、速度の変換さえ出来てしまえば電気的には回路の作り方次第でなんとでもなってしまうはずです。速度を変換しちゃえばいいだろう...とハードウェアUSART登載のマイコンであればシリアルI/Oの速度をある程度自由自在に設定できます。31250bpsも38400bpsも。このマイコンを使って速度変換機能を実現し、MIDI機器とPCの間に挟み込めばシリアル端子経由でMIDI機器と接続可能なはずです。MIDIマスターキーボードからwindows上のシーケンサソフトに演奏の信号を読み込むことも出来ちゃいます。いうわけで、マイコンを使って市販のUSB-MIDI変換器よりも安上がりの速度変換器を作ってみることにします。いっても部品代全部合わせて1000円近く行くかなぁ...なお、盛り込む機能は通信速度の変換だけです。お手持ちの各MIDI機器のメーカーさんご提供の「シリアルMIDIドライバ」をそのまま使うことにします。ヤマハ、ローランドなどなど各メーカーからシリアルMIDIドライバが公開されています。いうわけでマイコンで速度変換を行いつつ、各メーカーのシリアルMIDIドライバを組み合わせる作戦を考えます。実際に出来上がりを接続してみて判った注意点を。注意を要するのは「USB-シリアル変換ケーブル」経由で接続する場合です。USB-シリアル変換ケーブルのドライバとの相性によっても影響されるようです。ちなみにウチの環境の話。PC背面の9ピンシリアル端子経由であれば当然何の問題もなく機能しました。USB端子にATEN製のUSB-シリアル変換器を使用したところ、ウンともスンとも言いませんでした。ちなみに単純な変換ケーブルと違ってマイコンの駆動に電源が必要になります。マイコンでMIDI関係の工作をする際のモニター的な用途程度になっちゃう。なんとかUSB接続したい...このあたりについては後日いろいろ実験したので、その結果を下のほうに書いておきます。盛り込むべきは速度の変換処理だけなので、プログラム的には大した話じゃありません。一定量のバッファリングが必要になるということが注意点でしょうか。この辺りは情報をきちんと整理して練りこんでいきたいところ。適当な回路とプログラムをでっち上げていくことにします。上に挙げた概略図の通り、シリアルの入力・出力がそれぞれ2つずつあり、しかもPC側・MIDI側では速度が異なります。これをマトモに満たすマイコンを探すと、AVRならUSARTを2個登載したmega128とかmega64のような規模の大きなやつばかり。似たようなモノでもmega644PはUSARTが1個しか入ってません。最初は手元のmega128を使っちゃおうかと思ったんですが、何しろやっぱり勿体無い...。巨大なプログラムメモリの殆どが使われずじまいになっちゃう...アタマを切り替えて、入力側の経路、出力側の経路を2つのマイコンに分けたらどうか...。オイラの大好きなtiny2313なら1個100円程度だし、USARTも登載しているし。いけるんじゃないかな?...でも1つだけ問題アリ。一つのペアをMIDI側に充てることができるけど、マイコンを2個に分けちゃうとハードウェアUSARTで扱える速度は1種類のみ。ハードウェアだけでは速度変換が出来なくなっちゃう...気を取り直して。入力側についてはハードウェアUSARTを使わざるをえないえしょう。出力側だけならポーリングでやっちゃうのは造作無いでしょう。いずれにしてもMIDI→PC側の経路はバッファリングが必要になるので、それらを踏まえると...こんな感じでしょうか。この橙色のところをそれぞれtiny2313を充てるというわけ。流出入するデータのストックとフローについて考えます。PCから受けてMIDI-OUTに抜けていくルートの2つ。MIDI-INから受けてPCに抜けていくルートの方。MIDI-INから入ってくる速度は31250bps。対してPCに抜けていく速度は38400bps。入ってきたデータは即時出力し、かつ出力の方が速いという事になるので、ストックは不要ですね(といっても最大で1バイトはストックする)。フローは最大で31250bps、つまり遅い方のMIDI-INに引きずられるカタチになります。1バイト入力してから次の1バイトを入力するまでの間に出力処理は完了してしまうわけです。PCから受けてMIDI-OUTに抜けていく方。PCから入ってくる速度は38400bps。対してMIDI-OUTに抜けていく速度は31250bps。フン詰まりになってます。PCから連続してデータが入りつづけたら永遠にデータが処理し終わらずに溜まりつづけていくことになります。ホントにそんな事になるのかというと、実際はそういうことではありません。MIDIデータのトラフィックは、基本的には「音が出始めたよ」とか「音が止まったよ」という合図。音符と音符の間は比較的閑散としているはずです。場合によってはフロー制御も組み合わせて使えば良いことになります。よると、ローランド、カワイ、ヤマハはハードウェアフロー制御を用いてますが、コルグの回路を見るとフロー制御を行ってません。閑散としたデータゆえ、ある程度のバッファを確保すればフロー制御は要らないってことと考えて良さそうです。今回は既にtiny2313を選択肢に仮定しているので、それで大丈夫かどうかを考えてみます。tiny2313のSRAMは128バイト。一部はサブルーチンコールのスタックに使われるのでバッファに使用できるのはせいぜい100バイト前後でしょう。31250bpsと38400bpsで比を取ると出力速度が入力に対して20%近く遅いということになります。100バイト÷20%=約500バイト以上のデータが一気にドバッと流れ込んで来た場合バッファを食いつぶす恐れが生じます。約0.16秒間に166個程度のノートオン+ノートオフが流れ込むとバッファを食いつぶす恐れが生じるということです。複数パートが混在する曲であっても、実際はデータとデータの間には間隔があきます。掃ける程度のデータ密度でなければそもそもMIDIの31250bpsという仕様自体が遅延が目立ちすぎて音楽として成り立たないでしょう。SMFファイルをPCから再生する場合等には、曲の開始前にシステムメッセージや音色設定などの信号が一気に流れる可能性があります。曲によってはこのデータが大量かもしれません。その場合はバッファを食いつぶす恐れが無いわけではありません。100バイト程度のバッファなら、多分瞬間的にこの程度は許容でき、曲がスタートすれば遅延もほぼ無く送受信が出来るものと思われます。いうわけで、このくらいのバッファを取っておけば多分問題ないと判断することにします。回路構成PCとの接続についてはシンプルに。電気的にはごく普通のRS232CレベルならOKなので、大人しくMAX232互換のICを使います。今回は道具箱からADM232Aを使ってみました。MIDI側の接続は機器を壊さないようにちゃんと考えつつ、一応部品代もアタマの片隅に置いて考えることにします。MIDIはカレントループで接続することになっていて、およそ5mAの電流を流してあげればいいことになってます。5mAならバッファICを使わずともAVRの出力ピンで直接ドライブできます。AVRの出力ピンと電流制限抵抗で構成することにします。MIDIの入力回路は、受けた電流でフォトカプラをドライブすることになってます。通常は高速なデジタル出力タイプのものが必要になります。安定動作するらしいので、有り難くこれを応用させていただくことにします。いうわけで組んだ回路がこれ。(クリックで別窓に開きます)入出力周りはおよそ一般的な回路になっていると思うので、仮にMIDI-OUTとMIDI-OUT同士を間違えて繋いでも壊れることは無いと思います。pcm1723さんの真似をしたところを除くと大した回路じゃ有りません。LEDですが、pcm1723さんと同じ理由でLEDに電圧降下の負担をさせているだけです。赤いLEDを1個使いました。使いましたが、在庫切れのようです(2009.10時点)。配置が同じものなら多分どれを使っても大丈夫でしょう。実際に組んで動かしてみて、波形をオシロで拾ったら、pcm1723さんのページにあるような少しだけ角が丸まってるけど奇麗な波形が見れましたあと補足するとしたらDIN5ピンのMIDI信号の配置。出来る限り写真にピンを書き込んで残しておくようにしてます。すれば実際に配線する時になっても迷い様がないので...。そうそう、右側のtiny2313のクロック源は左側のtiny2313のクロック出力機能を使うことにします。これによってセラロックを1個省けます。左のtiny2313は書き込みの際にPD2をクロック出力とするようにfuseを設定します。セラロックをもう1個増やしても構いませんが。プログラムtiny2313が2つあるので、プログラムも2個あります。右クリックしてダウンロードしてください。HEXファイルまずPC→MIDI変換(右側)用の方について。入力はハードウェアUSARTを使います。入力したデータは、内蔵のSRAMの100バイトをリングバッファに充てて一旦格納しておきます。バッファに溜められたデータは、1バイトずつ読み出してからソフトウェアのポーリングで1ビットずつ出力していきます。出力より入力のピッチが若干速いので、入力データが連続すると1バイト出力している間に次のデータが届くことになります。出力処理中にもきちんと読み込みとバッファリングを行わないと、すぐにハードウェアUSARTがバッファオーバーフローします。ういことで、1ビット出力するたびにUSARTにデータが届いているかどうかチェックし、データが来てたらバッファに放り込みます。USARTにデータが届いているかどうかのチェックにも神経を使います。分岐処理の周りがメンドウ...。この辺はシミュレーターでフルパスを通してクロック計算すればok。ちなみにデータ部分8ビット分の出力中はUSART入力有無チェックを行ってますが、スタートビット、ストップビットの出力中はサボってます。入出力の速度差が小さいので、この程度のサボりならストックとフローの点で特に問題は生じません。MIDI→PC変換(左側)用の方は簡単。入力より出力の方が早いので入力データをそのまま1ビット単位でポーリングしているだけです。1クロック単位で正確なタイミングを確保することを最優先にしたってことで、まぁいいことにします。使い方つなぎ方とかこんな風に接続して使います。MIDI-OUTが1個のMIDI入出力端子として機能します。mediaplayerだろうと、自作プログラムだろうと、何でも接続することが可能です。普通のシリアルi/fとしても扱うことが出来るので、MIDIとのやり取りを自由自在に読み書きすることも出来るわけです。普通のMIDI変換ケーブル類と一緒です。キーボードとかのMIDI楽器を繋げば、シーケンサーだろうとソフトウェアシンセだろうと、MIDIの演奏にしたがって音を拾ってくれます。データの中身には特にタッチしてないので、ノートオン、ノートオフとかだけじゃなく、音色の変更とかも普通に機能します。USB経由にしたい...さて注意を要するのは先ほどのUSB経由の接続の場合。USBシリアル変換ケーブル類を使う際の各社シリアルMIDIドライバとの相性のこと。幾つかの組合せで実験してみたところ、動く組合せと動かない組み合わせが存在するようです。実験結果をまとめておきます。いっても、動くか動かないかを保証するものではありません。私の環境での結果です。時と場合と環境によって異なる恐れが強いです。動いた(com2)というわけでcom2が空いているなら、カワイのドライバを使ってシリアル変換コネクタ(かボード)をcom2に割り当てて使うのが良さそうです。ローランド製の「設定できず」の件はブログに書き残してあります。オンボードシリアル(com1)が自由自在に使えるなら動作的には一番安定して使えます。便利な使い方やはり何と言ってもUSB接続にしてしまいかつ電源もUSBから取ったら、市販のUSB-シリアル変換ケーブルと同等になっちゃって便利。秋月のAE-UM232RはFTDI社のFT232-RLチップを登載したUSB-シリアル変換ボードです。今回使ったADM232AをFT232-RLに置き換えてしまえばばっちり。シリアル端子経由で通信内容をモニターできちゃったり...。あとでPCBEでも使ってFT232-RLを登載する専用ボードでも描いてみたいなぁ。プログラムは使いまわせるし...追記:FT232RLでUSB接続やっぱ世の中はUSB。FT232RLをつかって通信も電源もUSBケーブル1本で済まそうという作戦を考えてみました。回路図MAX232互換ICの代わりにFT232RLを使ってみました。これなら電源もUSBから取るので、通信と電源がUSBケーブル1本でok。電源周りはフェライトビーズとパスコンでノイズ対策としました。それ以外は特に凝ったことはしてません。いう話は気付かなかったことにします。万能基板とタカチのケースを使って纏めてみました。FT232RLは0.65mmピッチで扱い難いので、変換基板を使ってます。作り上げたモノを幾つかの観点でテストしてみます。組み合わせてみてちゃんと動くのかと言う点(設計面)と、組み立ててみてちゃんと動くのかという点(製造面)の、主に2つの観点です。ワンオフだから、特に製造面の不安が大きいわけですね。windowsのMIDI出力をこの基板を通して出力して、外部MIDI音源がちゃんとなるのか、とか確認します。MIDIマスターキーボードを繋いでソフトウェアMIDI音源を鳴らしてみると→ok、ok。