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 12 | MIDI IN\0、MIDI OUT\0、DAW Control IN\0、DAW Control OUT\0 |
| Arturia BeatStep Pro | BeatStepPro OutEditor\0\0 |
原因を確かめるため、新しいユーザーアカウントを作り、他の MIDI アプリを動かさずに、Model 12 をつないだ場合と外した場合を比べました。どちらも構成を作り、IAC バスを足してから MIDIServer を再起動しています(macOS 27.0.1)。
| Model 12 をつないだ場合 | Model 12 を外した場合 | |
|---|---|---|
新しく作った Untitled.mcfg | 218 バイト。機器が一つも書かれていない | 32,025 バイト。11 台の機器と IAC の Bus 1、Bus 2 が書かれている |
| 再起動の前に足した IAC バス | 消えた | 残った |
違いは、Model 12 をつないでいるかどうかだけです。
自分の Mac で起きているか確かめる
-
構成ファイルがあるか、最後にいつ書き込まれたかを見てください。
ls -l ~/Library/Audio/MIDI\ Configurations/.mcfgがあって、Audio MIDI 設定で何かを変えても日付が変わらないなら、変更は保存されていません。 -
今の MIDI の設定に、NUL 文字が入っていないかを見てください。このコマンドは XML への変換を試して結果を捨てるだけで、ファイルは変えません。
plutil -convert xml1 -o /dev/null ~/Library/Preferences/ByHost/com.apple.MIDI.*.plistInvalid object in plist for property list formatと出たら、XML に保存できない文字を含む名前があります。私たちの場合、それが NUL 文字でした。 -
確実なのは、試しに IAC バスを足してから MIDIServer を再起動することです。
killall MIDIServerAudio 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 がなくても起きます。