charset of this page is UTF-8
MU100 使ってる人からメールもらったんでちょっと対応してみようかと。
MU100 って本体にニ系統の XG 音源もってて、あと THRU 端子もついてるんです。で、 port 1 が音源 A に、 port 2 が音源 B に、 port 3 ~ 8 のいずれか(設定可能)が THRU からでるらしいんです。いまの serial_midi は multiport のことなんかなぁんにも考えてませんので、 THRU からもそのまま出ちゃうよーってうメールをもらったわけです。 THRU だから当然やんか、って気はするのですが。 multiport 対応のドライバを使えば音源 A と THRU とに別 port を割り振って使うことができるらしいんですね。
この multiport 対応は MIDI OUT に関しては簡単でさくっとできちゃいましたが、 multiport にするか否か、 multiport にするときは何 port まで使えるようにするか、とかハードコーディングしちゃってます。で、これを設定ファイルで設定できるようにするってのをやってます。っていうか、これもできました。ですが、せっかく設定ファイルを使うんだからもっといろいろ設定できるようにしたいよねー、という誘惑にかられてなんか変なことやりつつあります。そんなんは置いといて、 MIDI IN を作んなきゃいけないんすけど。でも結局リリースするときには、 multiport 関係以外に付け足した設定関係は隠してリリースしようと思ってたりします。
MU100 は multiport に関しての事がマニュアルにも書いてあるらしいんですが、うちにあるのは SC-88VL 。これで試せないと面倒やなぁとか思ってたんですが、なんか multiport 対応してるらしいことがわかってちょっとラッキー。マニュアルのどっこにも書いてないんすけどね。 Roland の Windows 用シリアルポート MIDI ドライバにはなんか multiport 関係の設定があるらしいです。らしいというのは、 Win98 用の最新版ドライバをインストールしようとすると、 Win98 が死んじゃうんです。
現在の serial_midi は multiport 対応になってませんので、 midi/serial/1 とか midi/serial/2 とかいうデバイスファイルを作るようにしてます。で、 multiport 対応版ではもひとつ階層が深くなって midi/seral/1/1 とか midi/seral/2/3 とかいうふうになります。 multiport 対応の音源を繋いでいないシリアルポートに関しては、今まで通り midi/seral/1 っていう風になります。設定ファイルでこの設定をするんですが、設定ファイルを書き換えてもかってにデバイスファイルが変わるわけじゃないので、一度 rescan かけてやらんといけません(virtual midi で試すとわかります)。そんなことユーザーに要求するのは無茶ですんで設定ファイルを書き換える preferences application も書かんといかんなぁとか思ってます(virtual midi は設定するためのアプリケーションあるのに、どうして rescan しとらんのやろ)。とか云いながら、多分しばらく書きませんけど。
このデバイスファイルの re-publish に関してもちょっとありまして、 midi/serial/2/2 とか作った後に、設定ファイルで serial2 を multiport 対応じゃなくして、 rescan serial_midi ってしてやると、本来 midi/serial/2 ができて欲しいのにちゃんとできないってことが起きます。階層が変化しなければ大丈夫なんですけどね。で、これを避けるには serial_midi を一旦別のディレクトリに移動するか、名前を変えて読み込まれないようにして、 rescan serial_midi してやり(この段階で serial_midi のデバイスファイルが無くなる)、その後 serial_midi ドライバを元の場所/名前に戻してもう一度 rescan serial_midi ってやる必要があったりします。あるいは reboot しちゃうとか。これ、 devfs のバグなんじゃないかって気はするんですけど。あー、ちなみに rescan ってのは /bin/rescan で、デバイスドライバにデバイスファイルを作り直させる時に使います(ドライバが最初にロードされたときだけ呼ばれる publish_devices() をもう一度呼んでくれる)。
この rescan コマンドに関してもちょっとありまして(しつこい?)、プログラム的に同じことをするにはどうすればよいかがわかったんで、それを忘れないよう書いておきます。
いちばん素直 & 確実な方法はプログラムの中から /bin/rescan を実行しちゃうって事です。これ、あたりまえ。もう一つの方法は fd = open("/dev", O_WRONLY) して write(fd, "serial_midi", strlen("serial_midi")) するっての。これで /bin/rescan したのと同じことになります。はい、正直に言います。 rescan を disassemble しました。いや、 rescan でのデバイスファイル作り直しがうまくいかんかったんで、どんなことしとるんやろってのぞいてみたんです。そしたら /dev を open() して、ドライバの名前を write() してるだけだったって訳です。
disassemble といえば、 BeBox の serial3 と serial4 に関しても、 BeBox 用のシリアルドライバの中をのぞきました。そしたら ioport が 0x0380 と 0x0388 で、 IRQ が 16 と 17 だったってわかったわけです。ついでにクロックが 8MHz だってことも。 BeBox のシリアルポートは serial1 & serial2 と serial3 & serial4 とで別の石になってます。 serial3 & serial4 は BeBox のニ系統の MIDI port と同じ石にあります。 TI の UART が四つ入った石です。 MIDI だけの事考えるなら四つ入った石を使う必要もないわけなんですが、なぜか四つ入った石を使っていて、ついでにシリアルポートを合計四つにしちゃってるってあたりは、 I/O お化けな BeBox らしいと云えるのカモ。 serial3 & serial4 は MIDI と同居してるって事からわかるように、 PC の通常のシリアルポートでは使えない 31.25Kbps(MIDI の転送速度) が使えます。実は Macintosh 用のシリアルポート接続 MIDI デバイスって 38.4Kbps じゃなくて 31.25Kbps を使ってるらしいんです(未確認)。ということは、うちの初代 MIDI Time Piece (8IN/8OUT の MIDI interface) が BeBox で使えるかもしれないってんで、 serial_midi の multiport 対応がすんだら実験してみる予定です。
ついでなんで、もう一個だけ。 MIDI ドライバの ioctl 関係って、 midi_driver.h (sonic_vibes のソースの中に有りました(さっき気付いた)) では幾つか定義されてるんですが、 serial_midi に吐出させたログで見る限り、ただの一個も ioctl() が飛んできません。というわけで、 serial_midi の control hook はからっぽになっていたりします。
あ、そーそー、あともう一個だけ。最初 serial_midi は ioport とか IRQ とか決めうちにしてたんです。 ioport/IRQ を調べることはできるんですが、それが port/serial1 ~ serial8 のどれに対応するのか知る方法がわからんかったんですね。シリアルポートと同じ番号の振り方にしておかないと、 MIDI とシリアルポートの対応がわかんなくなって混乱するだろうってんで、とりあえず serial1 ~ serial4 を com1 ~ com4 の標準的な ioport/IRQ にしてました。今はちゃいます。で、この対応というか個々のシリアルポートの ioport/IRQ を知る方法はというと、 /dev/config/serial を read() してやれば okay 。 cat /dev/config/serial | hd すればすぐにわかりますが、 ioport と IRQ のペアが八個分出てきます。これがそれぞれ serial1 ~ serial8 に対応しているわけです。
みょ~に長くなっちゃった。書き落としはないかな。ここに書いたことは(最初の方の MU100 がなんたらってのは別にして)、 Be に聞けば多分教えてくれることばかりなんじゃないかなぁって思います。ですが、せっかくごにょごにょ調べたことなんで書いておきました。
1999-10-27
KISAKA Toshihiro