#include // winmm.lib をリンクする #pragma comment(lib,"winmm") #define SRATE 8000 //標本化周波数(1秒間のサンプル数) #define F 400 //周波数(1秒間の波形数) #define WIN_W 640 //横幅 #define WIN_H 480 //高さ typedef struct _GCW{ WORD nChannels; WORD wBitsPerSample; void *lpWave; DWORD sample_sum; DWORD win_r,win_b; POINT *left,*right; DWORD point_sum; }GCW; void GetCurrentWave(HWAVEOUT hWaveOut,DWORD sample,GCW *gcw) { DWORD center_x=gcw->win_r/2; int left,right; for(DWORD i=0;ipoint_sum;i++){ if(gcw->nChannels==1){ if(sample+i= gcw->sample_sum+center_x)){ gcw->left[i].y=gcw->win_b/2; }else{ if(gcw->wBitsPerSample==8){ left=((BYTE*)(gcw->lpWave))[(sample-center_x)+i]; gcw->left[i].y=gcw->win_b*left/255; }else if(gcw->wBitsPerSample==16){ left=((short*)(gcw->lpWave))[(sample-center_x)+i]; gcw->left[i].y=gcw->win_b*(left+32768)/65536; } } gcw->left[i].y = gcw->win_b - gcw->left[i].y; //上下反転 }else if(gcw->nChannels==2){ if(sample+i= gcw->sample_sum+center_x)){ gcw->left[i].y=gcw->win_b/2; gcw->right[i].y=gcw->win_b/2; }else{ if(gcw->wBitsPerSample==8){ left=((BYTE*)(gcw->lpWave))[(sample-center_x)*2 + 2*i]; right=((BYTE*)(gcw->lpWave))[(sample-center_x)*2 + 2*i+1]; gcw->left[i].y=gcw->win_b*left/255; gcw->right[i].y=gcw->win_b*right/255; }else if(gcw->wBitsPerSample==16){ left=((short*)(gcw->lpWave))[(sample-center_x)*2 + 2*i]; right=((short*)(gcw->lpWave))[(sample-center_x)*2 + 2*i+1]; gcw->left[i].y=gcw->win_b*(left+32768)/65536; gcw->right[i].y=gcw->win_b*(right+32768)/65536; } } gcw->left[i].y = gcw->win_b - gcw->left[i].y; //上下反転 gcw->right[i].y = gcw->win_b - gcw->right[i].y; //上下反転 } } } LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { WAVEFORMATEX wfe; static HWAVEOUT hWaveOut; static WAVEHDR whdr; static LPBYTE lpWave; int i,len; HDC hdc; PAINTSTRUCT ps; static HPEN leftPen,rightPen; MMTIME mmt; DWORD sample; static GCW gcw; switch(uMsg){ case WM_CREATE: wfe.wFormatTag=WAVE_FORMAT_PCM; wfe.nChannels=2; //ステレオ wfe.wBitsPerSample=8; //量子化ビット数 wfe.nBlockAlign=wfe.nChannels * wfe.wBitsPerSample/8; wfe.nSamplesPerSec=SRATE; //標本化周波数 wfe.nAvgBytesPerSec=wfe.nSamplesPerSec * wfe.nBlockAlign; waveOutOpen(&hWaveOut,WAVE_MAPPER,&wfe,(DWORD)hWnd,0,CALLBACK_WINDOW); lpWave=(LPBYTE)calloc(wfe.nAvgBytesPerSec,2); //2秒分 len=SRATE/F; //波長 for(i=0;i