⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 musicplay.cpp

📁 这是一个用vc编写的系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	img00.hwnd = NULL;

	CreateThread( NULL, 0,

				 (LPTHREAD_START_ROUTINE)th_Proc0,

				 NULL, 0, &tid );

	while( !(img00.hwnd) );			// 保持窗口所表示的

}





/******************************************************************************

 * 打开窗口1

******************************************************************************/

void openWindow1(void)

{

	DWORD tid;



	img01.hwnd = NULL;

	CreateThread( NULL, 0,

				 (LPTHREAD_START_ROUTINE)th_Proc1,

				 NULL, 0, &tid );



	while( !(img01.hwnd) );			// 保持窗口所表示的

}





/******************************************************************************

 * oscillatPlay - 演奏音乐

******************************************************************************/

double drand(void)

{

	return (double)rand()/RAND_MAX;

}



double nrand(void)

{

	return  drand()+drand()+drand()+drand()+drand()+drand()+

			drand()+drand()+drand()+drand()+drand()+drand()-6.0;

}



short round(double d)

{

	if (d>0) 

		return (short)(d+0.5);

	else

		return (short)(d-0.5);

}





/******************************************************************************

 * 根据模式频率产生发声数据

******************************************************************************/

void makedata(DWORD dwDataSize, int pattern, double freq, 

			  unsigned char HUGE *lpData)

{

	unsigned long i; 

	double freq2;

	short HUGE *lpData2 = (short HUGE *)lpData;

	if (rec_bits==8)

	{

		for (i=0; i<dwDataSize; i++)

		{

			switch(pattern)

			{

			case 0:/* 模式0 */

				if (fmod(i, rec_freq/freq) < rec_freq/freq/2) 

					lpData[i]=0;

				else 

					lpData[i]=255;

				break;

			case 1:/* 模式1 */

				lpData[i]=fmod(i, rec_freq/freq)/(rec_freq/freq)*255;

				break;

			case 2:/* 模式2 */

				if (fmod(i, rec_freq/freq) < rec_freq/freq/2)

					lpData[i]=fmod(i, rec_freq/freq/2)/(rec_freq/freq/2)*255;

				else

					lpData[i]=255-fmod(i, rec_freq/freq/2)/(rec_freq/freq/2)*255;

				break;

			case 3:/* 模式3 */

				lpData[i]=sin(i*freq/rec_freq*M_PI*2)*127+128;

				break;

			case 4:/* 模式4 */

				lpData[i]=128+nrand()*20;

				break;

			case 5:/* 模式5 */

				freq2=freq*HANON;

				lpData[i]=sin(i*freq /rec_freq*M_PI*2)*63+

						  sin(i*freq2/rec_freq*M_PI*2)*63+128;

				break;

			case 6:/* 模式6 */

				freq2=freq*HANON*HANON;

				lpData[i]=sin(i*freq /rec_freq*M_PI*2)*63+

						  sin(i*freq2/rec_freq*M_PI*2)*63+128;

				break;

			case 7:/* 模式7 */

				freq2=freq*HANON*HANON*HANON*HANON;

				lpData[i]=sin(i*freq /rec_freq*M_PI*2)*63+

						  sin(i*freq2/rec_freq*M_PI*2)*63+128;

				break;

			case 8:/* 模式8 */

				freq2=freq*1.5;

				lpData[i]=sin(i*freq /rec_freq*M_PI*2)*63+

						  sin(i*freq2/rec_freq*M_PI*2)*63+128;

				break;

			case 9:/* 模式9 */

				freq2=freq*2;

				lpData[i]=sin(i*freq /rec_freq*M_PI*2)*63+

						  sin(i*freq2/rec_freq*M_PI*2)*63+128;

				break;

			case 10:/* 模式10 */

				if (dwDataSize/2 <=i && i<=dwDataSize/2+rec_freq/freq) 

					lpData[i]=0;

				else 

					lpData[i]=128;

				break;

			}

		}

	}

	else

	{

		for (i=0; i<dwDataSize/2; i++)

		{

			switch(pattern)

			{

			case 0:/* 模式0 */

				if (fmod(i, rec_freq/freq) < rec_freq/freq/2) 

					lpData2[i]=SHRT_MAX;

				else 

					lpData2[i]=SHRT_MIN;

				break;

			case 1:/* 模式1 */

				lpData2[i]=fmod(i, rec_freq/freq)/(rec_freq/freq)*USHRT_MAX-32768L;

				break;

			case 2:/* 模式2 */

				if (fmod(i, rec_freq/freq) < rec_freq/freq/2)

					lpData2[i] =

						fmod(i, rec_freq/freq/2)/(rec_freq/freq/2)*USHRT_MAX-32768L;

				else

					lpData2[i] =

						32767-fmod(i, rec_freq/freq/2)/(rec_freq/freq/2)*USHRT_MAX;

				break;

			case 3:/* 模式3 */

				lpData2[i]=round(sin(i*freq/rec_freq*M_PI*2)*32767);

				break;

			case 4:/* 模式4 */

				lpData2[i]=nrand()*20*256;

				break;

			case 5:/* 模式5 */

				freq2=freq*HANON;

				lpData2[i]=round(sin(i*freq /rec_freq*M_PI*2)*16383+

								 sin(i*freq2/rec_freq*M_PI*2)*16383);

				break;

			case 6:/* 模式6 */

				freq2=freq*HANON*HANON;

				lpData2[i]=round(sin(i*freq /rec_freq*M_PI*2)*16383+

								 sin(i*freq2/rec_freq*M_PI*2)*16383);

				break;

			case 7:/* 模式7 */

				freq2=freq*HANON*HANON*HANON*HANON;

				lpData2[i]=round(sin(i*freq /rec_freq*M_PI*2)*16383+

								 sin(i*freq2/rec_freq*M_PI*2)*16383);

				break;

			case 8:/* 模式8 */

				freq2=freq*1.5;

				lpData2[i]=round(sin(i*freq /rec_freq*M_PI*2)*16383+

								 sin(i*freq2/rec_freq*M_PI*2)*16383);

				break;

			case 9:/* 模式9 */

				freq2=freq*2;

				lpData2[i]=round(sin(i*freq /rec_freq*M_PI*2)*16383+

								 sin(i*freq2/rec_freq*M_PI*2)*16383);

				break;

			case 10:/* 模式10 */

				if (dwDataSize/4 <=i && i<=dwDataSize/4+rec_freq/freq) 

					lpData2[i]=32767;

				else 

					lpData2[i]=0;

				break;

			}

		}

	}

}





