起こっている問題
やさしい音と音楽のプログラミング
こちらの書籍を参考にしているのですが、waveOutWrite関数に入力する波形をサンプルのソースコードで作成しています。
試しに実行するととんでもない音量で再生されました。
調べてみると、だいぶ古い記事ですが、これによると、
WAVEFORMATEX は再生したい Hz、ビットレート、チャンネル数を設定するものです。音量というデータは .wav ファイルには存在しません。
というように、音量を調整する時は通常、入力する波形の振幅で調整するようです。
ですが、ソースコードの振幅を変更しても、音量が変わっているように感じません。
あるいは、振幅を小さくしても、私の設定が悪いのか音量が大きすぎてその差を感じられないのか、わかりません。
書籍は、VisualStudioを使うことを推奨していますが、その設定等に関する記述がなく、どこを変えると最終的な音量が変わるのかわかりません。
今は、Windowsの音量ミキサーの場所から音量を下げていますが、1/100にしても音量は大きいし、プロジェクトを変えるたびにこの操作をするのが億劫であるため、コードかVisualStudioの設定、あるいはWindowsの設定を変更して、適切な音量に設定したいです。
ソースコードだけの問題ではないかもしれないのですが、知見のある方がいらっしゃいましたら、どうぞご教授お願い致します。
必要そうな情報はできるだけ詳細に記載するようにしていますが、不明なことがあれば、おっしゃっていただければ追記します。
該当のソースコード
書籍に記載されている内容ですが、WebページからDL出来るため、引用という形で記載します。
c
1#include "stdafx.h" 2#include <stdio.h> 3#include <windows.h> 4#include <mmsystem.h> 5#include <math.h> 6#pragma comment( lib, "winmm.lib" ) 7#define SRATE 44100 // サンプリングレート 44.1kHz 8#define PI 3.14159286 // π 9 10int main() 11{ 12 // wave関係変数 13 static HWAVEOUT hWave; 14 static WAVEHDR whdr; 15 WAVEFORMATEX wfe; 16 static char *bWave; 17 unsigned int count = 0; 18 float b_time = 1.0; // 鳴らす時間(秒)の設定 19 float f0 = 440.0; // ラ(A4)440Hz 20 int amplitude = 2; // 振幅 21 int data_len = (int)SRATE * b_time; // データの長さ 22 bWave = (char *)malloc(data_len); // 波形データのメモリ確保 23 char tmp; 24 // 1秒分のデータを配列に設定する 25 for (count = 0; count < data_len; count++ ) { 26 tmp = (char)(amplitude * sin(2 * PI * f0 * count / SRATE)); 27 printf("%d", tmp); 28 if (bWave != NULL) { 29 bWave[count] = tmp; 30 } 31 } 32 33 wfe.wFormatTag = WAVE_FORMAT_PCM; 34 wfe.nChannels = 1; 35 wfe.nSamplesPerSec = SRATE; 36 wfe.nAvgBytesPerSec = SRATE; 37 wfe.wBitsPerSample = 8; 38 wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample / 8; 39 40 // デバイスのオープン 41 waveOutOpen(&hWave, WAVE_MAPPER, &wfe, 0, 0, CALLBACK_NULL); 42 43 whdr.lpData = bWave; 44 whdr.dwBufferLength = data_len; 45 whdr.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; 46 whdr.dwLoops = 1; 47 48 // ヘッダーの準備 49 waveOutPrepareHeader(hWave, &whdr, sizeof(WAVEHDR)); 50 // 波形データの書き出し(再生) 51 waveOutWrite(hWave, &whdr, sizeof(WAVEHDR)); 52 53 printf("press any key !"); 54 getchar(); // キー入力待ち 55 return 0; 56} 57 58
試したこと
4行目にある通り、波形を数値で出力したところ、振幅の値に応じて変化していることが確認できています。
補足情報(FW/ツールのバージョンなど)
Windows 10 バージョン 2004
Microsoft Visual Studio Community 2019 Version 16.10.4
Visual C++ 2019
###解決後のソースコード
原因は、回答していただいたお二方の回答を見ていただくとして、簡素ですが修正したコードを記載しておきます。
同じように困っている方に助けになれば幸いです。
c
1 for (count = 0; count < data_len; count++ ) { 2 tmp = (unsigned char)(amplitude * sin(2 * PI * f0 * count / SRATE)); 3 tmp = tmp + 128; //追加した1行 4 printf(" %x", tmp); 5 if (bWave != NULL) { 6 bWave[count] = tmp; 7 } 8 } 9
回答2件
あなたの回答
tips
プレビュー