getPortCount(); 如果(nPorts==0){ cout,c++,midi,ableton-live,midi-interface,C++,Midi,Ableton Live,Midi Interface" /> getPortCount(); 如果(nPorts==0){ cout,c++,midi,ableton-live,midi-interface,C++,Midi,Ableton Live,Midi Interface" />

向Ableton Live发送RtMidi MIDI控制信号 我试图用RMTIdi编写一个C++应用程序,通过我的TASCAM火警MIDI控制器发送控制信号给AbtLon 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; } //midiout.cpp #包括 使用名称空间std; #包括 #包括 #包括 #包括“RtMidi.h” int main() { std::向量消息; int i,按键; int nPorts; 字符输入; RtMidiOut*midiout=0; //迷迭香 试一试{ midiout=新的RtMidiOut(); //检查可用端口。 nPorts=midiout->getPortCount(); 如果(nPorts==0){ cout

向Ableton Live发送RtMidi MIDI控制信号 我试图用RMTIdi编写一个C++应用程序,通过我的TASCAM火警MIDI控制器发送控制信号给AbtLon 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; } //midiout.cpp #包括 使用名称空间std; #包括 #包括 #包括 #包括“RtMidi.h” int main() { std::向量消息; int i,按键; int nPorts; 字符输入; RtMidiOut*midiout=0; //迷迭香 试一试{ midiout=新的RtMidiOut(); //检查可用端口。 nPorts=midiout->getPortCount(); 如果(nPorts==0){ cout,c++,midi,ableton-live,midi-interface,C++,Midi,Ableton Live,Midi Interface,首先,尝试发送不同的CC并将其映射到Ableton中的某个任意控件,看看它是否正常工作。您尝试更改的卷控件的行为与常规CC稍有不同。具体而言,您应该检查(注意0x60==96),即当它们写入: 此参数分别使用MSB和LSB,MSB以半音调整灵敏度,LSB以美分调整灵敏度。一些制造商甚至可能忽略LSB的调整 只有一条评论-您的异常处理有点奇怪 我会将整个代码(初始化和所有代码)包装在一个try/catch(RtError&err)块中,并丢失大部分其他try/catch块 特别是,我不知道你的ca

首先,尝试发送不同的CC并将其映射到Ableton中的某个任意控件,看看它是否正常工作。您尝试更改的卷控件的行为与常规CC稍有不同。具体而言,您应该检查(注意0x60==96),即当它们写入:

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


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

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


特别是,我不知道你的
catch(char*str)
东西能达到什么效果,如果
openPort()
throws.

这会发生在设备的所有端口上吗?我下载了一个非常简洁的应用程序,名为MIDI Monitor,它可以监控正在传输的MIDI数据:现在是关键点——我的MIDI控制器设备有两个端口->一个用于MIDI,一个用于控制。当我监控控制时,我可以发送MIDI信号,反之亦然,但如果e、 我正在监视控制,我试图发送一些CC类型的数据,程序锁定。这可能是设备驱动程序的问题吗?@kosomonova两个MIDI端口可能对应于设备背面的物理MIDI端口(您可以连接键盘或其他东西)以及设备本身,它也在发送/接收MIDI。您应该看到,在MIDI监视器的输出窗口中,这两个项目显示为不同的条目。您可能应该为每个项目提供不同的rtmidi输出端口。