開発環境 |
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