【win32 】 波形声音

20Hz  振幅127    波形如下图


80Hz  振幅127    波形如下图


440Hz  振幅127    波形如下图


5000Hz  振幅127    波形如下图


程序代码如下

#include <windows.h>
#include <math.h>
#include "resource.h"
#pragma comment(lib,"winmm.lib")

#define SAMPLE_RATE     11025
#define FREQ_MIN           20
#define FREQ_MAX         5000
#define FREQ_INIT         440
#define OUT_BUFFER_SIZE  4096
#define PI                  3.14159

TCHAR szAppName[] = TEXT("SineWave");
VOID FillBuffer(PBYTE pBuffer, int iFreq)
{
	static double fAngle;
	int           i;
	for (i = 0; i < OUT_BUFFER_SIZE; i++)
	{
		pBuffer[i] = (BYTE)(127 + 127 * sin(fAngle));
		fAngle += 2 * PI * iFreq / SAMPLE_RATE;
		if (fAngle > 2 * PI)
			fAngle -= 2 * PI;
	}
}
BOOL CALLBACK DlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static BOOL         bShutOff, bClosing;
	static HWAVEOUT     hWaveOut;
	static HWND         hwndScroll;
	static int          iFreq = FREQ_INIT;
	static PBYTE        pBuffer1, pBuffer2;
	static PWAVEHDR     pWaveHdr1, pWaveHdr2;
	static WAVEFORMATEX waveformat;
	int                 iDummy;

	switch (message)
	{
	case WM_INITDIALOG:
		hwndScroll = GetDlgItem(hwnd, IDC_SCROLL);
		SetScrollRange(hwndScroll, SB_CTL, FREQ_MIN, FREQ_MAX, FALSE);
		SetScrollPos(hwndScroll, SB_CTL, FREQ_INIT, TRUE);
		SetDlgItemInt(hwnd, IDC_TEXT, FREQ_INIT, FALSE);
		return TRUE;
	case WM_HSCROLL:
		switch (LOWORD(wParam))
		{
		case SB_LINELEFT:   iFreq -= 1;  break;
		case SB_LINERIGHT:  iFreq += 1;  break;
		case SB_PAGELEFT:   iFreq /= 2;  break;
		case SB_PAGERIGHT:  iFreq *= 2;  break;

		case SB_THUMBTRACK:
			iFreq = HIWORD(wParam);
			break;
		case SB_TOP:
			GetScrollRange(hwndScroll, SB_CTL, &iFreq, &iDummy);
			break;
		case SB_BOTTOM:
			GetScrollRange(hwndScroll, SB_CTL, &iDummy, &iFreq);
			break;
		}
		iFreq = max(FREQ_MIN, min(FREQ_MAX, iFreq));
		SetScrollPos(hwndScroll, SB_CTL, iFreq, TRUE);
		SetDlgItemInt(hwnd, IDC_TEXT, iFreq, FALSE);
		return TRUE;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDC_ONOFF:
			if (hWaveOut == NULL)
			{
				// Allocate memory for 2 headers and 2 buffers
				pWaveHdr1 = malloc(sizeof(WAVEHDR));
				pWaveHdr2 = malloc(sizeof(WAVEHDR));
				pBuffer1 = malloc(OUT_BUFFER_SIZE);
				pBuffer2 = malloc(OUT_BUFFER_SIZE);
				// Variable to indicate Off button pressed
				bShutOff = FALSE;
				// Open waveform audio for output
				waveformat.wFormatTag = WAVE_FORMAT_PCM;
				waveformat.nChannels = 1;
				waveformat.nSamplesPerSec = SAMPLE_RATE;
				waveformat.nAvgBytesPerSec = SAMPLE_RATE;
				waveformat.nBlockAlign = 1;
				waveformat.wBitsPerSample = 8;
				waveformat.cbSize = 0;
				if (waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveformat,(DWORD)hwnd, 0, CALLBACK_WINDOW)!= MMSYSERR_NOERROR)
				{
					free(pWaveHdr1);
					free(pWaveHdr2);
					free(pBuffer1);
					free(pBuffer2);

					hWaveOut = NULL;
					MessageBeep(MB_ICONEXCLAMATION);
					MessageBox(hwnd,TEXT("Error opening waveform audio device!"),szAppName, MB_ICONEXCLAMATION | MB_OK);
					return TRUE;
				}
				// Set up headers and prepare them
				pWaveHdr1->lpData = pBuffer1;
				pWaveHdr1->dwBufferLength = OUT_BUFFER_SIZE;
				pWaveHdr1->dwBytesRecorded = 0;
				pWaveHdr1->dwUser = 0;
				pWaveHdr1->dwFlags = 0;
				pWaveHdr1->dwLoops = 0;
				pWaveHdr1->lpNext = NULL;
				pWaveHdr1->reserved = 0;
				waveOutPrepareHeader(hWaveOut, pWaveHdr1,sizeof(WAVEHDR));

				pWaveHdr2->lpData = pBuffer2;
				pWaveHdr2->dwBufferLength = OUT_BUFFER_SIZE;
				pWaveHdr2->dwBytesRecorded = 0;
				pWaveHdr2->dwUser = 0;
				pWaveHdr2->dwFlags = 0;
				pWaveHdr2->dwLoops = 0;
				pWaveHdr2->lpNext = NULL;
				pWaveHdr2->reserved = 0;
				waveOutPrepareHeader(hWaveOut, pWaveHdr2,sizeof(WAVEHDR));
			}
			else
			{
				bShutOff = TRUE;
				waveOutReset(hWaveOut);
			}
			return TRUE;
		}
		break;
		// Message generated from waveOutOpen call
	case MM_WOM_OPEN:
		SetDlgItemText(hwnd, IDC_ONOFF, TEXT("Turn Off"));
		// Send two buffers to waveform output device
		FillBuffer(pBuffer1, iFreq);
		waveOutWrite(hWaveOut, pWaveHdr1, sizeof(WAVEHDR));
		FillBuffer(pBuffer2, iFreq);
		waveOutWrite(hWaveOut, pWaveHdr2, sizeof(WAVEHDR));
		return TRUE;
		// Message generated when a buffer is finished
	case MM_WOM_DONE:
		if (bShutOff)
		{
			waveOutClose(hWaveOut);
			return TRUE;
		}
		// Fill and send out a new buffer
		FillBuffer(((PWAVEHDR)lParam)->lpData, iFreq);
		waveOutWrite(hWaveOut, (PWAVEHDR)lParam, sizeof(WAVEHDR));
		return TRUE;
	case MM_WOM_CLOSE:
		waveOutUnprepareHeader(hWaveOut, pWaveHdr1, sizeof(WAVEHDR));
		waveOutUnprepareHeader(hWaveOut, pWaveHdr2, sizeof(WAVEHDR));
		free(pWaveHdr1);
		free(pWaveHdr2);
		free(pBuffer1);
		free(pBuffer2);
		hWaveOut = NULL;
		SetDlgItemText(hwnd, IDC_ONOFF, TEXT("Turn On"));
		if (bClosing)
			EndDialog(hwnd, 0);
		return TRUE;
	case WM_SYSCOMMAND:
		switch (wParam)
		{
		case SC_CLOSE:
			if (hWaveOut != NULL)
			{
				bShutOff = TRUE;
				bClosing = TRUE;
				waveOutReset(hWaveOut);
			}
			else
				EndDialog(hwnd, 0);
			return TRUE;
		}
		break;
	}
	return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
	DialogBox(hInstance, szAppName, NULL, DlgProc);
	return 0;
}


