2011-12-18 11 views
1

CoreAudioは、1つのチャンネルにミキシングするときに音波を加えているようです。私のプログラムは合成音を作ります。私はそれぞれの音の振幅を知っています。私がそれらを一緒に演奏すると、私はそれらを一緒に追加し、範囲内に保つために結果としての波を掛ける必要がありますか?私はこれのようにすることができます:サウンドウェーブをミキシングする(iOSのCoreAudio)

MaxAmplitude = max1 + max2 + max3 //Maximum amplitude of each sound wave 
if MaxAmplitude > 1 then //Over range 
    Output = (wave1 + wave2 + wave3)/MaxAmplitude //Meet range 
else 
    Output = (wave1 + wave2 + wave3) //Normal addition 
end if 

私はこのようにすることはできますか?実際の最大振幅を見つけるために音波を事前に解析する必要があります(最大点がタイムライン上で一致しない可能性があるため)。

私が欲しいのは、非常に音量を下げずにいくつかの合成音をシームレスに再生する方法です。私がいくつかの合成楽器で和音を演奏する場合、私は単音を実際には静かにする必要はありません。

ありがとうございます。

答えて

2

「if」文のように、1回のサンプルベースで急にスケールを変更すると、クリッピングと同様に非常に悪く聞こえることがあります。

適応AGC(自動利得制御)を調べると、スケール係数が緩やかに変化しますが、高速トランジェント時にはクリップが突然変化したり突然音量が変化する可能性があります。

AGCアルゴリズムでlookaheadを使用して突然のトランジェントがクリッピングしないようにすると、レイテンシが悪化します。

AGCを使用すると、単音が、コードで演奏されたときよりもはるかに大きな音で演奏されたように聞こえることがあります。これは、楽曲の意図を正しく表していない場合があります(このタイプの圧縮は、ラジオコマーシャル)。

ミキサーの出力音量を小さくして、音符が決してクリップされないようにするか、またはコンポジションが示すように音量を下げると、多数のチャンネルの音量が大幅に減少します(古典的に正しく再生される理由ラジオの音楽は、十分なお金を稼ぐのに十分な視聴者を描くにはあまりにも静かなことが多い)。

すべてのトレードオフです。

+0

ありがとうございます。私はさまざまなテクニックを試して、何が最善であるかを見ていきます。私は最良の解決策が見つかるまで、より多くの答えを歓迎します。 –

0

これは問題ではありません。すべての波の最大振幅を(すべての時間について)知っていればうまくいくはずです。サンプルごとに振幅を変えずに、すべての "ノートオン"を決定してください。それは非常に単純なアルゴリズムですが、あなたのニーズに合うかもしれません。

関連する問題