audio scilab 数学

Mac OS X Leopard環境でscilabのplaysndっぽい関数を作る。

[`evernote` not found]
LINEで送る
Pocket

今回は前回のpostに引き続きscilabについて。

scilabには、コマンドラインからサウンドをならす関数である、playsndが最初から定義されていて、変数でサイン波とかを用意してplaysndに突っ込むと音がなる、という仕組みなのですが、Macの場合はなぜだかそのままでは使う事ができません。

本当は、http://science6.2ch.net/test/read.cgi/kikai/1068735555/108n-

に書いているようにすればplaysndを使えるようになるらしいのですが、僕の環境ではできなかったので、代わりに自分でplaysnd関数もどきを定義しよう、と考えました。その手順からテストするまでを記述します。

当然、Macであることを前提とします。

 

1 playsnd.sciを開く。

playsnd.sciはscilab.appを右クリック(Control+クリック)し、「パッケージの内容を表示」を選択、その後、「Contents/Resources/macros/sound/playsnd.sci」と進み、ファイルをテキストエディタか何かで開く。

 

すると、どうやらplaysndは

 

  1. “TMPDIR/_playsnd_.wav”というファイルを生成
  2. PlaySound関数で直ぐに再生
ということを行って音を再生する機能を実現している、とわかります。
次に色々とif文の記述がありますが、どこがMacに関係するのかを調べましょう。

 

しばらく眺めると、12行目あたりからが怪しい、とわかります。(理由は、12行目のelseに対応するif文に、”MSDOS”と書いているから、12行目以降はWindows以外を指しているんだろうな、と検討をつける事ができます。だってMac OS XってBSDベースでしょ。)

ここを見ると、「/dev/audio」と書かれているところがあります。

が、まずこの階層は、デフォルトではないと思いますし、なんか別のアイコンが表示されていて、/devを作るのは難しいと思うので、ここでは、/audiodevというフォルダを作り、そこにオーディオファイルを作成します。

 

次に、なぜか僕の環境ではwavファイルを扱うsavewave, rwaveなどが使えなかったので、前回のポストでも使った、.auファイルを生成してならすことにします。

.auファイルの書き出しに関しては、まさに前回のauwriteを使うのですが、では再生はどうすれば良いでしょうか。

 

幸いにもシェルぽく使えるunix関数があるので、コマンドラインで音を鳴らせるプログラムと.auファイルを指定する、という方針にします。

 

コマンドラインからオーディオファイルを鳴らすプログラムを探す

ここではコマンドラインからオーディオファイルを鳴らすプログラムとしては、afplayをつかう事にします。

afplayに関しては、ここが詳しいです。(こちらはOctaveでの例ですね。)

で、afplayにパスを通します。(.bash_profileとかをいじって下さいね。)

 

これでコマンドラインからオーディオファイルを鳴らす事ができるようになりましたので、あとは独自に定義したplaysoundという関数を作成します。

 

playsndライクな関数、playsoundを作成する

 

それでは、playsound関数を作成しましょう。

といっても、playsnd関数をちょこっといじるだけです。

 

 

  1. Macintosh HD直下に、scilabというフォルダを作成します。
  2. 1.で作成したフォルダに、”playsound.sci”というファイルを作成します。
  3. 2.で作成したファイルに下記のように記述し、保存します。
function []=playsound(y,rate,bits,aplay)
// play signal y at sample rate rate 
// bits is unused 
  [lhs,rhs]=argn(0);
  if rhs <= 3 aplay=’aplay’; end 
  if rhs <= 2 bits=16; end 
  if rhs <= 1 rate=22050; end 
  if MSDOS  then
    savewave(TMPDIR+’/_playsnd_.wav’,y,rate);
    PlaySound(TMPDIR+’/_playsnd_.wav’);      
    return 
  else
    if aplay<>’/audiodev‘ then 
      // should send aplay to PlaySound 
      auwrite(y, rate, ‘/audiodev/_playsnd_.au’);
      unix(‘afplay /audiodev/_playsnd_.au’);
    else
      [fp,www] = mopen(‘/devaudio‘,’wb’,0);
      if www<0 then 
fp = -1;
      end
      if fp==(-1) then
disp(‘Audio capabilities not available’);
return
      end
      mput(lin2mu(y),’uc’,fp);
      mclose(fp);
    end
  end
endfunction
これで/audiodevというところに_playsnd_.auというファイルを作成し、それを再生するという関数playsoundを作成できました。

実際にplaysound関数を使ってみる

それでは実際に使ってみましょう。
1. まず、なんでもいいのでscilabからファイルを開く。
2. 下記の内容を記述する。
 //————————– test playsound function
 getf(‘/scilab/playsound.sci’); // 1
 sfrq = 22050;
 while(1)
    state = input(‘play sound?’);
    if state == [] then break end;
    frq = 440;
    T = 1/sfrq;
    tmax = 3;
    tnum = tmax*sfrq;
    
    k = 0: 1: tnum;
    ys = cos(2 * %pi * frq * k * T);
    ymax = max(abs(ys));
    ys = ys/ymax;
    playsound(ys); // 2
   end
3. Executeから実行する。
すると
play Sound?–>
となるので、何かしら1でも何でもいいので入力し、enterを押します。
すると、440Hzで3秒間音がなると思います。
実際に使う時のポイントとしては、
getf関数で先ほど作ったファイルの参照を入れる事くらいでしょうか。
やっとこれからサンプルを触りながら波形の勉強ができる!!やった!

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA