RtMidi MIDI-сигналы управления в Ableton Live - PullRequest
2 голосов
/ 24 мая 2011

Я пытаюсь написать приложение на C ++, используя RtMidi для отправки управляющих сигналов через мой MIDI-контроллер Tascam FireOne в Ableton Live. До сих пор он успешно отправлял сигналы Note On + Off, сигналы увеличения / уменьшения громкости и т. Д. Через мой 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 для получения ввода от следующего нажатия клавиши.

edit: Я только что заметил, что даже вышеприведенный код (который обычно работает нормально) зависает, когда умеет liveton live, и я нажимаю клавишу.

дальнейшее редактирование: Я скачал действительно аккуратное приложение под названием MIDI Monitor, которое может контролировать передаваемые MIDI-данные: http://obds.free.fr/midimon - мое устройство MIDI-контроллера имеет два порта -> один для MIDI и один для контроля. Когда я контролирую управление, я могу отправлять миди-сигналы и наоборот. Однако, если, например, я контролирую управление и пытаюсь отправить некоторые данные типа CC, программа блокируется. Может ли это быть проблема с драйвером устройства? -

Кто-нибудь знает, что здесь происходит не так?

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Только один комментарий - ваша обработка исключений немного странная.

Я бы обернул весь код (инициализация и все) в блок try/catch(RtError &err) и потерял бы большинство других блоков try / catch.

В частности, я не знаю, чего достигнет ваш catch(char * str) материал, и вы вообще не поймаете, если openPort() бросит.

0 голосов
/ 24 мая 2011

Прежде всего, попробуйте отправить другой CC и сопоставить его с произвольным элементом управления в Ableton, просто чтобы посмотреть, работает ли он. Регуляторы громкости, которые вы пытаетесь изменить, ведут себя немного иначе, чем обычные CC. В частности, вам следует ознакомиться с рекомендациями организации MIDI по увеличению / уменьшению контроллеров (обратите внимание, что 0x60 == 96), а именно когда они пишут:

Этот параметр использует MSB и LSB отдельно, MSB регулирует чувствительность в полутонах, а LSB регулирует чувствительность в центах. Некоторые производители могут даже игнорировать корректировки LSB.

...