RtMidi MIDI控制信号发送给Ableton Live

问题描述

| 我正在尝试使用RtMidi编写一个C ++应用程序,以通过我的Tascam FireOne MIDI控制器向Ableton Live发送控制信号。到目前为止,我已经使用\'a \'和\'s \键通过MIDI控制器成功将Note On + Off信号,Volume Up + Down信号等发送到我的数码钢琴。
// midiout.cpp

#include <iostream>
using namespace std;

#include <signal.h>
#include <windows.h>
#include <conio.h>
#include \"RtMidi.h\"

int main()
{
    std::vector<unsigned char> message;

    int i,keyPress;
    int nPorts;
    char input;

    RtMidiout *midiout = 0;

    // midioUT
    try {
        midiout = new RtMidiout();

        // Check available ports.
        nPorts = midiout->getPortCount();
        if ( nPorts == 0 ) {
            cout << \"No ports available!\" << endl;
            goto cleanup;
        }

        // List Available Ports
        cout << \"\\nPort Count = \" << nPorts << endl;
        cout << \"Available Output Ports\\n-----------------------------\\n\";
        for( i=0; i<nPorts; i++ )
        {
            try {
                cout << \"  Output Port Number \" << i << \" : \" << midiout->getPortName(i) << endl;
            }
            catch(RtError &error) {
                error.printMessage();
                goto cleanup;
            }
        }

        cout << \"\\nSelect an output port number :\" << endl;
        cin >> keyPress;

        while( keyPress < 0 || keyPress >= midiout->getPortCount() )
        {
            cout << \"\\nIncorrect selection. Please try again :\" << endl;
            cin >> keyPress;
        }

        // Open Selected Port
        midiout->openPort( keyPress );

        keyPress = NULL;

        bool done = false;

        cout << \"Press a key to generate a message,press \'Esc\' to exit\" << endl;

        while(!done)
        {
            keyPress = _getch();
            input = keyPress;
            cout << input << \" is: \" << keyPress << endl;

            switch ( keyPress )
            {
                case 97 : 
                // Process for keypress = a
                    // Note On: 144,60,90
                    message.push_back( 144 );
                    message.push_back( 60 );
                    message.push_back( 90 );
                    midiout->sendMessage( &message );
                    break;
                case 115 : 
                    // Process for keypress = s
                    // Note Off: 128,90
                    message.push_back( 128 );
                    message.push_back( 60 );
                    message.push_back( 90 );
                    midiout->sendMessage( &message );
                    break;
                case 27 : 
                    // Process for keypress = esc
                    done = true;
                    break;
            }
            message.clear();
            keyPress = NULL;
        }
    }
    catch(RtError &error) {
        error.printMessage();
        exit( EXIT_FAILURE );
    }

    cleanup:
        delete midiout;

  return 0;
}
我尝试以与上述相同的方式发送控制信号,但是这次使用消息字节中的控制值代替音符打开或音符关闭值。 当ableton live运行时,我按一个键发送信号,但该应用程序锁定,并且没有返回到while循环的开始以接收下一次按键的输入。 编辑:我刚刚注意到,当ableton live运行时,即使上面的代码(通常运行正常)也会冻结,并且我按了一个键。 进一步编辑:我下载了一个名为MIDI Monitor的真正简洁的应用程序,它可以监视正在传输的MIDI数据:http://obds.free.fr/midimon-我的MIDI控制器设备具有两个端口->一个用于MIDI,另一个用于控制。当我监视控件时,我可以发送Midi信号,反之亦然。但是,例如,如果我正在监视控件,并且尝试发送一些CC类型数据,则程序将锁定。这可能是设备驱动程序问题吗? – 有人知道这里出了什么问题吗?     

解决方法

只是一个评论-您的异常处理有点奇怪。 我将整个代码(初始化和全部)包装在一个“ 1”块中,并丢失了大多数其他try / catch块。 特别是,我不知道您的2英镑的东西会达到什么,如果3英镑的罚球,您根本就不会抓到。     ,首先,尝试发送一个不同的CC并将其映射到Ableton中的任意控件,以查看其是否正常运行。您尝试更改的音量控制的行为与常规CC的行为略有不同。具体来说,您应该查看MIDI组织关于递增/递减控制器的建议做法(请注意0x60 == 96),即在编写时:   此参数分别使用MSB和LSB,MSB调整灵敏度为半音,LSB调整灵敏度为美分。一些制造商甚至可能忽略对LSB的调整。