sing2img是一款创新的应用程序,它允许用户通过歌唱来创建图像。这个应用的原理是使用人工智能技术来将用户的歌声转化为图像。当用户唱歌时,sing2img可以分析歌声的频率、波形和情感,然后将这些数据转化为图像。这个图像可以是一个抽象的艺术品,也可以是一个代表歌曲内容的具体形象。 使用sing2img有许多有趣的应用场景。首先,它可以为歌手和音乐制作人提供创作灵感。唱歌创作是很多音乐家的常用方法,而现在有了sing2img,他们可以通过歌声创作出独特的视觉图像,这可以激发他们的创造力。 此外,sing2img还可以用于艺术表演和展览。一位歌手可以在舞台上唱歌,而观众可以通过屏幕看到他们的声音被转化为图像。这不仅可以增强观众的视听体验,还可以给他们带来更多沉浸感。 sing2img还可以用于音乐教育。对于想要学习唱歌的人来说,这个应用可以帮助他们更好地理解和掌握音乐。通过将歌声转化为图像,学生们可以更直观地感受到音乐的要素,如音调、节奏和情感。 总的来说,sing2img是一个具有创新和实用价值的应用程序。它不仅可以为音乐创作带来新的灵感,还可以为艺术表演提供更多元化的内容,同时也可以用于音乐教育。相信随着人工智能技术的进一步发展,sing2img将会在音乐界和艺术界发挥更大的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值