【发布时间】:2014-11-04 12:41:23
【问题描述】:
我知道 MIDI 允许我通过捕获指示控制更改的 MIDI 消息来读取 MIDI 脚踏控制器的状态。但是如果用户还没有触摸/改变控件呢?我还能读取状态/值吗?这样做的方法是什么?
这是我使用 OSX CoreMIDI 捕捉 Midi 消息的代码
void initMidi()
{
MIDIClientRef midiClient;
MIDIPortRef inputPort;
OSStatus status;
MIDIEndpointRef src;
status = MIDIClientCreate(CFSTR("testing"), NULL, NULL, &midiClient);
if (status != noErr)
NSLog(@"Error creating MIDI client: %d", status);
status = MIDIInputPortCreate(midiClient, CFSTR("Input"), midiInputCallback, NULL, &inputPort);
if (status != noErr)
NSLog(@"Error creating MIDI input port: %d", status);
ItemCount numOfDevices = MIDIGetNumberOfDevices();
// just try to connect to every device
for (ItemCount i = 0; i < numOfDevices; i++) {
src = MIDIGetSource(i);
status = MIDIPortConnectSource(inputPort, src, NULL);
}
}
void midiInputCallback(const MIDIPacketList *list,
void *procRef,
void *srcRef)
{
for (UInt32 i = 0; i < list->numPackets; i++) {
const MIDIPacket *packet = &list->packet[i];
for (UInt16 j = 0, size = 0; j < packet->length; j += size) {
UInt8 status = packet->data[j];
if (status < 0xC0) size = 3;
else if (status < 0xE0) size = 2;
else if (status < 0xF0) size = 3;
else if (status < 0xF3) size = 3;
else if (status == 0xF3) size = 2;
else size = 1;
switch (status & 0xF0) {
case 0xb0:
NSLog(@"MIDI Control Changed: %d %d", packet->data[j + 1], packet->data[j + 2]);
break;
}
}
}
}
【问题讨论】:
-
你的目标是什么控制器?
-
我的目标是吉他效果控制器 - PODxt 的旋钮和控件。值得庆幸的是,Line6 确实为其供应商特定的 SysEx 消息提供了规范:link to PDF
-
请求转储,一切就绪
-
我做了一个转储请求,它成功了!谢谢大家!对于任何感兴趣的人:PODxt 编辑缓冲区转储请求消息是“F0 00 01 0C 03 75 F7”。我找到了这个信息on this thread