RtMidi MIDI-сигналы управления в Ableton Live
Я пытаюсь написать приложение на C++, используя RtMidi для отправки управляющих сигналов через мой MIDI-контроллер Tascam FireOne в Ableton Live. До сих пор он успешно отправлял сигналы Note On + Off, сигналы Volume Up + Down и т. Д. Через мой 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;
}
Я попытался отправить управляющие сигналы таким же образом, как описано выше, но на этот раз с контрольными значениями в байтах сообщения вместо значений примечания или примечания.
Когда умеет liveton, я нажимаю клавишу, чтобы отправить сигнал, но приложение блокируется и не возвращается к началу цикла while для получения ввода от следующего нажатия клавиши.
редактирование: я только что заметил, что даже приведенный выше код (который обычно работает нормально) зависает, когда умеет liveton работает, и я нажимаю клавишу.
Дальнейшее редактирование: я скачал действительно аккуратное приложение под названием MIDI Monitor, которое может контролировать передаваемые MIDI-данные: http://obds.free.fr/midimon - мое устройство MIDI-контроллера имеет два порта -> один для MIDI и один для управления, Когда я контролирую управление, я могу отправлять миди-сигналы и наоборот. Однако, если, например, я контролирую управление и пытаюсь отправить некоторые данные типа CC, программа блокируется. Может ли это быть проблема с драйвером устройства? -
Кто-нибудь знает, что здесь происходит не так?
2 ответа
Только один комментарий - ваша обработка исключений немного странная.
Я бы обернул весь код (инициализация и все) в try/catch(RtError &err)
блокировать, и потерять большинство других блоков try/catch.
В частности, я не знаю, какой у тебя catch(char * str)
вещи достигнут, и у вас нет никакой выгоды, если openPort()
броски.
Прежде всего, попробуйте отправить другой CC и сопоставить его с произвольным элементом управления в Ableton, просто чтобы посмотреть, работает ли он. Регуляторы громкости, которые вы пытаетесь изменить, ведут себя немного иначе, чем обычные CC. В частности, вы должны проверить рекомендованную практику организации MIDI для увеличения / уменьшения контроллеров (обратите внимание, что 0x60 == 96), а именно, когда они пишут:
Этот параметр использует MSB и LSB отдельно, MSB регулирует чувствительность в полутонах, а LSB регулирует чувствительность в центах. Некоторые производители могут даже игнорировать корректировки LSB.