wavファイルを作りたい
Posted: 2010年9月10日(金) 13:34
いつもお世話になっております、山崎です。
今回は、wavファイルの作り方について伺いに参りました。
先日、お世話になっている方に
「こんなふうに音が鳴るプログラムが作りたい。どうすればいいかわからないか」
と尋ねられ、音声ファイルの中身を全く知らない私は何も力になることができませんでした。
そこで、現在wavファイルの作り方についていろいろ調べております。
とりあえず、wavファイルを学ぶ上での最初の目標として、
「"ラ"の音を1秒間鳴らすwavファイルを作る」
ことにいたしました。
そしてwavファイルの作り方を検索したところ、
フォーマットについて紹介したサイトはいくつか見つけることができたのですが、
どんな方法でそれらのフォーマットをファイルに書き込めばいいのか
具体的な解説が載ったサイトを見つけることができませんでした。
ちなみに、以下のサイトを主な参考としていました。
http://www.kk.iij4u.or.jp/~kondo/wave/#wav
そこで、それらのサイトのフォーマットを見ながら、
C++で闇雲に下記のようなプログラムを書いて実行し、怪しいwavファイルを作って
メディアプレイヤーで読み込んでみましたが、もちろん再生されることはありませんでした。
本当にwavファイルについて何もわかっていないので、かなり馬鹿なことをしていると思います。
コメントに、作成中の私の心の中の疑問などを書きました。
どのようにすれば、wavファイルをC++で生成することができるのでしょうか。
あるいは、フォーマットだけでなく具体的なwavの作り方を解説しているサイトはありますでしょうか。
今回は、wavファイルの作り方について伺いに参りました。
先日、お世話になっている方に
「こんなふうに音が鳴るプログラムが作りたい。どうすればいいかわからないか」
と尋ねられ、音声ファイルの中身を全く知らない私は何も力になることができませんでした。
そこで、現在wavファイルの作り方についていろいろ調べております。
とりあえず、wavファイルを学ぶ上での最初の目標として、
「"ラ"の音を1秒間鳴らすwavファイルを作る」
ことにいたしました。
そしてwavファイルの作り方を検索したところ、
フォーマットについて紹介したサイトはいくつか見つけることができたのですが、
どんな方法でそれらのフォーマットをファイルに書き込めばいいのか
具体的な解説が載ったサイトを見つけることができませんでした。
ちなみに、以下のサイトを主な参考としていました。
http://www.kk.iij4u.or.jp/~kondo/wave/#wav
そこで、それらのサイトのフォーマットを見ながら、
C++で闇雲に下記のようなプログラムを書いて実行し、怪しいwavファイルを作って
メディアプレイヤーで読み込んでみましたが、もちろん再生されることはありませんでした。
本当にwavファイルについて何もわかっていないので、かなり馬鹿なことをしていると思います。
コメントに、作成中の私の心の中の疑問などを書きました。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* fp=fopen("TestWave.wav","wb"); //サイトには何も書いていなかったが、wavの中身はおそらくバイナリファイルなのだろう。
fputs("RIFF",fp); //"RIFF"という文字列を4バイトで書き込めばいいのだろうか。半角英数字は1文字で1バイトだから、これでいいはず?
fputs("1500",fp); //全体のファイルサイズから8を引いたバイト数を書けばいいらしい。今はわからないから適当に1500バイトと書いて後回し。
fputs("WAVE",fp); //"WAVE"という文字列を4バイトで書き込む。
fputs("fmt ",fp); //"fmt "という文字列を4バイトで書き込む。おっと、スペースを入れるのを忘れちゃいけない。
fputs("0018",fp); //fmtチャンクなるもののバイト数を書くのだらしい。ここもよくわからないから適当に18バイトにしておこう。
fputs("01",fp); //フォーマットIDとは何だろう?よくわからないので、サイトのとおり1にしておこう。
fputs("01",fp); //チャンネル数とはステレオとモノラルのことらしい。まずは簡単そうなモノラルにしてみよう。ということで1。
fputs("4410",fp); //サンプリングレート、1秒間に何バイト分の音声データを持たせるか、かな。勝手にキロのオーダーになるのだろうか。よくわからないので4410に。
fputs("4410",fp); //データ速度?サンプリングレートとどう違うのだろう。よくわからないから同じ4410に。
fputs("04",fp); //ブロックサイズなるものを書くらしい。よくわからないので、サイトのまねをして4に。
fputs("16",fp); //「サンプルあたりのビット数」とは何だろう。そもそも何のサンプルだろう?ここもサイトのまねをして16に。
fputs("00",fp); //拡張部分のサイズを書くらしい。拡張しなくてもいいから0にしておく。
fputs("data",fp); //"data"という文字列を4バイトで書き込む。
fputs("1000",fp); //波形データのバイト数をここに入れるようだ。とりあえず1000バイトとしておく。
//最後に波形データを書き込めばいいようだが、どんな形式で書けばいいのだろう。
//周波数とか振幅とか、どういう形式で書いて何で区切ればいいのだろう。
//とりあえず、何の意味もないノイズでもいいので音を鳴らしてみよう。
//さっき波形データのバイト数を1000にしたから、charが1000個で1000バイトになるはずだ。
for(int i=0;i<1000;i++)
{
char Temp=rand()%256; //とりあえず0から255までのランダムな数値を求める。
fputc(Temp,fp);
}
fclose(fp);
return 0;
}
これではラの音を出すどころか、ノイズさえ出すことができません。どのようにすれば、wavファイルをC++で生成することができるのでしょうか。
あるいは、フォーマットだけでなく具体的なwavの作り方を解説しているサイトはありますでしょうか。
