我知道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;
}
}
}
}
答案 0 :(得分:3)
如果您没有重置设备,并且没有更改控件,那么您的程序在收到消息之前不会知道控件的状态。
某些设备可能具有特定于供应商的命令,用于读取控件的当前状态或转储整个状态。
答案 1 :(得分:0)
简短的回答是 - 不 - 在事件发生之前你无法知道
其他答案是正确的,如果您将IN和OUT连接到允许通过SysEx消息进行询问的控制器(特定于制造商)
更有帮助: 所有控制器(您想要使用)的默认状态应该在启动时为OFF 例如弯音度=居中,调制=零,维持=关闭等...
这是自1980年以来的状态,所以这不是一个真正的问题 如果您在开始使用应用程序之前将脚放下(踏板),则在发布应用程序时将保持同步状态
祝你好运