更新日:
確認環境: macOS 27.0、27.0.1

アプリを動かしたまま 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 を必要としたときに、自動で起動します。

対処

  1. MIDI を使うアプリを、Audio MIDI 設定も含めてすべて終了してください。
  2. 起動し直してください。MIDIServer は自動で起動します。
  3. トラブル対処で killall MIDIServer を実行する場合は、先に音楽アプリを終了しておいてください。そうしないと、上のとおり MIDI が失われます。
  4. 何度も起きる場合は、/Library/Audio/MIDI Drivers にどのドライバが入っているか、メーカーから更新が出ていないかを確かめてください。使っていない機器のドライバは、メーカーのアンインストーラで削除できます。

MIDIFabric について

MIDIFabricは MIDIServer との接続を常に確かめ、切れたらすぐにダイアログで知らせて、起動し直すよう案内します。上に書いた挙動は macOS 側のもので、他のアプリにも起きます。

← 開発ノートの一覧