RS-MIDIと言われているインターフェースをFreeBSD上で使えるように するはなし。
こちらが 現在FreeBSDとMIDIで遊ぶには必読のページです。うちの方は基礎知識を仕込む程度に しか使えなくなってしまいました。
以下は、FreeBSDでMIDIを楽しむためのtipsなど
MIDI specification(URL調査中)によると、 MIDIの信号は31250bpsで非同期シリアル転送 (8bit-1stop、none parity)されるものらしい。 なんで31250bpsになったのかはわかんないけど、 当時はパソコンのRS-232CでMIDI機器をドライブするなんて 発想はなかったに違いない :-)。 38400bpsにしてくれれば後の苦労はいろいろとなくなって うれしいのになあ、などと単純に考えてしまうが、 実は31250bpsじゃないといけないようなすげー理由があったり するのかもしれない。今となってはもうそれを知る術はないが (よくゆうわ)
と思ったら「トランジスタ技術SPECIAL No.63 パソコン周辺インタフェースのすべて」(CQ出版)に書いてあった。 要するに回路が複雑にならなくてラクだった、という ことらしい。なるほど納得。
幸いというかなんというか、EPSONのPC-x86シリーズと その互換機であるNECのPC-98x1シリーズ(あ逆かな :-))についてる RS-232Cポートでは31250bpsに設定することができるので、 これに簡単な回路をつけたインターフェースを 用意してMIDI機器と通信するいわゆる「RS-MIDI」という やつができたりした。DOS時代のソフトは大抵対応していたし、 逆にRolandのMPU-98とかに対応していないソフトの方が 多かったりしたのかもしれない :-)
その後、もっと複雑な回路をつかって、こんぴゅーた側が 28800bpsで通信できるようなインターフェース「MIDIator」 (URL調査中)や、パラレルポートを利用した インターフェースなどが発表されたりしたが、 これは主に31250bpsに設定できないPC/ATマシンで 利用されてたらしい。
31250bpsに設定できないこんぴゅーたで、 38400bpsに設定しといてBREAK信号を使って擬似的に 31250bpsを作りだしMIDI機器と通信するという すばらしい技術も開発され、DynaMIMPIとか sermid、SRECなどを使えば 31250bpsに設定できないPCでもRS-232Cを使って 通信することが可能になった。わたしとしては、 BREAK信号を送るタイミングを自動的に計測して決めてくれる sermidが一番素晴しいと思う。でもやっぱり力技な作業なので multitask OSではきびしいかなという感じがする。
さらに、MIDI機器内部にこんぴゅーたとのシリアル接続を サポートするためのインターフェースを内蔵するものも でてきた。これを使うとこんぴゅーた側は38400bpsに 設定するだけでおっけーなのでうれしい(もちろん 31250でもおっけーだが)。いわゆる、 「Computer端子」というのがついている機器が このタイプに属する。最近のMIDI音源にはたいていこの Computer端子がついてるので、それと専用ケーブル(たいてい 附属している)を使えばRS-232Cポートを使ってMIDI音源とおしゃべりができる。
以上の話をまとめておく。
PC-98x1シリーズ(uart8251) | PC/AT互換機(uart16550) | |
---|---|---|
Computer端子がある機器 | 附属ケーブルで通信可能(PC1またはPC2) | 附属ケーブルで通信可能(PC2のみ) |
Computer端子がない機器 | 専用インターフェースを作れば通信可能 | MIDIatorやパラレルインターフェースを使うか、 sermidなどのソフトを使えば通信可能 |
PC1だとかPC2だとかはRolandの機器を見て喋っているので 単に方言かもしれないけどよくわからない。 PC1は31250bpsでの通信、PC2は38400bpsでの通信モードという つもりで書いている。 で、今回相手にするのは赤いマスクがかかった部分のみである。 このドキュメントでは、このようにしてRS-232Cポートを 利用してMIDI機器とおしゃべりするしくみのことを RS-MIDIと呼ぶことにする。
FreeBSDに限らず、UNIX系のOSでこのようなRS-MIDIを 実現するためには、 midiplayというソフトを使えばよい。 Computer端子のある音源なら、これだけでRS-MIDIを楽しむことができる。 Computer端子がない音源でも、こんぴゅーた側が98なら sioドライバにちょっと パッチをあてれば31250bpsで 通信させることができる。
midiplayを使ってみて、「あ、こりゃあいい」と思ったひとは もはやこのドキュメントを読む必要はない :-) が、 「なんかテンポがぐにゃぐにゃになる」とか 「他にいろいろ出ているMIDI対応ソフトも使いたい」と思ったひとは こっから先を読んでソンはないと思う ;-)
midiplayでテンポがぐにゃぐにゃになるのは、user processで タイミングをとってデータを送ってるからである。だから 他のtaskに処理をうばわれたりしてタイミングがずれたりする。 やっぱり、こういうシビアなタイミングが要求される 処理はカーネル内部にもっていないとつらい。
... と、思っていたのだが、 こちらのパッチを 使うとテンポの歪み、音が途切れるなどの症状が 緩和されるんだとか。知らなかった。
現在のところFreeBSDのサウンド対応は 混乱した状況だと思う。基本的にはVoxWare(現OSS/Free)が 利用されていることが多いと思うが、2.2系と3.0系では 利用されているversionが違うし、中身もけっこう違う。 そこに、FreeBSDオリジナルのLuigi's new sound driver(LGSND)が 出てきて話がかなりややこしい。 LGSNDは、2.2.6-RELEASEから標準で添付されているので、 VoxWareとLGSNDの好きな方をインストールして利用することが できる。
LGSNDはVoxWareとインターフェース互換のドライバであり、 将来はFreeBSDの標準ドライバになると思われるが(個人的な希望的観測)、 残念ながら まだMIDI関連がサポートされていないので今回は 対象としない。
VoxWareの方は、3.0系で採用されているバージョンは 2.2系で不完全なままだった場所などがきちんと実装されていたり、 なかなか魅力なのだがわたし自身が3.0系を利用していないので こちらも今回は対象としない。
というわけで、今回対象とするモデルは、
FreeBSD 2.2.6-RELEASE + VoxWare 3.0
ということにする。
VoxWareがインストールされたFreeBSDでは、/dev/midiや /dev/sequencerなどを介してMIDI機器と通信ができるように なっている。RS-MIDI用のデバイスドライバを書いて、 /dev/midiや/dev/sequencerからアクセスできるように してやれば、MIDI対応のアプリケーション(playmidiや rosegardenなどなど)をRS-MIDIで使うことができるように なるわけである(わたしは試してないがnetscapeのMIDI plugin なども使えるようになるはずである)。 playmidiならmidiplayのようにテンポがぐにゃぐにゃになったり することはまずない。
uart8251の方はもういじってないけど、uart16550の方は まだまだ興味深いネタがある。
モデムなどと共用の場合は着脱可能な方が便利よね。 それからぜひLGSNDとの共存は今年じゅうには果たしたいところだ。