MIDIショートメッセージをリアルタイムで受信することをウインドウズ上で確認するために、このサイト(http://www.alles.or.jp/~minoc/dtm/midiin.htm)
を参照したのですが、どーやらこちらのプログラム実行上で外付けのMIDIキーボードからノートオンメッセージ、ノートオフメッセージを入力しても、そのメッセージが入力されたかを実行画面上で確認することができません。
C言語、API関数の知識は多少あるのですが、このプログラムをどのように修正したらよいのかがわかりません。
どなたか相談にのっていただけないでしょうか?
No.4ベストアンサー
- 回答日時:
>MIDI INを使える開発環境が無いんで、このプログラムがあっているのか私は検証できませんが。
作ってみました。MIDI入力できる開発環境。
こちらでは、ソースそのままコンパイルするだけで、MIDIメッセージの内容は表示されました。なので、とりあえずソースが原因ではないですね。
>MIDIキーボードは他のアプリでは動作し、
他のアプリで何か設定しましたか?
>しかし、この識別子についてよくわからないのですが、数字を0からひとつずつ増やして実行していけば良いのですか?
そうです。0から順に増やして試してください。
デバイスが存在しない番号までいってしまうとちゃんとエラーメッセージが表示されるように組んであるようですので。
ちなみに私の環境では0と1のみOpenできました。
もちろんMIDIキーボードを接続してるのは1つのポートだけなので、片方は何もメッセージは送られてきませんが。
MIDI入力ができる環境まで作っていただいてほんとーーに感謝しています。calk walkというソフトのバーチャルピアノを入力装置としたら、こちらでも実行画面上で出力することができました。ほんとに嬉しくて早く返信したかったのでメールしました。今はMIDIキーボードが手元にあるところにいないため、明日識別子の値を変えてMIDIキーボードでの入力もプログラム実行画面で出力できるかやってみたいと思っております。ほんとーに感謝しています。ありがとうございました。
No.3
- 回答日時:
>私の考えでは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からひとつずつ増やして実行していけば良いのですか?何度も申し訳ないです。。。
できました!!!!!!!!!!
赤の他人にこんなに親切にしてくださる人が
いるなんて感動しました。感無量です!!
ほんとーにありがとうございました。
とてもすがすがしい気分です。
ほんとーにありがとうございました。
No.2
- 回答日時:
>ご返信ありがとうございます。
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度も返信して申し訳ありませんが、ご相談にまたのっていただけないでしょうか?
補足日時:2005/02/03 02:04No.1
- 回答日時:
ウィンドウプロシージャで、MM_MIM_DATAのメッセージを受け取ったときがMIDI INからデータが送られたときになります。
で、これのlParamにMIDIメッセージが入ってますので取り出して表示してください。lParamは4バイトですのでどのようにMIDIデータが格納されているかは下のurlを見て確認してください。
http://msdn.microsoft.com/library/default.asp?ur …
この回答への補足
ご返信ありがとうございます。MM_MIM_DATAを受け取ったときにある、sprintf(buff, "Short Message: %2x %2x %2x",STATUS,DATA1,DATA2);
TextOut(hdc,0,0,buff,lstrlen(buff));
の関数テキストアウトでは、何が画面に出力されるのでしょうか?率直な質問で申し訳ないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- その他(パソコン・周辺機器) DTMとMIDIキーボードについて。 ハードオフでジャンク品のmidiキーボードを見つけました。Ro 1 2022/06/25 13:24
- 作詞・作曲 DTMとMIDIキーボードについて。 ハードオフでジャンク品のmidiキーボードを見つけました。Ro 1 2022/06/25 11:35
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
- 作詞・作曲 DTM DAWとmidiキーボードについて 1 2022/10/20 16:41
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- PHP ここで言う空文字の意味とは? 1 2022/08/05 16:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WriteFile()でのデータ送信がで...
-
C# シリアル通信でデータ受信...
-
winsockでソケット通信の開発を...
-
シリアルポート通信
-
Linuxでのシリアル通信について...
-
POSTデータが送信されなくなり...
-
「スイッチングハブのバッファ...
-
rs232cでの受信データ(mscomm)...
-
ネットワークカメラの動画保存...
-
バイナリデータ受信時のデータ順
-
popen実行時にバッファが空の場合
-
RS-232Cでバイナリデータを受信...
-
MSCommでoutputできない
-
socket: recvはいつ,どれだけ...
-
TCPでの非同期型select関数につ...
-
シリアル通信 大きいサイズの...
-
【CAsyncSocket::OnReceive()呼...
-
Connection reset by peer
-
SSL_connect(ssl)
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
socket: recvはいつ,どれだけ...
-
WriteFile()でのデータ送信がで...
-
winsockでソケット通信の開発を...
-
UDP処理のエラーについて
-
RS232C通信(PC⇔PLC)
-
シリアル通信の出力バッファと...
-
シリアルポート通信
-
SocketのSend関数でのCLOSEの検...
-
「スイッチングハブのバッファ...
-
シリアル通信 大きいサイズの...
-
Connection reset by peer
-
WinsockAPIのrecvfromの受信デ...
-
C#で通信処理。応答がない場合...
-
rs232cでの受信データ(mscomm)...
-
ソケット通信内 read関数について
-
Linuxでのシリアル通信について...
-
バイナリデータ受信時のデータ順
-
RS-232Cでバイナリデータを受信...
-
recv関数の受信結果について
おすすめ情報