/******************************************************************************

 * 演奏

******************************************************************************/

void oscillatPlay(int pattern, 	double freq)

{

	/*

	"        " pattern=9

	"五度重音" pattern=8

	"三度重音" pattern=7

	"全音重音" pattern=6

	"半音重音" pattern=5

	"正弦波  " pattern=3

	"锯齿波  " pattern=1

	"方形波  " pattern=0

	"三角波  " pattern=2

	"        " pattern=4

	"        " pattern=10

	

	freq     频率

	*/



	HMMIO hmmio;

	MMCKINFO mmckinfoParent, mmckinfoSubchunk;

	HANDLE			hWaveHdr;

	LPWAVEINST		lpWaveInst;

	DWORD			dwFmtSize;

	char			szFileName[ MAX_FILENAME_SIZE ];

	UINT			wResult;

	HANDLE			hFormat;

	PCMWAVEFORMAT	*pFormat;

	DWORD			dwDataSize;

	HANDLE			hWaveInst;

	HANDLE			hData;

	unsigned char HUGE * lpData;

	int				wIndex;

	char			*p;



	dwFmtSize = sizeof(PCMWAVEFORMAT);

	hFormat = LocalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));

	if (!hFormat)

	{

		printf("内存不足\n");

		exit(-1);

	}

	pFormat = (PCMWAVEFORMAT *) LocalLock(hFormat);

	if (!pFormat)

	{

		printf("内存锁定失败\n");

		LocalFree( hFormat );

		exit(-1);

	}



	pFormat->wf.wFormatTag = WAVE_FORMAT_PCM;

	pFormat->wf.nChannels = 1;

	pFormat->wf.nSamplesPerSec = rec_freq;

	pFormat->wf.nBlockAlign = (WORD)(1 * (rec_bits / 8));

	pFormat->wBitsPerSample = rec_bits;

	pFormat->wf.nAvgBytesPerSec = rec_freq * pFormat->wf.nBlockAlign;



	if (waveOutOpen(&hWaveOut, (UINT)WAVE_MAPPER, (LPWAVEFORMATEX)pFormat,

					(DWORD)NULL, 0L, (DWORD)WAVE_FORMAT_QUERY)) 

	{

		LocalUnlock( hFormat );

		LocalFree( hFormat );

		exit(-1);

	}



	dwDataSize = sec * rec_freq * (rec_bits / 8);



	if (waveOutOpen((LPHWAVEOUT)&hWaveOut, (UINT)WAVE_MAPPER, (LPWAVEFORMATEX)pFormat,

			 (UINT)hwndApp, 0L, (DWORD)CALLBACK_WINDOW)) 

	{

		LocalUnlock( hFormat );

		LocalFree( hFormat );

		exit(-1);

	}



	LocalUnlock( hFormat );

	LocalFree( hFormat );



	hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, dwDataSize );

	if (!hData) 

	{

		exit(-1);

	}

	lpData = (unsigned char HUGE *)GlobalLock(hData);

	if (!lpData) 

	{

		GlobalFree( hData );

		exit(-1);

	}



	makedata(dwDataSize, pattern, freq, lpData);



	hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (DWORD) sizeof(WAVEHDR));

	if (!hWaveHdr) 

	{

		GlobalUnlock( hData );

		GlobalFree( hData );

		exit(-1);

	}

	lpWaveHdr = (LPWAVEHDR) GlobalLock(hWaveHdr);

	if (!lpWaveHdr) 

	{

		GlobalUnlock( hData );

		GlobalFree( hData );

		GlobalFree( hWaveHdr );

		exit(-1);

	}



	hWaveInst = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (DWORD) sizeof(WAVEHDR));

	if (!hWaveInst)

	{

		GlobalUnlock( hData );

		GlobalFree( hData );

		GlobalUnlock( hWaveHdr );

		GlobalFree( hWaveHdr );

		exit(-1);

	}

	lpWaveInst = (LPWAVEINST) GlobalLock(hWaveInst);

	if (!lpWaveInst)

	{

		GlobalUnlock( hData );

		GlobalFree( hData );

		GlobalUnlock( hWaveHdr );

		GlobalFree( hWaveHdr );

		GlobalFree( hWaveInst );

		exit(-1);

	}

	lpWaveInst->hWaveInst = hWaveInst;

	lpWaveInst->hWaveHdr = hWaveHdr;

	lpWaveInst->hWaveData = hData;



	lpWaveHdr->lpData = (LPSTR)lpData;

	lpWaveHdr->dwBufferLength = dwDataSize;

	lpWaveHdr->dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;

	lpWaveHdr->dwLoops = ULONG_MAX;

	lpWaveHdr->dwUser = (DWORD) lpWaveInst;

	if(waveOutPrepareHeader(hWaveOut, lpWaveHdr, sizeof(WAVEHDR)))

	{

		GlobalUnlock( hData );

		GlobalFree( hData );

		GlobalUnlock( hWaveHdr );

		GlobalFree( hWaveHdr );

		GlobalUnlock( hWaveInst );

		GlobalFree( hWaveInst );

		exit(-1);

	}



	wResult = waveOutWrite(hWaveOut, lpWaveHdr, sizeof(WAVEHDR));

	if (wResult != 0)

	{

		waveOutUnprepareHeader( hWaveOut, lpWaveHdr, sizeof(WAVEHDR));

		GlobalUnlock( hData );

		GlobalFree( hData );

		exit(-1);

	}

}





