簡単な正弦波音源を作りました。問題は、トーンが再生されるときに強いクリック音が聞こえることです。これを回避するには、速いフェードイン (アタック タイム) を実装する必要があります。
トゥイーン (tweenmax など) を使用してみましたが、オーディオに歪みが生じます (トゥイーンのステップでしょうか?)。このテーマに関する漠然としたチュートリアルをいくつか見つけましたが、特にアタックタイムに関するものは何もありませんでした。
これどうやってするの?
簡単な正弦波音源を作りました。問題は、トーンが再生されるときに強いクリック音が聞こえることです。これを回避するには、速いフェードイン (アタック タイム) を実装する必要があります。
トゥイーン (tweenmax など) を使用してみましたが、オーディオに歪みが生じます (トゥイーンのステップでしょうか?)。このテーマに関する漠然としたチュートリアルをいくつか見つけましたが、特にアタックタイムに関するものは何もありませんでした。
これどうやってするの?
フェードをスムーズにするには、合成ループ内でサンプルごとにインクリメントする必要があります。トゥイーンエンジンは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を微調整する必要がある場合があります。