ChatGPTでMIDIプログラム

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関数を使用します。