/* BGM用MIDI演奏システム 2004/ 9/ 3 宍戸 輝光 */ #include #include #pragma comment(lib, "winmm.lib") HINSTANCE g_hInstance; HWND g_hwMain; DWORD g_dwMMTimerID; LPDWORD g_lpdwMIDI[4]; HMIDIOUT g_hMidi; LPBITMAPINFO g_lpbiInfo; BYTE g_abyPixel[640 * 480]; BYTE g_byLine; BOOL g_bExit; void CALLBACK timerFunc(UINT uiID, UINT uiNo, DWORD dwCookie, DWORD dwNo1, DWORD dwNo2); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; WNDCLASS wndclass; RECT recWnd = {0, 0, 479, 479}; DWORD dwTime; g_hInstance = hInstance; /* ウインドウクラス設定 */ 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 = "THREADSC"; RegisterClass(&wndclass); /* ウインドウサイズ計算 */ AdjustWindowRect(&recWnd, WS_OVERLAPPEDWINDOW, FALSE); /* ウインドウ作成 */ g_hwMain = CreateWindow("THREADSC", "BGM用MIDI演奏システム", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, recWnd.right - recWnd.left, recWnd.bottom - recWnd.top, NULL, NULL, hInstance, NULL); /* ウインドウを表示 */ ShowWindow(g_hwMain, iCmdShow); UpdateWindow(g_hwMain); dwTime = timeGetTime(); /* メインループ */ do { if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { /* メッセージ処理 */ if (GetMessage(&msg, NULL, 0, 0) == 0) { g_bExit = TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { /* 背景にビットマップをスクロール表示 */ if (timeGetTime() - dwTime > 15) { dwTime = timeGetTime(); MoveMemory(g_abyPixel, g_abyPixel + 640, 640 * 479); FillMemory(g_abyPixel + 640 * 479, 640, g_byLine); InvalidateRect(g_hwMain, NULL, FALSE); g_byLine++; } } Sleep(1); } while (!g_bExit); return (int)msg.wParam; } /* マルチメディアタイマコールバック関数 */ void CALLBACK timerFunc(UINT uiID, UINT uiNo, DWORD dwCookie, DWORD dwNo1, DWORD dwNo2) { static DWORD dwCount = 0; static int aiIndex[4]; int i; BYTE byCommand, byArg; DWORD dwData; if (dwCount == 0) { for (i = 0;i < 4;i++) { aiIndex[i] = 0; } } /* 制御チャネル処理 */ if (aiIndex[0] < 1024 && g_lpdwMIDI[0][aiIndex[0]] != 0xffffffff) { /* 現カウントまでに未処理のデータをすべて再生 */ while(((g_lpdwMIDI[0][aiIndex[0]] & 0xffff0000) >> 16) <= dwCount) { byCommand = (BYTE)((g_lpdwMIDI[0][aiIndex[0]] & 0x0000ff00) >> 8); byArg = (BYTE)(g_lpdwMIDI[0][aiIndex[0]] & 0x000000ff); switch (byCommand) { /* リピート */ case 0xa0: dwCount = 0; midiOutReset(g_hMidi); return; break; } aiIndex[0]++; } } /* MIDIチャネル1-3の演奏データ再生 */ for (i = 1;i < 4;i++) { /* 有効な演奏データあり */ if (aiIndex[i] < 1024 && g_lpdwMIDI[i][aiIndex[i]] != 0xffffffff) { /* 現カウントまでに未処理のデータをすべて再生 */ while(((g_lpdwMIDI[i][aiIndex[i]] & 0xffff0000) >> 16) <= dwCount) { byCommand = (BYTE)((g_lpdwMIDI[i][aiIndex[i]] & 0x0000ff00) >> 8); byArg = (BYTE)(g_lpdwMIDI[i][aiIndex[i]] & 0x000000ff); switch (byCommand) { /* ボリューム設定 */ case 0xb7: dwData = ((DWORD)byArg << 16) + (7 << 8) + 0xb0 + (i - 1); midiOutShortMsg(g_hMidi, dwData); break; /* 音色変更 */ case 0xc0: dwData = ((DWORD)byArg << 8) + 0xc0 + (i - 1); midiOutShortMsg(g_hMidi, dwData); break; default: /* ノートオン */ if (byCommand < 0x80) { dwData = ((DWORD)byArg << 16) + ((DWORD)byCommand << 8); dwData += 0x90 + (i - 1); midiOutShortMsg(g_hMidi, dwData); } break; } /* チャネルの現在位置カウンタ更新 */ aiIndex[i]++; } } } dwCount++; } /* ウインドウプロシージャー */ LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { int i; HDC hdc; PAINTSTRUCT ps; switch (iMsg) { case WM_CREATE: g_lpbiInfo = (LPBITMAPINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + 1024); g_lpbiInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); g_lpbiInfo->bmiHeader.biBitCount = 8; g_lpbiInfo->bmiHeader.biPlanes = 1; g_lpbiInfo->bmiHeader.biWidth = 640; g_lpbiInfo->bmiHeader.biHeight = 480; g_lpbiInfo->bmiHeader.biCompression = BI_RGB; for (i = 0;i < 256;i++) { g_lpbiInfo->bmiColors[i].rgbBlue = i; g_lpbiInfo->bmiColors[i].rgbRed = 255 - i; } FillMemory(g_abyPixel + 640 * 240, 640 * 240, 192); for (i = 0;i < 4;i++) { g_lpdwMIDI[i] = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 1024); FillMemory(g_lpdwMIDI[i], 1024, 0xff); } g_lpdwMIDI[0][0] = 0x1000a000; g_lpdwMIDI[1][0] = 0x0000b740; g_lpdwMIDI[1][1] = 0x0000c049; g_lpdwMIDI[1][2] = 0x00004570; g_lpdwMIDI[1][3] = 0x00804500; g_lpdwMIDI[1][4] = 0x00804070; g_lpdwMIDI[1][5] = 0x00c04000; g_lpdwMIDI[1][6] = 0x00c03e70; g_lpdwMIDI[1][7] = 0x01003e00; g_lpdwMIDI[1][8] = 0x01004070; g_lpdwMIDI[1][9] = 0x01404000; g_lpdwMIDI[1][10] = 0x01404570; g_lpdwMIDI[1][11] = 0x01804500; g_lpdwMIDI[1][12] = 0x01804370; g_lpdwMIDI[1][13] = 0x02004300; g_lpdwMIDI[1][14] = 0x02004170; g_lpdwMIDI[1][15] = 0x02404100; g_lpdwMIDI[1][16] = 0x02404570; g_lpdwMIDI[1][17] = 0x02804500; g_lpdwMIDI[1][18] = 0x02804070; g_lpdwMIDI[1][19] = 0x02c04000; g_lpdwMIDI[1][20] = 0x02c04370; g_lpdwMIDI[1][21] = 0x03004300; g_lpdwMIDI[1][22] = 0x03004570; g_lpdwMIDI[1][23] = 0x03c04500; g_lpdwMIDI[1][24] = 0x04004070; g_lpdwMIDI[1][25] = 0x04804000; g_lpdwMIDI[1][26] = 0x04804170; g_lpdwMIDI[1][27] = 0x05004100; g_lpdwMIDI[1][28] = 0x05004370; g_lpdwMIDI[1][29] = 0x05404300; g_lpdwMIDI[1][30] = 0x05404070; g_lpdwMIDI[1][31] = 0x05804000; g_lpdwMIDI[1][32] = 0x05803e70; g_lpdwMIDI[1][33] = 0x06003e00; g_lpdwMIDI[1][34] = 0x06004170; g_lpdwMIDI[1][35] = 0x06404100; g_lpdwMIDI[1][36] = 0x06403e70; g_lpdwMIDI[1][37] = 0x06803e00; g_lpdwMIDI[1][38] = 0x06804070; g_lpdwMIDI[1][39] = 0x06c04000; g_lpdwMIDI[1][40] = 0x06c04570; g_lpdwMIDI[1][41] = 0x07004500; g_lpdwMIDI[1][42] = 0x07004170; g_lpdwMIDI[1][43] = 0x07404100; g_lpdwMIDI[1][44] = 0x07404570; g_lpdwMIDI[1][45] = 0x07804500; g_lpdwMIDI[1][46] = 0x07804370; g_lpdwMIDI[1][47] = 0x07c04300; g_lpdwMIDI[1][48] = 0x08003c70; g_lpdwMIDI[1][49] = 0x08403c00; g_lpdwMIDI[1][50] = 0x08404070; g_lpdwMIDI[1][51] = 0x08804000; g_lpdwMIDI[1][52] = 0x08804170; g_lpdwMIDI[1][53] = 0x09004100; g_lpdwMIDI[1][54] = 0x09004070; g_lpdwMIDI[1][55] = 0x09404000; g_lpdwMIDI[1][56] = 0x09404370; g_lpdwMIDI[1][57] = 0x09804300; g_lpdwMIDI[1][58] = 0x09804570; g_lpdwMIDI[1][59] = 0x0a004500; g_lpdwMIDI[1][60] = 0x0a004170; g_lpdwMIDI[1][61] = 0x0a404100; g_lpdwMIDI[1][62] = 0x0a403c70; g_lpdwMIDI[1][63] = 0x0a803c00; g_lpdwMIDI[1][64] = 0x0a803e70; g_lpdwMIDI[1][65] = 0x0ac03e00; g_lpdwMIDI[1][66] = 0x0ac04370; g_lpdwMIDI[1][67] = 0x0b004300; g_lpdwMIDI[1][68] = 0x0b004070; g_lpdwMIDI[1][69] = 0x0bc04000; g_lpdwMIDI[1][70] = 0x0c004570; g_lpdwMIDI[1][71] = 0x0c804500; g_lpdwMIDI[1][72] = 0x0c804070; g_lpdwMIDI[1][73] = 0x0cc04000; g_lpdwMIDI[1][74] = 0x0cc03e70; g_lpdwMIDI[1][75] = 0x0d003e00; g_lpdwMIDI[1][76] = 0x0d004070; g_lpdwMIDI[1][77] = 0x0d404000; g_lpdwMIDI[1][78] = 0x0d404570; g_lpdwMIDI[1][79] = 0x0d804500; g_lpdwMIDI[1][80] = 0x0d804370; g_lpdwMIDI[1][81] = 0x0e004300; g_lpdwMIDI[1][82] = 0x0e004170; g_lpdwMIDI[1][83] = 0x0e404100; g_lpdwMIDI[1][84] = 0x0e404570; g_lpdwMIDI[1][85] = 0x0e804500; g_lpdwMIDI[1][86] = 0x0e804370; g_lpdwMIDI[1][87] = 0x0f004300; g_lpdwMIDI[1][88] = 0x0f004570; g_lpdwMIDI[1][89] = 0x0fc04500; g_lpdwMIDI[2][0] = 0x0000b730; g_lpdwMIDI[2][1] = 0x0000c000; g_lpdwMIDI[2][2] = 0x00002d70; g_lpdwMIDI[2][3] = 0x00802d00; g_lpdwMIDI[2][4] = 0x00802670; g_lpdwMIDI[2][5] = 0x01002600; g_lpdwMIDI[2][6] = 0x01002870; g_lpdwMIDI[2][7] = 0x01402800; g_lpdwMIDI[2][8] = 0x01402d70; g_lpdwMIDI[2][9] = 0x01802d00; g_lpdwMIDI[2][10] = 0x01802870; g_lpdwMIDI[2][11] = 0x02002800; g_lpdwMIDI[2][12] = 0x02002670; g_lpdwMIDI[2][13] = 0x02802600; g_lpdwMIDI[2][14] = 0x02802870; g_lpdwMIDI[2][15] = 0x03002800; g_lpdwMIDI[2][16] = 0x03002d70; g_lpdwMIDI[2][17] = 0x03c02d00; g_lpdwMIDI[2][18] = 0x04002870; g_lpdwMIDI[2][19] = 0x04802800; g_lpdwMIDI[2][20] = 0x04802670; g_lpdwMIDI[2][21] = 0x05002600; g_lpdwMIDI[2][22] = 0x05002b70; g_lpdwMIDI[2][23] = 0x05402b00; g_lpdwMIDI[2][24] = 0x05402870; g_lpdwMIDI[2][25] = 0x05802800; g_lpdwMIDI[2][26] = 0x05802970; g_lpdwMIDI[2][27] = 0x06002900; g_lpdwMIDI[2][28] = 0x06002670; g_lpdwMIDI[2][29] = 0x06802600; g_lpdwMIDI[2][30] = 0x06802870; g_lpdwMIDI[2][31] = 0x06c02800; g_lpdwMIDI[2][32] = 0x06c02d70; g_lpdwMIDI[2][33] = 0x07002d00; g_lpdwMIDI[2][34] = 0x07002b70; g_lpdwMIDI[2][35] = 0x07802b00; g_lpdwMIDI[2][36] = 0x07802870; g_lpdwMIDI[2][37] = 0x08002800; g_lpdwMIDI[2][38] = 0x08002470; g_lpdwMIDI[2][39] = 0x08802400; g_lpdwMIDI[2][40] = 0x08002670; g_lpdwMIDI[2][41] = 0x09002600; g_lpdwMIDI[2][42] = 0x09002870; g_lpdwMIDI[2][43] = 0x09402800; g_lpdwMIDI[2][44] = 0x09402b70; g_lpdwMIDI[2][45] = 0x09802b00; g_lpdwMIDI[2][46] = 0x09802970; g_lpdwMIDI[2][47] = 0x09c02900; g_lpdwMIDI[2][48] = 0x09c02d70; g_lpdwMIDI[2][49] = 0x0a002d00; g_lpdwMIDI[2][50] = 0x0a002670; g_lpdwMIDI[2][51] = 0x0a802600; g_lpdwMIDI[2][52] = 0x0a802970; g_lpdwMIDI[2][53] = 0x0ac02900; g_lpdwMIDI[2][54] = 0x0ac02b70; g_lpdwMIDI[2][55] = 0x0b002b00; g_lpdwMIDI[2][56] = 0x0b002b70; g_lpdwMIDI[2][57] = 0x0b802b00; g_lpdwMIDI[2][58] = 0x0b802670; g_lpdwMIDI[2][59] = 0x0c002600; g_lpdwMIDI[2][60] = 0x0c002d70; g_lpdwMIDI[2][61] = 0x0c802d00; g_lpdwMIDI[2][62] = 0x0c802670; g_lpdwMIDI[2][63] = 0x0d002600; g_lpdwMIDI[2][64] = 0x0d002870; g_lpdwMIDI[2][65] = 0x0d402800; g_lpdwMIDI[2][66] = 0x0d402d70; g_lpdwMIDI[2][67] = 0x0d802d00; g_lpdwMIDI[2][68] = 0x0d802870; g_lpdwMIDI[2][69] = 0x0e002800; g_lpdwMIDI[2][70] = 0x0e002670; g_lpdwMIDI[2][71] = 0x0e802600; g_lpdwMIDI[2][72] = 0x0e802870; g_lpdwMIDI[2][73] = 0x0f002800; g_lpdwMIDI[2][74] = 0x0f002470; g_lpdwMIDI[2][75] = 0x0f402400; g_lpdwMIDI[2][76] = 0x0f402870; g_lpdwMIDI[2][77] = 0x0f802800; g_lpdwMIDI[2][78] = 0x0f802d70; g_lpdwMIDI[2][79] = 0x0fc02d00; /* MIDIデバイスオープン */ if (midiOutOpen(&g_hMidi, MIDIMAPPER, 0, 0, 0) != MMSYSERR_NOERROR) { return 0; } /* マルチメディアタイマ起動 */ g_dwMMTimerID = timeSetEvent(10, 1, timerFunc, 0, TIME_PERIODIC); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); StretchDIBits(hdc, 0, 0, 640, 480, 0, 0, 640, 480, g_abyPixel, g_lpbiInfo, DIB_RGB_COLORS, SRCCOPY); EndPaint(hwnd,&ps); return 0; case WM_DESTROY: /* 終了処理 */ /* マルチメディアタイマ終了 */ timeKillEvent(g_dwMMTimerID); for (i = 0;i < 4;i++) { HeapFree(GetProcessHeap(), 0, g_lpdwMIDI[i]); } midiOutReset(g_hMidi); midiOutClose(g_hMidi); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }