- ベストアンサー
MIDIデータを受信するためのプログラムについて
MIDIショートメッセージをリアルタイムで受信することをウインドウズ上で確認するために、このサイト(http://www.alles.or.jp/~minoc/dtm/midiin.htm) を参照したのですが、どーやらこちらのプログラム実行上で外付けのMIDIキーボードからノートオンメッセージ、ノートオフメッセージを入力しても、そのメッセージが入力されたかを実行画面上で確認することができません。 C言語、API関数の知識は多少あるのですが、このプログラムをどのように修正したらよいのかがわかりません。 どなたか相談にのっていただけないでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>MIDI INを使える開発環境が無いんで、このプログラムがあっているのか私は検証できませんが。 作ってみました。MIDI入力できる開発環境。 こちらでは、ソースそのままコンパイルするだけで、MIDIメッセージの内容は表示されました。なので、とりあえずソースが原因ではないですね。 >MIDIキーボードは他のアプリでは動作し、 他のアプリで何か設定しましたか? >しかし、この識別子についてよくわからないのですが、数字を0からひとつずつ増やして実行していけば良いのですか? そうです。0から順に増やして試してください。 デバイスが存在しない番号までいってしまうとちゃんとエラーメッセージが表示されるように組んであるようですので。 ちなみに私の環境では0と1のみOpenできました。 もちろんMIDIキーボードを接続してるのは1つのポートだけなので、片方は何もメッセージは送られてきませんが。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>私の考えではTextOut関数があるため、このプログラム実行時に、 >MIDIデータがMIDIキーボードから入力されたとき、 >そのbuffに格納されたlParam(ステータス、データ1、データ2)の >メッセージが実行画面上に現れると思ったのです。 >しかし実際はあらわれません。 その考えであってますよ。 単純にちゃんと受信できてないだけでは? MIDI INを使える開発環境が無いんで、このプログラムがあっているのか私は検証できませんが。 #メモリリークしてるところはありますがMIDIデータの受信に関係ないところですし。 まず、ケーブルがちゃんと接続できているかどうかから確認してみてください。他のアプリでちゃんと受信できているかですね。 そうしたら、オープンしてるポートに本当にMIDI INを送信している機器が接続されているのか確認してください。 midiInOpen()でデバイスの識別子が0が固定で指定されているのでMIDI INデバイスが複数あった場合、実際に接続されているポートと違うポートが開かれている可能性があります。 列挙する方法もありますが、面倒なので順番に数字を増やしてって確認してみてください。 #サウンドカードのジョイスティックポートなんかもMIDI INデバイスですからね。MIDIコネクタなんか他にないと思われても確認してください。
お礼
できました!!!!!!!!!! 赤の他人にこんなに親切にしてくださる人が いるなんて感動しました。感無量です!! ほんとーにありがとうございました。 とてもすがすがしい気分です。 ほんとーにありがとうございました。
補足
迅速な対応ありがとうございます。MIDIキーボードは他のアプリでは動作し、また、それをUSBポートからPCに接続しているのですが、そのキーボードに備え付けのディスプレイの表示を見ると、しっかりMIDIデータは出力されているようです。 しかし、PCのプログラム実行画面上ではその入力メッセージが表示がされないために、midiInOpen()でのデバイスの識別子が関係あるのかもしれません。しかし、この識別子についてよくわからないのですが、数字を0からひとつずつ増やして実行していけば良いのですか?何度も申し訳ないです。。。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>ご返信ありがとうございます。MM_MIM_DATAを受け取ったときにある、 >sprintf(buff, "Short Message: %2x %2x %2x",STATUS,DATA1,DATA2); >TextOut(hdc,0,0,buff,lstrlen(buff)); >の関数テキストアウトでは、何が画面に出力されるのでしょうか? #define STATUS LOBYTE(LOWORD(lParam)) #define DATA1 HIBYTE(LOWORD(lParam)) #define DATA2 LOBYTE(HIWORD(lParam)) と上の方に定義してありますよね。 なんで、 STATUSがContains the MIDI status. DATA1がContains the first byte of MIDI data (when needed). DATA2がContains a second byte of MIDI data (when needed). みたいですね。
補足
お忙しいところ何度も本当に申し訳ありません。lParamに入っているMIDIメッセージを取り出して表示させるにはどのようにしたらよいのでしょうか?私の考えではTextOut関数があるため、このプログラム実行時に、MIDIデータがMIDIキーボードから入力されたとき、そのbuffに格納されたlParam(ステータス、データ1、データ2)のメッセージが実行画面上に現れると思ったのです。しかし実際はあらわれません。今まで考えていたのですが、どーしてもわかりません。2度も返信して申し訳ありませんが、ご相談にまたのっていただけないでしょうか?
- taka_tetsu
- ベストアンサー率65% (1020/1553)
ウィンドウプロシージャで、MM_MIM_DATAのメッセージを受け取ったときがMIDI INからデータが送られたときになります。 で、これのlParamにMIDIメッセージが入ってますので取り出して表示してください。lParamは4バイトですのでどのようにMIDIデータが格納されているかは下のurlを見て確認してください。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_mm_mim_data.asp
補足
ご返信ありがとうございます。MM_MIM_DATAを受け取ったときにある、sprintf(buff, "Short Message: %2x %2x %2x",STATUS,DATA1,DATA2); TextOut(hdc,0,0,buff,lstrlen(buff)); の関数テキストアウトでは、何が画面に出力されるのでしょうか?率直な質問で申し訳ないです。
お礼
MIDI入力ができる環境まで作っていただいてほんとーーに感謝しています。calk walkというソフトのバーチャルピアノを入力装置としたら、こちらでも実行画面上で出力することができました。ほんとに嬉しくて早く返信したかったのでメールしました。今はMIDIキーボードが手元にあるところにいないため、明日識別子の値を変えてMIDIキーボードでの入力もプログラム実行画面で出力できるかやってみたいと思っております。ほんとーに感謝しています。ありがとうございました。