情報処理4レポート課題(11)のレポート課題の解答例

更新:2008年12月9日


  1. bfile1_7.cを書き換えて、
    1. 文字列"RIFF"
    2. 適当な4バイト数値データ
    3. 文字列"WAVE"
    の順にファイルreport11-1.datに出力するプログラムを作成してください。 作成した後、試しにスクリーン左上にあるホームフォルダアイコンから辿って、 report11-1.datを確認するとどうでしょうか。
    report11-1.c
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void){
    	FILE *fp;
    	int chk;
    	const char *s1="RIFF";
    	int data_i=1;
    	const char *s2="WAVE";
    
    	fp=fopen("report11-1.dat", "wb");
    	if(fp==NULL){
    		printf("File Can't Open\n");
    		exit(1);
    	}
    	chk=fwrite(s1, sizeof(s1[0]), strlen(s1), fp);
    	if(chk<strlen(s1)){
    		printf("Write Error\n");
    	}
    
    	chk=fwrite(&data_i, sizeof(data_i), 1, fp);
    	if(chk<1){
    		printf("Write Error\n");
    	}
    
    	chk=fwrite(s2, sizeof(s2[0]), strlen(s2), fp);
    	if(chk<strlen(s2)){
    		printf("Write Error\n");
    	}
    	fclose(fp);
    	return 0;
    }
    
    ファイルマネージャ(Nautilus)からreport11-1.datのアイコンを見ると WAVファイルであるかのように見えます。
  2. 次の作業を行って下さい.
    1. このファイルをダウンロードする.
    2. スクリーン右上のスピーカアイコンをクリックしてボリュームを最大値に設定する.
    3. モニタスクリーン下部にあるVolumelボタンを押して,ボリュームを適度に(3くらい?)に設定する.
    4. ファイルsample.wavが保存されているディレクトリで,次を実行する:
      xmms sample.wav &
      音が鳴ったことを確認して下さい. 音が鳴らない場合には,上の作業を確認して下さい. もしくは、次のコマンドを試してみて下さい。
      sox -V sample.wav -t ossdsp /dev/dsp0
    5. ファイルsample.wavをemacsでバイナリーモードで閲覧してみて下さい。

    解答例は省略されています。
  3. WAVファイルフォーマットは次の通りです:

    1. 文字列"RIFF"
    2. この項目以降のサイズ(Byte)を4[Byte]で表す(全体のサイズ-8[Byte])
    3. 「WAVEチャンク」
      1. 文字列"WAVE"
      2. 「fmtチャンク」
        1. 文字列"fmt "(最後に空白がある)
        2. この項目以降のこのチャンクデータのサイズを4[Byte]で表す
        3. フォーマットID(2[Byte]):リニアPCMの場合は1
        4. チャネル数(2[byte]):モノラルならば1,ステレオならば2
        5. サンプリングレート(4[Byte])
        6. データ速度(4[Byte]):サンプリングレート×単位ビット数÷8×チャネル数
        7. ブロックサイズ(2[Byte]):単位ビット数÷8×チャネル数
        8. 単位ビット数(2[Byte]):8もしくは16
        9. 場合によって拡張部分の記述を要するがリニアPCMの場合には不要
      3. 「factチャンク」:無くても良い
      4. 「dataチャンク」
        1. 文字列"data"
        2. この項目以降のこのチャンクデータのサイズを4[Byte]で表す
        3. 波形データ:単位ビット数が8[Bit]の場合には0から255までの整数(1[Byte])で,16[Bit]の場合には-32768から32767までの整数(2[Byte])で時系列で表す.ただしチャネル数が2(ステレオ)の場合には同時刻でのデータを左右の順に並べていく.
      5. 「LISTチャンク」:無くても良い
    ただし,各データはリトルエンディアン(バイト毎逆順)である.

    サンプリングレート8000[Hz],16[Bit]符号付きデータ、モノラルで、 ピッチ1[kHz]、音量最大、2秒のWAVファイルを作成して下さい. 次の問題を解いてからの方が良いと思います。 次の雛型を使用してもかまいません.
    wavep.c
    #include<stdio.h>
    #include<limits.h>
    #include<math.h>
    
    #define WAVEDATASIZE	16000
    
    int main(void){
    	FILE *fp;
    
    	/***文字列"RIFF"の設定***/
    	const char *s_riff=/***ここに何か書く***/
    
    	/***文字列"WAVE"の設定***/
    	const char *s_wave=/***ここに何か書く***/
    	/***ファイルサイズWholeSizeの宣言***/
    	int WholeSize;
    
    	/***文字列"fmt "の設定***/
    	const char *s_fmt="fmt ";
    	/***fmtチャンクサイズの宣言***/
    	/***ここに何か書く***/ FmtChunkSize;
    	/***↓フォーマットID:FmtIDを設定***/
    	short FmtId=/***ここに何か書く***/
    	/***↓チャネル数Channelを設定***/
    	short Channel=/***ここに何か書く***/
    	/***↓サンプリングレートSamplingRateを設定***/
    	int SamplingRate=/***ここに何か書く***/
    	/***↓データ速度DataVelocityを宣言***/
    	/***ここに何か書く***/ DataVelocity;
    	/***↓ブロックサイズBlockSizeを宣言***/
    	/***ここに何か書く***/ BlockSize;
    	/***↓サンプル単位ビット数を設定***/
    	short Bps=/***ここに何か書く***/
    
    	/***文字列"data"の設定***/
    	const char *s_data=/***ここに何か書く***/
    	/***↓dataチャンクサイズを宣言***/
    	/***ここに何か書く***/ DataChunkSize;
    	/***↓波形データ配列WaveDataを宣言***/
    	/***ここに何か書く***/ Data[WAVEDATASIZE];
    
    	int i, chk;
    
    	/***↓データ速度DataVelocityを設定***/
    	DataVelocity=/***ここに何か書く***/
    	/***↓ブロックサイズBlockSizeを設定***/
    	BlockSize=/***ここに何か書く***/
    	/***↓fmtチャンクサイズFmtchunkSizeを設定***/
    	FmtChunkSize=/***ここに何か書く***/;
    	/***↓dataチャンクサイズDataChunkSizeを設定***/
    	DataChunkSize=/***ここに何か書く***/;
    	/***↓ファイルサイズWholeSizeを設定***/
    	WholeSize=/***ここに何か書く***/
    
    	/***↓波形データWaveDataの設定***/
    	/***ここに何か書く***/
    
    	fp=/***ここに何か書く***/
    	if(/***ここに何か書く***/){
    		printf("Cannot open File\n");
    		exit(1);
    	}
    
    	/***↓"RIFF"のファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for s_riff\n");
    		exit(1);
    	}
    
    	/***↓WholeSizeのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for WholeSize\n");
    		exit(1);
    	}
    
    	/***↓"WAVE"のファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for s_wave\n");
    		exit(1);
    	}
    
    	/***ここからfmtチャンクのファイル出力***/
    	
    	/***↓"fmt "の書き込み***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for s_fmt\n");
    		exit(1);
    	}
    
    	/***↓fmtチャンクサイズFmtChunkSizeのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for FmtChunkSize\n");
    		exit(1);
    	}
    
    	/***↓フォーマットID:FmtIdのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for FmtId\n");
    		exit(1);
    	}
    
    	/***↓チャネル数Channelのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for Channel\n");
    		exit(1);
    	}
    
    	/***↓サンプリングレートSamplingRateのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for SamplingRate\n");
    		exit(1);
    	}
    
    	/***↓データ速度DataVelocityのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for DataVelocity\n");
    		exit(1);
    	}
    
    	/***↓ブロックサイズBlockSizeのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for BlockSize\n");
    		exit(1);
    	}
    
    	/***↓サンプル単位ビット数Bpsのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for Bps\n");
    		exit(1);
    	}
    
    	/***ここまでfmtチャンクのファイル出力***/
    	/***ここからdataチャンクのファイル出力***/
    	
    	/***↓"data"のファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for s_data\n");
    		exit(1);
    	}
    
    	/***↓dataチャンクサイズDataChunkSizeのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く){
    		printf("Write Error for DataChunkSize\n");
    		exit(1);
    	}
    
    	/***↓波形データWaveDataのファイル出力***/
    	chk=/***ここに何か書く***/
    	if(chk</***ここに何か書く***/){
    		printf("Write Error for Data[%d]\n", i);
    		exit(1);
    	}
    
    	/***ここまでdataチャンクのファイル出力***/
    	
    	fclose(fp);
    	return 0;
    }
    


    wave.c
    #include<stdio.h>
    #include<limits.h>
    #include<math.h>
    
    #define WAVEDATASIZE	16000
    
    int main(void){
    	FILE *fp;
    
    	/***文字列"RIFF"の宣言・設定***/
    	const char *s_riff="RIFF";
    
    	/***文字列"WAVE"の宣言・設定***/
    	const char *s_wave="WAVE";
    	/***ファイルサイズWholeSizeの宣言***/
    	int WholeSize;
    
    	/***文字列"fmt "の宣言・設定***/
    	const char *s_fmt="fmt ";
    	/***fmtチャンクサイズの宣言***/
    	int FmtChunkSize;
    	/***↓フォーマットID:FmtIDを宣言・設定***/
    	short FmtId=1;
    	/***↓チャネル数Channelを宣言・設定***/
    	short Channel=1;
    	/***↓サンプリングレートSamplingRateを宣言・設定***/
    	int SamplingRate=8000;
    	/***↓データ速度DataVelocityを宣言***/
    	int DataVelocity;
    	/***↓ブロックサイズBlockSizeを宣言・設定***/
    	short BlockSize;
    	/***↓サンプル単位ビット数を設定***/
    	short Bps=16;
    
    	/***文字列"data"の設定***/
    	const char *s_data="data";
    	/***↓dataチャンクサイズを宣言***/
    	int DataChunkSize;
    	/***↓波形データ配列WaveDataを宣言***/
    	short wave[WAVEDATASIZE];
    
    	int i, chk;
    
    	/***↓データ速度DataVelocityを設定***/
    	DataVelocity=SamplingRate*Bps/8*Channel;
    
    	/***↓ブロックサイズBlockSizeを設定***/
    	BlockSize=Bps/8*Channel;
    
    	/***↓fmtチャンクサイズFmtchunkSizeを設定***/
    	FmtChunkSize=
    	  sizeof(FmtId)
    	  +sizeof(Channel)
    	  +sizeof(SamplingRate)
    	  +sizeof(DataVelocity)
    	  +sizeof(BlockSize)
    	  +sizeof(Bps);
    
    	/***↓dataチャンクサイズDataChunkSizeを設定***/
    	DataChunkSize=WAVEDATASIZE*BlockSize;
    
    	/***↓ファイルサイズWholeSizeを設定***/
    	WholeSize=strlen(s_wave)
    	  +strlen(s_fmt)
    	  +sizeof(FmtChunkSize)
    	  +FmtChunkSize
    	  +strlen(s_data)
    	  +sizeof(DataChunkSize)
    	  +DataChunkSize;
    
    	/***波形データwaveの設定***/
    	for(i=0;i<WAVEDATASIZE;i++){
    		wave[i]=(short)(SHRT_MAX*sin(2*M_PI*1000.0*((double)i)/(double)(SamplingRate)));
    	}
    
    	fp=fopen("pcm-8000Hz-1c-2byte-1000Hz-2sec.wav", "wb");
    	if(fp==NULL){
    		printf("Cannot open File\n");
    		exit(1);
    	}
    
    	/***↓"RIFF"のファイル出力***/
    	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);
    	}
    
    	/***↓WholeSizeのファイル出力***/
    	chk=fwrite(&WholeSize, sizeof(WholeSize), 1, fp);
    	if(chk<1){
    		printf("Write Error for WholeSize\n");
    		exit(1);
    	}
    
    	/***↓"WAVE"のファイル出力***/
    	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);
    	}
    
    	/***ここからfmtチャンクのファイル出力***/
    	
    	/***↓"fmt "のファイル出力***/
    	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);
    	}
    
    	/***↓fmtチャンクサイズFmtChunkSizeのファイル出力***/
    	chk=fwrite(&FmtChunkSize, sizeof(FmtChunkSize), 1, fp);
    	if(chk<1){
    		printf("Write Error for FmtChunkSize\n");
    		exit(1);
    	}
    
    	/***↓フォーマットID:FmtIdのファイル出力***/
    	chk=fwrite(&FmtId, sizeof(FmtId), 1, fp);
    	if(chk<1){
    		printf("Write Error for FmtId\n");
    		exit(1);
    	}
    
    	/***↓チャネル数Channelのファイル出力***/
    	chk=fwrite(&Channel, sizeof(Channel), 1, fp);
    	if(chk<1){
    		printf("Write Error for Channel\n");
    		exit(1);
    	}
    
    	/***↓サンプリングレートSamplingRateのファイル出力***/
    	chk=fwrite(&SamplingRate, sizeof(SamplingRate), 1, fp);
    	if(chk<1){
    		printf("Write Error for SamplingRate\n");
    		exit(1);
    	}
    
    	/***↓データ速度DataVelocityのファイル出力***/
    	chk=fwrite(&DataVelocity, sizeof(DataVelocity), 1, fp);
    	if(chk<1){
    		printf("Write Error for DataVelocity\n");
    		exit(1);
    	}
    
    
    	/***↓ブロックサイズBlockSizeのファイル出力***/
    	chk=fwrite(&BlockSize, sizeof(BlockSize), 1, fp);
    	if(chk<1){
    		printf("Write Error for BlockSize\n");
    		exit(1);
    	}
    
    	/***↓サンプル単位ビット数Bpsのファイル出力***/
    	chk=fwrite(&Bps, sizeof(Bps), 1, fp);
    	if(chk<1){
    		printf("Write Error for Bps\n");
    		exit(1);
    	}
    
    	/***ここまでfmtチャンクのファイル出力***/
    	/***ここからdataチャンクのファイル出力***/
    	
    	/***↓"data"のファイル出力***/
    	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);
    	}
    
    	/***↓dataチャンクサイズDataChunkSizeのファイル出力***/
    	chk=fwrite(&DataChunkSize, sizeof(DataChunkSize), 1, fp);
    	if(chk<1){
    		printf("Write Error for DataChunkSize\n");
    		exit(1);
    	}
    
    	/***↓波形データwaveのファイル出力***/
    	chk=fwrite(wave, sizeof(wave[0]), sizeof(wave)/sizeof(wave[0]), fp);
    	if(chk<sizeof(wave)/sizeof(wave[0])){
    		printf("Write Error for wave[%d]\n", i);
    		exit(1);
    	}
    
    	/***ここまでdataチャンクのファイル出力***/
    	
    	fclose(fp);
    	return 0;
    }
    
  4. 上に述べたWAVファイルフォーマット、雛型プログラムと対応させながら、 次の「あ」から「ぎゅ」に適切に埋めてください。
    1. 文字列"RIFF"を格納する文字列をs_riffとします。
    2. ファイルサイズから8を差し引いた大きさを格納する変数をWholeSizeとします。 これを4バイトで格納するのでint型で宣言します。 これについては後で計算することにして宣言だけしておきます。
    3. 文字列"WAVE"を格納する文字列をs_waveとします。

    ここからfmtチャンクの作成に必要な変数を宣言していきます。

    1. まず文字列"fmt "を格納する文字列をs_fmtとします。
    2. 次にfmtチャンクサイズからチャンク名("fmt ")とチャンクサイズを格納する分を差し引いた大きさを格納する変数をFmtChunkSizeとします。 これについては後で計算することにして宣言だけしておきます。 これを4バイトで格納するのでint型で宣言します。
    3. 次にフォーマットIDを格納する変数をFmtIdとします。 これを2バイトで格納するのでshort型で宣言します。 本課題ではリニアPCMに限定して1に設定しておきます。
    4. 次にチャネル数を格納する変数をChannelとします。 これを2バイトで格納するのでshort型で宣言します。 本課題ではモノラルに限定して1に設定しておきます。
    5. 次にサンプリングレートを格納する変数をSamplingRateとします。 これを4バイトで格納するのでint型で宣言します。 本課題で指定されているサンプリングレートが8000[Hz]に設定しておきます。
    6. 次にデータ速度を格納する変数をDataVelocityとします。 これを4バイトで格納するのでint型で宣言します。 これはサンプリングレート×単位ビット数÷8×チャネル数で表され、 まだ単位ビット数を宣言設定していないので DataVelocityの宣言設定は後回しにします。
    7. 次にブロックサイズを格納する変数をBlockSizeとします。 これを2バイトで格納するのでshort型で宣言します。 これは単位ビット数÷8×チャネル数で表され、 まだ単位ビット数を宣言設定していないので BlockSizeの宣言設定は後回しにします。
    8. 次に単位ビット数を格納する変数をBpsとします。 これを2バイトで格納するのでshort型で宣言します。 本課題で指定されている16に設定しておきます。
    9. 拡張部分は本課題で扱うリニアPCMの場合には不要です。
    これでfmtチャンクに必要な変数の宣言が終りました。

    factチャンクは無くても良いので本課題では扱いません。

    ここからdataチャンクに必要な変数の宣言・設定を行います。

    1. 文字列"data"を格納するための文字列をs_dataとします。
    2. dataチャンクサイズからチャンク名("data")分とdataチャンクサイズを格納する分を差し引いたものを格納する変数をDataChunkSizeとします。 これを4バイトで格納するのでint型で宣言します。 これについては後で計算することにして宣言だけしておきます。
    3. 波形データを格納するための配列名をWaveDataとします。 本課題では単位ビット数が16なのでshort型で宣言します。 要素数は本課題の指定であるサンプリングレートと時間から16000とします。
    これでdataチャンクに必要な変数の宣言が終りました。

    LISTチャンクは無くても良いので本課題では扱いません。

    これで一通り、プログラミングに必要な変数の宣言が終りました。 その他に必要な変数は適宜、宣言してください。

    波形データを作成します。 作成方法については前回のレポート課題を参考にしてください。

    ファイルをオープンした後に、 各データをファイルに出力していきます。

    1. まず、文字列"RIFF"を出力します。 このときfwrite関数の 第1引数はs_riff、 第2引数は1文字分の大きさsizeof(s_riff[0])、 第3引数は文字数strlen(s_riff)、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
    2. 次にWholeSizeを出力します。 このときfwrite関数の 第1引数は&WholeSize、 第2引数はデータの大きさsizeof(WholeSize)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
    3. ここからWAVEチャンクを出力していきます。
      1. 次に、文字列"WAVE"を出力します。 このときfwrite関数の 第1引数はs_wave、 第2引数は1文字分の大きさsizeof(s_wave[0])、 第3引数は文字数strlen(s_wave)、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
      2. ここからfmtチャンクを出力していきます。
        1. 次に、文字列"fmt "を出力します。 このときfwrite関数の 第1引数はs_fmt、 第2引数は1文字分の大きさsizeof(s_fmt[0])、 第3引数は文字数strlen(s_fmt)、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        2. 次にFmtChunkSizeを出力します。 このときfwrite関数の 第1引数は&FmtChunkSize、 第2引数はデータの大きさsizeof(FmtChunkSIze)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        3. 次にFmtIdを出力します。 このときfwrite関数の 第1引数は&FmtId、 第2引数はデータの大きさsizeof(FmtId)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        4. 次にChannelを出力します。 このときfwrite関数の 第1引数は&Channel、 第2引数はデータの大きさsizeof(Channel)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        5. 次にSamplingRateを出力します。 このときfwrite関数の 第1引数は&SamplingRate、 第2引数はデータの大きさsizeof(SamplingRate)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        6. 次にDataVelocityを出力します。 このときfwrite関数の 第1引数は&DataVelocity、 第2引数はデータの大きさsizeof(DataVelocity)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        7. 次にBlockSizeを出力します。 このときfwrite関数の 第1引数は&BlockSize、 第2引数はデータの大きさsizeof(BlockSize)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        8. 次にBpsを出力します。 このときfwrite関数の 第1引数は&Bps、 第2引数はデータの大きさsizeof(Bps)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
      3. ここからdataチャンクを出力していきます。
        1. 次に、文字列"data"を出力します。 このときfwrite関数の 第1引数はs_data、 第2引数は1文字分の大きさsizeof(s_data[0])、 第3引数は文字数strlen(s_data)、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        2. 次にDataChunkSizeを出力します。 このときfwrite関数の 第1引数は&DataChunkSize、 第2引数はデータの大きさsizeof(DataChunkSize)、 第3引数はデータの個数1、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。
        3. 最後に配列WaveDataの全要素を出力します。 このときfwrite関数の 第1引数はWaveData、 第2引数はデータの大きさsizeof(WaveData[0])、 第3引数はデータの個数sizeof(WaveData)/sizeof(WaveData[0])、 第4引数はfpです。 念のためfwrite関数の戻り値を用いて 書き込みバイト数を確認してください。

    後はファイルをクローズして終了です。