void oscillatStop(void)

{

	LPWAVEINST      lpWaveInst;



	waveOutReset(hWaveOut);

	waveOutUnprepareHeader(hWaveOut,lpWaveHdr,sizeof(WAVEHDR));

	waveOutClose(hWaveOut); hWaveOut=NULL;

	lpWaveInst = (LPWAVEINST) lpWaveHdr->dwUser;

	cleanup(lpWaveInst);

}





VOID cleanup(LPWAVEINST lpWaveInst)

{

	GlobalUnlock( lpWaveInst->hWaveData );

	GlobalFree( lpWaveInst->hWaveData );

	GlobalUnlock( lpWaveInst->hWaveHdr );

	GlobalFree( lpWaveInst->hWaveHdr );

	GlobalUnlock( lpWaveInst->hWaveInst );

	GlobalFree( lpWaveInst->hWaveInst );

}





/******************************************************************************

 * HSV二值化

******************************************************************************/

void masuku(BYTE *pRGB1) 

{

	double R, G, B, H, S, V, v, Vflag, vflag;

	int x, y;

	long x_count=0, y_count=0, count=0;

	

	for (y = 0; y < y_size; y++)

	{

		for (x = 0; x < x_size; x++) 

		{

			B = pRGB1[(x + y*x_size)*3];

			G = pRGB1[(x + y*x_size)*3+1];

			R = pRGB1[(x + y*x_size)*3+2];

			

			HSV(&H, &S, &V, B, G, R);

			

			if (V == 0) 

			{

				image1[y_count][x_count++] = 0;

				if (x_count == x_size) 

				{

					x_count = 0;

					y_count++;

				}

			}

			else 

			{

				if (((H >=0 ) && (H <= 30)) && ((S >= 30) && (S <= 255)) 

					&& ((V >= 20) && (V <= 255)))

				{

					image1[y_count][x_count++] = 255;

					if (x_count == x_size)

					{

						x_count = 0;

						y_count++;

					}

				}

				else

				{

					image1[y_count][x_count++] = 0;

					if (x_count == x_size) 

					{

						x_count =0;

						y_count++;

					}

				}

			}

		}

	}

}



