我有這個很酷的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文件並使用它?因爲主文件已經有它自己的包和類,所以我不能將它打到同一個文件中。
基本上我在這裏要做的是加載一個聲音文件,播放它,並改變它與我已有的值有關的音高。
在此先感謝。
嗨。非常感謝您的快速回復。它必須是那麼簡單的事情。現在,它會成功加載聲音文件併爲我播放,但Flash Builder不喜歡第二行:「pitcher.rate = 2;」 「訪問未定義的屬性投手」,即使我像上面那樣立即在上面聲明它。另外當我寫「投手」時。它確實給出了「率」的建議......嗯..它有多難。 – Dusty 2012-03-19 14:47:08
啊。顯然,「pitcher.rate」必須在一個函數內才能被識別。謝謝。 – Dusty 2012-03-19 15:04:57
對,你不能在類中的函數之外編寫代碼。你只能聲明變量。 – Kodiak 2012-03-19 16:05:08