如何读取 MIDI 脚踏控制器的初始状态?

Posted

技术标签:

【中文标题】如何读取 MIDI 脚踏控制器的初始状态?【英文标题】:How to read the initial state of a MIDI Foot Controller? 【发布时间】: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 【参考方案1】:

如果您没有重置设备,也没有更改控件,那么您的程序在收到消息之前不会知道控件的状态。

某些设备可能具有特定于供应商的命令来读取控件的当前状态或转储整个状态。

【讨论】:

检查相关脚踏控制器的文档。如果支持,它通常是系统专有消息。您还可以研究向控制器发送 MIDI PC 或 CC 以明确设置其状态。这两种方法都需要双向通信,这意味着您必须连接控制器的 MIDI-In 和 MIDI-Out 端口。如果控制器只有一个 MIDI 输出,则几乎不可能检索到状态。 [2c]【参考方案2】:

简短的回答是 - 不 - 在事件发生之前你无法知道

其他答案是正确的,如果您将 IN 和 OUT 连接到允许通过 SysEx 消息进行询问的控制器(特定于制造商)

为了更有帮助: 所有控制器(您要使用)的默认状态应在启动时关闭 例如弯音 = 居中,调制 = 零,延音 = 关闭等……

这是自 1980 年代以来的游戏状态,所以这不是一个真正的问题 如果您在启动应用程序之前将脚踩在脚下(踩在踏板上),您将在释放应用程序的那一刻保持同步

祝你好运

【讨论】:

以上是关于如何读取 MIDI 脚踏控制器的初始状态?的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 发送midi程序更改并根据按下的脚踏板控制更改消息

Pygame 读取 MIDI 输入

修改 Arduino 代码以读取串行以控制移位寄存器

可编程“实时”MIDI处理

WebMidi.js 无法识别我的 midi 控制器

用于 Arduino 的 Korg Nanokey MIDI 控制器?