2012-03-19 24 views
0

我有這個很酷的AS3 MP3pitch包,這是我從這裏得到:http://blog.andre-michelle.com/2009/pitch-mp3/#more-483AS3如何調用和使用外部類

package components 
{ 
import flash.events.Event; 
import flash.events.SampleDataEvent; 
import flash.media.Sound; 
import flash.net.URLRequest; 
import flash.utils.ByteArray; 

/** 
* @author Andre Michelle ([email protected]) 
*/ 
public class MP3Pitch 
{ 
    private const BLOCK_SIZE: int = 3072; 

    private var _mp3: Sound; 
    private var _sound: Sound; 

    private var _target: ByteArray; 

    private var _position: Number; 
    private var _rate: Number; 

    public function MP3Pitch(url: String) 
    { 
     _target = new ByteArray(); 

     _mp3 = new Sound(); 
     _mp3.addEventListener(Event.COMPLETE, complete); 
     _mp3.load(new URLRequest(url)); 

     _position = 0.0; 
     _rate = 1.0; 

     _sound = new Sound(); 
     _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleData); 
    } 

    public function get rate(): Number 
    { 
     return _rate; 
    } 

    public function set rate(value: Number): void 
    { 
     if(value < 0.0) 
      value = 0; 

     _rate = value; 
    } 

    private function complete(event: Event): void 
    { 
     _sound.play(); 
    } 

    private function sampleData(event: SampleDataEvent): void 
    { 
     //-- REUSE INSTEAD OF RECREATION 
     _target.position = 0; 

     //-- SHORTCUT 
     var data: ByteArray = event.data; 

     var scaledBlockSize: Number = BLOCK_SIZE * _rate; 
     var positionInt: int = _position; 
     var alpha: Number = _position - positionInt; 

     var positionTargetNum: Number = alpha; 
     var positionTargetInt: int = -1; 

     //-- COMPUTE NUMBER OF SAMPLES NEED TO PROCESS BLOCK (+2 FOR INTERPOLATION) 
     var need: int = Math.ceil(scaledBlockSize) + 2; 

     //-- EXTRACT SAMPLES 
     var read: int = _mp3.extract(_target, need, positionInt); 

     var n: int = read == need ? BLOCK_SIZE : read/_rate; 

     var l0: Number; 
     var r0: Number; 
     var l1: Number; 
     var r1: Number; 

     for(var i: int = 0 ; i < n ; ++i) 
     { 
      //-- AVOID READING EQUAL SAMPLES, IF RATE < 1.0 
      if(int(positionTargetNum) != positionTargetInt) 
      { 
       positionTargetInt = positionTargetNum; 

       //-- SET TARGET READ POSITION 
       _target.position = positionTargetInt << 3; 

       //-- READ TWO STEREO SAMPLES FOR LINEAR INTERPOLATION 
       l0 = _target.readFloat(); 
       r0 = _target.readFloat(); 

       l1 = _target.readFloat(); 
       r1 = _target.readFloat(); 
      } 

      //-- WRITE INTERPOLATED AMPLITUDES INTO STREAM 
      data.writeFloat(l0 + alpha * (l1 - l0)); 
      data.writeFloat(r0 + alpha * (r1 - r0)); 

      //-- INCREASE TARGET POSITION 
      positionTargetNum += _rate; 

      //-- INCREASE FRACTION AND CLAMP BETWEEN 0 AND 1 
      alpha += _rate; 
      while(alpha >= 1.0) --alpha; 
     } 

     //-- FILL REST OF STREAM WITH ZEROs 
     if(i < BLOCK_SIZE) 
     { 
      while(i < BLOCK_SIZE) 
      { 
       data.writeFloat(0.0); 
       data.writeFloat(0.0); 

       ++i; 
      } 
     } 

     //-- INCREASE SOUND POSITION 
     _position += scaledBlockSize; 
    } 
} 

} 

我怎麼能包括它變成我的「主」 AS3文件並使用它?因爲主文件已經有它自己的包和類,所以我不能將它打到同一個文件中。

基本上我在這裏要做的是加載一個聲音文件,播放它,並改變它與我已有的值有關的音高。

在此先感謝。

回答

1

你必須創建一個文件夾具有相同的名稱作爲包(這裏components),並把這個類在裏面。然後從你的主,導入這個類:

import components.MP3Pitch 

你只需要實例化這個類,並在代碼中使用它:

var pitcher:MP3Pitch = new MP3Pitch("mymp3.mp3"); 
pitcher.rate = 2; 
+0

嗨。非常感謝您的快速回復。它必須是那麼簡單的事情。現在,它會成功加載聲音文件併爲我播放,但Flash Builder不喜歡第二行:「pitcher.rate = 2;」 「訪問未定義的屬性投手」,即使我像上面那樣立即在上面聲明它。另外當我寫「投手」時。它確實給出了「率」的建議......嗯..它有多難。 – Dusty 2012-03-19 14:47:08

+0

啊。顯然,「pitcher.rate」必須在一個函數內才能被識別。謝謝。 – Dusty 2012-03-19 15:04:57

+0

對,你不能在類中的函數之外編寫代碼。你只能聲明變量。 – Kodiak 2012-03-19 16:05:08

0
package { 

import components.MP3Pitch; 

public class Main extends Sprite 
{ 
    public function Main() { 
     new MP3Pitch("http://path-to-mp3-file.com/"); 
    } 

} 
} 
+0

感謝非常快速回復。 – Dusty 2012-03-19 15:05:18