« AO入試を希望する高校生のみなさんへ | トップページ | おもしろメディア学 第17話 ゲームからの「お・も・て・な・し」 ~動的難易度調整をめぐる議論~ »

あなたも作れるお化け音

|

お化け音を以前のブログの「おもしろメディア学」で紹介しました。

その正体は、音の高さがフワフワと変化する音でした。不規則な音の高さの動きがあると、人は不安になります。これが気味悪さを感じさせる理由でした。
さて、今日は、お化け音を実際に作ってみましょう。
これには、scilabという信号処理ツールを使います。まずscilabのホームページからツールをダウンロードしてインストールしてください。無料で使えます。
scilabはmatlabと類似した信号処理ツールです。コンソールから命令を打ち込むと、その場で処理してくれます。音を作ったり、音を鳴らしたりが簡単にできます。

さて、準備ができましたら、以下の命令をscilabのコンソールに打ち込んでみてください。右側の//から右側は各命令の説明なので、これは打ち込む必要ありません。各行はセミコロン;で終わります。

fs = 11025;  //サンプリング周波数=1秒に何個音のデジタルデータを作るか
d = 1 / fs ;  //サンプリング間隔=デジタルデータの時間間隔
fc = [ 100 300 200 400 100 ] ;  //おおまかな周波数変化軌跡(単位はHz=ヘルツ)
tx = length( fc ) - 1 ; //音の時間長(秒)
t = 0 : tx ;  //上記各周波数の時刻(秒)
tt = 0 : d : tx ; //サンプリング間隔をメモリとする時間ものさし
fi = interp( tt , t , fc , splin( t , fc ) ) ;  //スプライン関数でなめらかに周波数をつなぐ
fv = 30 *  sin( 2 * %pi * 5 *  tt ) ; //1秒に5回、周波数変化幅±30Hzのビブラート
fx = fi + fv ; //最終的なお化け音の周波数変化
p = cumsum( [ 0 fx ] ) * 2 * %pi * d;  //時々刻々の角度変化を累積し角度変化を作る
sound( sin( p ) , fs ) ; //波を作って音を鳴らす
いかがですか?fcは音の高さ(周波数)の変化の設定です。スプライン関数を使って、それらの周波数をなめらかにつなぎます。さらに、fvにより、1秒に5回のビブラートを発生します。これら2つを足し合わせた周波数変化がfxで、それから周波数変化音作成の原理に基づいてお化け音を発生させるわけです。
ここで、時々刻々の音の周波数の動きから音の高さが変化する周波数変化音を作る仕組みをもう少し解説しておきましょう。
音は波ですから、sinという関数を使えば作れます。よく知られた三角関数ですね。
通常sinの中には角度を入れます。
sinは2πラジアン(360度のこと)で1回の振動をします。
1秒にfc回振動する音のときには2πfcラジアン進みます。
音のサンプルの時間間隔はdですから、この時間で2πfc  d  だけ角度が進みます。
これを累積していけば、時々刻々の角度が求まります。
cumsumは数値列の累積値の並びを求めてくれます。
たとえばcumsum([ 1 2 3 ] を実行すると、1、3、6という累積値の並びが求まります。
さあ、それでは、音の周波数の時間変化fcを作り変えて、みなさん独自の「お化け音」をつくってみてください!

研究紹介」カテゴリの記事

« AO入試を希望する高校生のみなさんへ | トップページ | おもしろメディア学 第17話 ゲームからの「お・も・て・な・し」 ~動的難易度調整をめぐる議論~ »