/******************************************************************************

 * 边缘跟踪

******************************************************************************/

int obtain_contour(int x_start, int y_start, unsigned char image[y_size][x_size])

{

	int x, y;

	int xs, ys;

	int code, num;

	int i, counter, detect;

	

	counter = 0;

	for (i = 0; i < 8; i++) 

	{

		xs = x_start + Freeman[i][0];

		ys = y_start + Freeman[i][1];

		if ((xs >= 0) && (xs < x_size) && (ys >= 0) && (ys < y_size) 

			&& (image[ys][xs] == 255)) 

		{

			counter++;

		}

	}

	

	if (counter == 0) 

	{

		num = 1;

	}

	else 

	{

		num = -1;

		x = x_start;

		y = y_start;

		code = 0;

		

		ch_x[0] = x_size;

		ch_x[1] = 0;

		ch_y[0] = 0;

		ch_y[1] = y_size;

		

		do

		{

			detect = 0;

			code = code - 3;

			

			if (code < 0) 

			{

				code = code + 8;

			}

			

			do 

			{

				xs = x + Freeman[code][0];

				ys = y + Freeman[code][1];

				

				if ((xs >= 0) && (xs < x_size) && (ys >= 0) 

					&& (ys < y_size) && (image[ys][xs] == 255)) 

				{

					detect = 1;

					num++;

					if (num > MAX_CNTR) 

					{

						return(-1);

					}

					

					chain_code[num] = code;

					x = xs;

					y = ys;

					

					if (ch_x[0] > x) 

					{

						ch_x[0] = x;

					}

					else if (ch_x[1] < x) 

					{

						ch_x[1] = x;

					}

					

					if (ch_y[0] < y) 

					{

						ch_y[0] = y;

					}

					else if (ch_y[1] > y) 

					{

						ch_y[1] = y;

					}

				}

				

				code++;

				

				if (code > 7) 

				{

					code = 0;

				}

			}while (detect == 0);

		}while ((x != x_start) || (y != y_start));



		num = num + 2;

	}



	return (num);

}





/******************************************************************************

 * 去除边缘跟踪后周长小于一定阈值的部分

******************************************************************************/

int remove_areas(BYTE *pRGB1)

{

	int threshold=50;

	int num, x, y, xs, ys, i, mid, hani_x, hani_y;

	int fill_value;

	int N[3], check_x[3][2], check_y[3][2];

	int kao_x[2], kao_y[2], right_x[2], right_y[2];

	int left_x[2], left_y[2], flag1, flag2, s;

	unsigned char image2[y_size][x_size];

	long count=0;

	double wid_x, wid_y, dot_x, dot_y, line;

	int DO, LE, MI, FA, SO, RA, SI, DO1[2], left[6];

	WORD leftVol = 0xffff;

	WORD rightVol = 0xffff;

	long volume;

	MMRESULT rc;

	

	for (y = 0; y < y_size; y++) 

	{

		for (x = 0; x < x_size; x++) 

		{

			image2[y][x] = 0;

		}

	}

	

	for (i = 0; i < 3; i++)

	{

		N[i] = 0;

		check_x[i][0] = x_size;

		check_x[i][1] = 0;

		check_y[i][0] = 0;

		check_y[i][1] = y_size;

	}



	for (y = 0; y < y_size; y++)

	{

		for (x = 0; x < x_size; x++)

		{

			if (image1[y][x] == 255) 

			{

				num = obtain_contour(x, y, image1);

				if (num != -1) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -