2013-06-19 69 views
1

我使用SampleDataEvent使AS3发出正弦波音效。我可以轻松制作出纯正的正弦波,但是如果我试图通过频率扫描,我会得到可怕的爆音。这里是我使用的代码 - 任何帮助都会很棒。使用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); 

       } 
      } 
     } 
    } 

回答

1

我认为故障是与进近时,扫描需要循序渐进,当你踩它像您所创建的声波,这被解释为一个短的高频信号的突然变化 - 一个流行或点击。我建议你做这种调制的方式是在回调循环内。

设定目的地频率(dF)和电流频率(cF),而不是做一个突然的变化设置cF = cF*0.8 + dF*0.2内循环,这应该删除急剧变化,并将它发生在几个样品。