CoreMIDIのMIDISend()関数では、複数のメッセージを「パケットリスト」の形でまとめて送信する。
ノートオン
が、最初から複数のパケットを送って動作確認するのはわかりにくいので、手始めにNOTE ONのメッセージを一つだけ送ってみる。
MIDIPacketList packetList; packetList.numPackets = 1; MIDIPacket* packet = &packetList.packet[0]; packet->timeStamp = 0; packet->length = 3; packet->data[0] = 0x90; packet->data[1] = 80; // キー (0〜127) packet->data[2] = 100; // ヴェロシティ(強さ) (0〜127) MIDISend(outputPortRef, destinationEndPointRef, &packetList);
送るメッセージ(パケット)が一つでも、パケットリストを作らないといけない。(ちなみに複数パケットを送る場合は、パケットリスト用のメモリの確保を手動でやる必要がある)
NOTE ONのメッセージは通常3つのバイトで構成される。コード内にコメントで書いた通り、2バイト目と3バイト目にキーとヴェロシティを指定する。1バイト目の9はNOTE ONのメッセージであることを表し、0はチャンネル1(チャンネル番号は1から始まる)を表している。NSX-39はチャンネル1に初音ミクの音源がセットされているのでチャンネル1を指定している。
ちなみに、チャンネル2以降にはGM音源が入っているので、0x91とかにするとGM音源をならすことができる。
早速実験。動いた。上記コードではノートオンしっぱなしになるので、音を消したい場合は直接デバイスの方でカーボン部分に一回タッチしてノートオフを送ってください。
なお、プログラム上でノートオフを送信したい場合は、素直に1バイト目に0x80を指定してノートオフのメッセージを送ってもよいし、ヴェロシティ=0のノートオンを送ってもOK。
発音を指定
発音する文字を指定したい場合には、システムエクスクルーシブデータで指定を行う。
packet->length = 9; packet->data[0] = 0xF0; packet->data[1] = 0x43; packet->data[2] = 0x79; packet->data[3] = 0x09; packet->data[4] = 0x11; packet->data[5] = 0x0A; packet->data[6] = 0x00; packet->data[7] = 0x52; // ここで発音を指定0x52は「ぴ」 packet->data[8] = 0xF7;
data[7]に発音させたい文字のコード(ポケットミクの説明書の最後のページに書いてある)を指定する。このパケットをノートオンの直前に送信すると、発音する文字を変更できる。
一応、これでCoreMIDIから基本的なポケットミクの操作ができるようになった。Javaに比べるとコードが長くなっていろいろ面倒くさいので、後で一旦まとめてからCocoaPodsかどこかでライブラリの形で公開します。
「NSX-39(ポケットミク)で遊んでみる3(Objective-Cメッセージ送信編)」への1件のフィードバック