1

私の問題は:

jack MID プロキシ クライアントを実装しています。MIDI キーボードで yoshimi のミュート機能を制御したいと考えています。

つまり、MIDIコントローラーは私のプロキシに「接続」されており、プロキシはyoshimiのMIDI入力に「接続」されています。

コードは問題なく動作します。ミュート ボタン メッセージが傍受され、データ チャネルが変更され、yoshimi がミュートされているコマンドを受け入れています...ただし、コントローラーの (ノート) ボタンのプレス/リリース イベントがイベントごとに 1 回だけ受信 (および転送) された場合でも、それは繰り返されています。例: コントローラーの音符キーを押すと、1 秒間に 10 回、キーが押されている (および離されている) ように yoshimi が聞こえます。

MIDI メッセージは process_callback 関数で処理されています。メインループ内で処理してみましたが結果は同じです。

ここで何が問題なのですか?

これは処理関数です:

int res = 0;
int i,j;

//get events
void* in_port_buf = jack_port_get_buffer(input_port, nframes);

jack_nframes_t n = jack_midi_get_event_count(in_port_buf);

if(n==0)
    return 0;

jack_midi_event_t jev;

printf("%i: Data arrived!\n", cnt);
for(i = 0;i<n;i++){

    res = jack_midi_event_get(&jev,in_port_buf,i);
    if(res == 0){
        printf("Got event, %i bytes!\n",jev.size);
        for(j=0;j<jev.size;j++)
            printf("%i: %i\n",j,jev.buffer[j]);

    } else{
        printf("ERROR getting event!\n");
        return 0;
    }

    //first button: mute yoshimi volume, port 120, all sound off
    if(jev.buffer[0]==176 && jev.buffer[1] == 97){
        jev.buffer[1] = 120;
    }

    //transmit data
    cnt++;


    void* port_buf = jack_port_get_buffer(output_port, nframes);


    jack_midi_clear_buffer(port_buf);

    res = jack_midi_event_write(port_buf, jev.time, jev.buffer, jev.size);

    if(res == 0)
        printf("Data sent!\n");
    else
        printf("Error: %i\n",res);
}

return 0;
4

1 に答える 1

1

とった!

私が発見したジャックの例を研究した後、出力ポートのクリアと割り当てルーチンをループから移動する必要がありました。

また、midi_event_write は必要ありません。

今は正常に動作します。

于 2015-01-26T11:30:18.943 に答える