開発日記

2010年3月29日

Cat Voice Keyboard - ActionScript3

義弟との会話から、音を使った何かを作ってみる事に。

とりあえず、手始めに動物の声をサンプリングして、音階調整した物でKeyboardを作ってみる事にした。

簡単にできるかなーなどと、考えていましたが、なかなか手間がかかりました。

最初に取り組んだのは、読み込んだSoundデータをextractでByteArrayに読み込み、ダイナミックに周波数を変更する方法。ざっくり考えるに、データを間引く、もしくは水増することで、周波数を変更出来るのでは?という甘い考えw

まーできる事はできたのですが、サンプリングした音によっては、ブチブチと雑音がはいってしまいました。さらに周波数を短くする場合は、データを水増ししてやらない事には、当然ブチブチがひどくなるので、とりあえず、足りないデータを、前後の音をコピーしてみたのですが、なんかエコーがかかるような状態になり、断念。

とりあえず、低い音はあきらめて、高くする事だけで作ってみたのは、こちらです。

結局、全音階をサンプリング(音系の専用ソフトで加工)した方が手っ取り早い、キレイなのではとあきらめかけたのですが、Twitterでつぶやいたところ、alumican_netさんより、PhaseVocoder&FFTで実現可能では?との情報を頂く。

さらに、海外サイト
 http://iq12.com/blog/2009/08/25/real-time-pitch-shifting/
にて、C++よりAS3に移植されたPhaseVocoderがあるとの、情報まで教えていただき、早速飛びついてみました。

上記サイトでは、音楽をダイナミックに、速度を変更せずに音程を変更するというサンプルだったので、UI部分と、SoundPitchShiftクラスを大幅に変更し、キーボードを押すごとに、指定したキーでサンプリング音をダイナミックに変換するように改造してみました。

が、サンプルと違い、KeyboardのキーごとにSoundデーターを毎回変換すると、複数の音が重なったりした場合、てきめんに重くなる事が判明。このままではまったく使い物にならないw

なので、最初に必要な音(今回は2オクターブ分、24音)を一気に変換作成してしまう方式に。

そして完成したのが、こちら

(注!最初の音変換時はかなり重いです)。

 

やはり取り込んだ音を一気に変換してる為、変換時のFPSは1/60という激重状態に。なおかつ24音作成にマシンスペックにもよりますが、1分以上かかってしまいます。

変換後の動作はかなり軽快なのですがw

ということで、結論としては、やはり最初から変換した音を取り込んだ方がいいというオチにw
 

 

トラックバックURL

このエントリーのトラックバックURL:
http://marubayashi.net/mt/mt-tb.cgi/61

コメントする