【问题标题】:RtMidi MIDI control signals to Ableton LiveAbleton Live 的 RtMidi MIDI 控制信号
【发布时间】:2011-08-31 22:37:18
【问题描述】:

我正在尝试使用 RtMidi 编写一个 C++ 应用程序,以通过我的 Tascam FireOne MIDI 控制器向 Ableton Live 发送控制信号。到目前为止,我已经成功地通过我的 MIDI 控制器使用“a”和“s”按键向我的数码钢琴发送了 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, 60, 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 类型的数据,程序会锁定。这可能是设备驱动程序问题吗? ——

有人知道这里出了什么问题吗?

【问题讨论】:

  • 设备的所有端口都会出现这种情况吗?

标签: c++ midi ableton-live midi-interface


【解决方案1】:

只有一条评论 - 你的异常处理有点奇怪。

我会将整个代码(初始化和所有)包装在一个 try/catch(RtError &amp;err) 块中,并丢失大部分其他 try/catch 块。

特别是,我不知道你的catch(char * str) 的东西会达到什么效果,如果openPort() 抛出,你根本没有任何收获。

【讨论】:

    【解决方案2】:

    首先,尝试发送一个不同的 CC 并将其映射到 Ableton 中的某个任意控件,以查看它是否正常工作。您尝试更改的音量控制与常规 CC 的行为略有不同。具体来说,你应该查看MIDI organization's recommended practice for incrementing/decrementing controllers(注意0x60 == 96),即他们写的时候:

    此参数分别使用 MSB 和 LSB,MSB 以半音为单位调节灵敏度,LSB 以音分为单位调节灵敏度。一些制造商甚至可能会忽略对 LSB 的调整。

    【讨论】:

    • 我下载了一个名为 MIDI Monitor 的非常简洁的应用程序,它可以监控正在传输的 MIDI 数据:obds.free.fr/midimon 现在是关键——我的 MIDI 控制器设备有两个端口 -> 一个用于 MIDI,一个用于控制。当我在监控控制时,我可以发送 MIDI 信号,反之亦然,但是,例如,如果我在监控控制并尝试发送一些 CC 类型的数据,程序就会锁定。这可能是设备驱动程序问题吗?
    • @kosomonova 这两个 MIDI 端口可能对应于设备背面的物理 MIDI 端口(您可以连接键盘或其他东西)和设备本身,它也发送/接收 MIDI .您应该看到这两个在 MIDI 监视器的输出窗口中显示为不同的条目。您可能应该为每个端口设置不同的 rtmidi 输出端口。
    猜你喜欢
    • 2014-06-19
    • 2022-01-22
    • 2021-01-06
    • 1970-01-01
    • 2011-04-30
    • 2013-05-08
    • 2014-07-13
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多