以下は皆さんの幾つかの考察・感想に対するコメントです。
拡張子とは関係無くファイルを認識するんですね。
基本的にはそうです。
またwindowsからbfile1_8.datを見てみると、普通にバイナリファイルとして認識されて いた。windowsは拡張子だけで判断していた。
実験してみたのですね!大変良いことだと思います。
問題1において、int型で宣言することにより、4バイト分の空きが確保されることを確認 しました。 念のため、data_tでは4桁の数を宣言してありますが、これは、1桁の数でも同じように なることを確認済みです。
実験して自分で確認したことは大変良いことだと思います。 考察してくれた通り、バイト数と表現する値の桁数は別物です。
順番に気を付けて書き換えるだけだったのですぐにできた。 出力する順を変えるとどうなるのだろうか?
是非、試してみて下さい。
音はなったが、どうやったら違う音が出せたりするのか、いまいちわからない。
ピッチを変えると音程が変わります。 別の音色を出すのは結構大変だと思います。
.rawのファイルと.wavのファイルでは、実行するときの効率などが変わるのだろうか? 実行コマンドは.wavの方がだいぶ簡略化されているが、チャンクなどを用いている分、前回作成した.rawのプログラムより大幅に長くなっている。 そもそもチャンクという概念がよくわからない、、、 確保する容量がすごく増えるのだが、それを補うだけの利点があるのだろうか?
そもそもRAWファイルではその音声のサンプリング周波数、チャネル数、単位データのビット数が不明です。 自分で作って自分で管理するだけならばこれらの情報を覚えておけば良いかも知れませんが、 誰かにRAWファイルをあげるとなるとそのRAWファイルを再生するために必要なサンプリング周波数、チャネル数、単位データのビット数を別途、教えなくてはなりません。 一方で、WAVEファイルの場合にはこれらの情報が初めからファイルに埋め込まれているのでそのような面倒は起こりません。
rawファイルの再生するアプリケーションは"spwave"という音声ファイルエディタです。 詳しい使用方法は分かりません
情報ありがとうございます。 今度使ってみたいと思います。
2の適当な4バイトの数値データという意味がよくわかりませんでした。WAVEのところ をwaveにしてしまったら、音楽ファイルにならなかったのですが、どうしてならなかった のかよくわかりませんでした。
4バイトの数値データは、その次の課題で波形データなどを含めたファイルサイズを表すことになります。 問1では、波形データなどを出力しないので、適当な(いい加減な)数値でよいと思います。 "wave"でダメだったのは大文字小文字を区別するからかも知れません(未確認)。
データ速度とかの意味が良くわかりません。
データ速度は、計算式の単位から判断して、 1秒当たりの波形データバイト数です。
問題3は実行するところまではできたのだが、sox~をすると、上で述べたようになって 音が出なかった。
今回の題意では作成されたファイルをxmmsで再生してみて下さい。
課題2について,soxコマンドとwavコマンドでは何が違うのだろう?? wavコマンドの方が音声データを扱っているっぽかったが、、、スピーカーみたいなのが 出たし、、
wavコマンドでなくxmmsではないでしょうか。 soxコマンドはもともと、音声ファイルの変換に使うものです。 xmmsはいわゆるプレーヤです。
プログラムをコンパイルしたら gcc -pedantic -g -Wall bfile1_7.c -lm bfile1_7.c: 関数 `main' 内: bfile1_7.c:16: 警告: implicit declaration of function `strlen' とでました。 実行は普通にでき、出力も間違ってないと思います。 この警告は何なんでしょう?
strlen関数の宣言がないと云っています。 string.hをincludeしましょう。
シラバスで見たらバイナリファイルはテスト範囲に入っていませんでしだ。今やってる所 はテストに出るんでしょうか。教えてください。それと、最近ほかの授業のレポートも出 て、週にパソコンを使うレポートが2個もあります。正直心身ともにまいってます。
問題4の解答枠で「ぽ」の次がなぜ「きゃ」ではなく「ぎゃ」なのかが気になります。
あっ...
バイナリファイルは今期の試験範囲に入ります。
listチャンク、factチャンクはどういう時に使うんだろうか?
私も知らないので、ぐぐってみて下さい。 各所に色々と書いてあるようです。
2秒しか音がならなかったけど、原因がわかりませんでした。
ええと、2秒間音の鳴るファイルを作成したのです。
PC室の閉室の音楽を課題が終わらなくて最近よく聞きます。 「蛍の光」は切なすぎるのでなにか楽しい曲にはならないでしょうか?
う〜ん、楽しい曲にしてしまうと閉室の雰囲気になりませんよねぇ。 帰り道にipodなどでお好みの曲で口直ししましょう。 閉店ミュージックとして定着してしまった「蛍の光」。 原詞は閉店とかとは関係ない、いい歌詞なんですけどねぇ。
メール画面でたまに日本語が打てなくなるんですがどうしたらいいのでしょう(;_;)? ?emacsは面倒です,,,
ときどきそのような人を見かけますね。 自分がそうなったことがないので正直、原因が分からない以上、 対処のしようがありません。 ネットワークサービス課の方に聞いてみて下さい。
最近は音にかんしてやっているが、これから音楽が作れるのか? これが派生して、電波等は飛ばせないか知りたい
音楽を作れなくはないでしょうが大変だと思いますし、 奔流ではないと思います。 プログラム自体で電波を飛ばすのは難しいと思います。 作るとすれば、電波に乗せる情報を作ることになると思います。
最近、休みはあっても休めていないような気がする。授業の無い日に大学にきて、 課題をやっていることも原因の一つだと思うので、できるだけ授業日に課題を終わらせら れるように努力したい。
そうですね。 私もこの週末ずっと仕事してて疲れが溜りつつあります。 インフルエンザが流行りつつあるようなので、 お互いに体調に気をつけましょう。
頭痛と風邪と腹痛で死にそうです。
辛そうですね。 休息が大事です。
新型インフルエンザかからないといいですね。
新型はやばいっすね。
日経ソフトウェアという雑誌を買ってみましたが知っていますか?
初心者にもとっつきやすいソフトウエア関連雑誌ですね。 大学の授業では時間などの都合で扱えないけれど 社会に出ると必要なものは、そのような雑誌で補うと良いと思います。
眠いです。でも基底の再履がんばります。
基底はふん張って2年次でとっておいた方がいいですね。 でないと大宮バック決定ですし。
神澤先生はあまりゲームやらないのですか? 森〇先生しかゲームしないようなイメージがでてきますが・・・
念のため、森○先生がゲームをなさるかどうかは未確認です。 若くてどちらかというと計算機系なのでそうなのかなぁと。 私の場合、子どもの頃は親の方針で、学生時代は経済的な理由で、 家庭用ゲーム機にほとんど触れていないのです。 ゲーセンなら小学生時代にパックマンとゼビウスにはまってました。 今は仕事の合間にマインスイーパをやる程度です。
Core i7 の買い時はいつぐらいでしょうか?
まだ開発者にも分からないんじゃないでしょうか。
大学生はお金は貯めるより使った方がいいんでしょうか?
今の自分に投資するのが良いと思います。
傘立てに置いておいたはずの傘が消失しました。この鬱憤はどのように晴らしたらいいで しょうか。教えてください。
ムカつきますね。 しかし、ここで欝憤を晴らそうとはしない方が良いと思います。 負の連鎖を自分のところで断ち切ることが肝要です。 次に盗まれないような工夫を考えてみるのはいかがでしょうか。 うまくいけば特許でうはうは。
宿題を忘れてしまったときに、思わず許してしまいたくなっちゃう言い訳を教えてくだ さい。
う〜ん、それはないかなぁ。 逆に、「理由があるんだから宿題やらなくて当然!」みたいな態度でこられると、 どんなにしかたない理由でも思わず許したくなくなっちゃいます。
今年のM-1も笑い飯を応援します。 しかし、優勝はナイツだと思います。
笑い飯とはまた、正当派好みですね。 ナイツも正当派、いいですね。
裁判傍聴はおもしろいですね
傍聴したのですか?いい体験してますね。
今年の流行語大賞も微妙でしたね。 ですが、ポケモンマスターの友達はしばしば「上野の413球」と口ずさんでおります。
国全体で価値観を共有している時代ではなくなっているので、 万人が納得できる流行語が発生しにくいのかも知れませんね。 ポケモンってテレビではまだやってるのですね。この週末に知りました。
僕は「鬚のおじさん」って呼ばれています。まだ19歳なのに。。。 僕の趣味はポケットモンスターで、最近ドサイドンを育てています。
ん?もしかして。
二十歳になったのでお年玉をもらえるかどうか心配です。
十九だと言い張りましょう。
最近、サウナがマイブームになっています。我慢した後の水風呂がたまりません。
なんか、うちらの世代みたいな発言ですね。 血管ぶちキレない程度に抑えて下さいね。
先生はミクスチャーロックは好きですか??
おぢさんにはその用語は不明です。 フュージョンとどう違うのだろ。
最近のテレビ番組は、全然面白くなく腹が立ちます。特に流行りのクイズ番組とかはひど くあんなのでよく視聴率がとれるなと思います。ニュース番組もただマスコミが事件とか にたかって叩くだけで意味がないです。そんな番組作るくらいなら放送しなくていいんで すけど・・・ 昔にやってたダウンタウンのごっつええ感じのようなコント番組を作って欲しいものです 。
コント番組って最近ありませんね。 コントは台本作りやリハーサルなど時間も金もかかるからでしょうかね。 イロモネアのような一発モンばっかですね。
クリスマスが今年もやってきます そう、今年も・・・
クリスマスを気にすることができる多感な時期はあっと云う間に過ぎてしまうのです。
市販されているお茶のペットボトルのおいしい会社順は"伊藤園>サントリー>キリン> >コカコーラだと思います。
情報ありがとうございます。 今度、比較してみます。

何かありましたら、 まで。