アプリを動かしたまま MIDIServer を終了させたら、そのアプリの MIDI が、エラーも出さずに止まりました。
MIDIServer は、macOS で MIDI の送受信を仲介するプロセスです。これが終了すると、起動中のアプリは MIDI 接続を失います。受信できなくなるだけでなく、送信 API が成功を返しても機器には届かない状態になります。接続を作り直すには、Audio MIDI 設定を含め、MIDI を使うアプリを終了して起動し直してください。
気づいたきっかけ
MIDIServer が終了したときに MIDIFabric に何が起きるかを確かめるため、MIDI の接続と仮想のポートを作ったアプリを動かしたまま、Terminal で killall MIDIServer を実行しました。
1 秒もたたないうちに、アプリから MIDI の情報を読み出せなくなりました。一方、自分の仮想ポートへの送信 API は成功を返し続けましたが、受信はできませんでした。MIDIServer が終了したことを知らせる通知も、アプリには来ませんでした。一方、後から起動したアプリは、普通に MIDI を使えました。
試したのは macOS 27 ですが、特定の macOS の版に限った問題ではないと考えています。
MIDIServer とは
音楽アプリは、MIDI 機器と直接やり取りしているわけではありません。macOS は MIDIServer というプロセスを動かしていて、これがすべてのアプリと、すべての MIDI 機器(USB、Bluetooth、ネットワーク MIDI、IAC ドライバ)のあいだを仲介しています。MIDI を使うアプリは、このプロセスにクライアントとして接続します。
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 設定でも切断は通知されませんでした。開き直すまで、表示や動作が正しくなくなることがあります。
多くのアプリが自動で復帰しない理由
今回の試験では、MIDIServer の終了通知がアプリに届かず、送信 API も成功を返し続けました。復帰するには、アプリ自身が切断に気づいて、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 側のもので、他のアプリにも起きます。