を参考に、指定した時間(秒)の内に指定した開始時の周波数から終了時の周波数まで音の高さが変わるコードを書こうとしています。
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <math.h> 5 6// 44100Hz, 8bit, 1ch のWAVデータ 7#define SMPL 44100 8#define BIT 8 9 10void wav_write(const char *filename, char *buf, int size) 11{ 12 int filesize = 44 + size; 13 char *work = (char *) malloc(filesize); 14 FILE *fp = fopen(filename, "wb"); 15 16 if (fp == NULL) return; 17 18 /* RIFFヘッダ */ 19 memcpy(work, "RIFF", 4); 20 work[4] = (filesize - 8) >> 0 & 0xff; 21 work[5] = (filesize - 8) >> 8 & 0xff; 22 work[6] = (filesize - 8) >> 16 & 0xff; 23 work[7] = (filesize - 8) >> 24 & 0xff; 24 /* WAVEヘッダ */ 25 memcpy(work+8, "WAVE", 4); 26 /* fmtチャンク */ 27 memcpy(work+12, "fmt ", 4); 28 work[16] = 16; 29 work[17] = work[18] = work[19] = 0; 30 work[20] = 1; 31 work[21] = 0; 32 work[22] = 1; 33 work[23] = 0; 34 work[24] = SMPL >> 0 & 0xff; 35 work[25] = SMPL >> 8 & 0xff; 36 work[26] = SMPL >> 16 & 0xff; 37 work[27] = SMPL >> 24 & 0xff; 38 work[28] = (SMPL * (BIT / 8)) >> 0 & 0xff; 39 work[29] = (SMPL * (BIT / 8)) >> 8 & 0xff; 40 work[30] = (SMPL * (BIT / 8)) >> 16 & 0xff; 41 work[31] = (SMPL * (BIT / 8)) >> 24 & 0xff; 42 work[32] = ((BIT / 8)) >> 0 & 0xff; 43 work[33] = ((BIT / 8)) >> 8 & 0xff; 44 work[34] = BIT >> 0 & 0xff; 45 work[35] = BIT >> 8 & 0xff; 46 /* dataチャンク */ 47 memcpy(work+36, "data", 4); 48 work[40] = size >> 0 & 0xff; 49 work[41] = size >> 8 & 0xff; 50 work[42] = size >> 16 & 0xff; 51 work[43] = size >> 24 & 0xff; 52 memcpy(work + 44, buf, size); 53 54 /* 書き出し */ 55 fwrite(work, filesize, 1, fp); 56 fclose(fp); 57 free(work); 58} 59 60int main(void) 61{ 62 int size; 63 char *buf; 64 int sec; 65 66 sec = 3; 67 size = (SMPL*(BIT/8)) * sec; 68 buf = (char *) malloc(size); 69 70 double freq_start = 886; // 開始時の周波数 71 double freq_end = 443; // 終了時の周波数 72 73 double t; // 時間(秒) 74 double freq; // 周波数 75 double y; // 出力 76 77 for (int i = 0; i < size; i++) { 78 // 時間(秒) 79 t = i / (double)size * sec; 80 81 // 周波数 82 freq = freq_start + (t / sec) * (freq_end - freq_start); 83 84 // 出力 85 y = sin(2.0 * M_PI * freq * t); 86 87 buf[i] = floor(y * 63) + 128; 88 89#ifdef EBUG 90 printf("%f\n", freq); 91#endif 92 } 93 94 wav_write("test.wav", buf, size); 95 96 free(buf); 97 return 0; 98}
この例では周波数を886Hzから443Hzまで変化させようとしていますが、
実際に出力されたtest.wav
は886Hzから0Hzまで落ちてしまいます。
ちなみに
c
1 double freq_start = 886; // 開始時の周波数 2 double freq_end = 443; // 終了時の周波数 3
を
c
1 double freq_start = 443; // 開始時の周波数 2 double freq_end = 886; // 終了時の周波数
とすると意図した通り周波数は443Hzから886Hzに変化します。
何がいけないのでしょうか?
(補足)
printfで出力すると周波数(freq)は思い通りに変化しています。
(自分だけじゃなく、Zuishinさんがダブルチェックをしていただけたのでこれは大丈夫)
所が音源ファイル(test.wav)を実際に聴いてみると、
周波数は0まで落ちているのです。
その確認は「audacity」という、波形を見ながら音を再生できるソフトで出来ますし、
耳で聞いてもおかしいのは分かります。
周波数は正しく変化していて、
その上でwavファイルがその通りに書き出されてない。
freqとtest.wavが一致しないのは何故なのでしょう?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/23 01:13
2017/05/23 02:00 編集
2017/05/23 02:01
2017/05/23 02:08 編集
2017/05/23 02:13 編集
2017/05/23 11:44