WAVファイルの書き出し

ページトップへ 一つ上へ

ポイント


wavwrite



さて、今回は作った音をWAVファイルに書き出す方法を話します。
今まではMATLABで音を作っても、それを聞いて波形を見ていただけで、
ファイルに保存という事をしていなかったです。
ここでは、その方法について書きます。

さて、方法といいましても、簡単に出来るので説明もそんなにいらないかもしれません。
では、まず以下のプログラムを書いてみて下さい。
function makewav

%
% 音をWAVファイルに書き出す
%
%

fs=44100;
t=[0:1/fs:1];
f=1000;

y=sin(2*pi*f*t);

soundsc(y,fs);
wavwrite(y,fs,16,'sin.wav');

これで、sin1000Hzの音をサンプリング周波数44100Hz、量子化16bitで書き出しました。
たったこれだけで、WAVファイルに出来るわけです。
変な警告が出ても無視して下さい(笑)

ここで終ってもつまらないので、このプログラムを少々拡張していきましょう。
まず、ファイル名が最初から決まっているので、それをユーザに入力させるようにしましょう。
では、以下のようにプログラムを修正してみて下さい。
function makewav

%
% 音をWAVファイルに書き出す
% ファイル名はユーザが入力
%
%

fs=44100;
t=[0:1/fs:1];
f=1000;

y=sin(2*pi*f*t);

soundsc(y,fs);

filename=input('保存するファイル名を入力して下さい','s');
wavwrite(y,fs,16,[filename '.wav']);

これでユーザがファイル名を入力するように拡張しました。
拡張子の部分は入力しないでもいいようにしました。

さて、次の問題は保存が完了したというフィードバックがないという事です。
さらに、同じファイル名があった場合は強制的に上書きされてしまうという事があります。
その辺を修正してみましょう。
では以下のようにプログラムを修正してみて下さい。
function makewav

%
% 音をWAVファイルに書き出す
% ファイル名はユーザが入力
% 既にファイルが存在する場合は別の名前を要求する
%
%

fs=44100;
t=[0:1/fs:1];
f=1000;

y=sin(2*pi*f*t);

soundsc(y,fs);

filename=input('保存するファイル名を入力して下さい','s');
fid=fopen([filename '.wav']);
		 while fid >= 0
			 disp('その名前のファイルは既に存在します');
			 fclose(fid);
			 filename = input('別のファイル名を入力して下さい','s');
			 fid=fopen([filename '.wav']);
	     end
wavwrite(y,fs,16,[filename '.wav']);

disp([filename '.wavの作成に成功しました']);

これで、上書きはされなくなりました。
fopen関数を使って、ファイルの有無を調べるという方法を使いました。
そしてもし存在するなら、違う名前を要求するという仕様です。
しかしこのままではファイルは上書きされないです。
上書きしたくても出来ないというのもユーザに優しくないと言えるので、
もう少し拡張してみましょう。
今度は上書きするかどうかを聞くように修正します。
function makewav

%
% 音をWAVファイルに書き出す
% ファイル名はユーザが入力
% 既にファイルが存在する場合は上書きの可否を要求
%
%

fs=44100;
t=[0:1/fs:1];
f=1000;

y=sin(2*pi*f*t);

soundsc(y,fs);

filename=input('保存するファイル名を入力して下さい','s');
fid=fopen([filename '.wav']);
		 while fid >= 0
			 disp('その名前のファイルは既に存在します');
             writeq=input('ファイルを上書きしますか?(Y or N)','s');
             if writeq=='y'
                 fclose(fid);
                 break;
             elseif writeq='n'
             	 fclose(fid);
			     filename = input('別のファイル名を入力して下さい','s');
			     fid=fopen([filename '.wav']);
             end
	     end
wavwrite(y,fs,16,[filename '.wav']);

disp([filename '.wavの作成に成功しました']);

さて、これで上書きしたい時は上書き出来ますし、
別の名前でも保存出来るようになりました。

これで随分使い勝手のいい書き出しのプログラムが出来ましたので、
今回はこの辺にしておきます。