アプリを動かしたまま MIDIServer を終了させたら、そのアプリの MIDI が、エラーも出さずに止まりました。
原因は、Mac のすべての MIDI が通る、MIDIServer という裏で動くプロセスにあります。MIDIServer が終了またはクラッシュすると、すでに起動していたアプリは、通知もないまま MIDI の接続を失います。入ってくる MIDI は届かなくなり、送った MIDI は送れたように見えて、機器には届きません。アプリがこれに気づいて MIDI の接続を作り直さない限り、切れたままです。確実な対処は、MIDI を使うアプリを、Audio MIDI 設定も含めて、終了して起動し直すことです。
気づいたきっかけ
MIDIServer が終了したときに MIDIFabric に何が起きるかを確かめるため、MIDI の接続と仮想のポートを作ったアプリを動かしたまま、Terminal で killall MIDIServer を実行しました。
1 秒もたたないうちに、アプリから MIDI の情報を読み出せなくなりました。それなのに、自分の仮想のポートへの送信は成功を返し続け、実際には何も届いていませんでした。MIDIServer が終了したことを知らせる通知も、アプリには来ませんでした。一方、後から起動したアプリは、普通に MIDI を使えました。
試したのは macOS 27 ですが、特定の macOS の版に限った問題ではないと考えています。
MIDIServer とは
音楽アプリは、MIDI 機器と直接やり取りしているわけではありません。macOS は MIDIServer というプロセスを動かしていて、これがすべてのアプリと、すべての MIDI 機器(USB、Bluetooth、ネットワーク MIDI、IAC ドライバ)のあいだを仲介しています。MIDI を使うアプリは、どれも MIDIServer の利用者(クライアント)です。
MIDI のドライバ(プラグイン)も、MIDIServer のプロセスの中で動いています。USB、Bluetooth、ネットワーク MIDI、IAC ドライバのための Apple 自身のドライバ(/System/Library/Extensions にあります)と、機器のメーカーが提供するドライバ(/Library/Audio/MIDI Drivers にインストールされます。Roland のものなど)です。すべて同じプロセスで動くため、どれか一つのドライバに問題があると MIDIServer ごと落ち、すべてのアプリが同時に MIDI を失うことがあります。
MIDIServer が終了するとき
- MIDI を使うアプリがないとき。 MIDIServer は自分で終了し、次にアプリが MIDI を必要としたときに起動し直します。そのときは接続しているアプリがないので、通常は問題になりません。
- クラッシュしたとき(MIDI のドライバの問題によるものなど)や、Terminal で
killall MIDIServerを実行したとき(よく紹介されるトラブル対処の方法です)。 - 予期せず。 MIDIFabric が起動して MIDI を使っている最中に、MIDIServer が終了したこともありました。理由は分かっていません。
起きること
- 鍵盤やコントローラーからの MIDI が、アプリに届かなくなります。
- アプリが送ったノートやメッセージが、シンセに届かなくなります。アプリの側では送信が成功したことになっているので、エラーは表示されません。
- この後に起動したアプリは普通に動きます。そのため、あるアプリは動くのに別のアプリは動かない、という分かりにくい状況になります。
- Audio MIDI 設定も気づきません。開き直すまで、表示や動作が正しくなくなることがあります。
多くのアプリが自動で復帰しない理由
macOS は、MIDIServer がいなくなったことを起動中のアプリに知らせず、アプリが使う MIDI の機能も成功を返し続けます。復帰するには、アプリ自身が切断に気づいて、MIDI の接続を作り直す(Core MIDI を初期化し直す)必要があります。そうしているアプリは多くないため、確実な対処はアプリを起動し直すことです。
起きたかどうかの確かめ方
Terminal で次のコマンドを実行してください。
ps -o pid=,lstart= -p "$(pgrep -x MIDIServer)"
今の MIDIServer が起動した日時が表示されます。その日時が音楽アプリを開いた時刻より後なら、その間に MIDIServer が起動し直しており、アプリは MIDI の接続を失っている可能性が高いです。何も表示されなければ、今は MIDIServer が動いていません。アプリが MIDI を必要としたときに、自動で起動します。
対処
- MIDI を使うアプリを、Audio MIDI 設定も含めてすべて終了してください。
- 起動し直してください。MIDIServer は自動で起動します。
- トラブル対処で
killall MIDIServerを実行する場合は、先に音楽アプリを終了しておいてください。そうしないと、上のとおり MIDI が失われます。 - 何度も起きる場合は、
/Library/Audio/MIDI Driversにどのドライバが入っているか、メーカーから更新が出ていないかを確かめてください。使っていない機器のドライバは、メーカーのアンインストーラで削除できます。
MIDIFabric について
MIDIFabricは MIDIServer との接続を常に確かめ、切れたらすぐにダイアログで知らせて、起動し直すよう案内します。上に書いた挙動は macOS 側のもので、他のアプリにも起きます。