1

xy スタイルのコントローラーに関連するコントローラー位置変更メッセージを記述する 2 つのパケットを含む MIDIPacketList を送信しようとしています。

実装しようとしている関数は、x と y の位置を取り、パケットを作成して、次のように選択したターゲット デバイスに送信します。

- (void)matrixCtrlSetPosX:(int)posX PosY:()posY {

    MIDIPacketList packetList;
    packetList.numPackets = 2;

    packetList.packet[0].length = 3;
    packetList.packet[0].data[0] = 0xB0;        // status: controller change
    packetList.packet[0].data[1] = 0x32;        // controller number 50
    packetList.packet[0].data[2] = (Byte)posX;  // value (x position)
    packetList.packet[0].timeStamp = 0;

    packetList.packet[1].length = 3;
    packetList.packet[1].data[0] = 0xB0;        // status: controller change
    packetList.packet[1].data[1] = 0x33;        // controller number 51
    packetList.packet[1].data[2] = (Byte)posY;  // value (y position)
    packetList.packet[1].timeStamp = 0;

    CheckError(MIDISend(_outputPort, _destinationEndpoint, &packetList), "Couldn't send MIDI packet list");
}

私が抱えている問題は、プログラムが最初のパケットしか送信していないように見えることです。

出力を 2 つの別々の MIDIPacketLists に分割し、2 つの MIDISend() を 2 回呼び出してみました。 MIDISend() への 1 回の呼び出しで送信されます。ここで何が問題なのか理解できないようです!ここの誰もがこれを行った経験がありますか、それとも私はこれを完全に間違った方法で行っていますか?

4

1 に答える 1

4

MIDIPacketList を宣言するだけでは、メモリの割り当てや構造のセットアップは行われません。リストにパケットを追加するプロセスがあります。これは簡単で汚い例です:

- (void)matrixCtrlSetPosX:(int)posX PosY:(int)posY {
    MIDITimeStamp timestamp = 0;
    const ByteCount MESSAGELENGTH = 6;
    Byte buffer[1024];             // storage space for MIDI Packets
    MIDIPacketList *packetlist = (MIDIPacketList*)buffer;
    MIDIPacket *currentpacket = MIDIPacketListInit(packetlist);
    Byte msgs[MESSAGELENGTH] = {0xB0, 0x32, (Byte)posX, 0xB0, 0x33, (Byte)posY};
    currentpacket = MIDIPacketListAdd(packetlist, sizeof(buffer),
                                      currentpacket, timestamp, MESSAGELENGTH, msgs);

    CheckError(MIDISend(_outputPort, _destinationEndpoint, packetlist), "Couldn't send MIDI packet list");
}

ここにあるtestout.cからこのコードを適応させました

于 2013-03-08T01:17:27.830 に答える