Как расширить звуковую волну в AS3? - PullRequest
0 голосов
/ 23 сентября 2011

Я реализую этот код для рисования звуковой волны.Он находится в Adobe Liveocs на SoundMixer .Моя проблема в том, как расширить звуковую волну?Например, я бы хотел, чтобы он был 655 пикселей.Я могу изменить его, чтобы рисовать на разные каналы, а также изменить высоту чертежа, но не могу найти, как изменить ширину всего чертежа

Есть идеи, как это сделать?

Спасибо.

  package {
     import flash.display.Sprite;
     import flash.display.Graphics;
     import flash.events.Event;
     import flash.media.Sound;
     import flash.media.SoundChannel;
      import flash.media.SoundMixer;
     import flash.net.URLRequest;
      import flash.utils.ByteArray;
     import flash.text.TextField;

    public class SoundMixer_computeSpectrumExample extends Sprite {

        public function SoundMixer_computeSpectrumExample() {
           var snd:Sound = new Sound();
           var req:URLRequest = new URLRequest("Song1.mp3");
           snd.load(req);

           var channel:SoundChannel;
           channel = snd.play();
           addEventListener(Event.ENTER_FRAME, onEnterFrame);
           channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
        }

       private function onEnterFrame(event:Event):void {
           var bytes:ByteArray = new ByteArray();
           const PLOT_HEIGHT:int = 25;
           const CHANNEL_LENGTH:int = 256;

           SoundMixer.computeSpectrum(bytes, false, 0);

           var g:Graphics = this.graphics;

           g.clear();

           g.lineStyle(0, 0x6600CC);
           g.beginFill(0x6600CC);
            g.moveTo(0, PLOT_HEIGHT);

           var n:Number = 0;

           for (var i:int = 0; i < CHANNEL_LENGTH; i++) {
               n = (bytes.readFloat() * PLOT_HEIGHT);
               g.lineTo(i * 2, PLOT_HEIGHT - n);
           }

           g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);
           g.endFill();

           g.lineStyle(0, 0xCC0066);
           g.beginFill(0xCC0066, 0.5);
           g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);

           for (i = CHANNEL_LENGTH; i > 0; i--) {
               n = (bytes.readFloat() * PLOT_HEIGHT);
               g.lineTo(i * 2, PLOT_HEIGHT - n);
           }

           g.lineTo(0, PLOT_HEIGHT);
           g.endFill();
        }

         private function onPlaybackComplete(event:Event):void {
             removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
     }
 }

1 Ответ

2 голосов
/ 23 сентября 2011

измените коэффициент x в ваших вызовах lineTo (x, y).

например, измените:

g.lineTo(i * 2, PLOT_HEIGHT - n);

на что-то вроде:

var xfactor:Number = 655/256;
g.lineTo(i * xfactor, PLOT_HEIGHT - n);

Поскольку xfactor исправлен, рассчитайте его, прежде чем вводить свои циклы (не в них (

...