1

SampleDataEventを使ってAS3で正弦波音を作っています。純粋な正弦波を簡単に作成できますが、周波数をスイープしようとすると、ひどいポッピングが発生します。これが私が使用しているコードです-どんな助けも素晴らしいでしょう。

    package
    {
        import flash.display.*;
        import flash.events.*;
        import flash.media.*;
        import flash.utils.Timer;

        public class DynamicSound extends Sprite
        {
            private var sound:Sound;
            private var noise:Number = 0;
            private var f:Number = 1000;
            private var v:Number = 1;
            private var sweepDown:Boolean = true;

            // make the sound
            public function DynamicSound():void
            {
                sound = new Sound();
                sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onCallback);
                sound.play();
                sweep();
            }

            // create the sinewave
            private function onCallback(e:SampleDataEvent):void
            {
                for (var i:int = 0; i < 8192; i++)
                {
                    noise += 1;
                    var sampleNumber = noise;
                    e.data.writeFloat(v * Math.sin(sampleNumber * f / 44100));
                    e.data.writeFloat(v * Math.sin(sampleNumber * f / 44100));

                }
            }

            // sweep up and down frequency
            private function sweep() {
                var timer:Timer = new Timer(100);
                timer.addEventListener(TimerEvent.TIMER, onTimer);
                timer.start();
                function onTimer(event:TimerEvent):void
                {
                    if(sweepDown){
                        f--;
                    } else {
                        f++;
                    }
                    if (f <=600 ){
                        sweepDown = false;
                    }
                    if (f >= 1000) {
                        sweepDown = true;
                    }
                trace(f);

                }
            }
        }
    }
4

2 に答える 2

2

欠点はアプローチにあると思います。スイープは緩やかである必要があり、そのようにステップすると、音波に急激な変化が生じます。これは、短い高周波信号(ポップまたはクリック)として解釈されます。この変調を行うことをお勧めする方法は、コールバック ループ内です。

目的の周波数 ( )dFと現在の周波数 ( cF) を設定し、ループ内で設定された突然の変更を行う代わりにcF = cF*0.8 + dF*0.2、これにより突然の変更が削除され、いくつかのサンプルで発生するはずです。

于 2013-06-19T17:01:00.027 に答える