更新日:
確認環境: macOS 26、27.0、Korg Keystage と opsix module を USB で接続

Korg Keystage と opsix module を USB で Mac につなぎ、MIDIFabric で互いにルーティングしたところ、MIDI-CI の Property Exchange が成立しませんでした。

macOS 自身が USB の機器と MIDI-CI をやり取りし、その一部を機器のあいだで中継していることが関わっているとみています。macOS の中継とルーティングの両方から同じメッセージが届くと、機器は返信を衝突として扱い、Property Exchange が成立しない、または片方の電源を入れ直すと成立しなくなります。正確な原因はまだ確定していません。2 台を MIDI(DIN)ケーブルで直接つなぐと成立しました。

気づいたきっかけ

MIDI モニタで見ると、電源を入れ直した機器が MIDI-CI の Discovery を約 100 ms ごとに送り直していて、そのたびに相手が「Invalidate MUID」を返していました。一度は成立した接続が、電源を入れ直した後は二度と成立しません。

MIDIFabric のルーティングによるものかを切り分けるため、MIDIFabric を止め、MIDI モニタだけを動かして確かめました。すると、macOS 自身が MIDI-CI に参加し、機器のあいだでメッセージを中継していることが分かりました。

起きること

  • Property Exchange に対応したシンセのパラメータ名が、コントローラーに表示されません。
  • 一度は成立したのに、片方の電源を入れ直すと二度とつながりません。
  • MIDI モニタで、MIDI-CI の Discovery が約 100 ms ごとに繰り返され、そのたびに「Invalidate MUID」が続きます。

macOS が MIDI-CI に対して行っていること

ルーティングのアプリを使わず、MIDI モニタだけを起動した状態で確認したことです。

  • macOS 自身が MIDI-CI に参加する。 MIDIServer は USB の機器へ、起動するたびに新しい MUID で自分の Discovery を送り、Property Exchange の情報(PE Capabilities と ResourceList)を問い合わせます。Apple の CoreMIDI の資料には、MIDI サーバーが UMP Endpoint と MIDI 1.0 の機器に対して、自動で MIDI-CI の Discovery を行うと書かれています。
  • macOS は、機器が全体に向けて送る MIDI-CI の一部を、機器のあいだで中継する。 opsix module が全体に向けて送った Discovery が、MIDIServer 自身によって Keystage に届けられました。確認できたのは opsix → Keystage の方向だけで、逆方向は確認できませんでした。特定の機器に宛てたメッセージは多くの場合中継されませんでしたが、中継されないとは言い切れません。
  • 中継の回数は一定しない。 MIDIServer の起動直後は 1 回でした。別の日には 3 回を観測しました。機器がつなぎ直しを繰り返した後には、opsix module からの 1 通に対して、Keystage が数百回返信しました。

ルーティングすると悪化する理由

MIDI-CI は双方向のやり取りなので、ルーティングのアプリが 2 台のあいだでメッセージを運ぶ必要があります。そこへ macOS も全体向けのメッセージを中継すると、受け取る機器には同じメッセージが macOS 経由とルーティングのアプリ経由の 2 回届き、2 回返信します。相手の機器は同じ MUID から 2 回返信が来たことを衝突とみなし、その MUID を無効にします(Invalidate MUID)。その結果 Property Exchange が成立せず、電源を入れ直した後には、Discovery、返信、Invalidate MUID の繰り返しから抜け出せなくなることがあります。

機器の側の挙動が関わっている可能性もあります。以前に見た機器の新しい MUID を、機器が無効にする動きも観測しました。これらの原因は切り分けていません。

アプリだけでは解決できません。macOS には、自身の MIDI-CI の Discovery や中継を止める公開の設定がありません(MIDICIDeviceManager は発見した機器を報告するだけです)。MIDIFabric で、ルーティングの途中で重複する MIDI-CI のメッセージを取り除く方法も試しましたが、中継の方向と回数が一定せず、機器が意図して送った重複まで消してしまうため、採用しませんでした。

対処

  1. 機器どうしの MIDI-CI には、2 台を MIDI(DIN)ケーブルで直接つないでください。 私たちの確認では、電源を入れ直す側の機器を Mac に USB で接続しなければ、この接続で MIDI-CI が成立しました。
  2. 抜け出せなくなったら状態を戻してください。 MIDI を使うアプリをすべて終了して MIDIServer を終了させ、機器の電源を入れ直します。
  3. MIDI-CI が不要なルーティングでは SysEx を遮断してください。 機器のあいだでノートやコントローラーだけを送ればよい場合は、そのルーティングで SysEx をフィルタします。MIDI-CI のメッセージは SysEx なので繰り返しは止まりますが、そのルーティングでは Property Exchange も使えなくなります。

何か分かったら、このページを更新します。

MIDIFabric について

MIDIFabricは MIDI-CI をそのまま転送し、モニタは MIDI-CI のメッセージを名前で表示します。上に書いた中継は macOS が行っているもので、MIDIFabric がなくても起きます。

← 開発ノートの一覧