This program demonstrates how to perform a signal processing operation on sound data and play it back. If you left-click the box above, you can hear the clip saying “XoaX.net” that I have been using in the other examples played at double speed. Note that if you want to hear the clip played a second time, you need to refresh the page.
The code is shown below. The first three lines output the “Click To Play” message. The next two lines create two Sound objects. The two lines after those set an event listener that is called when the file loads and then call load() to load the mp3 file.
The remaining code consists of three functions. The first function, FinishedLoading(), is called when the file is loaded since it was set as the callback. The FinishedLoading() function sets PlaySound() as a callback function for mouse clicks. Doing this prevents the PlaySound() from being called before the sound file is loaded.
The second function, PlaySound(), sets the DoubleSpeed() function as a callback when data is requested for the destination sound. Then it calls play(), which triggers a series of data requests as the sound plays.
The third function, DoubleSpeed(), calls the extract() function to retrieve data into the source byte array. Inside the while loop, each pair of source samples is averaged and then written into the destination array. Finally, the destination byte array is written back into the SampleDataEvent object.
// Output the initial instructions to user
var qInstructions:TextField = new TextField();
qInstructions.text = "Click To Play";
addChild(qInstructions);
var qSrc:Sound = new Sound();
var qDest:Sound = new Sound();
qSrc.addEventListener(Event.COMPLETE, FinishedLoading);
qSrc.load(new URLRequest("http://www.xoax.net/public/XoaXDotNet.mp3"));
function FinishedLoading(e:Event):void {
stage.addEventListener(MouseEvent.CLICK, PlaySound);
}
function PlaySound(e:Event):void {
qDest.addEventListener(SampleDataEvent.SAMPLE_DATA, DoubleSpeed);
qDest.play();
}
function DoubleSpeed(e:SampleDataEvent) {
var qSrcBytes:ByteArray = new ByteArray();
qSrc.extract(qSrcBytes, 8192);
var qDestBytes:ByteArray = new ByteArray();
var dLeft:Number = 0;
var dRight:Number = 0;
qSrcBytes.position = 0;
// Read and average two samples
while (qSrcBytes.bytesAvailable > 0) {
dLeft = qSrcBytes.readFloat();
dRight = qSrcBytes.readFloat();
if (qSrcBytes.bytesAvailable > 0) {
dLeft = (dLeft + qSrcBytes.readFloat())/2.0;
dRight = (dRight + qSrcBytes.readFloat())/2.0;
qDestBytes.writeFloat(dLeft);
qDestBytes.writeFloat(dRight);
}
}
e.data.writeBytes(qDestBytes);
}