ChatGPTでMIDIのプログラムを書かせてみました。 結果から言うと、2箇所修正するだけで動作させることができました。
検索メッセージに、「WindowsでMIDIをUSBから取り込むC++のソースコード」と入力しました。

出力されたプログラムは以下の通りです。但し、このままではコンパイルが通りませんでした。 赤文字のように、#include <stdio.h> を追加しました。修正箇所は以下の3行追加です。 このプログラムをmidiintest.cとして保存しました。
#include <Windows.h>
#include <mmsystem.h>
#include <stdio.h> //<--- 追加
#undef MIDI_MAPPER //<--- 追加
#define MIDI_MAPPER 0 //<--- 追加
#pragma comment(lib, "winmm.lib")
void CALLBACK MidiInProc(HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
if (wMsg == MIM_DATA) {
// MIDIデータを処理する
DWORD dwData = dwParam1;
BYTE status = dwData & 0xFF;
BYTE data1 = (dwData >> 8) & 0xFF;
BYTE data2 = (dwData >> 16) & 0xFF;
// MIDIデータを表示する
printf("Status: %02X, Data1: %02X, Data2: %02X\n", status, data1, data2);
}
}
int main() {
// MIDI入力デバイスを開く
HMIDIIN hMidiIn;
MMRESULT result = midiInOpen(&hMidiIn, MIDI_MAPPER, (DWORD_PTR)MidiInProc, 0, CALLBACK_FUNCTION);
if (result != MMSYSERR_NOERROR) {
printf("Error: Failed to open MIDI input device.\n");
return 1;
}
// MIDI入力デバイスを開始する
result = midiInStart(hMidiIn);
if (result != MMSYSERR_NOERROR) {
printf("Error: Failed to start MIDI input device.\n");
midiInClose(hMidiIn);
return 1;
}
// MIDI入力を受け取るまで待機する
printf("Waiting for MIDI input...\n");
getchar();
// MIDI入力デバイスを停止する
midiInStop(hMidiIn);
// MIDI入力デバイスを閉じる
midiInClose(hMidiIn);
return 0;
}
コンパイルにはMinGWを使っています。コンパイルは以下のコマンドで行います。
> gcc -o midiintest midiintest.c [MinGW pass]\liblibwinmm.a
USB接続のMIDIの鍵盤をPCに接続し、midiintestを起動し、鍵盤を押すと以下のようにMIDIを表示することができます。
Waiting for MIDI input... Status: 90, Data1: 35, Data2: 4E Status: 80, Data1: 35, Data2: 40 Status: 90, Data1: 35, Data2: 31 Status: 80, Data1: 35, Data2: 40 Status: 90, Data1: 32, Data2: 3A Status: 90, Data1: 34, Data2: 35 Status: 80, Data1: 32, Data2: 40 Status: 90, Data1: 37, Data2: 36 Status: 80, Data1: 34, Data2: 40 Status: 80, Data1: 37, Data2: 40 Status: 90, Data1: 34, Data2: 31 Status: 80, Data1: 34, Data2: 40 Status: 90, Data1: 37, Data2: 33 Status: 80, Data1: 37, Data2: 40
ソースコードの後には以下のような説明書きが表示されました。
このコードでは、midiInOpen関数を使用してMIDI入力デバイスを開き、midiInStart関数を使用してMIDI入力を開始します。MIDI入力を受け取るためには、MidiInProc関数をコールバック関数として指定する必要があります。MidiInProc関数は、MIDI入力デバイスからMIDIデータが受信されるたびに呼び出されます。MIDIデータを処理するコードは、MidiInProc関数内に記述されています。 MIDI入力デバイスを停止するには、midiInStop関数を使用し、MIDI入力デバイスを閉じるには、midiInClose関数を使用します。