FM音源2

ページトップへ 一つ上へ

ポイント


switch文、三角波、矩形波



さてさて、前々回にお話したFM音源について今回も話していきます。
今回は前回のFM音源基礎を使って、ちょっとしたツールを作っていきましょう。
ツールの仕様は以下のような感じ。

・キャリア周波数を指定する
・変調波を正弦波、三角波、矩形波の3つから選択
・何度でも変調する事が出来る
・直前の状態になら戻す事が出来る
・毎変調ごとに音出力と図出力による確認
・決定すれば、音を保存する

こんな感じで。
あくまでインタラクティブに。インパクトに。

今回はってか今回もCUI(Commandable User Interface)で。
さてさて、では以下のような基本的な部分をプログラムしてみましょう。
function fmtool

% 
% 簡易FM音源ツール
% 
% 変調の種類:正弦波、三角波、矩形波
% 保存フォーマット:44100Hz,16bit,wav file
%
% 第一版
%

disp('>>>メニュー<<< ');
disp('1.新規作成');
disp('2.保存');
disp('3.変調');
disp('4.元に戻す');
disp('5.再生');
disp('6.終了');

menu=input('メニューから番号を選んで下さい');

switch menu
case 1
    % 新規作成処理
    % キャリアの作成
case 2
    % 保存処理
    % WAVファイルの書き出し
case 3
    % 変調処理
    % 正弦波、三角波、矩形波の選択
    % 変調実行
case 4
    % 元に戻す処理
case 5
    % 再生処理
    % 現在の状態を再生
case 6
    % 終了
end


さて、このようにまず大枠を作っておきます。
これが全体的な処理の流れになります。
ここでswitchという関数が出てきましたが、
使い方はC言語と同じです。
MATLABではC言語と違ってfall throughではありません。
ですから、breakは必要ないのです。

さて、この基本的な部分の中身を埋めて行く作業が次になります。
一つ一つ説明していくよりもまず、全て書いた方がいいと思いますので、
プログラムの完成版を書いておきます。
function fmtool

% 
% 簡易FM音源ツール
% 
% 変調の種類:正弦波、三角波、矩形波
% 保存フォーマット:44100Hz,16bit,wav file
%
%

fs = 44100;
t=[0:1/fs:1];
z=0;

while z == 0

fprintf('\n\n');
disp('>>>メニュー<<< ');
disp('1.新規作成');
disp('2.保存');
disp('3.変調');
disp('4.元に戻す');
disp('5.再生');
disp('6.終了');

menu=input('\nメニューから番号を選んで下さい>>');

switch menu
case 1
    f1=input('\nキャリアの周波数を入力して下さい>>');
    x=2*pi*f1*t;
    soundsc(sin(x),fs);
case 2
    fprintf('\n\n');
    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(sin(x),fs,16,[filename '.wav']);

    disp([filename '.wavの作成に成功しました']);
case 3
    x1=x;
    fprintf('\n\n');
    disp('>>>変調波の選択<<<');
    disp('1.正弦波');
    disp('2.三角波');
    disp('3.矩形波');
    moduno=input('\n変調波を選択して下さい>>');
    f2=input('\nモジュレーションの周波数を入力して下さい>>');
    
    switch moduno
    case 1
        x=x+sin(2*pi*f2*t);
    case 2
        x=x+sawtooth(2*pi*f2*t,0.5);
    case 3
        x=x+square(2*pi*f2*t);
    otherwise
        disp('番号が認識できません。変調出来ませんでした');
    end
    soundsc(sin(x),fs);
    plot(t,sin(x));
    axis([0 0.01 -1 1]);
case 4
    x=x1;
case 5
    soundsc(sin(x),fs);
case 6
    z=1;
otherwise
    disp('番号が認識できません');
end

end


これが完成版になります。
プログラムを見て頂ければわかると思いますが、
三角波はsawtooth関数、矩形波はsquare関数を使って実現しています。
sawtooth関数は本来は鋸波を出力する関数ですが、
ご存知の通り、鋸波と三角波は類似しています。
sawtooth関数の第2引数を0.5とする事で、三角波が出力できます。
MATLABでは最初から関数が用意されているので便利です。

その他いろいろやっていますが、そんなに難しい事はやってないと思います。