開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 プロジェクト
プロジェクト名 EzPlay
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode

EzPlay.cpp
#pragma comment(lib, "winmm")
 
#include <Windows.h>
#include <tchar.h>
#include "resource.h"
 
#define MAKESMSG(st,ch,d1,d2) ((st)<<4|(ch)|(d1)<<8|(d2)<<16)
#define CH 0
 
// 関数プロトタイプ宣言
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void Trace(LPCTSTR format, ...);
void NoteOff(void);
 
// 外部変数
HMIDIOUT g_hmo;
UINT_PTR g_uCode = 0;
int g_nNoteNO = -1;
 
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
	midiOutOpen(&g_hmo, MIDI_MAPPER, NULL, 0, CALLBACK_NULL);
	midiOutShortMsg(g_hmo, MAKESMSG(0xc, CH, 0, 0));	// プログラム・チェンジ Piano
 
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
 
	midiOutReset(g_hmo);
	midiOutClose(g_hmo);
	return 0;
}
 
void Trace(LPCTSTR format, ...)
{
	va_list arg_ptr;
	TCHAR buffer[256];
	int size;
 
	va_start(arg_ptr, format);
	size = _vsntprintf_s(buffer, _countof(buffer), _TRUNCATE, format, arg_ptr);
	va_end(arg_ptr);
	OutputDebugString(buffer);
	if (size < 0) {
		OutputDebugString(_T("...\n"));
	}
}
 
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	INT_PTR nRet = TRUE;	// メッセージを処理した
 
	switch (uMsg) {
	case WM_KEYDOWN:
		if (wParam != g_uCode) {
			g_uCode = wParam;
			Trace(_T("D:%x\n"), g_uCode);
			NoteOff();
			switch (g_uCode) {
			case 'A': g_nNoteNO = 56; break;
			case 'Z': g_nNoteNO = 57; break;
			case 'S': g_nNoteNO = 58; break;
			case 'X': g_nNoteNO = 59; break;
			case 'C': g_nNoteNO = 60; break;
			case 'F': g_nNoteNO = 61; break;
			case 'V': g_nNoteNO = 62; break;
			case 'G': g_nNoteNO = 63; break;
			case 'B': g_nNoteNO = 64; break;
			case 'N': g_nNoteNO = 65; break;
			case 'J': g_nNoteNO = 66; break;
			case 'M': g_nNoteNO = 67; break;
			case 'K': g_nNoteNO = 68; break;
			case VK_OEM_COMMA: g_nNoteNO = 69; break;
			case 'L': g_nNoteNO = 70; break;
			case VK_OEM_PERIOD: g_nNoteNO = 71; break;
			case VK_OEM_2: g_nNoteNO = 72; break;
			case VK_OEM_1: g_nNoteNO = 73; break;
			case VK_OEM_102: g_nNoteNO = 74; break;
			case VK_OEM_6: g_nNoteNO = 75; break;
			}
			if (0 <= g_nNoteNO) {
				// ノート・オン
				midiOutShortMsg(g_hmo, MAKESMSG(0x9, CH, g_nNoteNO, 127));
			}
		}
		break;
	case WM_KEYUP:
		Trace(_T("U:%x\n"), g_uCode);
		g_uCode = 0;
		NoteOff();
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDCANCEL:
			EndDialog(hDlg, IDCANCEL);
			break;
		}
		break;
	case WM_CLOSE:
		EndDialog(hDlg, 0);
		break;
	default:
		nRet = FALSE;	// メッセージを処理しなかった
	}
	return nRet;
}
 
void NoteOff(void)
{
	if (g_nNoteNO < 0) return;
 
	midiOutShortMsg(g_hmo, MAKESMSG(0x8, CH, g_nNoteNO, 0));	// ノート・オフ
	g_nNoteNO = -1;
}
 

resource.h
#define IDD_MAIN	100
 

EzPlay.rc
// resource script
#include <windows.h>
#include "resource.h"

IDD_MAIN DIALOGEX 100, 100, 320, 200
STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX
EXSTYLE WS_EX_APPWINDOW
CAPTION "EzPlay"
FONT 9, "MS Pゴシック"
BEGIN
END
 
最終更新:2013年01月22日 20:21