何が間違ってるのか解らないけど、単純にout.szPnameをprintfしようとしても最初の1文字しか出なかった。
とりあえず、音出た。
今までMIDIデバイスを扱える言語を使った事なかったから、これはすごい。
#pragma comment(lib, "winmm.lib") #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <mmsystem.h> void list_input_devices() { int num, id, i; char pname[65]; num = midiInGetNumDevs(); printf("INPUT : %d\n", num); for(id=0; id<num; id++){ MIDIINCAPS in; midiInGetDevCaps(id, &in, sizeof(in)); memset(&pname, '\0', sizeof(pname)); for (i=0; i<sizeof(in.szPname); i++) { memcpy(pname+i, in.szPname+i, 1); } printf("[%d]\n", id); printf("メーカID : %d\n", in.wMid); printf("プロダクトID : %d\n", in.wPid); printf("バージョン : %d\n", in.vDriverVersion); printf("プロダクト名 : %s\n", pname); printf("サポートされる機能 : %d\n", in.dwSupport); } } void list_output_devices() { int num, id, i; char pname[65]; num = midiOutGetNumDevs(); printf("OUTPUT : %d\n", num); for(id=0; id<num; id++){ MIDIOUTCAPS out; memset(&out, '\0', sizeof(out)); midiOutGetDevCaps(id, &out, sizeof(out)); memset(&pname, '\0', sizeof(pname)); for (i=0; i<sizeof(out.szPname); i++) { memcpy(pname+i, out.szPname+i, 1); } printf("[%d]\n", id); printf("メーカID : %d\n", out.wMid); printf("プロダクトID : %d\n", out.wPid); printf("バージョン : %d\n", out.vDriverVersion); printf("プロダクト名 : %s\n", pname); printf("デバイスタイプ : %d\n", out.wTechnology); printf("ボイス数 : %d\n", out.wVoices); printf("最大同時発音数 : %d\n", out.wNotes); printf("チャンネル : %d\n", out.wChannelMask); printf("サポートされる機能 : %d\n", out.dwSupport); } } int deviceOpen(HMIDIOUT *hmo, UINT deviceno) { if (midiOutOpen(hmo, deviceno, 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR) { return -1; } return 0; } int deviceClose(HMIDIOUT *hmo) { midiOutClose(*hmo); } int main(void) { HMIDIOUT hmo; list_input_devices(); printf("\n"); list_output_devices(); printf("\n"); // ポインタとデバイスIDを渡してデバイスを開く if (deviceOpen(&hmo, -1) < 0) { printf("MIDIデバイスオープン失敗\n"); return -1; } // note on midiOutShortMsg(hmo, 0x00703C90); Sleep(1000); // note off midiOutShortMsg(hmo, 0x00703C80); // ポインタを渡してデバイスを閉じる deviceClose(&hmo); return 0; }