開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 wave2
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト

wave2.c
#pragma comment(lib, "winmm.lib")
 
#define _USE_MATH_DEFINES
 
#include <math.h>
#include <stdio.h>
#include <Windows.h>
 
// 定義
#define VOLUME		32
#define SAMPLE_RATE	11025
#define TONE_MSEC	1000
#define DATA_LEN	(SAMPLE_RATE * TONE_MSEC / 1000)
 
// 関数プロトタイプ宣言
int WaveOut(LPWAVEFORMATEX pwfx, LPWAVEHDR pwh, DWORD dwMSec);
 
//==============================================================================
int main()
{
	WAVEFORMATEX	wfx;
	WAVEHDR		wh;
	unsigned char	aucData[DATA_LEN];
	unsigned char	uc;
	double		adFreq[3];
	double		dWave;
	int		i, j;
 
	// 波形データの作成
	adFreq[0] = 440 * pow(2.0, 3 / 12.0);	// c
	adFreq[1] = 440 * pow(2.0, 7 / 12.0);	// e
	adFreq[2] = 440 * pow(2.0, 10 / 12.0);	// g
	for (i = 0; i < DATA_LEN; i++) {
		dWave = 0;
		for (j = 0; j < 3; j++) {
			dWave += sin(2 * M_PI * adFreq[j] * i / SAMPLE_RATE) / 3;
		}
		uc = (char)(dWave * VOLUME) + 128;
		aucData[i] = uc;
//		printf("%d %u\n", i, uc);
	}
 
	wfx.wFormatTag		= WAVE_FORMAT_PCM;
	wfx.nChannels		= 1;
	wfx.nSamplesPerSec	= SAMPLE_RATE;
	wfx.nAvgBytesPerSec	= SAMPLE_RATE;
	wfx.nBlockAlign		= 1;
	wfx.wBitsPerSample	= 8;
	wfx.cbSize		= 0;
 
	ZeroMemory(&wh, sizeof wh);
	wh.lpData		= (LPSTR)aucData;
	wh.dwBufferLength	= DATA_LEN;
 
	WaveOut(&wfx, &wh, TONE_MSEC);
 
	return 0;
}
 
//------------------------------------------------------------------------------
int WaveOut(LPWAVEFORMATEX pwfx, LPWAVEHDR pwh, DWORD dwMSec)
{
	HWAVEOUT	hwo;
	MMRESULT	mmr;
 
	// Play
	mmr = waveOutOpen(&hwo, WAVE_MAPPER, pwfx, 0, 0, CALLBACK_NULL);
	if (mmr != MMSYSERR_NOERROR) {
		fprintf(stderr, "error: waveOutOpen\n");
		return -1;
	}
	mmr = waveOutPrepareHeader(hwo, pwh, sizeof (WAVEHDR));
	if (mmr != MMSYSERR_NOERROR) {
		fprintf(stderr, "error: waveOutPrepareHeader\n");
		return -1;
	}
	mmr = waveOutWrite(hwo, pwh, sizeof (WAVEHDR));
	if (mmr != MMSYSERR_NOERROR) {
		fprintf(stderr, "error: waveOutWrite\n");
		return -1;
	}
 
	// Wait
	Sleep(dwMSec);
 
	// Stop
	mmr = waveOutReset(hwo);
	if (mmr != MMSYSERR_NOERROR) {
		fprintf(stderr, "error: waveOutReset\n");
		return -1;
	}
	mmr = waveOutUnprepareHeader(hwo, pwh, sizeof (WAVEHDR));
	if (mmr != MMSYSERR_NOERROR) {
		fprintf(stderr, "error: waveOutUnprepareHeader\n");
		return -1;
	}
	mmr = waveOutClose(hwo);
	if (mmr != MMSYSERR_NOERROR) {
		fprintf(stderr, "error: waveOutClose\n");
		return -1;
	}
 
	return 0;
}
 
最終更新:2012年09月01日 16:42