MIDIデバイス一覧を出力してちょっと音を出してみる

何が間違ってるのか解らないけど、単純に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;
}