更新日:
確認環境: macOS 27.0、27.0.1(26A434)、Mac mini(Mac16,11)

macOS 27 に上げてから、Audio MIDI 設定で追加した IAC バスが、いつの間にか消えるようになりました。

調べると、次の二つがそろったときに、macOS 27 は Audio MIDI 設定の構成ファイル(.mcfg)を保存できなくなることが分かりました。

  • Audio MIDI 設定で構成を作っている
  • ポート名に NUL 文字を含む USB MIDI 機器がつながっている

保存できないので、MIDIServer が起動し直すたびに、設定は最後に保存できた内容へ戻ります。追加した IAC バスも、削除した機器も元通りです。こうした機器がつながっていなければ、ファイルは普通に保存され、何も失われません。macOS 26 では、同じ状態でも保存できていました。Apple には報告済みです。

気づいたきっかけ

最初に追いかけていたのは、別の問題でした。macOS 27 に上げた後、Audio MIDI 設定で USB MIDI インターフェースの出力ポートが表示されなくなったのです。原因になっていた設定値を消すと表示は戻りましたが、MIDIServer が再起動すると、また元に戻ってしまいます。IAC バスを足しても同じで、再起動すると消えてしまいます。構成ファイルの日付を見ると、macOS 27 に上げてから一度も更新されていませんでした。

MIDIServer は、MIDI を使うアプリがなくなると自分で終了し、必要になるとまた起動します。そのため再起動は気づかないうちに起きていて、「しばらくすると消える」ように見えます。

原因は見えない NUL 文字

macOS は、MIDI の設定を二か所に持っています。

  • ~/Library/Preferences/ByHost/com.apple.MIDI.<ホストの UUID>.plist: バイナリの property list。変更のたびに更新されます。
  • ~/Library/Audio/MIDI Configurations/<名前>.mcfg: Audio MIDI 設定で作った構成。XML の property list です。

構成があると、MIDIServer は起動のたびに設定を .mcfg の内容へ戻し、ByHost のファイルもそれで上書きします。普段は .mcfg も更新されているので、これで困ることはありません。

問題は、USB MIDI 機器の一部が、ポート名の末尾に NUL 文字(\0)を付けて報告することでした。XML の property list には NUL 文字を入れられません。macOS 27 の MIDIServer はそこで .mcfg の書き出しをあきらめ、ファイルは古いまま残ります。バイナリの ByHost のファイルは NUL 文字も保存できるので、構成を一度も作っていない Mac なら問題は起きません。ただ、構成は一度作ると、Audio MIDI 設定から「構成なし」には戻せません。

手元で NUL 文字を報告していたのは、次の二台でした(どちらも Apple 標準の USB MIDI ドライバで動いています)。

機器ポート名
TASCAM Model 12MIDI IN\0、MIDI OUT\0、DAW Control IN\0、DAW Control OUT\0
Arturia BeatStep ProBeatStepPro OutEditor\0\0

原因を確かめるため、新しいユーザーアカウントを作り、他の MIDI アプリを動かさずに、Model 12 をつないだ場合と外した場合を比べました。どちらも構成を作り、IAC バスを足してから MIDIServer を再起動しています(macOS 27.0.1)。

Model 12 をつないだ場合Model 12 を外した場合
新しく作った Untitled.mcfg218 バイト。機器が一つも書かれていない32,025 バイト。11 台の機器と IAC の Bus 1、Bus 2 が書かれている
再起動の前に足した IAC バス消えた残った

違いは、Model 12 をつないでいるかどうかだけです。

自分の Mac で起きているか確かめる

  1. 構成ファイルがあるか、最後にいつ書き込まれたかを見てください。

    ls -l ~/Library/Audio/MIDI\ Configurations/

    .mcfg があって、Audio MIDI 設定で何かを変えても日付が変わらないなら、変更は保存されていません。

  2. 今の MIDI の設定に、NUL 文字が入っていないかを見てください。このコマンドは XML への変換を試して結果を捨てるだけで、ファイルは変えません。

    plutil -convert xml1 -o /dev/null ~/Library/Preferences/ByHost/com.apple.MIDI.*.plist

    Invalid object in plist for property list format と出たら、XML に保存できない文字を含む名前があります。私たちの場合、それが NUL 文字でした。

  3. 確実なのは、試しに IAC バスを足してから MIDIServer を再起動することです。

    killall MIDIServer

    Audio MIDI 設定を開き直してバスが消えていれば、この問題に当たっています。

先に音楽アプリを終了しておいてください。MIDIServer が終了すると、起動中のアプリは MIDI の接続を失い、多くの場合そのまま止まってしまいます(「Mac の音楽アプリで、MIDI が突然止まるのはなぜ?」)。

対処

私たちの Mac では、原因の機器を外してから、Audio MIDI 設定で新しい構成を作り直したら直りました。変更がまた保存され、MIDIServer を再起動しても残ります。今の構成にすでにその名前が記録されている場合は、機器を外すだけでは直らないかもしれません。確かめたのは、構成を作り直す方法です。

いくつか注意点があります。

  • 新しい構成では IAC バスの ID が変わることがあるので、アプリ側でバスを選び直す必要が出るかもしれません。
  • 機器をつなぎ直すと、たぶん再発します(試してはいません)。設定を変えるときは、その機器を外してからにしてください。
  • それまでは、Audio MIDI 設定での変更は一時的なものと考えておくのが安全です。MIDIServer の再起動をまたいで残るのを確かめるまでは、保存されたと考えないほうがよいでしょう。
  • 構成の切り替えも避けたほうが無難です。切り替えると IAC バスの ID が作り直され、バスを ID で覚えているアプリはそれを見失うことがあります。

どうしても今の構成を残したい場合は、.mcfg を手で直す方法もあります。ただし上級者向けです。NUL 文字が入っているせいで、plutil や Python の plistlib では書き戻せません(plistlib は読み込みすらできません)。バックアップを取ってから、テキストエディタで必要な行だけを直し、元のファイルと差分を比べてから、Audio MIDI 設定でその構成を選んで読み込ませてください。

Apple には詳細を送っています。何か変わったら、このページを更新します。

MIDIFabric について

MIDIFabricは機器や IAC バスを CoreMIDI の ID で覚えているので、MIDIServer の再起動をまたいで何が残るかを、いつも気にしています。今回の問題は macOS 側のもので、MIDIFabric がなくても起きます。

← 開発ノートの一覧