win api + 基础乐理产生正弦波声音

  暂时记录。

  感觉想写个电子钢琴乐程序了,不过感觉音有点怪怪的。

#include <iostream>
#include <windows.h>
#include <Mmreg.h>
#include <mmeapi.h>
#include <Windows.h>
#include <math.h>

#pragma comment(lib, "Winmm.lib")

#define RATE 44100
#define PIPE 2
#define BUFF (RATE * 500)
#define PI 3.14159

void GenAudio(PBYTE pB, int freq)
{
	double w = (2 * PI) / freq;
	for (int i = 0; i < BUFF; i++)
	{
		pB[i] = 127 + 127 * std::sin(w * i);
	}
}

int main()
{
	WAVEHDR wavehdr;
	WAVEFORMATEX waveformat;
	HWAVEOUT hWavO;
	PBYTE aData = new BYTE[BUFF];
	ZeroMemory(aData, BUFF);

	waveformat.wFormatTag = WAVE_FORMAT_PCM;
	waveformat.nSamplesPerSec = RATE;
	waveformat.nChannels = PIPE;
	waveformat.wBitsPerSample = 16;
	waveformat.nBlockAlign = PIPE * waveformat.wBitsPerSample / 8;
	waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
	waveformat.cbSize = 0;

	wavehdr.lpData = (LPSTR)aData;
	wavehdr.dwBufferLength = BUFF;
	wavehdr.dwLoops = 1;
	wavehdr.dwFlags = 0;

	if (waveOutOpen(&hWavO, WAVE_MAPPER, &waveformat, NULL, 0, CALLBACK_NULL) != MMSYSERR_NOERROR)
		std::cout << "出错";

	waveOutPrepareHeader(hWavO, &wavehdr, sizeof(wavehdr));

	int scale[] = { 261, 293, 329, 349, 391, 440, 493, 523 };
	

	for (;;)
	{
		for (int i = 0; i < 8; i++)
		{
			GenAudio(aData, scale[i]);
			for (int j = 0; j < RATE; j++)
				waveOutWrite(hWavO, &wavehdr, sizeof(wavehdr));
		}
	}

	waveOutUnprepareHeader(hWavO, &wavehdr, sizeof(wavehdr));
	waveOutClose(hWavO);
	delete[] aData;

	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/darkchii/p/11883233.html