2009-07-08 11 views
3

こんにちは、それはフラッシュで「パラメトリック」イコライザを作成することが可能かどうかを知りたいです。 通常のグラフィックエフェクトだけでなく、アプリケーションを通過するサウンドの出力を変更するツールです。任意のリファレンス、ヒントのアイデアを歓迎します。 ありがとうフラッシュイコライザを作成する(出力サウンドを変更する)

答えて

6

それはひどく簡単なことではないだろう...しかし、ここでの方法かもしれない:

var parameters:Array = [1,1,1,1,0.5] 
var sound:Sound = new Sound(); 
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, filter); 
sound.load(soundURLRequest); 
sound.play(); 

private function filter(event:SampleDataEvent):void 
{ 
    var freqDomain:Array = FFT(event.data, parameters.length); // You will need to find a FFT(Fast Fourier Transform) function to generate an array. 
    for(var i:int = 0; i < freqDomain.length; i++) 
    { 
     freqDomain[i] = freqDomain[i] * parameters[i]; // This is where your EQ parameters get applied. 
    } 
    var timeDomain:Array = IFFT(freqDomain, event.data.length); // Inverse FFT 

    for(value:Number in timeDomain) 
    { 
     event.data.writeFloat(value); 
    } 
} 

一部のFFT及びIFFT機能に、FFTは通常、複素数値(+本物の複雑なコンポーネント)を出力し、することができます振幅成分および位相成分に変換することができる。本当に必要なのは、数式=(sqrt(real^2 + complex^2))を持つ大きさだけです。人間の耳は、位相には敏感ではありません(位相に非常に敏感な目とは対照的に)、逆FFTを実行すると、ほとんど差のないランダムまたは平坦な位相を挿入することができます。私のアプローチは、フィルタの実装に関して非常に低いレベルであることに注意してください。

ここはフーリエ変換関数です(高速ではありませんが、畳み込み(O(n^2)vs FFT O(nlogn))だけで参照できます)の定数と間違っているかもしれません:

// Note that this only returns the magnitude, I am discarding the phase. 
function FFT(sample:Array, size):Array 
{ 
    var frequencies = new Array(size); 
    for(int i = 0; i < sample.size; i++) 
    { 
     for(int j = 0; i < frequencies.size; j++) 
     { 
      var real:Number = sample[i] * Math.cos(Math.PI/2 * i * j); 
      var complex:Number = sample[i] * Math.sin(Math.PI/2 * i * j); 
      frequencies[j] += Math.sqrt(real * real + complex * complex); 
     } 
    } 
    return frequencies; 
} 
+0

event.dataオブジェクトはByteArrayのではなく、配列です。 bytearrayを処理するコードを更新するための推奨事項。 また、IFFTを作成するためには何が必要ですか? – klamping

+1

ByteArraysではインデックス付けが可能です([i]を使用して部品を取り込む)ので、基本的には配列のように使用します。 IFFTアルゴリズムはオンラインで見つけることができますが、本質的にはFFTを実行していますが、大きさと位相の大きさは異なります。 – CookieOfFortune

1

チェックアウトAndre Michelle's labs page彼はフラッシュでaudoを使って仕事をしています...おそらく最高のものの1つです。私はパラメトリックeqが何であるか分かりませんが、あなたはそのページの良い情報を見つけることができます。

0

おそらくdigital filtersのセットは、あなたの最善の策だろう。 FFTとは異なり、デジタルフィルタはメモリ全体に波形を保持する必要はありません。なぜなら、デジタルフィルタは因果的であり、過去および/または未来のいくつかの点のみを見るからです。また、サウンドをストリーミングすることができれば、それらをオンザフライで適用することもできます。簡単なフィルタを簡単に連鎖させて、より複雑なフィルタを作成することができます。

いくつかの基本的な理論を持っていますが、ページングとリフトの計算式だけがあるfree book on digital filtersがあります。例えば、Chの速い熟読。 19には、ハイパス、ローパス、バンドパスの再帰フィルタの簡単な式がリストされていますが、これはおそらくトリックですが、好きにならないようにするためには、

+0

FIRフィルタとIIRフィルタの問題点は、FIRフィルタとIIRフィルタが任意の周波数パラメータで動作することは自明ではないことです。 – CookieOfFortune

+0

@Cookie - 一部のデジタルフィルタではそうですが、すべてではありません。私が述べた参考文献には、非常に単純なコード行の中で、オンザフライで簡単に計算できる複数のフィルタがリストされています。 – tom10

1

を更新:私は3-band equalizer using Flash 10の例を発見しました。それは言及CookieOfFortuneとは異なる数学を使用しますが、それは動作します(まあ、それでした)。これを使用して、5バンドのサンプルを更新し、Flexで実行するように変換しました。あなたはsee the code on GitHubです。

誰かが数学をどのように実行するかについてのご意見がありましたら、私はそれについて聞いて嬉しいです。私は実際には音の変化についてあまり知らない。


オリジナルのポスト: 私はこれが役立つどのくらいわからないんだけど、これはFFTのと、このような痛みのないサウンドイコライザーの効果を得るための一時しのぎです。

http://www.webdesign.org/web/flash/tutorials/sound-equalizer.5020.html

基本的には、サウンドファイルのいくつかのバージョン、あらかじめ用意されたイコライザー設定に各セットを作成します。次に、ユーザーが低音や高音を調整するときは、それぞれのファイルの音量を調整するだけです。

また、音の変数に役立つエキス()関数を見つけるかもしれない:SampleDataEventによって渡さ http://livedocs.adobe.com/flex/3/langref/flash/media/Sound.html#extract

+0

彼らはFFTを使用しているようです。これらのステートメントをかなり一般化して、任意のバンドを作成することができます(バッファ長を長くする必要があります)。 – CookieOfFortune

関連する問題