swift - CoreMIDI:接收来自 MIDISendSysex 的响应

标签 swift coremidi

我有一个可以通过 MIDI 控制的 Marshall CODE 放大器。我可以通过向放大器发送简单的 MIDI 消息来成功更改放大器上的某些控件:

var midiClient: MIDIClientRef = 0;
var outPort:MIDIPortRef = 0;
MIDIClientCreate("MidiTestClient" as CFString, nil, nil, &midiClient);
MIDIOutputPortCreate(midiClient, "MidiTest_OutPort" as CFString, &outPort);

var packet1:MIDIPacket = MIDIPacket();
packet1.timeStamp = 0;
packet1.length = 3;
packet1.data.0 = 0xB0;
packet1.data.1 = 0x46;
packet1.data.2 = 0x64;    
var packetList:MIDIPacketList = MIDIPacketList(numPackets: 1, packet: packet1);

let dest:MIDIEndpointRef = MIDIGetDestination(0);
MIDISend(outPort, dest, &packetList);

编码(marshal) spec表示您可以通过发送 SysEx 消息来检索整个预设的数据,我正在这样做:

var method:MIDICompletionProc = comp
let buffer:UnsafePointer<UInt8> = UnsafePointer([0xF0,0x00,0x21,0x15,0x7F,0x7F,0x7F,0x72,0x01,0x00,0xF7])    
var sendRequest = MIDISysexSendRequest(destination: dest,
                                       data: buffer,
                                       bytesToSend: 11,
                                       complete: false,
                                       reserved: (0, 0, 0),
                                       completionProc: method,
                                       completionRefCon: UnsafeMutableRawPointer(&method))
MIDISendSysex(&sendRequest);
CFRunLoopRun();

func comp(req: UnsafeMutablePointer<MIDISysexSendRequest>) -> Void {
    print("Complete");
}

只要没有任何错误并且 comp() 回调触发,这似乎就可以工作。我不知道如何从包含预设数据的 SysEx 调用中获取响应。

我尝试设置一个输入端口并将其连接到代码的源,但回调从未触发:

var inPort:MIDIPortRef = 0;
MIDIInputPortCreate(midiClient, "MidiTest_InPort" as CFString, midiInputCallback, nil, &inPort);
let endpoint:MIDIEndpointRef = MIDIGetSource(0);
MIDIPortConnectSource(inPort, endpoint, nil);

func midiInputCallback (pktList: UnsafePointer<MIDIPacketList>,
                    readProcRefCon: UnsafeMutableRawPointer?, srcConnRefCon: UnsafeMutableRawPointer?) -> Void
{
    print("midiInputCallback was called");
}

我确信我错过了一些明显的东西,但它现在却回避了我。

最佳答案

好吧,我不确定到底是什么问题,但我最初是在 Playground 中尝试这个,我尝试创建一个实际的 Mac 应用程序,上面的代码现在可以工作了。

关于swift - CoreMIDI:接收来自 MIDISendSysex 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50963060/

相关文章:

objective-c - Objective-C 项目中的 Swift CocoaPod 库从 Swift 3 迁移到 4/5

objective-c - 使用 Swift 和 CoreMIDI 发送和接收 MIDI

ios - 如何确保 MIDI 消息以正确的顺序到达?

ios - 扩展符合协议(protocol)的类与基于类似条件扩展协议(protocol)之间的区别?

swift - `let case(value)` 和 `case(let value)` 之间的区别(Swift)

ios - 字典中的字符串值是字符串的两倍

swift - 修改枚举关联值

python - 使用 Python C API 时 MIDIGetNumberOfDestinations 返回 0

swift - Swift 3 中不允许 Core Midi Read 回调

swift - 在swift中访问固定长度C数组的元素