0

actionscript 3 でデッド検出を実行しようとしています。私の考えは、周波数スペクトルを表す x 軸上にドットの配列 (MovieClips) を作成することです。SoundMixer.computeSpectrum(bytes, true, 0); 真に設定されています。配列の最初のドット インスタンスにアクセスするにはどうすればよいですか。次に、現在の各フレームで最高値を確認し、最後の値と比較して測定します。しきい値を設定する必要があると思います。値がしきい値の範囲内にある場合、ビートと呼ばれます....私は迷っています。誰かが私を正しい方向に向けることができます..

前もって感謝します。

var snd: Sound = new Sound();
var req: URLRequest = new URLRequest("mySong.mp3");
snd.load(req);

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

const CHANNEL_LENGTH: int = 256;
const BUFFER_LENGTH: int = 512;
var dot:Dot;

dot.cacheAsBitmap = true;
var myArray:Array = new Array();
var bytes:ByteArray = new ByteArray();

function onEnterFrame(event: Event): void 
{

  SoundMixer.computeSpectrum(bytes, true, 0);


   for (var i:int = 0; i < CHANNEL_LENGTH; i+=8) // channel_length = 256
   {


     var sampleValue:Number = bytes.readFloat();
     dot = new Dot();
     dot.x = i * 2;
     dot.y = sampleValue * 250; //50 + (i * 30)
     addChild(dot);
     myArray.push(dot);
   }

}

4

1 に答える 1

1

あなたが何をしようとしているのかわからない。

しかし、サウンド スペクトル ビジュアライザーを実行したい場合は、その方向性は正しいと思います。

私はあなたがすることに従い、次のような結果を得ます: ( http://www.imageupload.co.uk/5M3n ) これらのドットは音楽に合わせて踊ります

移動するかdot.cacheAsBitmap = true;dot = new Dot(); 削除することができます。

Dot クラスでは、しばらくしてから自分自身を破棄することを忘れないでください。

しかし、実際にmyArrayはまったく使用する必要はありません。

これが私のコードです:

import flash.events.Event;

var snd: Sound = new Sound();
var req: URLRequest = new URLRequest("mySong.mp3");
snd.load(req);

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

const CHANNEL_LENGTH: int = 256;
const BUFFER_LENGTH: int = 512;
var dot:Dot;

var myArray:Array;
var bytes:ByteArray = new ByteArray();

function onEnterFrame(event: Event): void 
{

  SoundMixer.computeSpectrum(bytes, true, 0);
  myArray = [];

   for (var i:int = 0; i < CHANNEL_LENGTH; i+=8) // channel_length = 256
   {


     var sampleValue:Number = bytes.readFloat();
     dot = new Dot();
     dot.cacheAsBitmap = true;
     dot.x = i * 2;
     dot.y = sampleValue * stage.StageHeight;
     addChild(dot);
     myArray.push(dot);
   }
   var firstElement:Dot = myArray.length>0?myArray[0]:null;
   if(firstElement)
   {
      handleWithFirstElement(firstElement);
   }
}

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

function handleWithFirstElement(ele:Dot):void
{
   //your code
}

そしてドットクラスでは:

flash.utils.setTimeout(this.parent.removeChild, 100, this);
// Run this just after added on Stage
于 2014-12-16T03:36:35.513 に答える