MIDI 2.0送信プログラム

送信プログラムの手順は、(1)MIDI Clientを作成、(2)ポートの生成、(3)機器の数を調べる、 (4)出力機器の名前を表示、(5)出力機器を選択、 (6)UMPをリストを追加、(7)リストを送信

(1)MIDI Clientの生成

送信と受信ではクライアント生成を若干違う関数で行っています。 受信側では、MIDIClientCreateWithBlockを使っています。 MIDIClientCreateWithBlockはMIDIシステムの変更通知をBlockで受け取ることができます。 受け取る時には、3つめの引数にコールバック関数を指定します。送信側はそこまで必要はありません。

MIDIClientCreateWithBlock(
  CFSTR("MIDI 2.0 Receiver"),
  &client,
  ^(const MIDIObjectAddRemoveNotification* notification)
  {
    // MIDI機器の追加・削除などを処理
  }
);

(2)ポートの生成

受信の場合は、MIDIInputPortCreateWithProtocolを使って受信プロトコルをMIDI 2.0 であることを 指定してポートを生成しています。送信側ではプロトコルを設定してポートを生成するAPIはありません。 ですので普通にMIDIOutputPortCreateでポートを生成します。

(3)機器の数をしらべる

受信側はMIDIGetNumberOfSourcesで、送信側はMIDIGetNumberOfDestinationsでそれぞれの機器の数を獲得 することができます。

(4)出力機器の名前を表示

    // MIDI Destination一覧を表示
  for (ItemCount i = 0; i < destinationCount; ++i){
    MIDIEndpointRef destination = MIDIGetDestination(i);
    CFStringRef name = nullptr;
    MIDIObjectGetStringProperty(destination, kMIDIPropertyName, &name);
    char nameBuffer[256] = {};
    if (name != nullptr){
      CFStringGetCString(name, nameBuffer,sizeof(nameBuffer),kCFStringEncodingUTF8);
      CFRelease(name);
    }

    std::cout
      << "[" << i << "] "
      << nameBuffer
      << std::endl;
  }

(5)出力機器を選択

  // Destinationを選択
  int destinationNumber;
  std::cout << "Select MIDI Destination: ";
  std::cin >> destinationNumber;

(6)UMPをリストを追加

まず、MIDI 2.0のUMPフォーマットに従って、MT=4のノートオンメッセージを準備します。 MT=4のUMPは64ビット(32ビット×2ワード)で構成されます。 次に、MIDI 2.0プロトコルを指定してMIDIEventListを初期化します。 その上で、準備したUMPをMIDIEventListAdd()を使ってイベントリストに追加します。

  MIDIEventList eventList = {};
  uint32_t ump[2]={0x40903C00,0xFFFF0000};
  MIDIEventPacket *packet = MIDIEventListInit(&eventList, kMIDIProtocol_2_0);
  packet = MIDIEventListAdd(&eventList, sizeof(eventList), packet, 0, 2, ump);

(7)リストを送信

最後に、MIDISendEventList()でイベントリストを送信します。

  status = MIDISendEventList(outputPort, destination,&eventList);