topical media & game development

talk show tell print

student-mma-16-Clip1.mx

student-mma-16-Clip1.mx [swf] flex


  <?xml version="1.0" encoding="utf-8"?>
  <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="64" height="78">
          <mx:Script>
                  <![CDATA[
                          import mx.controls.Alert;
                          import mx.controls.Image;
                          import mx.controls.Label;
                          import de.popforge.audio.output.Audio;
                          import de.popforge.audio.output.Sample;
                          import de.popforge.format.wav.*;
                          
                          public static var 
                                  GREEN:int = 0,
                                  RED:int = 1,
                                  BLUE:int = 2,
                                  YELLOW:int = 3,
                                  
                                  STATE_ERROR:int = -1,
                                  STATE_INACTIVE:int = 0,
                                  STATE_LOADING:int = 1,
                                  STATE_IDLE:int = 2,
                                  STATE_PLAYING:int = 3,
                                  
                                  TYPE_NOLOOP:int = 0,
                                  TYPE_LOOP:int = 1;
                          
                          public var color:int;
                          public var url:String = "";
                          public var title:String = "";
                          public var type:int = TYPE_NOLOOP;
                          public var length:int = 1;
                          
                          public var state:int = STATE_INACTIVE;
                          public var curBar:int = 1;
                          
                          private var buffer:AudioBuffer;
                          private var wav:WavFormat;
                          
                          private var sound:Sound;
                          private var trans:SoundTransform;
                          private var soundChannel:SoundChannel;
                          private var progressBar:Shape;
                          private var img:Image;
                          
                          private var c:int = 0;
                          private var numSamples:int;
                          
                          public function init():void {
                                  setImage();
                                  setLabel();
                                  createSound(url);
                          }
                          
                          public function launch():void {
                                  if(state == STATE_IDLE) {
                                          play();
                                          state = STATE_PLAYING;
                                          img.alpha = 1;
                                  }
                          }
                          
                          private function play():void {
                                  buffer.start();
                          }
                          
                          private function onAudioBufferInit( buffer: AudioBuffer ): void {
                                  //ready to launch
                                  state = STATE_IDLE;
                                  progressBar.graphics.clear();
                          }
                          
                          private function loadComplete(e:Event):void {
                                  wav = WavFormat.decode(ByteArray(e.target.data));
                                  
                                  //make sure the length in samples is correct
                                  if(type == TYPE_NOLOOP) {
                                          numSamples = wav.samples.length;
                                  }
                                  else {
                                          numSamples = Math.ceil(44100 * 1.920 * length);
                                          if(numSamples > wav.samples.length) {
                                                  //add silent samples at the end
                                                  Alert.show("adding samples");
                                                  for(var i:int = 0; i < numSamples - wav.samples.length; i++) {
                                                          wav.samples.push(new Sample());
                                                  }
                                          }
                                  }
                                  
                                  buffer = new AudioBuffer( 4, Audio.STEREO, Audio.BIT16, Audio.RATE44100 );
                                  buffer.onInit = onAudioBufferInit;
                                  buffer.onComplete = onAudioBufferComplete;
                          }
                          
                          private function onAudioBufferComplete(buffer: AudioBuffer): void {
                                  var samples: Array = buffer.getSamples();
                                  
                                  for(var i:int; i < samples.length; i++) {
                                          samples[i].left = wav.samples[c].left;
                                          samples[i].right = wav.samples[c].right;
                                          c++;
                                          if(c == wav.samples.length) {
                                                  if(type == TYPE_NOLOOP) {
                                                          stop();
                                                          break;
                                                  }
                                                  c = 0;
                                          }
                                  }
                                  buffer.update();
                          }
                          
                          public function stop():void {
                                  //soundChannel.stop();
                                  buffer.stop();
                                  state = STATE_IDLE;
                                  img.alpha = 0.5;
                          }
                          
                          public function setVolume(vol:Number):void {
                                  /* if(vol < 0 || vol > 1) return;
                                  trans.volume = vol;
                                  soundChannel.soundTransform = trans; */
                          }
                          
                          private function setImage():void {
                                  var src:String = "student-mma-16-img-final-";
                                  
                                  switch(color) {
                                          case RED: src += "loop-red.png"; break;
                                          case BLUE: src += "loop-blue.png"; break;
                                          case YELLOW: src += "loop-yellow.png";break;
                                          default: src += "loop-green.png";
                                  }
                                  
                                  img = new Image();
                                  img.source = src;
                                  img.width = 64;
                                  img.height = 78;
                                  img.alpha = 0.5;
                                  this.addChild(img);
                          }
                          
                          private function setLabel():void {
                                  var label:Label = new Label();
                                  label.text = title;
                                  label.x = 10;
                                  label.y = 24;
                                  label.styleName = "loopLabel";
                                  label.truncateToFit = false;
                                  label.width = 46;
                                  label.setStyle("color", getColor(color));
                                  this.addChild(label);
                          }
                          
                          private function createSound(url:String):void {
                                  var loader:URLLoader = new URLLoader();  
                                  loader.dataFormat = URLLoaderDataFormat.BINARY;  
                                  loader.addEventListener(Event.COMPLETE, loadComplete );
                                  loader.addEventListener(IOErrorEvent.IO_ERROR, loadError );
                                  loader.addEventListener(ProgressEvent.PROGRESS, updateProgress);
                                  createProgressBar();
                                  loader.load( new URLRequest(url));
                                  
                                  trans = new SoundTransform();
                          }
                          
                          public static function getColor(color:int):uint {
                                  switch(color) {
                                          case RED: return 0x7d0000;
                                          case BLUE: return 0x00527d;
                                          case YELLOW: return 0x7c7d00;
                                          default: return 0x007d11;
                                  }
                          }
                          
                          private function createProgressBar():void {
                                  progressBar = new Shape();
                                  this.rawChildren.addChild(progressBar);
                          }
                          
                          private function updateProgress(e:ProgressEvent):void {
                                  var width:int = (e.bytesLoaded / e.bytesTotal) * 62;
                                  progressBar.graphics.clear();
                                  progressBar.graphics.beginFill(0xFFFFFF);
                                  progressBar.graphics.drawRect(1, 65, width, 12);
                          }
                          
                          private function loadError(e:IOErrorEvent):void {
                                  state = STATE_ERROR;
                          }
                  ]]>
          </mx:Script>
          
          
  </mx:Canvas>
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.