質問: NULL) { std::cerr << "MIDI出力デバイス「" << szDeviceName << "」を開けません。" << std::endl; return 0; } std::cerr << "MIDI出力デバイス「" << szDeviceName << "」を開きました。" << std::endl; } ```
回答: 次のような考え方になると思います。 (1) ドラムのMIDI-OUTをPCのMIDI-INへ接続 ひょっとしたらこのアプリケーション以外で接続状態になっているのかも知れませんが・・・その辺り詳しくありません。(ハードを繋いだことがないので・・・) (2) ドラムが繋がったMIDI-INをオープン (最初の回答でこれ書き忘れてました) (3) Windows内臓シンセサイザーのMIDI-OUTをオープン これは以前すでにできていますね? (4) プログラムでMIDI-INからドラムからのMIDIメッセージをリアルタイムに受信 受信メッセージで肝心なのはNOTE ON/NOTE OFFであることはご存知ですね? (5) ドラムから受信したNOTE ON/NOTE OFFを(2)のシンセサイザーへ中継 つまりシンセサイザーへメッセージを流し込んでやればシンセサイザーから音がでます。 ・・・ただし、キーボードと違ってドラムはちょっと難しく、ひょっとしたら「スネアをたたいたのに全然違う音が鳴る><」といったことになるかも知れません。そのあたりは悩むよりまず音を出すのが先決なのでやってみるとよいと思います。 もしうまくならないようなら、とりあえずプログラムチェンジで1番(ピアノ)を選んでおき、そこへドラムのNOTE ON/NOTE OFFを流すとテストとしてはよいと思います。 追記:コンソールアプリケーションで作っておられるので比較的(4)はやりやすい気がしますが、プログラムをビジーループさせないように気を付けた方がよいかも知れません。 ``` int main(...) { MIDI-OUTオープン(シンセサイザー) // (2) MIDI-INオープン(ドラム) // (3) MIDI-OUTへプログラムチェンジ送信 // CH#1の音色を#1に。 for (;;) { // 無限ループ Sleep(10); // <===これを挟んでおいた方がよいかも MIDI-INから(受信できている分を全て)読み込み // (4) // ドラムからはCH#10のメッセージが届くかも知れません。 // うまくならないようならドラムからのMIDIメッセージのCH#を#1に変えて // MIDI-OUTへ送信するとピアノの音がCH#1から鳴らせます。 MIDI-OUTへ送信(受信できたのを全て) // (5) } } ``` 蛇足なコメントがあるかも知れません。その辺りはスルーしてください。