2

RtMidi を使用して、Tascam FireOne MIDI Controller 経由で Ableton Live に制御信号を送信する C++ アプリを作成しようとしています。これまでのところ、「a」と「s」のキーを押して、MIDI コントローラーを介してノート オン + オフ信号、ボリューム アップ + ダウン信号などをデジタル ピアノに送信することに成功しています。

// 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 データを監視できる MIDI モニターと呼ばれる非常に優れたアプリをダウンロードしました: http://obds.free.fr/midimon -- 私の MIDI コントローラー デバイスには 2 つのポートがあります -> 1 つは MIDI 用、もう 1 つは制御用です。 . コントロールを監視しているときは、MIDI 信号を送信でき、その逆も可能です。ただし、たとえば、制御を監視していて、CC タイプのデータを送信しようとすると、プログラムがロックされます。これはデバイスドライバーの問題でしょうか? –</p>

ここで何がうまくいかないのか誰か知っていますか?

4

2 に答える 2

1

コメントは1つだけです。例外処理は少し奇妙です。

コード全体(初期化とすべて)をtry/catch(RtError &err)ブロックにラップし、他のほとんどのtry/catchブロックを失います。

特に、あなたのものが何を達成するのか私にはわかりません、そしてあなたは投げcatch(char * str)ても全くキャッチがありません。openPort()

于 2011-05-24T15:04:18.193 に答える
0

まず、別の CC を送信して、Ableton の任意のコントロールにマッピングしてみて、動作するかどうかを確認してください。変更しようとしているボリューム コントロールは、通常の CC とは動作が少し異なります。具体的には、コントローラーのインクリメント/デクリメント(0x60 == 96 に注意)に関する MIDI 組織の推奨プラクティスを確認する必要があります。

このパラメーターは MSB と LSB を別々に使用し、MSB は半音単位で感度を調整し、LSB はセント単位で感度を調整します。メーカーによっては、LSB の調整を無視することさえあります。

于 2011-05-24T14:33:02.630 に答える