// // メディアコントロール>MIDIファイルの演奏 // //   1998/ 7/25 宍戸 輝光 // #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void playMidi(char *); void stopMidi(void); HINSTANCE hInst; HWND hwnd,hwPlayB,hwStopB; BOOL play; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; hInst=hInstance; // プロセスのハンドルを保存 wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "Test Window"; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); RegisterClassEx (&wndclass); hwnd = CreateWindow ("Test Window", "MIDIファイルの演奏", WS_OVERLAPPEDWINDOW, 64,64, 256,128, NULL, NULL, hInstance, NULL); DragAcceptFiles(hwnd,TRUE); // ドラッグ&ドロップ受入 ShowWindow (hwnd,iCmdShow); // ウインドウを表示 UpdateWindow (hwnd); // 再描画 while (GetMessage (&msg,NULL,0,0)) { // メッセージループ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static OPENFILENAME ofn; static char szFn[256],szFt[256],str[280]; HDROP hDrop; ofn.lStructSize=sizeof(OPENFILENAME); // ファイルを開くダイアログ設定 ofn.hwndOwner=hwnd; ofn.hInstance=NULL; ofn.lpstrFilter= // フィルター "MIDIファイル(*.mid)\0*.mid\0すべてのファイル(*.*)\0*.*\0\0"; ofn.lpstrCustomFilter=NULL; ofn.nMaxCustFilter=0; ofn.nFilterIndex=1; // フィルターの初期位置 ofn.lpstrFile=szFn; // ファイル名用文字列バッファ ofn.nMaxFile=255; // 文字列バッファのサイズ ofn.lpstrFileTitle=szFt; // タイトル用文字列バッファ ofn.nMaxFileTitle=255; // 文字列バッファのサイズ ofn.lpstrInitialDir=NULL; ofn.lpstrTitle="読み込むファイルを選んでください"; // タイトル ofn.Flags=OFN_FILEMUSTEXIST;// | OFN_HIDEREADONLY; ofn.nFileOffset=0; ofn.nFileExtension=0; ofn.lpstrDefExt=NULL; ofn.lCustData=0; ofn.lpfnHook=NULL; ofn.lpTemplateName=NULL; switch (iMsg) { case WM_CREATE: hwPlayB=CreateWindow("Button","Load", // ボタン作成 WS_CHILD | WS_VISIBLE,16,8,80,32,hwnd, (HMENU)0,hInst,NULL); hwStopB=CreateWindow("Button","Stop", WS_CHILD | WS_VISIBLE,128,8,80,32,hwnd, (HMENU)1,hInst,NULL); play=FALSE; // 演奏フラグリセット EnableWindow(hwStopB,FALSE); // 中止ボタン無効 return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 0: // Playボタン if (!GetOpenFileName(&ofn)) // ファイルを選択 return 0; playMidi(szFn); // 演奏開始 break; case 1: // Stopボタン if (play) stopMidi(); break; } break; return 0; case WM_DROPFILES: // ファイルがドロップされた時の処理 hDrop=(HDROP)wParam; // HDROPを取得 DragQueryFile(hDrop,0,szFn,256); // ファイル名を取得 DragFinish(hDrop); // 終了処理 playMidi(szFn); // 演奏開始 return 0; case MM_MCINOTIFY: // 演奏終了時の処理 if (!play) return 0; // 最初に巻き戻して再度演奏開始 mciSendString("seek music to start",NULL,0,hwnd); mciSendString("play music NOTIFY",NULL,0,hwnd); return 0; case WM_DESTROY : if (play) // 演奏中ならデバイス開放 stopMidi(); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } void playMidi(char *fn) { char cmd[280],res[128]; if (play) // すでに演奏中なら戻る return; lstrcpy(cmd,"open "); // デバイスオープン lstrcat(cmd,fn); lstrcat(cmd," alias music"); mciSendString(cmd,NULL,0,NULL); mciGetErrorString(mciSendString("play music NOTIFY",NULL,0,hwnd),res,128); MessageBox(hwnd,res,"実行結果",MB_OK); play=TRUE; // 演奏フラグセット EnableWindow(hwPlayB,FALSE); // プレイボタン無効 EnableWindow(hwStopB,TRUE); // 中止ボタン有効 } void stopMidi(void) { // 演奏終了とデバイス開放 play=FALSE; // 演奏フラグリセット mciSendString("stop music",NULL,0,NULL); mciSendString("close music",NULL,0,NULL); EnableWindow(hwPlayB,TRUE); // プレイボタン有効 EnableWindow(hwStopB,FALSE); // 中止ボタン無効 }