Guest

SimplePiano.as by Ian Icasiano,2011 Philippine 5kb Challeng

By: object404 on Dec 27th, 2011  |  syntax: ActionScript 3  |  size: 4.96 KB  |  hits: 101  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. package {import flash.display.Sprite;import flash.events.SampleDataEvent;import flash.media.Sound;import flash.media.SoundChannel;import flash.events.KeyboardEvent;import flash.ui.Keyboard;import flash.events.MouseEvent;import flash.utils.setTimeout;import flash.text.TextField;import flash.text.TextFormat;import flash.filters.GlowFilter;import flash.filters.DropShadowFilter;
  2. [SWF(backgroundColor="0xf4f4f4", width="530", height="220")]
  3. /**2011 Phlashers.com 5KB Challenge entry by Ian Icasiano, @ cyril dot icasiano at gmail dot com**/
  4.         public class SimplePiano extends Sprite {
  5.                 var snd:Sound,samples:Number=2049;
  6.                 var keyDwn:Vector.<Boolean>=new Vector.<Boolean>(300,true);
  7.                 var regKeys:Vector.<uint>=new Vector.<uint>();
  8.                 var pressd:Vector.<Vector.<Number>> = new Vector.<Vector.<Number>>(500, true);
  9.                 var ctrl:Vector.<uint>=new Vector.<uint>(200,true);
  10.                 var sndsArr:Vector.<Number>=new Vector.<Number>();
  11.                 const TWO_PI:Number = 2*Math.PI,PI2_OVR_SR:Number=TWO_PI/44100;
  12.                 var keys:Array = new Array();
  13.                 var ctrls:Array = [90,83,88,68,67,86,71,66,72,78,74,77,69,52,82,53,84,89,55,85,56,73,57,79,80];//keycodes
  14.                 function SimplePiano(){
  15.                         sndsArr.push(65.41);//initialize sounds base at 65.41Hz
  16.                         for (var i:uint = 1; i <61; i++)sndsArr.push(sndsArr[i-1] * 1.0594630943593);
  17.                         for (var c:uint=25;c<50;c++){
  18.                                 var ct:uint=c-25; ctrl[ctrls[ct]]=c;//choose only notes from C3 to C5
  19.                         }
  20.                         stage.addEventListener(KeyboardEvent.KEY_DOWN,dwnLstnr);
  21.                         stage.addEventListener(KeyboardEvent.KEY_UP,upLstnr);
  22.                         snd = new Sound();snd.addEventListener(SampleDataEvent.SAMPLE_DATA, writeData);snd.play();
  23.                         var jump:uint = 3,nextJump:uint=2,keyCtr:uint= 0;
  24.                         for (var ctr:uint = 0; ctr < 15; ctr++){//15 white keys
  25.                                 var spr:Sprite;
  26.                                 spr = createKey(keyCtr,34,200,Math.random()*0xFFFFFF);
  27.                                 spr.x = 10 + spr.width*ctr;spr.y = 10;
  28.                                 keys.push(spr);keyCtr++;addChildAt(spr,0);
  29.                                 if (ctr == nextJump){
  30.                                         (jump==3)?jump=4:(jump==4)?jump=3:jump;
  31.                                         nextJump +=jump;
  32.                                 }else if (ctr != 14){//10 black keys
  33.                                         spr = createKey(keyCtr,17,120,0x000000);
  34.                                         spr.x = Sprite(keys[keys.length-1]).x + (spr.width *1.5);spr.y = 10;
  35.                                         keys.push(spr);keyCtr++;addChild(spr);
  36.                                 }
  37.                         }
  38.                 }
  39.                 function createKey(indx:uint=-1,kW:uint=0,kH:uint=0,keyC:uint=0):Sprite{
  40.                         var spr:Sprite,tF:TextField=new TextField(),tFmt:TextFormat=new TextFormat(),bevel:DropShadowFilter=new DropShadowFilter();
  41.                         var sg:*;
  42.                         spr = new Sprite();sg = spr.graphics;
  43.                         sg.beginFill(keyC);sg.drawRoundRect(0,0,kW,kH,10,10);sg.endFill();
  44.                         spr.width = kW; spr.height = kH;spr.buttonMode = true;
  45.                         tF.text = String.fromCharCode(ctrls[indx]);
  46.                         tF.width = spr.width;tF.height = 20;tF.y =spr.height- 20;
  47.                         tFmt.align = "center"; tFmt.color = 0xffffff; tF.setTextFormat(tFmt); tF.selectable = false;
  48.                         tF.filters = [bevel];
  49.                         spr.addChild(tF);
  50.                         spr.mouseChildren=false;
  51.                         spr.addEventListener(MouseEvent.CLICK, clckd);
  52.                         return (spr);
  53.                 }
  54.                 function clckd(e:MouseEvent){
  55.                         var ctr:uint = 0;
  56.                         for each(var key:Sprite in keys){
  57.                                 if (Sprite(e.target) == key){
  58.                                         prss(ctrl[ctrls[ctr]], ctrls[ctr]);
  59.                                         setTimeout(function (){unprss(ctrl[ctrls[ctr]],  ctrls[ctr]);}, 500);
  60.                                         break;
  61.                                 }
  62.                                 ctr++
  63.                         }
  64.                 }
  65.                 function anyKyDwn():Boolean{
  66.                         for (var ctr:uint = 0; ctr < 300; ctr++)
  67.                                 if (keyDwn[ctr])return (true);
  68.                         return (false);
  69.                 }
  70.                 function upLstnr(e:KeyboardEvent) {
  71.                         var k:uint=e.keyCode, ct:uint=ctrl[k];
  72.                         keyDwn[k] = false;
  73.                         (ct!=0)?unprss(ct,k):k;
  74.                         if (!anyKyDwn()&& regKeys.length > 0)
  75.                                 for each(var val:Number in regKeys) unprss(val);
  76.                 }
  77.                 function dwnLstnr(e:KeyboardEvent){
  78.                         var k:uint=e.keyCode, ct:uint=ctrl[k];
  79.                         keyDwn[k] = true;
  80.                         if (ct!= 0 && regKeys.indexOf(ct) == -1)prss(ct,k);
  81.                 }
  82.                 function unprss(kN:uint, keyCode:Number = -1){
  83.                         var id:*;
  84.                         id=keys[ctrls.indexOf(keyCode)];
  85.                         (id!=null)?id.filters =[]:null;
  86.                         id=regKeys.indexOf(kN);
  87.                         (id!=-1)?regKeys.splice(id,1):null;
  88.                         if (pressd[kN]== null)
  89.                                 return;
  90.                         pressd[kN][0] = null;pressd[kN][1] = null;pressd[kN] = null;
  91.                 }
  92.                 function prss(kN:uint, keyCode:Number=-1):void{
  93.                         var fil:GlowFilter = new GlowFilter();
  94.                         Sprite(keys[ctrls.indexOf(keyCode)]).filters = [fil];
  95.                         if (regKeys.length >2)return;
  96.                         if (pressd[kN]!=null)return;
  97.                         pressd[kN] = new Vector.<Number>(2);
  98.                         pressd[kN][0] = sndsArr[kN -1];
  99.                         pressd[kN][1] = new Number();
  100.                         regKeys.push(kN);
  101.                 }
  102.                 function writeData(e:SampleDataEvent){
  103.                         var amp:Number = 0.075, sample:Number, amplitude:Number = 0,rk:*;
  104.                         for(var i:Number = 0; i<samples; i++){
  105.                                 for each (var registeredKey:Number in regKeys){
  106.                                         rk=pressd[registeredKey];
  107.                                         if (rk!=null){
  108.                                                 sample =rk[1]<Math.PI?amp:-amp;
  109.                                                 rk[1]+=PI2_OVR_SR*rk[0];
  110.                                                 rk[1]=rk[1]<TWO_PI?rk[1]:rk[1]-TWO_PI;//create a square wave for each pressed key.
  111.                                                 amplitude += sample;
  112.                                         }
  113.                                 }
  114.                                 e.data.writeFloat((amplitude)/18);//32 bit for left and right
  115.                                 e.data.writeFloat((amplitude)/18);
  116.                         }
  117.                 }
  118.         }
  119. }