gpt4 book ai didi

c++ - RtMidi MIDI 控制信号到 Ableton Live

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:00 27 4
gpt4 key购买 nike

我正在尝试使用 RtMidi 编写一个 C++ 应用程序,以通过我的 Tascam FireOne MIDI Controller 向 Ableton Live 发送控制信号。到目前为止,我已经成功地通过我的 MIDI Controller 使用“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;
}

我尝试以与上述相同的方式发送控制信号,但这次在消息字节中使用控制值代替音符开或音符关值。

当 ableton live 运行时,我按下一个键发送信号,但应用程序锁定并且不会返回到 while 循环的开始以接收来自下一次按键的输入。

编辑:我刚刚注意到,当 ableton live 正在运行并且我按下一个键时,即使是上面的代码(通常运行良好)也会卡住。

进一步编辑:我下载了一个名为 MIDI Monitor 的非常简洁的应用程序,它可以监控正在传输的 MIDI 数据:http://obds.free.fr/midimon -- 我的 MIDI Controller 设备有两个端口 -> 一个用于 MIDI,一个用于控制。当我监听控制时,我可以发送 MIDI 信号,反之亦然。但是,例如,如果我正在监视控制并尝试发送一些程序锁定的 CC 类型数据。这可能是设备驱动程序问题吗? –

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

最佳答案

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

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

特别是,我不知道您的 catch(char * str) 会实现什么,如果 openPort() 抛出,您根本就没有捕获。

关于c++ - RtMidi MIDI 控制信号到 Ableton Live,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6110947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com