2

簡単な正弦波音源を作りました。問題は、トーンが再生されるときに強いクリック音が聞こえることです。これを回避するには、速いフェードイン (アタック タイム) を実装する必要があります。

トゥイーン (tweenmax など) を使用してみましたが、オーディオに歪みが生じます (トゥイーンのステップでしょうか?)。このテーマに関する漠然としたチュートリアルをいくつか見つけましたが、特にアタックタイムに関するものは何もありませんでした。

これどうやってするの?

4

1 に答える 1

2

フェードをスムーズにするには、合成ループ内でサンプルごとにインクリメントする必要があります。トゥイーンエンジンは1秒間に何度も更新される場合がありますが、クリックすると耳に変化が聞こえます。

sampleDataイベントハンドラーでは、個々のサンプルにボリューム修飾子を掛ける必要があります。範囲は0〜1で、サンプルごとに増分します。

サウンドをすばやくフェードインするには、まず音量を0に設定し、1.0に達するまで、サンプルごとに小さな値を追加します。後でこれをより複雑なエンベロープコントローラに拡張できます。

これはあなたが始めるかもしれないものの大まかな例です:

for( i = 0; i < length; i++ ) {
    _count++;
    factor = _frequency * Math.PI * 2 / 4400;
    volume += 1.0 / 4400;
    if( volume > 1.0 ) volume = 1.0; //don't actually do it like this, ok?
    n = Math.sin( (_count) * factor ) * volume;
    _buffer.writeFloat(n); 
    _buffer.writeFloat(n); 
}

注:このスニペットはテストしていません。また、本番環境で使用することもお勧めしません。大まかに言っておくだけです。

あなたのために働くかもしれないもう一つのテクニックは、ボリュームに緩和/遅延を置くことです。常に特定の速度でターゲットボリュームを「追跡」するvolumeEase変数を使用します。これにより、ボリュームを変更するときのクリックを防ぎ、より長い封筒を作成するために使用できます。

var volume:Number = 0; // the target volume
var volumeEase:Number = 1.0; // the value to use in the signal math
var volumeEaseSpeed:Number = 0.001; // tweak this to control responsiveness of ease

for( i = 0; i < length; i++ ) {
    _count++;

    // bring the volumeEase closer to the target:
    volumeEase += ( volume - volumeEase ) * volumeEaseSpeed;

    factor = _frequency * Math.PI * 2 / 4400;

    //use volumeEase in the maths, rather than 'volume':
    n = Math.sin( (_count) * factor ) * volumeEase;
    _buffer.writeFloat(n); 
    _buffer.writeFloat(n); 
}

必要に応じて、線形補間を使用して、一定の速度でターゲットに向かって「向かって」進むことができます。

繰り返しになりますが、スニペットはテストされていないため、volumeEaseSpeedを微調整する必要がある場合があります。

于 2012-11-25T10:03:55.050 に答える