#include <stdio.h> #include <string.h> #include <math.h> #include <windows.h> #include <mmsystem.h> #include <conio.h> #include <unistd.h> #include <time.h> #define NUMBER_OF_BUFFER 8 /*バッファの数*/ #define BUFFER_SIZE 160 /*バッファのサイズ*/ #define BUTTON_ID1 0 HBITMAP hBitmap; int i=0,j,b[4]={0,0,0,0},flg=0; LPSTR fort[7]={"大吉","中吉","吉","小吉","末吉","凶","大凶"}; //運勢結果 LPSTR luccol[9]={"赤","青","黄","緑","紫","金","銀","白","黒"}; //ラッキーカラー LPSTR lucitem[10]={"輪ゴム","傘","リップクリーム","髪留め","孫の手","スリッパ","腕時計","タオル","イヤホン","メモ帳"}; //ラッキーアイテム LPSTR bectol[8]={"北","東","西","南","北東","北西","南東","南西"}; //旅行の方角 short s[BUFFER_SIZE]; /*音データ*/ DWORD WINAPI ThreadFunc(LPVOID hWnd) { char buffer[100]; char key; int n, in0, in1, out0, flag; short in_buffer[NUMBER_OF_BUFFER][BUFFER_SIZE];/*入力バッファ*/ WAVEHDR in_hdr[NUMBER_OF_BUFFER];/*入力バッファのヘッダ*/ HWAVEIN in_hdl = 0;/*サウンドデバイスのハンドル*/ WAVEHDR out_hdr[NUMBER_OF_BUFFER];/*出力バッファのヘッダ*/ WAVEFORMATEX wave_format_ex = {WAVE_FORMAT_PCM,/*PCM*/ 1,/*モノラル*/ 8000,/*標本化周波数(8000Hz)*/ 16000,/*1秒あたりの音データのサイズ(16000byte)*/ 2,/*音データの最小単位(2byte)*/ 16,/*量子化精度(16bit)*/ 0/*オプション情報のサイズ(0byte)*/ }; /* サウンドデバイスのオープン */ waveInOpen(&in_hdl,0,&wave_format_ex,0,0,CALLBACK_NULL); for(in0 = 0;in0 < NUMBER_OF_BUFFER;in0++) { memset(&in_hdr[in0],0,sizeof(WAVEHDR)); } /* 0を書き込むことでout_hdrをクリアする */ for(out0 = 0;out0 < NUMBER_OF_BUFFER;out0++) { memset(&out_hdr[out0],0,sizeof(WAVEHDR)); } in0 = 0; in1 = 0; out0 = 0; flag = 0; while(TRUE) { /* 0を書き込むことでin_hdrをクリアする */ if(flag == 1) /* flagが1のとき */ { /* 音データの出力 */ if(out0 < NUMBER_OF_BUFFER) { /* 出力バッファに音データを書き込む */ for(n = 0;n < BUFFER_SIZE;n++) { if((s[n]>=30000)&&(flg==0)&&(i==1)){ //二回目の判定 i++; }else if((s[n]>=30000)&&(flg==0)&&(i==0)){ //一回目の判定 wsprintf(buffer,"一回目\n"); MessageBox(hWnd,buffer,TEXT("カウンタ"),MB_OK); i++; continue; }else if(i==2){ srand((unsigned int)time(NULL)); // 現在時刻の情報で初期化 for(i=0;i<4;i++){ if(i==0)b[0]=rand()%7; else if(i==1)b[1]=rand()%9; else if(i==2)b[2]=rand()%10; else if(i==3)b[3]=rand()%8; } wsprintf(buffer, "運勢\t\t%s\nラッキーカラー\t%s\nラッキーアイテム\t%s\n旅行\t\t%s良し\n" ,fort[b[0]],luccol[b[1]],lucitem[b[2]],bectol[b[3]]); MessageBox(hWnd,buffer,TEXT("今日の結果"),MB_OK); flg++; i=0; } for(j=0;j<BUFFER_SIZE;j++)s[j]=0; } } } /* 音データの入力 */ if(in0 < NUMBER_OF_BUFFER) { /* 入力バッファの設定 */ in_hdr[in0].lpData = (char *)in_buffer[in0]; /* 入力バッファの指定 */ in_hdr[in0].dwBufferLength = BUFFER_SIZE * 2; /* 入力バッファのサイズ */ in_hdr[in0].dwFlags = 0; /* フラグのクリア */ /* 入力バッファのロック */ waveInPrepareHeader(in_hdl,&in_hdr[in0],sizeof(WAVEHDR)); /* 入力バッファを入力待ちキューに追加する */ waveInAddBuffer(in_hdl,&in_hdr[in0],sizeof(WAVEHDR)); in0++; if(in0 == NUMBER_OF_BUFFER) /* すべての入力バッファが入力待ちキューに追加されたとき */ { /* 音データの入力を開始する */ waveInStart(in_hdl); } } else { if((in_hdr[in1].dwFlags & WHDR_DONE) != 0) /* 入力バッファのおわりまで音データが録音されたとき */ { /* 入力バッファのアンロック */ waveInUnprepareHeader(in_hdl,&in_hdr[in1],sizeof(WAVEHDR)); /* 入力バッファから音データを読み取る */ for(n = 0;n<BUFFER_SIZE;n++) { s[n] = in_buffer[in1][n]; } flag = 1; /* flagを1にする */ /* 入力バッファの設定 */ in_hdr[in1].lpData = (char *)in_buffer[in1]; /* 入力バッファの指定 */ in_hdr[in1].dwBufferLength = BUFFER_SIZE * 2; /* 入力バッファのサイズ */ in_hdr[in1].dwFlags = 0; /* フラグのクリア */ /* 入力バッファのロック */ waveInPrepareHeader(in_hdl,&in_hdr[in1],sizeof(WAVEHDR)); /* 入力バッファを入力待ちキューに追加する */ waveInAddBuffer(in_hdl,&in_hdr[in1],sizeof(WAVEHDR)); in1++; if(in1 == NUMBER_OF_BUFFER) { in1 = 0; /* in1を0に戻し,入力バッファを再利用する */ } } } if(kbhit()) /* キーボードから入力があるとき */ { key = getch(); /* キーのチェック */ if(key == 13) /* Enterキーが押されたとき */ { waveInStop(in_hdl); /* 音データの入力を停止する */ for(in0 = 0;in0<NUMBER_OF_BUFFER;in0++) { /* 入力バッファのアンロック */ if ((in_hdr[in0].dwFlags & WHDR_PREPARED) != 0) { waveInUnprepareHeader(in_hdl,&in_hdr[in0],sizeof(WAVEHDR)); } } waveInClose(in_hdl); /* サウンドデバイスのクローズ */ return 0; } } Sleep(1); /* 1msのスリープをはさむことで,プログラムの実行速度を調節する */ } ExitThread(TRUE); } LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { DWORD dwParam; static HANDLE hThread; HDC hdc , hBuffer; PAINTSTRUCT ps; switch (msg) { case WM_DESTROY: DeleteObject(hBitmap); PostQuitMessage(0); return 0; case WM_CREATE: hBitmap = LoadBitmap(((LPCREATESTRUCT)lp)->hInstance,TEXT("KITTY")); hThread = CreateThread( NULL,0,ThreadFunc,hWnd,0,&dwParam); return 0; case WM_PAINT: hdc = BeginPaint(hWnd,&ps); hBuffer = CreateCompatibleDC(hdc); SelectObject(hBuffer,hBitmap); BitBlt(hdc,400,125,300,300,hBuffer,0,0,SRCCOPY); EndPaint(hWnd,&ps); DeleteDC(hBuffer); return 0; case WM_COMMAND: switch(LOWORD(wp)) { case BUTTON_ID1: flg=0; break; } return 0; } return DefWindowProc(hWnd,msg,wp,lp); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { HWND hWnd; MSG msg; WNDCLASS winc; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL,IDI_APPLICATION); winc.hCursor = LoadCursor(NULL,IDC_ARROW); winc.hbrBackground = GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("KITTY"); if(!RegisterClass(&winc))return -1; hWnd = CreateWindow( TEXT("KITTY") , TEXT("おみくじ"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL ); CreateWindow( TEXT("BUTTON"),TEXT("もう一回"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 500,380,100,50, hWnd,(HMENU)BUTTON_ID1,hInstance,NULL ); if(hWnd == NULL)return -1; hBitmap=LoadBitmap(hInstance,"KITTY"); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
以前に質問して一度手を叩くと乱数を使用したおみくじを動かすプログラムを制作しました。そのプログラムを改良して叩く回数を2回にしようとしているのですが(上記のプログラム)うまくいきません。
コンパイラはGCC,使用言語はCです。
・手を叩く音も他の音と同じで一定時間の音データと解釈しているのですが、二連続で叩いた時など連続したデータをを区別するのには、どのような判定をすればいいのでしょうか?
・上記のプログラムでおみくじ起動の条件を2回叩く(イメージは柏手)と動く、というような判定にするにはどう改良すればいいでしょうか?
アドバイスを頂けたらありがたいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/28 00:53
2020/01/28 01:03