アプリ版:「スタンプのみでお礼する」機能のリリースについて

サンプリングレート8000[Hz],モノラル,16bit符号付きデータとして, ピッチ1[kHz]一定,音量最大一定で2秒間の音声データファイルwave.rawを出力するようなプログラムを作成したく、以下のようなプログラムを作成しました。しかし、出力されたwave.rawファイルの音が、作りたいものと異なっていました。冒頭の数値設定が誤っているのでしょうが、どのように誤っているのかわかりません。わかります方いたら教えていただけますでしょうか。


#include<stdio.h>
#include<limits.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

#define BYTE 8

int main(void){
FILE *fp;
const char *s_riff="RIFF";
const char *s_wave="WAVE";
const char *s_fmt="fmt ";
int WholeSize;
int DataSize=200000;
short FmtId=1;
short Channel=1;
int SamplingRate=8000;
short Bps=16;
int DataVelocity=SamplingRate*Bps/8*Channel;
short BlockSize=Bps/8*Channel;
const char *s_data="data";
short Data;
int i, chk;

int FmtSize=
sizeof(FmtId)
+sizeof(Channel)
+sizeof(SamplingRate)
+sizeof(DataVelocity)
+sizeof(BlockSize)
+sizeof(Bps);

WholeSize=strlen(s_wave)
+strlen(s_fmt)
+sizeof(FmtSize)
+FmtSize;

WholeSize+=
+strlen(s_data)
+sizeof(DataSize)
+DataSize//;

fp=fopen("wa.wav", "wb");
if(fp==NULL){
printf("Cannot open File\n");
exit(1);
}

chk=fwrite(s_riff, sizeof(s_riff[0]), strlen(s_riff), fp);
if(chk<strlen(s_riff)){
printf("Write Error for s_riff\n");
exit(1);
}


chk=fwrite(&WholeSize, sizeof(WholeSize), 1, fp);
if(chk<1){
printf("Write Error for WholeSize\n");
exit(1);
}


chk=fwrite(s_wave, sizeof(s_wave[0]), strlen(s_wave), fp);
if(chk<strlen(s_wave)){
printf("Write Error for s_wave\n");
exit(1);
}


chk=fwrite(s_fmt, sizeof(s_fmt[0]), strlen(s_fmt), fp);
if(chk<strlen(s_fmt)){
printf("Write Error for s_fmt\n");
exit(1);
}


chk=fwrite(&FmtSize, sizeof(FmtSize), 1, fp);
if(chk<1){
printf("Write Error for FmtSize\n");
exit(1);
}


chk=fwrite(&FmtId, sizeof(FmtId), 1, fp);
if(chk<1){
printf("Write Error for FmtId\n");
exit(1);
}


chk=fwrite(&Channel, sizeof(Channel), 1, fp);
if(chk<1){
printf("Write Error for Channel\n");
exit(1);
}


chk=fwrite(&SamplingRate, sizeof(SamplingRate), 1, fp);
if(chk<1){
printf("Write Error for SamplingRate\n");
exit(1);
}


chk=fwrite(&DataVelocity, sizeof(DataVelocity), 1, fp);
if(chk<1){
printf("Write Error for DataVelocity\n");
exit(1);
}


chk=fwrite(&BlockSize, sizeof(BlockSize), 1, fp);
if(chk<1){
printf("Write Error for BlockSize\n");
exit(1);
}


chk=fwrite(&Bps, sizeof(Bps), 1, fp);
if(chk<1){
printf("Write Error for Bps\n");
exit(1);
}




chk=fwrite(s_data, sizeof(s_data[0]), strlen(s_data), fp);
if(chk<strlen(s_data)){
printf("Write Error for s_data\n");
exit(1);
}


chk=fwrite(&DataSize, sizeof(DataSize), 1, fp);
if(chk<1){
printf("Write Error for DataSize\n");
exit(1);
}


for(i=0;i<100000;i++){
Data=(short)(SHRT_MAX*sin(i*100));
chk=fwrite(&Data, sizeof(Data), 1, fp);
if(chk<1){
printf("Write Error for Data[%d]\n", i);
exit(1);
}
}



fclose(fp);
return 0;
}

A 回答 (1件)

うん, 確かに「冒頭の数値設定」がなんか変な気はするね. それぞれの値の根拠は?



と書いておくけど, 本質はそこじゃなくって「データをまともに作れていない」ところにある.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A