CreateWave
Borland C++ Compiler 5.5
CreateWave
#include
#include
#include
#include
// プロトタイプ宣言 int WriteWaveFile(const char *pcFile); int CreateWave(void); // グローバル変数 static WAVEFORMATEX g_wf; static DWORD g_dwSampleLength; static u_char *g_pucWaveformData = NULL; int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "Usage: CreateWave.c file-out\n"); return 1; } if (CreateWave() != 0) { return 1; } WriteWaveFile(argv[1]); if (g_pucWaveformData != NULL) { free(g_pucWaveformData); } return 0; } int WriteWaveFile(const char *pcFile) { HMMIO hmmio; MMCKINFO ckParent; MMCKINFO ckSub; // Open hmmio = mmioOpen((LPSTR)pcFile, NULL, MMIO_WRITE | MMIO_CREATE); if (hmmio == NULL) { fprintf(stderr, "mmioOpen\n"); return -1; } // RIFFチャンク ckParent.cksize = 0; // ダミー ckParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); mmioCreateChunk(hmmio, &ckParent, MMIO_CREATERIFF); // fmtチャンク ckSub.ckid = mmioFOURCC('f', 'm', 't', ' '); ckSub.cksize = sizeof(WAVEFORMATEX); mmioCreateChunk(hmmio, &ckSub, 0); mmioWrite(hmmio, (char *)&g_wf, sizeof(WAVEFORMATEX)); mmioAscend(hmmio, &ckSub, 0); // factチャンク ckSub.ckid = mmioFOURCC('f', 'a', 'c', 't'); ckSub.cksize = sizeof(DWORD); mmioCreateChunk(hmmio, &ckSub, 0); mmioWrite(hmmio, (char *)&g_dwSampleLength, sizeof(DWORD)); mmioAscend(hmmio, &ckSub, 0); // dataチャンク ckSub.ckid = mmioFOURCC('d', 'a', 't', 'a'); ckSub.cksize = 0; // ダミー mmioCreateChunk(hmmio, &ckSub, 0); mmioWrite(hmmio, g_pucWaveformData, g_dwSampleLength); mmioAscend(hmmio, &ckSub, 0); // RIFFチャンク mmioAscend(hmmio, &ckParent, 0); // Close mmioFlush(hmmio, 0); mmioClose(hmmio, 0); return 0; } int CreateWave(void) { DWORD dwSamplesPerSec = 8000; // サンプリングレート int aiScale[] = {0, 2, 3, 5, 7, 8, 10, 12, 14, 15}; // 音階 int iScale; int i; double dVol = 64.0; // ボリューム double dFreq; // 周波数(Hz) g_wf.wFormatTag = WAVE_FORMAT_PCM; g_wf.nChannels = 1; g_wf.nSamplesPerSec = dwSamplesPerSec; g_wf.nAvgBytesPerSec = dwSamplesPerSec * 1 * 1; g_wf.nBlockAlign = 1 * 1; g_wf.wBitsPerSample = 8; g_wf.cbSize = 0; g_dwSampleLength = 8 * 4000; g_pucWaveformData = malloc(g_dwSampleLength); if (g_pucWaveformData == NULL) { fprintf(stderr, "Error: malloc\n"); return -1; } for (iScale = 0; iScale < 8; iScale++) { dFreq = 440.0 * pow(2.0, aiScale[2 + iScale] / 12.0); printf("%f\n", dFreq); for (i = 0; i < 4000; i++) { g_pucWaveformData[iScale * 4000 + i] = 128 + dVol * sin(i * 2.0 * M_PI * dFreq / dwSamplesPerSec); } } return 0; }