我正在尝试使用RtMidi编写一个C ++应用程序,通过我的Tascam FireOne MIDI控制器向Ableton Live发送控制信号。到目前为止,我已经通过我的MIDI控制器使用“a”和“s”按键成功地将音符开+关信号,音量调高+降低信号等发送到我的数码钢琴。
// 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;
}
我尝试以与上述相同的方式发送控制信号,但这次使用消息字节中的控制值代替音符开启或音符关闭值。
当现场运行时,我按一个键发送信号,但应用程序锁定并且不会返回到while循环的开头以接收来自下一个按键的输入。
编辑:我刚刚注意到,即使上面的代码(通常运行正常)也会在运行时运行并按下一个键时冻结。
进一步编辑我下载了一个名为MIDI Monitor的非常简洁的应用程序,它可以监控正在传输的MIDI数据:http://obds.free.fr/midimon - 我的MIDI控制器设备有两个端口 - &gt;一个用于MIDI,一个用于控制。当我监控控制时,我可以发送midi信号,反之亦然。但是,例如,如果我正在监视控制,并且我尝试发送一些CC类型数据,程序将锁定。这可能是设备驱动程序的问题吗? -
有谁知道这里出了什么问题?
答案 0 :(得分:1)
只有一条评论 - 您的异常处理有点奇怪。
我将整个代码(初始化和所有代码)包装在try/catch(RtError &err)
块中,并丢失大多数其他try / catch块。
特别是,我不知道你的catch(char * str)
内容会实现什么,如果openPort()
抛出,你根本就没有抓到。
答案 1 :(得分:0)
首先,尝试发送一个不同的CC并将其映射到Ableton中的某个任意控件,只是为了查看它是否正常工作。您试图改变的音量控制与常规CC的行为略有不同。具体来说,你应该看看MIDI organization's recommended practice for incrementing/decrementing controllers(注意0x60 == 96),即他们写的时候:
此参数分别使用MSB和LSB,MSB调整半音的灵敏度,LSB调整灵敏度(以美分为单位)。有些制造商甚至可能会忽略对LSB的调整。