送信プログラムの手順は、(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);