// // バッファ切り替えによる音階演奏 // // 2001/ 5/31 宍戸 輝光 // #include #include HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HWND hwMain; int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow){ MSG msg; WNDCLASSEX wndclass; // ウインドウクラス設定 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(hInstance,"APP_ICON"); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = NULL; RegisterClassEx(&wndclass); /* ウインドウクラス登録 */ hwMain = CreateWindow("CWindow","音階演奏", WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT, 280,120,NULL,NULL,hInstance,NULL); 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 BYTE lpBuf[8][8000]; static HWAVEOUT hWOut; static WAVEHDR wh; static WAVEFORMATEX wf; static int i,j,n,l,pl[]={0,2,4,5,7,9,11,12}; static double lfRate,lfFreq[13]; switch (iMsg) { case WM_CREATE: n=0; /* 半音一つの倍率 */ lfRate=pow(2,1.0/12.0); /* オクターブ4のドの周波数 */ lfFreq[0]=220*lfRate*lfRate*lfRate; for (i=1;i<13;i++) lfFreq[i]=lfFreq[i-1]*lfRate; for (i=0;i<8;i++) { /* 音の波長計算 */ l=(int)(8000.0/lfFreq[pl[i]]); for (j=0;j<8000;j++) { /* 波形データ作成 */ if ((j % l)