最も良く使われるMidiインタフェース、MPU401が動くようになりました。新たに開発した、周期156usの高精度タイマがMPU401をVoxWareのような可聴遅延を生じることなく動作させます。
本ドライバはVoxWareおよびLGSNDのシリアルポート用Midiドライバです。VoxWare用のものはLinuxからFreeBSDに移植されたものです。 最初に井口 剛さんが3.1-STABLE VoxWareへ移植し、私(谷村 正剛)が4.0-CURRENT VoxWareへ移植しました。さらにLGSND上で作業を継続中です。
このドライバを使うと、computer portつきのmidi音源をシリアルポートに接続し、 playmidiやrosegarden、その他VoxWareに対応したポピュラーなmidiプレイヤーや ツールが使えます。重いexclusiveを使うシーケンスを再生してみましたが、 sbmidiのようなテンポの遅れが全くありませんでした。さらに、Luigiの新しい サウンドドライバ上であなたのお好きな曲を聞くこともできます。
井口さんと私は本ドライバをCURRENTへマージする作業をしています。 本ドライバに興味をお持ちの方を対象に、公開テストをしています。テストへの参加ありがとうございます!
もちろんありますよね!
現在、サウンドカード上のOPL3、MPU401 Midiインタフェース(SB midiなどの互換品を含む)、シリアルポートが使用できます。
Midi音源や楽器はMPU401 Midiインタフェースを通してPCに接続できます。 RolandのSC-{55,88}シリーズなど、最近のmidi音源には{computer, host, etc}ポートが ついています。このような音源はシリアルポートに接続できます。{computer, host, etc}ポートの 見かけはごく普通のmidiポートとは異なり、むしろMacのシリアルポートに似ています(Rolandの音源の場合)。 38.4kbpsの速度で受信できる{computer, host, etc}ポートが必要です。
MPU401を使う場合。
Midi音源をPCのシリアルポートに接続するケーブルが必要です。 詳しくはmidi音源の製造元にお尋ね下さい。
現在、3.1-STABLEおよび4.0-CURRENT向けのパッチがあります。
http://www.eie.yz.yamagata-u.ac.jp/~a95516/zinnia/hack/rsmidi/uart16550patch.tar.gz
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/uart16550-31stable-19990511.diff.gz(uart16550-19990509.diff.gzまでのMFC、時々rebootするとの報告あり)
http://www.sfy.gr.jp/~zinnia/archives/uart16550-stable.19990609.patch.gz(uart16550-19990605.diff.gzまでのMFC)
http://www.eie.yz.yamagata-u.ac.jp/~a95516/zinnia/hack/rsmidi/uart16550.egcsfixed.diff.gz
このパッチはドライバのファイルにcommitがあった時に更新します。一番下にあるのが最新版です。
http://www.eie.yz.yamagata-u.ac.jp/~a95516/zinnia/hack/rsmidi/uart16550-19990420.diff.gz(new-busのマージ)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/uart16550-19990424.diff.gz(sioreg.hがsys/isaに移動)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/uart16550-19990501.diff.gz(忘れ物、i386/isa/sound/{midi_synth, midibuf}.c 指摘者: Juergen Lock <nox@jelal.kn-bremen.de>)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/uart16550-19990509.diff.gz(LGSNDで曲が流れます! バンザイ!)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/uart16550-19990517.diff.gz(LGSNDでOPL3が動くようになりました)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/uart16550-19990523.diff.gz(書き忘れていたioctlとcallbackを実装、flagsのさらなる使用)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/uart16550-19990605.diff.gz(OPLでpnpを使ったprobe/attachをさせました。writerawとreadrawをsynthdev_infoに移動)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/uart16550-19990619.diff.gz(HEADS UP: newbus化完了までOPL3のpnpを止めています! midi(4)とseq(4)をそれぞれ別のソースファイルに移動し、newbus化の準備をしています)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/newmidi-19990627.diff.gz(HEADS UP: midi(4)とseq(4)のメジャーナンバーが変わりました! newbusを使うようにしました、pcm(4)に依存しなくなりました。)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/patches/newmidi-19990706.diff.gz(MPU401が動くようになりました。周期156usの高精度タイマを導入しました。新しいioctl(2) MIO{S,G}PASSTHRUを導入し、ドライバが使用中でなければmidiメッセージのパススルーができるようになりました。)
http://www.naklab.dnj.ynu.ac.jp/~tanimura/freebsd-serialmidi/midimanual.tar.gz(midi(4)およびseq(4)のnroff man pages)
% cd /usr/src/sys
% zcat (どこか)/uart16550-31stable-19990609.diff.gz | patch
% cd /usr/src/sys
% zcat (どこか)/uart16550.egcsfixed.diff.gz | patch
% cd /usr/src
% zcat (どこか)/newmidi-19990706.diff.gz | patch -p0
SB AWEのカードでは、EMU8000のチップをそのままにしておくとOPL3からの音が出力されません。 EMU8000を立ち上げて初期化するための対策を組み込み、OPL3からの音が聞こえるようにしました。 newmidi-19990627.diff.gz以降では、EMU8000向けにmidiデバイスを設定すれば十分です。
sys/i386/isa/snd/opl.cに、以下のような行があります:
EMU8000がポート0x620にあれば、そのままで構いません。 EMU8000がない場合は(SB16など)、この行をコメントアウトして下さい。 EMU8000が0x620以外のポートにある場合は、値を適切なものに変更して下さい。#define EMU8K_HACK_PORT 0x620
または使用不可にして下さい。例:#device sio0 at isa? port "IO_COM1" flags 0x10 tty irq 4
device sio0 at isa? disable port "IO_COM1" flags 0x10 tty irq 4
もちろん、{uartsio0, midi*}のポートとirqは異なるかもしれません。# VoxWareをお使いですか?
controller snd0 # お忘れなく!
device uartsio0 at isa? port 0x3f8 irq 4
# それともLGSND?
controller pnp0 # ISA pnpサポート。
device midi0 at isa? port 0x3f8 irq 4 # シリアルポート。
device midi1 at isa? port 0x388 # OPL3シンセサイザ。
device midi2 at isa? port 0x620 # EMU8000 wavetableシンセサイザ、OPLの音を出すだけです。
#device midi2 at isa? port ? irq ? drq ? # pnpによる自動設定(現在は使えません!)。
device midi3 at isa? port 0x330 # MPU401、irqは自動認識します。
pseudo-device seq 1 # これがシーケンサです。
pnp 1 0 os enable irq0 5 drq0 1 drq1 5 port0 0x220 port1 0x330 port2 0x388
pcm(4)とmidi(4)/seq(4)を別々に設定できるようにするため、midi(4)とseq(4)に新しいメジャー ナンバーを与えました。今のところ200となっており、公式なものを予約できたらもう一度変更する 予定です。midi(4)とseq(4)を使うにはデバイスノードを作り直す必要があります。例:
# cd /dev # rm midi* sequencer* # mknod midi0 c 200 2 ; chmod 666 midi0 # mknod midi1 c 200 18 ; chmod 666 midi1 # ln -s midi0 midi # mknod sequencer0 c 200 1 ; chmod 666 sequencer0 # ln -s sequencer0 sequencer # mknod midistat c 200 6 ; chmod 666 midistat
LGSNDならこんな感じです:Card config:
(中略)
16550 UART Midi at 0x3f8 irq 4
Midi devices:
0: SoundBlaster 16 Midi
1: uart16550A MIDI
FreeBSD Midi Driver (newmidi) Jul 6 1999 09:00:07
Installed devices:
midi0: <OPL FM Synthesizer> at 0x388
midi1: <16550 uart midi> at 0x3f8 irq 4
midi2: <EMU8000 Wavetable Synth> at 0x620, 0xa20, 0xe20
midi3: <MPU401 midi> at 0x330
seq: 1 unit(s) configured.
イタリックになっているところを確認して下さい。
こちらのページをお読み下さい(英語のみ)。解説は製作中です。
井口さんか 私に直接メールを送るか、 freebsd-hackers/ freebsd-multimedia/ freebsd-users-jpで 議論ができます。
$Id: index-j.html,v 1.23 1999/07/06 05:43:00 tanimura Exp $