更新日:
確認環境: 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 が変わることがあるので、アプリ側でバスを選び直す必要が出るかもしれません。
  • 機器をつなぎ直すと再発する可能性がありますが、再接続後の試験はしていません。設定を変えるときは、その機器を外してからにしてください。
  • 設定を変更した後は、MIDIServer を再起動しても変更が残るか確認してください。画面上で変更できても、保存に成功したとは限りません。
  • 構成の切り替えも避けたほうが無難です。切り替えると IAC バスの ID が作り直され、バスを ID で覚えているアプリはそれを見失うことがあります。

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

MIDIFabric について

MIDIFabricは機器や IAC バスを CoreMIDI の ID で覚えているので、MIDIServer の再起動や構成の変更で ID が変わると、接続先の再確認が必要になります。今回の問題は macOS 側のもので、MIDIFabric がなくても起きます。

← 開発ノートの一覧