1. // forked from keim_at_Si's 音楽を付けざるを得ない from:from:Ground
  2. // Ground.as
  3. //  Display a 3d ground surface and pillars.
  4. //  Control: Arrow keys or [WASD] keys.
  5. package
  6. {
  7.   import flash.display.Sprite;
  8.   import flash.display.BitmapData;
  9.   import flash.display.Bitmap;
  10.   import flash.geom.Rectangle;
  11.   import flash.events.Event;
  12.   import flash.events.KeyboardEvent;
  13.   import flash.events.SampleDataEvent;
  14.   import flash.media.Sound;
  15.   [SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
  16.   public class Ground extends Sprite
  17.   {
  18.     private const SCREEN_WIDTH:int = 465;
  19.     private const SCREEN_HEIGHT:int = 465;
  20.     private const COUNT:int = 512;
  21.     private const NEAR_PLANE_DIST:Number = 0.6;
  22.     private const PROJECTION_RATIO:Number = 250;
  23.     private const LOD_RATIO:Number = 1.05;
  24.     private const LOD_START_COUNT:Number = 16;
  25.     private const PILLARS_COUNT:int = 32;
  26.     private const WIRE_WIDTH:int = 2;
  27.     private const HAR_SPEED:Number = 11;
  28.     private const BACK_R:int = 210, BACK_G:int = 190, BACK_B:int = 240;
  29.     private var buffer:BitmapData;
  30.     private var left:Boolean, up:Boolean, right:Boolean, down:Boolean;
  31.     private var rect:Rectangle;
  32.     private var degs:Array;
  33.     private var index:int;
  34.     private var offset:Number;
  35.     private var gys:Array, gzs:Array, gcs:Array, gas:Array, gIndices:Array;
  36.     private var gCount:int;
  37.     private var sightX:Number, sightY:Number;
  38.     private var pillars:Array;
  39.     private var pillarRect:Rectangle;
  40.     private var harX:Number, harY:Number;
  41.     private var wireRect:Rectangle;
  42.     private var _sound:Sound;
  43.     private var _sequencer:Sequencer;
  44.     private var _module:TinySiOPM;
  45.     public function Ground()
  46.     {
  47.       buffer = new BitmapData(SCREEN_WIDTH, SCREEN_HEIGHT, false0);
  48.       var screen:Bitmap = new Bitmap(buffer);
  49.       addChild(screen);
  50.       rect = new Rectangle;
  51.       pillarRect = new Rectangle;
  52.       gys = new Array;
  53.       gzs = new Array;
  54.       gcs = new Array;
  55.       gas = new Array;
  56.       gIndices = new Array;
  57.       var di:Number = 0;
  58.       var did:Number = 1.0;
  59.       gCount = 0;
  60.       while (di < COUNT)
  61.       {
  62.         gys.push(0.0);
  63.         gzs.push(0.0);
  64.         gcs.push(int(0));
  65.         gas.push(int(0));
  66.         gIndices.push(int(0));
  67.         if (di > LOD_START_COUNT)
  68.           did *= LOD_RATIO;
  69.         di += did;
  70.         gCount++;
  71.       }
  72.       var i:int;
  73.       degs = new Array;
  74.       for (i = 0; i < COUNT; i++)
  75.       {
  76.         var d:Number;
  77.         if (i < COUNT / 4)
  78.           d = -0.001;
  79.         else if (i < COUNT / 2)
  80.           d = 0.002;
  81.         else if (i < COUNT / 4 * 3)
  82.           d = -0.003;
  83.         else
  84.           d = 0.004;
  85.         degs.push(d);
  86.       }
  87.       pillars = new Array;
  88.       for (i = 0; i < PILLARS_COUNT; i++)
  89.       {
  90.         var p:Pillar = new Pillar;
  91.         p.x = (Math.random() * 2.0 - 1.0) * 200;
  92.         p.z = Math.random() * COUNT;
  93.         p.width = 2;
  94.         p.height = 10 + Math.random() * 15;
  95.         pillars.push(p);
  96.       }
  97.       index = 0;
  98.       offset = 0;
  99.       sightX = sightY = 0;
  100.       harX = harY = 0;
  101.       wireRect = new Rectangle;
  102.       initializeSound();
  103.       _sound.play();
  104.       stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
  105.       stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
  106.       addEventListener(Event.ENTER_FRAME, onEnterFrame);
  107.     }
  108.     private function onEnterFrame(evt:Event):void
  109.     {
  110.       buffer.fillRect(buffer.rect, BACK_R * 0x10000 + BACK_G * 0x100 + BACK_B);
  111.       goForward(3.3);
  112.       drawGroundAndPillars();
  113.       updateHar();
  114.     }
  115.     private function drawGroundAndPillars():void
  116.     {
  117.       var idx:int = index;
  118.       var d:Number = degs[idx];
  119.       var dv:Number = -offset * d;
  120.       var y:Number = 5 - offset * d;
  121.       var z:Number = 1.0 - offset;
  122.       var di:Number = 0;
  123.       var did:Number = 1.0;
  124.       var i:int;
  125.       var gi:int = 0;
  126.       var r:Number;
  127.       for (i = 0; i < COUNT; i++)
  128.       {
  129.         var py:Number = y;
  130.         var pz:Number = z;
  131.         dv += degs[idx] + sightY * 0.00002;
  132.         y += dv;
  133.         z += 1.0;
  134.         if (i > di)
  135.         {
  136.           r = Number(i) - di;
  137.           gys[gi] = py * r + y * (1 - r);
  138.           gzs[gi] = pz * r + z * (1 - r);
  139.           var a:int = 255 - int(i * 255 / COUNT);
  140.           gas[gi] = a;
  141.           if (idx % 16 < 8)
  142.             gcs[gi] = createColor(0x77, 0xbb, 0x77, a);
  143.           else
  144.             gcs[gi] = createColor(0x99, 0x99, 0x99, a);
  145.           gIndices[gi] = idx;
  146.           gi++;
  147.           if (di > LOD_START_COUNT)
  148.             did *= LOD_RATIO;
  149.           di += did;
  150.         }
  151.         idx++;
  152.         if (idx >= COUNT)
  153.           idx = 0;
  154.       }
  155.       rect.x = 0;
  156.       rect.width = SCREEN_WIDTH;
  157.       var sx:Number;
  158.       var sy:Number;
  159.       var psy:Number = 99999;
  160.       for (i = gCount - 1; i >= 0; i--)
  161.       {
  162.         y = gys[i];
  163.         z = gzs[i];
  164.         sy = y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  165.         if (sy > psy)
  166.         {
  167.           rect.y = psy;
  168.           rect.height = sy - psy;
  169.           buffer.fillRect(rect, gcs[i]);
  170.         }
  171.         if (i < gCount - 1)
  172.         {
  173.           for (var j:int = 0; j < PILLARS_COUNT; j++)
  174.           {
  175.             var p:Pillar = pillars[j];
  176.             if (gIndices[i] > gIndices[i + 1])
  177.             {
  178.               drawPillar(p, gIndices[i], gIndices[i + 1] + COUNT, i);
  179.               drawPillar(p, gIndices[i] - COUNT, gIndices[i + 1], i);
  180.             }
  181.             else
  182.             {
  183.               drawPillar(p, gIndices[i], gIndices[i + 1], i);
  184.             }
  185.           }
  186.         }
  187.         psy = sy;
  188.       }
  189.     }
  190.     private function drawPillar(p:Pillar, si:int, ei:int, i:int):void
  191.     {
  192.       if (p.z >= si && p.z < ei)
  193.       {
  194.         var r:Number = Number(ei - p.z) / (ei - si);
  195.         var y:Number = gys[i] * r + gys[i + 1] * (1 - r);
  196.         var z:Number = gzs[i] * r + gzs[i + 1] * (1 - r);
  197.         var sx:Number = (p.x - sightX) * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_WIDTH / 2;
  198.         var sy:Number = y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  199.         var sh:Number = NEAR_PLANE_DIST / z * PROJECTION_RATIO;
  200.         for (var j:int = 0; j < 5; j++)
  201.         {
  202.           pillarRect.x = sx - sh * p.width * 2 / 5 * j;
  203.           pillarRect.y = sy - sh * p.height;
  204.           pillarRect.width = sh * p.width * 2 / 5;
  205.           pillarRect.height = sh * p.height * 2;
  206.           buffer.fillRect(pillarRect, createColor(0x77 + 0x11 * j, 0x77 + 0x11 * j, 0xcc, gas[i]));
  207.         }
  208.       }
  209.     }
  210.     private function createColor(r:int, g:int, b:int, a:int):int
  211.     {
  212.       return int((r * a + BACK_R * (256 - a)) / 256) * 0x10000 +
  213.              int((g * a + 230 * (256 - a)) / 256) * 0x100 +
  214.              int((b * a + BACK_B * (256 - a)) / 256);
  215.     }
  216.     private function goForward(v:Number):void
  217.     {
  218.       offset += v;
  219.       while (offset >= 1.0)
  220.       {
  221.         offset -= 1.0;
  222.         index++;
  223.         if (index >= COUNT)
  224.           index -= COUNT;
  225.       }
  226.     }
  227.     private function updateHar():void
  228.     {
  229.       if (right && harX < SCREEN_WIDTH / 2 - 20)
  230.         harX += HAR_SPEED;
  231.       if (left && harX > -SCREEN_WIDTH / 2 + 20)
  232.         harX -= HAR_SPEED;
  233.       if (up && harY < SCREEN_HEIGHT / 2 - 40)
  234.         harY += HAR_SPEED;
  235.       if (down && harY > -SCREEN_HEIGHT / 2 + 40)
  236.         harY -= HAR_SPEED;
  237.       sightX = harX * 0.4;
  238.       sightY = harY * 0.6;
  239.       var hx:int = harX + SCREEN_WIDTH / 2;
  240.       var hy:int = harY + SCREEN_HEIGHT / 2;
  241.       rect.x = hx - 12;
  242.       rect.y = hy - 30;
  243.       rect.width = 20;
  244.       rect.height = 40;
  245.       drawWireBox(rect, 0xdd7777);
  246.       rect.x++;
  247.       drawWireBox(rect, 0xaa4444);
  248.       rect.x = hx - 14;
  249.       rect.y = hy - 45;
  250.       rect.width = 16;
  251.       rect.height = 20;
  252.       drawWireBox(rect, 0xdddd77);
  253.       rect.x++;
  254.       drawWireBox(rect, 0xaaaa44);
  255.       rect.x = hx - 20;
  256.       rect.y = hy + 5;
  257.       rect.width = 12;
  258.       rect.height = 40;
  259.       drawWireBox(rect, 0x77dddd);
  260.       rect.x++;
  261.       drawWireBox(rect, 0x44aaaa);
  262.       rect.x = hx - 1;
  263.       rect.y = hy + 10;
  264.       rect.width = 15;
  265.       rect.height = 25;
  266.       drawWireBox(rect, 0x77dddd);
  267.       rect.x++;
  268.       drawWireBox(rect, 0x44aaaa);
  269.       rect.x = hx - 1;
  270.       rect.y = hy - 12;
  271.       rect.width = 16;
  272.       rect.height = 16;
  273.       drawWireBox(rect, 0xee4444);
  274.       rect.x++;
  275.       drawWireBox(rect, 0xbb2222);
  276.     }
  277.     private function drawWireBox(rect:Rectangle, color:int):void
  278.     {
  279.       wireRect.x = rect.x;
  280.       wireRect.y = rect.y;
  281.       wireRect.width = rect.width;
  282.       wireRect.height = WIRE_WIDTH;
  283.       buffer.fillRect(wireRect, color);
  284.       wireRect.y = rect.y + rect.height - WIRE_WIDTH;
  285.       buffer.fillRect(wireRect, color);
  286.       wireRect.y = rect.y;
  287.       wireRect.width = WIRE_WIDTH;
  288.       wireRect.height = rect.height;
  289.       buffer.fillRect(wireRect, color);
  290.       wireRect.x = rect.x + rect.width - WIRE_WIDTH;
  291.       buffer.fillRect(wireRect, color);
  292.     }
  293.     private function onKeyUp(evt:KeyboardEvent):void
  294.     {
  295.       switch (evt.keyCode)
  296.       {
  297.       case 0x25:
  298.       case 0x41:
  299.         left = false;
  300.         break;
  301.       case 0x26:
  302.       case 0x57:
  303.         up = false;
  304.         break;
  305.       case 0x27:
  306.       case 0x44:
  307.         right = false;
  308.         break;
  309.       case 0x28:
  310.       case 0x53:
  311.         down = false;
  312.         break;
  313.       }
  314.     }
  315.     private function onKeyDown(evt:KeyboardEvent):void
  316.     {
  317.       switch (evt.keyCode)
  318.       {
  319.       case 0x25:
  320.       case 0x41:
  321.         left = true;
  322.         break;
  323.       case 0x26:
  324.       case 0x57:
  325.         up = true;
  326.         break;
  327.       case 0x27:
  328.       case 0x44:
  329.         right = true;
  330.         break;
  331.       case 0x28:
  332.       case 0x53:
  333.         down = true;
  334.         break;
  335.       }
  336.     }
  337.     private function initializeSound():void
  338.     {
  339.       var A:String,B:String,C:String,D:String,E:String,F:String,G:String,H:String;
  340.       var M1:String="[f6ee16>g4a4<f6ee16>a+<crrf6ee16d4e4f16g+6g6f4]";
  341.       var M2:String="[e20>l4eg<d|c+12>a+a10gf2ef2d6el3fef2gfg2a12g+4<f8d8]";
  342.       var M3:String="c+16l2rec+>a+agfed12e4l3fef2gfg2a12g2<g10l1gab<cdefgl2o7";
  343.       A ="@11s8o6l2[[c12cc18|c10crc18]|c10<crc18]dddrrdrcr16> [s6"+M1+M2+M3+"]";
  344.       B ="@7l2[4e12ef18|f10fre18]fffrrfrer16 [l2s6v6[[c6>brr<d6crr>|b<crrc6>a+rr<d6crr>a+<crr]b4<c4c10dedd6c6d4]";
  345.       B+="s2l4[e28dc+16>a+8ag<d16c8d8|c16d8f8]c14g18]";
  346.       C ="@7l2[4c12cc18|c10crc18]dddrrdrcr16 >[l2s6v6[[g6grrg6grrggrr]8a6arra6al4raaf10l6ag+g+f4l2]";
  347.       C+="s2[l32gef|l16fg+]f14g18]";
  348.       D ="@7l2[4g12ga18|g+10g+rg18]g+g+g+rrg+rgr16 [v6o6k2"+M1+M2+M3+"]";
  349.       E ="@1s14l2o3[56c<c>]<cccrrcrc>r16 [[[8c<c>]>[8a+<a+>][7a<a>]g<g>[8f<f>]|<]";
  350.       E+="[[8e<e>][8a<a>][8d<d>]|[8f<f>]][4f<f>]g<g>a<a>a+<a+>b<b]";
  351.       F ="v10@3s32o0k4r116cr[4c1][12r4c4]l2cccl1ccc2l2crcrr[12c1] [[32r4c4] [30r4c4]c4c4c2c2l1cccc]";
  352.       G ="v4@3s64o0l1[224d]r32 [1024d]";
  353.       H ="v16w32s48o4[56c]l2cccl1<gec2>l2crcrrl1<[4g][4e][4c]> l8[128c]";
  354.       _sound = new Sound();
  355.       _sound.addEventListener("sampleData", _onSoundStream);
  356.       _module = new TinySiOPM(8192, _onSoundFrame);
  357.       _sequencer = new Sequencer(4, [A,B,C,D,E,F,G,H]);
  358.     }
  359.     private function _onSoundFrame():void
  360.     {
  361.       _sequencer.onSequence();
  362.     }
  363.     private function _onSoundStream(e:SampleDataEvent):void
  364.     {
  365.       var out:Vector.<Number> = _module.render();
  366.       for (var i:int=0; i<8192; i++) {
  367.         e.data.writeFloat(out[i]);
  368.         e.data.writeFloat(out[i]);
  369.       }
  370.     }
  371.   }
  372. }
  373. class Pillar
  374. {
  375.   public var x:Number;
  376.   public var z:Number;
  377.   public var width:Number;
  378.   public var height:Number;
  379. }
  380. class Sequencer {
  381.   private var tracks:Array, count:int=Track.speed+1;
  382.   function Sequencer(speed:int, mmls:Array) { Track.speed=speed; mml=mmls; }
  383.   public function onSequence() : void {
  384.     if (++count == Track.speed) {
  385.       for each (var tr:Track in tracks) tr.execute();
  386.       count = 0;
  387.     }
  388.   }
  389.   public function set mml(list:Array) : void {
  390.     tracks = [];
  391.     for each (var seq:String in list) tracks.push(new Track(seq));
  392.     count = 0;
  393.   }
  394. }
  395. class Track {
  396.   static public var codeA:int="a".charCodeAt(), nt:Array=[9,11,0,2,4,5,7], speed:int=3;
  397.   public var oct:int, len:int, tl:int, dt:int, cnt:int, seq:String, sgn:int, stac:Array, note:Note;
  398.   private var _rex:RegExp=/([a-gklorsvw<>[|\]$@])([#+])?(\d+)?/g;
  399.   function Track(seq:String) {
  400.     note = new Note(false);
  401.     reset(seq);
  402.   }
  403.   public function reset(seq_:String) : void {
  404.     seq=seq_; oct=5; len=4; tl=256; dt=0; cnt=0; sgn=0; _rex.lastIndex=0; stac=[];
  405.   }
  406.   public function execute() : void {
  407.     if (--cnt <= 0) {
  408.       while (true) {
  409.         var res:* = _rex.exec(seq);
  410.         if (!res) {
  411.           if (sgn) { _rex.lastIndex = sgn; continue; }
  412.           else     { cnt = int.MAX_VALUE; break; }
  413.         }
  414.         var cmd:int = res[1].charCodeAt();
  415.         if (cmd>=codeA && cmd<=codeA+6) {
  416.           cnt = (res[3])?int(res[3]):len;
  417.           if (note.isPlaying()) note.stop();
  418.           note.len = cnt*speed;
  419.           note.tl = tl;
  420.           note.play(((nt[cmd-codeA]+oct*12+((res[2])?1:0))<<4)+dt);
  421.           break;
  422.         } else if (res[1] == 'r') {
  423.           cnt = (res[3])?int(res[3]):len;
  424.           if (note.isPlaying()) note.stop();
  425.           break;
  426.         } else {
  427.           switch(res[1]){
  428.           case 'k': dt  = int(res[3]); break;
  429.           case 'l': len = int(res[3]); break;
  430.           case 'o': oct = int(res[3]); break;
  431.           case 'v': tl  = TinySiOPM.log(int(res[3])*0.0625); break;
  432.           case '<': oct++; break;
  433.           case '>': oct--; break;
  434.           case '@': note.ws = int(res[3]);    break;
  435.           case 's': note.dr = int(res[3])<<2break;
  436.           case 'w': note.sw = -int(res[3]);   break;
  437.           case '$': sgn = _rex.lastIndex; break;
  438.           case '[': stac.unshift({p:_rex.lastIndex,c:((res[3])?int(res[3]):2),j:0}); break;
  439.           case ']': stac[0].j = _rex.lastIndex; if (--stac[0].c == 0) stac.shift(); else _rex.lastIndex = stac[0].p; break;
  440.           case '|':  if (stac[0].c == 1) { _rex.lastIndex = stac[0].j; stac.shift(); } break;
  441.           }
  442.         }
  443.       }
  444.     }
  445.   }
  446. }
  447. class TinySiOPM {
  448.   private var _output:Vector.<Number>, _bufferSize:int, _frameCallBack:Function;
  449.   private var _pitchTable:Vector.<int> = new Vector.<int>(2048true);
  450.   private var _logTable:Vector.<Number> = new Vector.<Number>(6144true);
  451.   
  452.   // Pass the buffer size and the function calls in each frame.
  453.   function TinySiOPM(bufferSize:int=2048, frameCallBack:Function=null) {
  454.     var i:int, j:int, p:Number, v:Number, t:Vector.<int>, ft:Array=[0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0];
  455.     for (i=0, p=0; i<192; i++, p+=0.00520833333)                            // create pitchTable[128*16]
  456.       for(v=Math.pow(2, p)*12441.464342886, j=i; j<2048; v*=2, j+=192) _pitchTable[j] = int(v);
  457.     for (i=0; i<32; i++) _pitchTable[i] = (i+1)<<6;                         // [0:31] for white noize
  458.     for (i=0, p=0.0078125; i<256; i+=2, p+=0.0078125)                       // create logTable[12*256*2]
  459.       for(v=Math.pow(213-p)*0.0001220703125, j=i; j<3328; v*=0.5, j+=256) _logTable[j+1] = -(_logTable[j] = v);
  460.     for (i=3328; i<6144; i++) _logTable[i] = 0;                             // [3328:6144] is 0-fill area
  461.     for (t=Note.table(10), i=0, p=0; i<1024; i++, p+=0.00613592315) t[i] = log(Math.sin(p));  // sin=0
  462.     for (t=Note.table(10), i=0, p=0.75; i<1024; i++, p-=0.00146484375) t[i] = log(p);         // saw=1
  463.     for (t=Note.table(5),  i=0; i<16; i++) t[i+16] = (t[i] = log(ft[i]*0.0625)) + 1;          // famtri=2
  464.     for (t=Note.table(15), i=0; i<32768; i++) t[i] = log(Math.random()-0.5);                  // wnoize=3
  465.     for (i=0; i<8; i++) for (t=Note.table(4), j=0; j<16; j++) t[j] = (j<=i) ? 192 : 193;      // pulse=4-11
  466.     _output = new Vector.<Number>(bufferSize, true);                        // allocate monoral buffer
  467.     _bufferSize = bufferSize; _frameCallBack = frameCallBack;               // set parameters
  468.   }
  469.   
  470.   // calculate index of logTable
  471.   static public function log(n:Number) : int {
  472.     return (n<0) ? ((n<-0.00390625) ? (((int(Math.log(-n) * -184.66496523 + 0.5) + 1) << 1) + 1) : 2047)
  473.                  : ((n> 0.00390625) ? (( int(Math.log( n) * -184.66496523 + 0.5) + 1) << 1)      : 2046);
  474.   }
  475.   
  476.   // Returns monoral output as Vector.<Number>(bufferSize).
  477.   public function render() : Vector.<Number> {
  478.     var note:Note, rep:int, i:int, imax:int, ph:int, dph:int, lout:int, v:int;
  479.     for (i=0; i<_bufferSize; i++) _output[i] = 0;
  480.     for (imax=1024; imax<=_bufferSize; imax+=1024) {
  481.       if (_frameCallBack!=null) _frameCallBack();
  482.       var terminal:Note = Note._tm;
  483.       for (note=terminal.n; note!=terminal; note=note.step()) {
  484.         dph = _pitchTable[note.pt];
  485.         for (i = imax-1024; i < imax; i++) {
  486.           ph = note.ph>>note.sh;
  487.           lout = note.wv[ph] + note.tl;
  488.           _output[i] += _logTable[lout];
  489.           note.ph = (note.ph+dph)&0x3ffffff;
  490.         }
  491.       }
  492.     }
  493.     return _output;
  494.   }
  495.   
  496.   // note on
  497.   public function noteOn(pitch:int, length:int, vol:Number=0.5, wave:int=0, decay:int=6, sweep:int=0) : Note {
  498.     var note:Note = Note.alloc();
  499.     note.len = length;
  500.     note.tl = log(vol);
  501.     note.ws = wave;
  502.     note.dr = decay<<2;
  503.     note.sw = sweep; 
  504.     return note.play(pitch);
  505.   }
  506. }
  507. class Note {
  508.   static public var _w:Array=[], _s:Array=[], _fl:Note=new Note(), _tm:Note=new Note();
  509.   static public function alloc():Note {if(_fl.p==_fl)return new Note();var r:Note=_fl.p;_fl.p=r.p;r.p.n=_fl;return r.reset();}
  510.   static public function table(b:int):Vector.<int>{_w.push(new Vector.<int>(1<<b,true));_s.push(26-b);return _w[_w.length-1];}
  511.   public function into(x:Note):Note{ p=x.p;n=x;p.n=this;n.p=this;return this; }
  512.   public function step():Note { tl+=dr; pt+=sw; pt&=2047return (--len==0||tl>3328) ? (stop().n) : n; }
  513.   public var p:Note, n:Note, pt:int, tl:int, sw:int, dr:int, wv:Vector.<int>, sh:int, len:int, ph:int, fl:Note;
  514.   function Note(useFreeList:Boolean=true) { p=n=this; fl=(useFreeList)?_fl:null; reset(); }
  515.   public function set ws(t:int) : void { wv=_w[t]; sh=_s[t]; }
  516.   public function play(pitch:int) : Note { into(_tm); pt=pitch; return this; }
  517.   public function stop() : Note { var r:Note=p; p.n=n; n.p=p; if(fl)into(fl); pt=-1return r; }
  518.   public function reset() : Note { ph=0; pt=-1; len=0; tl=256; sw=0; dr=24; ws=0return this; }
  519.   public function isPlaying() : Boolean { return (pt>=0); }
  520. }
flash swf thumbnail play
FORKED

forked from: 音楽を付けざるを得ない from:from:Ground forked from: forked from: 音楽を付けざるを得ない from:from:Ground [diff(1)]

  1. // forked from ABA's forked from: 音楽を付けざるを得ない from:from:Ground
  2. // forked from keim_at_Si's 音楽を付けざるを得ない from:from:Ground
  3. // Ground.as
  4. //  Display a 3d ground surface and pillars.
  5. //  Control: Arrow keys or [WASD] keys.
  6. package
  7. {
  8.   import flash.display.Sprite;
  9.   import flash.display.BitmapData;
  10.   import flash.display.Bitmap;
  11.   import flash.geom.Rectangle;
  12.   import flash.events.Event;
  13.   import flash.events.KeyboardEvent;
  14.   import flash.events.SampleDataEvent;
  15.   import flash.media.Sound;
  16.   [SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
  17.   public class Ground extends Sprite
  18.   {
  19.     private const SCREEN_WIDTH:int = 465;
  20.     private const SCREEN_HEIGHT:int = 465;
  21.     private const COUNT:int = 512;
  22.     private const NEAR_PLANE_DIST:Number = 0.6;
  23.     private const PROJECTION_RATIO:Number = 250;
  24.     private const LOD_RATIO:Number = 1.05;
  25.     private const LOD_START_COUNT:Number = 16;
  26.     private const PILLARS_COUNT:int = 32;
  27.     private const WIRE_WIDTH:int = 2;
  28.     private const HAR_SPEED:Number = 11;
  29.     private const BACK_R:int = 210, BACK_G:int = 190, BACK_B:int = 240;
  30.     private var buffer:BitmapData;
  31.     private var left:Boolean, up:Boolean, right:Boolean, down:Boolean;
  32.     private var rect:Rectangle;
  33.     private var degs:Array;
  34.     private var index:int;
  35.     private var offset:Number;
  36.     private var gys:Array, gzs:Array, gcs:Array, gas:Array, gIndices:Array;
  37.     private var gCount:int;
  38.     private var sightX:Number, sightY:Number;
  39.     private var pillars:Array;
  40.     private var pillarRect:Rectangle;
  41.     private var harX:Number, harY:Number;
  42.     private var wireRect:Rectangle;
  43.     private var _sound:Sound;
  44.     private var _sequencer:Sequencer;
  45.     private var _module:TinySiOPM;
  46.     public function Ground()
  47.     {
  48.       buffer = new BitmapData(SCREEN_WIDTH, SCREEN_HEIGHT, false0);
  49.       var screen:Bitmap = new Bitmap(buffer);
  50.       addChild(screen);
  51.       rect = new Rectangle;
  52.       pillarRect = new Rectangle;
  53.       gys = new Array;
  54.       gzs = new Array;
  55.       gcs = new Array;
  56.       gas = new Array;
  57.       gIndices = new Array;
  58.       var di:Number = 0;
  59.       var did:Number = 1.0;
  60.       gCount = 0;
  61.       while (di < COUNT)
  62.       {
  63.         gys.push(0.0);
  64.         gzs.push(0.0);
  65.         gcs.push(int(0));
  66.         gas.push(int(0));
  67.         gIndices.push(int(0));
  68.         if (di > LOD_START_COUNT)
  69.           did *= LOD_RATIO;
  70.         di += did;
  71.         gCount++;
  72.       }
  73.       var i:int;
  74.       degs = new Array;
  75.       for (i = 0; i < COUNT; i++)
  76.       {
  77.         var d:Number;
  78.         if (i < COUNT / 4)
  79.           d = -0.001;
  80.         else if (i < COUNT / 2)
  81.           d = 0.002;
  82.         else if (i < COUNT / 4 * 3)
  83.           d = -0.003;
  84.         else
  85.           d = 0.004;
  86.         degs.push(d);
  87.       }
  88.       pillars = new Array;
  89.       for (i = 0; i < PILLARS_COUNT; i++)
  90.       {
  91.         var p:Pillar = new Pillar;
  92.         p.x = (Math.random() * 2.0 - 1.0) * 200;
  93.         p.z = Math.random() * COUNT;
  94.         p.width = 2;
  95.         p.height = 10 + Math.random() * 15;
  96.         pillars.push(p);
  97.       }
  98.       index = 0;
  99.       offset = 0;
  100.       sightX = sightY = 0;
  101.       harX = harY = 0;
  102.       wireRect = new Rectangle;
  103.       initializeSound();
  104.       _sound.play();
  105.       stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
  106.       stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
  107.       addEventListener(Event.ENTER_FRAME, onEnterFrame);
  108.     }
  109.     private function onEnterFrame(evt:Event):void
  110.     {
  111.       buffer.fillRect(buffer.rect, BACK_R * 0x10000 + BACK_G * 0x100 + BACK_B);
  112.       goForward(3.3);
  113.       drawGroundAndPillars();
  114.       updateHar();
  115.     }
  116.     private function drawGroundAndPillars():void
  117.     {
  118.       var idx:int = index;
  119.       var d:Number = degs[idx];
  120.       var dv:Number = -offset * d;
  121.       var y:Number = 5 - offset * d;
  122.       var z:Number = 1.0 - offset;
  123.       var di:Number = 0;
  124.       var did:Number = 1.0;
  125.       var i:int;
  126.       var gi:int = 0;
  127.       var r:Number;
  128.       for (i = 0; i < COUNT; i++)
  129.       {
  130.         var py:Number = y;
  131.         var pz:Number = z;
  132.         dv += degs[idx] + sightY * 0.00002;
  133.         y += dv;
  134.         z += 1.0;
  135.         if (i > di)
  136.         {
  137.           r = Number(i) - di;
  138.           gys[gi] = py * r + y * (1 - r);
  139.           gzs[gi] = pz * r + z * (1 - r);
  140.           var a:int = 255 - int(i * 255 / COUNT);
  141.           gas[gi] = a;
  142.           if (idx % 16 < 8)
  143.             gcs[gi] = createColor(0x77, 0xbb, 0x77, a);
  144.           else
  145.             gcs[gi] = createColor(0x99, 0x99, 0x99, a);
  146.           gIndices[gi] = idx;
  147.           gi++;
  148.           if (di > LOD_START_COUNT)
  149.             did *= LOD_RATIO;
  150.           di += did;
  151.         }
  152.         idx++;
  153.         if (idx >= COUNT)
  154.           idx = 0;
  155.       }
  156.       rect.x = 0;
  157.       rect.width = SCREEN_WIDTH;
  158.       var sx:Number;
  159.       var sy:Number;
  160.       var psy:Number = 99999;
  161.       for (i = gCount - 1; i >= 0; i--)
  162.       {
  163.         y = gys[i];
  164.         z = gzs[i];
  165.         sy = y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  166.         if (sy > psy)
  167.         {
  168.           rect.y = psy;
  169.           rect.height = sy - psy;
  170.           buffer.fillRect(rect, gcs[i]);
  171.         }
  172.         if (i < gCount - 1)
  173.         {
  174.           for (var j:int = 0; j < PILLARS_COUNT; j++)
  175.           {
  176.             var p:Pillar = pillars[j];
  177.             if (gIndices[i] > gIndices[i + 1])
  178.             {
  179.               drawPillar(p, gIndices[i], gIndices[i + 1] + COUNT, i);
  180.               drawPillar(p, gIndices[i] - COUNT, gIndices[i + 1], i);
  181.             }
  182.             else
  183.             {
  184.               drawPillar(p, gIndices[i], gIndices[i + 1], i);
  185.             }
  186.           }
  187.         }
  188.         psy = sy;
  189.       }
  190.     }
  191.     private function drawPillar(p:Pillar, si:int, ei:int, i:int):void
  192.     {
  193.       if (p.z >= si && p.z < ei)
  194.       {
  195.         var r:Number = Number(ei - p.z) / (ei - si);
  196.         var y:Number = gys[i] * r + gys[i + 1] * (1 - r);
  197.         var z:Number = gzs[i] * r + gzs[i + 1] * (1 - r);
  198.         var sx:Number = (p.x - sightX) * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_WIDTH / 2;
  199.         var sy:Number = y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  200.         var sh:Number = NEAR_PLANE_DIST / z * PROJECTION_RATIO;
  201.         for (var j:int = 0; j < 5; j++)
  202.         {
  203.           pillarRect.x = sx - sh * p.width * 2 / 5 * j;
  204.           pillarRect.y = sy - sh * p.height;
  205.           pillarRect.width = sh * p.width * 2 / 5;
  206.           pillarRect.height = sh * p.height * 2;
  207.           buffer.fillRect(pillarRect, createColor(0x77 + 0x11 * j, 0x77 + 0x11 * j, 0xcc, gas[i]));
  208.         }
  209.       }
  210.     }
  211.     private function createColor(r:int, g:int, b:int, a:int):int
  212.     {
  213.       return int((r * a + BACK_R * (256 - a)) / 256) * 0x10000 +
  214.              int((g * a + 230 * (256 - a)) / 256) * 0x100 +
  215.              int((b * a + BACK_B * (256 - a)) / 256);
  216.     }
  217.     private function goForward(v:Number):void
  218.     {
  219.       offset += v;
  220.       while (offset >= 1.0)
  221.       {
  222.         offset -= 1.0;
  223.         index++;
  224.         if (index >= COUNT)
  225.           index -= COUNT;
  226.       }
  227.     }
  228.     private function updateHar():void
  229.     {
  230.       if (right && harX < SCREEN_WIDTH / 2 - 20)
  231.         harX += HAR_SPEED;
  232.       if (left && harX > -SCREEN_WIDTH / 2 + 20)
  233.         harX -= HAR_SPEED;
  234.       if (up && harY < SCREEN_HEIGHT / 2 - 40)
  235.         harY += HAR_SPEED;
  236.       if (down && harY > -SCREEN_HEIGHT / 2 + 40)
  237.         harY -= HAR_SPEED;
  238.       sightX = harX * 0.4;
  239.       sightY = harY * 0.6;
  240.       var hx:int = harX + SCREEN_WIDTH / 2;
  241.       var hy:int = harY + SCREEN_HEIGHT / 2;
  242.       rect.x = hx - 12;
  243.       rect.y = hy - 30;
  244.       rect.width = 20;
  245.       rect.height = 40;
  246.       drawWireBox(rect, 0xdd7777);
  247.       rect.x++;
  248.       drawWireBox(rect, 0xaa4444);
  249.       rect.x = hx - 14;
  250.       rect.y = hy - 45;
  251.       rect.width = 16;
  252.       rect.height = 20;
  253.       drawWireBox(rect, 0xdddd77);
  254.       rect.x++;
  255.       drawWireBox(rect, 0xaaaa44);
  256.       rect.x = hx - 20;
  257.       rect.y = hy + 5;
  258.       rect.width = 12;
  259.       rect.height = 40;
  260.       drawWireBox(rect, 0x77dddd);
  261.       rect.x++;
  262.       drawWireBox(rect, 0x44aaaa);
  263.       rect.x = hx - 1;
  264.       rect.y = hy + 10;
  265.       rect.width = 15;
  266.       rect.height = 25;
  267.       drawWireBox(rect, 0x77dddd);
  268.       rect.x++;
  269.       drawWireBox(rect, 0x44aaaa);
  270.       rect.x = hx - 1;
  271.       rect.y = hy - 12;
  272.       rect.width = 16;
  273.       rect.height = 16;
  274.       drawWireBox(rect, 0xee4444);
  275.       rect.x++;
  276.       drawWireBox(rect, 0xbb2222);
  277.     }
  278.     private function drawWireBox(rect:Rectangle, color:int):void
  279.     {
  280.       wireRect.x = rect.x;
  281.       wireRect.y = rect.y;
  282.       wireRect.width = rect.width;
  283.       wireRect.height = WIRE_WIDTH;
  284.       buffer.fillRect(wireRect, color);
  285.       wireRect.y = rect.y + rect.height - WIRE_WIDTH;
  286.       buffer.fillRect(wireRect, color);
  287.       wireRect.y = rect.y;
  288.       wireRect.width = WIRE_WIDTH;
  289.       wireRect.height = rect.height;
  290.       buffer.fillRect(wireRect, color);
  291.       wireRect.x = rect.x + rect.width - WIRE_WIDTH;
  292.       buffer.fillRect(wireRect, color);
  293.     }
  294.     private function onKeyUp(evt:KeyboardEvent):void
  295.     {
  296.       switch (evt.keyCode)
  297.       {
  298.       case 0x25:
  299.       case 0x41:
  300.         left = false;
  301.         break;
  302.       case 0x26:
  303.       case 0x57:
  304.         up = false;
  305.         break;
  306.       case 0x27:
  307.       case 0x44:
  308.         right = false;
  309.         break;
  310.       case 0x28:
  311.       case 0x53:
  312.         down = false;
  313.         break;
  314.       }
  315.     }
  316.     private function onKeyDown(evt:KeyboardEvent):void
  317.     {
  318.       switch (evt.keyCode)
  319.       {
  320.       case 0x25:
  321.       case 0x41:
  322.         left = true;
  323.         break;
  324.       case 0x26:
  325.       case 0x57:
  326.         up = true;
  327.         break;
  328.       case 0x27:
  329.       case 0x44:
  330.         right = true;
  331.         break;
  332.       case 0x28:
  333.       case 0x53:
  334.         down = true;
  335.         break;
  336.       }
  337.     }
  338.     private function initializeSound():void
  339.     {
  340.       var A:String,B:String,C:String,D:String,E:String,F:String,G:String,H:String;
  341.       var M1:String="[f6ee16>g4a4<f6ee16>a+<crrf6ee16d4e4f16g+6g6f4]";
  342.       var M2:String="[e20>l4eg<d|c+12>a+a10gf2ef2d6el3fef2gfg2a12g+4<f8d8]";
  343.       var M3:String="c+16l2rec+>a+agfed12e4l3fef2gfg2a12g2<g10l1gab<cdefgl2o7";
  344.       A ="@11s8o6l2[[c12cc18|c10crc18]|c10<crc18]dddrrdrcr16> [s6"+M1+M2+M3+"]";
  345.       B ="@7l2[4e12ef18|f10fre18]fffrrfrer16 [l2s6v6[[c6>brr<d6crr>|b<crrc6>a+rr<d6crr>a+<crr]b4<c4c10dedd6c6d4]";
  346.       B+="s2l4[e28dc+16>a+8ag<d16c8d8|c16d8f8]c14g18]";
  347.       C ="@7l2[4c12cc18|c10crc18]dddrrdrcr16 >[l2s6v6[[g6grrg6grrggrr]8a6arra6al4raaf10l6ag+g+f4l2]";
  348.       C+="s2[l32gef|l16fg+]f14g18]";
  349.       D ="@7l2[4g12ga18|g+10g+rg18]g+g+g+rrg+rgr16 [v6o6k2"+M1+M2+M3+"]";
  350.       E ="@1s14l2o3[56c<c>]<cccrrcrc>r16 [[[8c<c>]>[8a+<a+>][7a<a>]g<g>[8f<f>]|<]";
  351.       E+="[[8e<e>][8a<a>][8d<d>]|[8f<f>]][4f<f>]g<g>a<a>a+<a+>b<b]";
  352.       F ="v10@3s32o0k4r116cr[4c1][12r4c4]l2cccl1ccc2l2crcrr[12c1] [[32r4c4] [30r4c4]c4c4c2c2l1cccc]";
  353.       G ="v4@3s64o0l1[224d]r32 [1024d]";
  354.       H ="v16w32s48o4[56c]l2cccl1<gec2>l2crcrrl1<[4g][4e][4c]> l8[128c]";
  355.       _sound = new Sound();
  356.       _sound.addEventListener("sampleData", _onSoundStream);
  357.       _module = new TinySiOPM(8192, _onSoundFrame);
  358.       _sequencer = new Sequencer(4, [A,B,C,D,E,F,G,H]);
  359.     }
  360.     private function _onSoundFrame():void
  361.     {
  362.       _sequencer.onSequence();
  363.     }
  364.     private function _onSoundStream(e:SampleDataEvent):void
  365.     {
  366.       var out:Vector.<Number> = _module.render();
  367.       for (var i:int=0; i<8192; i++) {
  368.         e.data.writeFloat(out[i]);
  369.         e.data.writeFloat(out[i]);
  370.       }
  371.     }
  372.   }
  373. }
  374. class Pillar
  375. {
  376.   public var x:Number;
  377.   public var z:Number;
  378.   public var width:Number;
  379.   public var height:Number;
  380. }
  381. class Sequencer {
  382.   private var tracks:Array, count:int=Track.speed+1;
  383.   function Sequencer(speed:int, mmls:Array) { Track.speed=speed; mml=mmls; }
  384.   public function onSequence() : void {
  385.     if (++count == Track.speed) {
  386.       for each (var tr:Track in tracks) tr.execute();
  387.       count = 0;
  388.     }
  389.   }
  390.   public function set mml(list:Array) : void {
  391.     tracks = [];
  392.     for each (var seq:String in list) tracks.push(new Track(seq));
  393.     count = 0;
  394.   }
  395. }
  396. class Track {
  397.   static public var codeA:int="a".charCodeAt(), nt:Array=[9,11,0,2,4,5,7], speed:int=3;
  398.   public var oct:int, len:int, tl:int, dt:int, cnt:int, seq:String, sgn:int, stac:Array, note:Note;
  399.   private var _rex:RegExp=/([a-gklorsvw<>[|\]$@])([#+])?(\d+)?/g;
  400.   function Track(seq:String) {
  401.     note = new Note(false);
  402.     reset(seq);
  403.   }
  404.   public function reset(seq_:String) : void {
  405.     seq=seq_; oct=5; len=4; tl=256; dt=0; cnt=0; sgn=0; _rex.lastIndex=0; stac=[];
  406.   }
  407.   public function execute() : void {
  408.     if (--cnt <= 0) {
  409.       while (true) {
  410.         var res:* = _rex.exec(seq);
  411.         if (!res) {
  412.           if (sgn) { _rex.lastIndex = sgn; continue; }
  413.           else     { cnt = int.MAX_VALUE; break; }
  414.         }
  415.         var cmd:int = res[1].charCodeAt();
  416.         if (cmd>=codeA && cmd<=codeA+6) {
  417.           cnt = (res[3])?int(res[3]):len;
  418.           if (note.isPlaying()) note.stop();
  419.           note.len = cnt*speed;
  420.           note.tl = tl;
  421.           note.play(((nt[cmd-codeA]+oct*12+((res[2])?1:0))<<4)+dt);
  422.           break;
  423.         } else if (res[1] == 'r') {
  424.           cnt = (res[3])?int(res[3]):len;
  425.           if (note.isPlaying()) note.stop();
  426.           break;
  427.         } else {
  428.           switch(res[1]){
  429.           case 'k': dt  = int(res[3]); break;
  430.           case 'l': len = int(res[3]); break;
  431.           case 'o': oct = int(res[3]); break;
  432.           case 'v': tl  = TinySiOPM.log(int(res[3])*0.0625); break;
  433.           case '<': oct++; break;
  434.           case '>': oct--; break;
  435.           case '@': note.ws = int(res[3]);    break;
  436.           case 's': note.dr = int(res[3])<<2break;
  437.           case 'w': note.sw = -int(res[3]);   break;
  438.           case '$': sgn = _rex.lastIndex; break;
  439.           case '[': stac.unshift({p:_rex.lastIndex,c:((res[3])?int(res[3]):2),j:0}); break;
  440.           case ']': stac[0].j = _rex.lastIndex; if (--stac[0].c == 0) stac.shift(); else _rex.lastIndex = stac[0].p; break;
  441.           case '|':  if (stac[0].c == 1) { _rex.lastIndex = stac[0].j; stac.shift(); } break;
  442.           }
  443.         }
  444.       }
  445.     }
  446.   }
  447. }
  448. class TinySiOPM {
  449.   private var _output:Vector.<Number>, _bufferSize:int, _frameCallBack:Function;
  450.   private var _pitchTable:Vector.<int> = new Vector.<int>(2048true);
  451.   private var _logTable:Vector.<Number> = new Vector.<Number>(6144true);
  452.   
  453.   // Pass the buffer size and the function calls in each frame.
  454.   function TinySiOPM(bufferSize:int=2048, frameCallBack:Function=null) {
  455.     var i:int, j:int, p:Number, v:Number, t:Vector.<int>, ft:Array=[0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0];
  456.     for (i=0, p=0; i<192; i++, p+=0.00520833333)                            // create pitchTable[128*16]
  457.       for(v=Math.pow(2, p)*12441.464342886, j=i; j<2048; v*=2, j+=192) _pitchTable[j] = int(v);
  458.     for (i=0; i<32; i++) _pitchTable[i] = (i+1)<<6;                         // [0:31] for white noize
  459.     for (i=0, p=0.0078125; i<256; i+=2, p+=0.0078125)                       // create logTable[12*256*2]
  460.       for(v=Math.pow(213-p)*0.0001220703125, j=i; j<3328; v*=0.5, j+=256) _logTable[j+1] = -(_logTable[j] = v);
  461.     for (i=3328; i<6144; i++) _logTable[i] = 0;                             // [3328:6144] is 0-fill area
  462.     for (t=Note.table(10), i=0, p=0; i<1024; i++, p+=0.00613592315) t[i] = log(Math.sin(p));  // sin=0
  463.     for (t=Note.table(10), i=0, p=0.75; i<1024; i++, p-=0.00146484375) t[i] = log(p);         // saw=1
  464.     for (t=Note.table(5),  i=0; i<16; i++) t[i+16] = (t[i] = log(ft[i]*0.0625)) + 1;          // famtri=2
  465.     for (t=Note.table(15), i=0; i<32768; i++) t[i] = log(Math.random()-0.5);                  // wnoize=3
  466.     for (i=0; i<8; i++) for (t=Note.table(4), j=0; j<16; j++) t[j] = (j<=i) ? 192 : 193;      // pulse=4-11
  467.     _output = new Vector.<Number>(bufferSize, true);                        // allocate monoral buffer
  468.     _bufferSize = bufferSize; _frameCallBack = frameCallBack;               // set parameters
  469.   }
  470.   
  471.   // calculate index of logTable
  472.   static public function log(n:Number) : int {
  473.     return (n<0) ? ((n<-0.00390625) ? (((int(Math.log(-n) * -184.66496523 + 0.5) + 1) << 1) + 1) : 2047)
  474.                  : ((n> 0.00390625) ? (( int(Math.log( n) * -184.66496523 + 0.5) + 1) << 1)      : 2046);
  475.   }
  476.   
  477.   // Returns monoral output as Vector.<Number>(bufferSize).
  478.   public function render() : Vector.<Number> {
  479.     var note:Note, rep:int, i:int, imax:int, ph:int, dph:int, lout:int, v:int;
  480.     for (i=0; i<_bufferSize; i++) _output[i] = 0;
  481.     for (imax=1024; imax<=_bufferSize; imax+=1024) {
  482.       if (_frameCallBack!=null) _frameCallBack();
  483.       var terminal:Note = Note._tm;
  484.       for (note=terminal.n; note!=terminal; note=note.step()) {
  485.         dph = _pitchTable[note.pt];
  486.         for (i = imax-1024; i < imax; i++) {
  487.           ph = note.ph>>note.sh;
  488.           lout = note.wv[ph] + note.tl;
  489.           _output[i] += _logTable[lout];
  490.           note.ph = (note.ph+dph)&0x3ffffff;
  491.         }
  492.       }
  493.     }
  494.     return _output;
  495.   }
  496.   
  497.   // note on
  498.   public function noteOn(pitch:int, length:int, vol:Number=0.5, wave:int=0, decay:int=6, sweep:int=0) : Note {
  499.     var note:Note = Note.alloc();
  500.     note.len = length;
  501.     note.tl = log(vol);
  502.     note.ws = wave;
  503.     note.dr = decay<<2;
  504.     note.sw = sweep; 
  505.     return note.play(pitch);
  506.   }
  507. }
  508. class Note {
  509.   static public var _w:Array=[], _s:Array=[], _fl:Note=new Note(), _tm:Note=new Note();
  510.   static public function alloc():Note {if(_fl.p==_fl)return new Note();var r:Note=_fl.p;_fl.p=r.p;r.p.n=_fl;return r.reset();}
  511.   static public function table(b:int):Vector.<int>{_w.push(new Vector.<int>(1<<b,true));_s.push(26-b);return _w[_w.length-1];}
  512.   public function into(x:Note):Note{ p=x.p;n=x;p.n=this;n.p=this;return this; }
  513.   public function step():Note { tl+=dr; pt+=sw; pt&=2047return (--len==0||tl>3328) ? (stop().n) : n; }
  514.   public var p:Note, n:Note, pt:int, tl:int, sw:int, dr:int, wv:Vector.<int>, sh:int, len:int, ph:int, fl:Note;
  515.   function Note(useFreeList:Boolean=true) { p=n=this; fl=(useFreeList)?_fl:null; reset(); }
  516.   public function set ws(t:int) : void { wv=_w[t]; sh=_s[t]; }
  517.   public function play(pitch:int) : Note { into(_tm); pt=pitch; return this; }
  518.   public function stop() : Note { var r:Note=p; p.n=n; n.p=p; if(fl)into(fl); pt=-1return r; }
  519.   public function reset() : Note { ph=0; pt=-1; len=0; tl=256; sw=0; dr=24; ws=0return this; }
  520.   public function isPlaying() : Boolean { return (pt>=0); }
  521. }
noswf

forked from: 音楽を付けざるを得ない from:from:Ground ネコを付けざるを得ない from:from:Ground [diff(234)]

  1. // forked from keim_at_Si's 音楽を付けざるを得ない from:from:Ground
  2. // Ground.as
  3. //  Display a 3d ground surface and pillars.
  4. //  Control: Arrow keys or [WASD] keys.
  5. package
  6. {
  7.   import flash.display.Sprite;
  8.   import flash.display.BitmapData;
  9.   import flash.display.Bitmap;
  10.   import flash.geom.Rectangle;
  11.   import flash.events.Event;
  12.   import flash.events.KeyboardEvent;
  13.   import flash.events.SampleDataEvent;
  14.   import flash.media.Sound;
  15.   [SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
  16.   public class Ground extends Sprite
  17.   {
  18.     private const SCREEN_WIDTH:int = 465;
  19.     private const SCREEN_HEIGHT:int = 465;
  20.     private const COUNT:int = 512;
  21.     private const NEAR_PLANE_DIST:Number = 0.6;
  22.     private const PROJECTION_RATIO:Number = 250;
  23.     private const LOD_RATIO:Number = 1.05;
  24.     private const LOD_START_COUNT:Number = 16;
  25.     private const PILLARS_COUNT:int = 32;
  26.     private const WIRE_WIDTH:int = 2;
  27.     private const HAR_SPEED:Number = 11;
  28.     private const BACK_R:int = 210, BACK_G:int = 190, BACK_B:int = 240;
  29.     private var buffer:BitmapData;
  30.     private var left:Boolean, up:Boolean, right:Boolean, down:Boolean;
  31.     private var rect:Rectangle;
  32.     private var degs:Array;
  33.     private var index:int;
  34.     private var offset:Number;
  35.     private var gys:Array, gzs:Array, gcs:Array, gas:Array, gIndices:Array;
  36.     private var gCount:int;
  37.     private var sightX:Number, sightY:Number;
  38.     private var pillars:Array;
  39.     private var pillarRect:Rectangle;
  40.     private var harX:Number, harY:Number;
  41.     private var wireRect:Rectangle;
  42.     private var _sound:Sound;
  43.     private var _sequencer:Sequencer;
  44.     private var _module:TinySiOPM;
  45.     ////////////////////////////////////
  46.     // giko instance
  47.     private var _giko:Giko = new Giko()
  48.     ////////////////////////////////////
  49.     public function Ground()
  50.     {
  51.       buffer = new BitmapData(SCREEN_WIDTH, SCREEN_HEIGHT, false0);
  52.       var screen:Bitmap = new Bitmap(buffer);
  53.       addChild(screen);
  54.       rect = new Rectangle;
  55.       pillarRect = new Rectangle;
  56.       gys = new Array;
  57.       gzs = new Array;
  58.       gcs = new Array;
  59.       gas = new Array;
  60.       gIndices = new Array;
  61.       var di:Number = 0;
  62.       var did:Number = 1.0;
  63.       gCount = 0;
  64.       while (di < COUNT)
  65.       {
  66.         gys.push(0.0);
  67.         gzs.push(0.0);
  68.         gcs.push(int(0));
  69.         gas.push(int(0));
  70.         gIndices.push(int(0));
  71.         if (di > LOD_START_COUNT)
  72.           did *= LOD_RATIO;
  73.         di += did;
  74.         gCount++;
  75.       }
  76.       var i:int;
  77.       degs = new Array;
  78.       for (i = 0; i < COUNT; i++)
  79.       {
  80.         var d:Number;
  81.         if (i < COUNT / 4)
  82.           d = -0.001;
  83.         else if (i < COUNT / 2)
  84.           d = 0.002;
  85.         else if (i < COUNT / 4 * 3)
  86.           d = -0.003;
  87.         else
  88.           d = 0.004;
  89.         degs.push(d);
  90.       }
  91.       pillars = new Array;
  92.       for (i = 0; i < PILLARS_COUNT; i++)
  93.       {
  94.         var p:Pillar = new Pillar;
  95.         p.x = (Math.random() * 2.0 - 1.0) * 200;
  96.         p.z = Math.random() * COUNT;
  97.         p.width = 2;
  98.         p.height = 10 + Math.random() * 15;
  99.         pillars.push(p);
  100.       }
  101.       ////////////////////////////////////
  102.       var waitAA:AA = new AA();
  103.       waitAA.setTextArray([
  104. "       ∧∧",
  105. "~′ ̄ ̄(,,゚Д゚)",
  106. "  UU ̄U U  "
  107.       ]);
  108.       var zukoAA:AA = new AA();
  109.       zukoAA.setTextArray([
  110. "    ∧∧",
  111. "  ヽ(・ω・)/",
  112. " \(.\ ノ"
  113.       ]);
  114.       _giko.setAA(waitAA, zukoAA);
  115.       _giko.setRandomPosition();
  116.       ////////////////////////////////////
  117.       index = 0;
  118.       offset = 0;
  119.       sightX = sightY = 0;
  120.       harX = harY = 0;
  121.       wireRect = new Rectangle;
  122.       initializeSound();
  123.       _sound.play();
  124.       stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
  125.       stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
  126.       addEventListener(Event.ENTER_FRAME, onEnterFrame);
  127.     }
  128.     private function onEnterFrame(evt:Event):void
  129.     {
  130.       buffer.fillRect(buffer.rect, BACK_R * 0x10000 + BACK_G * 0x100 + BACK_B);
  131.       ////////////////////////////////////
  132.       _giko.update();
  133.       if (_giko.isFlying())
  134.       {
  135.         drawGroundAndPillars();
  136.       }
  137.       else
  138.       {
  139.         goForward(3.3);
  140.         drawGroundAndPillars();
  141.         updateHar();
  142.         // assume the harriar is on NEAR_PLANE_DIST.
  143.         if (_giko.isHit(
  144.           harX / PROJECTION_RATIO + harX * 0.4// to world, and sight adjust
  145.           harY / PROJECTION_RATIO + harX * 0.6,
  146.           index))
  147.         {
  148.           _giko.fly();
  149.         }
  150.       }
  151.       ////////////////////////////////////
  152.     }
  153.     private function drawGroundAndPillars():void
  154.     {
  155.       var idx:int = index;
  156.       var d:Number = degs[idx];
  157.       var dv:Number = -offset * d;
  158.       var y:Number = 5 - offset * d;
  159.       var z:Number = 1.0 - offset;
  160.       var di:Number = 0;
  161.       var did:Number = 1.0;
  162.       var i:int;
  163.       var gi:int = 0;
  164.       var r:Number;
  165.       for (i = 0; i < COUNT; i++)
  166.       {
  167.         var py:Number = y;
  168.         var pz:Number = z;
  169.         dv += degs[idx] + sightY * 0.00002;
  170.         y += dv;
  171.         z += 1.0;
  172.         if (i > di)
  173.         {
  174.           r = Number(i) - di;
  175.           gys[gi] = py * r + y * (1 - r);
  176.           gzs[gi] = pz * r + z * (1 - r);
  177.           var a:int = 255 - int(i * 255 / COUNT);
  178.           gas[gi] = a;
  179.           if (idx % 16 < 8)
  180.             gcs[gi] = createColor(0x77, 0xbb, 0x77, a);
  181.           else
  182.             gcs[gi] = createColor(0x99, 0x99, 0x99, a);
  183.           gIndices[gi] = idx;
  184.           gi++;
  185.           if (di > LOD_START_COUNT)
  186.             did *= LOD_RATIO;
  187.           di += did;
  188.         }
  189.         idx++;
  190.         if (idx >= COUNT)
  191.           idx = 0;
  192.       }
  193.       rect.x = 0;
  194.       rect.width = SCREEN_WIDTH;
  195.       var sx:Number;
  196.       var sy:Number;
  197.       var psy:Number = 99999;
  198.       for (i = gCount - 1; i >= 0; i--)
  199.       {
  200.         y = gys[i];
  201.         z = gzs[i];
  202.         sy = y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  203.         if (sy > psy)
  204.         {
  205.           rect.y = psy;
  206.           rect.height = sy - psy;
  207.           buffer.fillRect(rect, gcs[i]);
  208.         }
  209.         if (i < gCount - 1)
  210.         {
  211.           for (var j:int = 0; j < PILLARS_COUNT; j++)
  212.           {
  213.             var p:Pillar = pillars[j];
  214.             if (gIndices[i] > gIndices[i + 1])
  215.             {
  216.               drawPillar(p, gIndices[i], gIndices[i + 1] + COUNT, i);
  217.               drawPillar(p, gIndices[i] - COUNT, gIndices[i + 1], i);
  218.             }
  219.             else
  220.             {
  221.               drawPillar(p, gIndices[i], gIndices[i + 1], i);
  222.             }
  223.           }
  224.           ///////////////////////////////////////
  225.           if (gIndices[i] > gIndices[i + 1])
  226.           {
  227.             drawGiko(_giko, gIndices[i], gIndices[i + 1] + COUNT, i);
  228.             drawGiko(_giko, gIndices[i] - COUNT, gIndices[i + 1], i);
  229.           }
  230.           else
  231.           {
  232.             drawGiko(_giko, gIndices[i], gIndices[i + 1], i);
  233.           }
  234.           ///////////////////////////////////////
  235.         }
  236.         psy = sy;
  237.       }
  238.     }
  239.     private function drawPillar(p:Pillar, si:int, ei:int, i:int):void
  240.     {
  241.       if (p.z >= si && p.z < ei)
  242.       {
  243.         var r:Number = Number(ei - p.z) / (ei - si);
  244.         var y:Number = gys[i] * r + gys[i + 1] * (1 - r);
  245.         var z:Number = gzs[i] * r + gzs[i + 1] * (1 - r);
  246.         var sx:Number = (p.x - sightX) * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_WIDTH / 2;
  247.         var sy:Number = y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  248.         var sh:Number = NEAR_PLANE_DIST / z * PROJECTION_RATIO;
  249.         for (var j:int = 0; j < 5; j++)
  250.         {
  251.           pillarRect.x = sx - sh * p.width * 2 / 5 * j;
  252.           pillarRect.y = sy - sh * p.height;
  253.           pillarRect.width = sh * p.width * 2 / 5;
  254.           pillarRect.height = sh * p.height * 2;
  255.           buffer.fillRect(pillarRect, createColor(0x77 + 0x11 * j, 0x77 + 0x11 * j, 0xcc, gas[i]));
  256.         }
  257.       }
  258.     }
  259.     ///////////////////////////////////////
  260.     private function drawGiko(giko:Giko, si:int, ei:int, i:int):void
  261.     {
  262.       if (giko._z >= si && giko._z < ei)
  263.       {
  264.         var r:Number = Number(ei - giko._z) / (ei - si);
  265.         var y:Number = gys[i] * r + gys[i + 1] * (1 - r);
  266.         var z:Number = gzs[i] * r + gzs[i + 1] * (1 - r);
  267.         var sx:Number = (giko._x - sightX) * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_WIDTH / 2;
  268.         var sy:Number =                  y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  269.         var sh:Number =                      NEAR_PLANE_DIST / z * PROJECTION_RATIO;
  270.         
  271.         giko.draw(buffer, sx, sy, sh);
  272.       }
  273.     }
  274.     ///////////////////////////////////////
  275.     private function createColor(r:int, g:int, b:int, a:int):int
  276.     {
  277.       return int((r * a + BACK_R * (256 - a)) / 256) * 0x10000 +
  278.              int((g * a + 230 * (256 - a)) / 256) * 0x100 +
  279.              int((b * a + BACK_B * (256 - a)) / 256);
  280.     }
  281.     private function goForward(v:Number):void
  282.     {
  283.       offset += v;
  284.       while (offset >= 1.0)
  285.       {
  286.         offset -= 1.0;
  287.         index++;
  288.         if (index >= COUNT)
  289.           index -= COUNT;
  290.       }
  291.     }
  292.     private function updateHar():void
  293.     {
  294.       if (right && harX < SCREEN_WIDTH / 2 - 20)
  295.         harX += HAR_SPEED;
  296.       if (left && harX > -SCREEN_WIDTH / 2 + 20)
  297.         harX -= HAR_SPEED;
  298.       if (up && harY < SCREEN_HEIGHT / 2 - 40)
  299.         harY += HAR_SPEED;
  300.       if (down && harY > -SCREEN_HEIGHT / 2 + 40)
  301.         harY -= HAR_SPEED;
  302.       sightX = harX * 0.4;
  303.       sightY = harY * 0.6;
  304.       var hx:int = harX + SCREEN_WIDTH / 2;
  305.       var hy:int = harY + SCREEN_HEIGHT / 2;
  306.       rect.x = hx - 12;
  307.       rect.y = hy - 30;
  308.       rect.width = 20;
  309.       rect.height = 40;
  310.       drawWireBox(rect, 0xdd7777);
  311.       rect.x++;
  312.       drawWireBox(rect, 0xaa4444);
  313.       rect.x = hx - 14;
  314.       rect.y = hy - 45;
  315.       rect.width = 16;
  316.       rect.height = 20;
  317.       drawWireBox(rect, 0xdddd77);
  318.       rect.x++;
  319.       drawWireBox(rect, 0xaaaa44);
  320.       rect.x = hx - 20;
  321.       rect.y = hy + 5;
  322.       rect.width = 12;
  323.       rect.height = 40;
  324.       drawWireBox(rect, 0x77dddd);
  325.       rect.x++;
  326.       drawWireBox(rect, 0x44aaaa);
  327.       rect.x = hx - 1;
  328.       rect.y = hy + 10;
  329.       rect.width = 15;
  330.       rect.height = 25;
  331.       drawWireBox(rect, 0x77dddd);
  332.       rect.x++;
  333.       drawWireBox(rect, 0x44aaaa);
  334.       rect.x = hx - 1;
  335.       rect.y = hy - 12;
  336.       rect.width = 16;
  337.       rect.height = 16;
  338.       drawWireBox(rect, 0xee4444);
  339.       rect.x++;
  340.       drawWireBox(rect, 0xbb2222);
  341.     }
  342.     private function drawWireBox(rect:Rectangle, color:int):void
  343.     {
  344.       wireRect.x = rect.x;
  345.       wireRect.y = rect.y;
  346.       wireRect.width = rect.width;
  347.       wireRect.height = WIRE_WIDTH;
  348.       buffer.fillRect(wireRect, color);
  349.       wireRect.y = rect.y + rect.height - WIRE_WIDTH;
  350.       buffer.fillRect(wireRect, color);
  351.       wireRect.y = rect.y;
  352.       wireRect.width = WIRE_WIDTH;
  353.       wireRect.height = rect.height;
  354.       buffer.fillRect(wireRect, color);
  355.       wireRect.x = rect.x + rect.width - WIRE_WIDTH;
  356.       buffer.fillRect(wireRect, color);
  357.     }
  358.     private function onKeyUp(evt:KeyboardEvent):void
  359.     {
  360.       switch (evt.keyCode)
  361.       {
  362.       case 0x25:
  363.       case 0x41:
  364.         left = false;
  365.         break;
  366.       case 0x26:
  367.       case 0x57:
  368.         up = false;
  369.         break;
  370.       case 0x27:
  371.       case 0x44:
  372.         right = false;
  373.         break;
  374.       case 0x28:
  375.       case 0x53:
  376.         down = false;
  377.         break;
  378.       }
  379.     }
  380.     private function onKeyDown(evt:KeyboardEvent):void
  381.     {
  382.       switch (evt.keyCode)
  383.       {
  384.       case 0x25:
  385.       case 0x41:
  386.         left = true;
  387.         break;
  388.       case 0x26:
  389.       case 0x57:
  390.         up = true;
  391.         break;
  392.       case 0x27:
  393.       case 0x44:
  394.         right = true;
  395.         break;
  396.       case 0x28:
  397.       case 0x53:
  398.         down = true;
  399.         break;
  400.       }
  401.     }
  402.     private function initializeSound():void
  403.     {
  404.       var A:String,B:String,C:String,D:String,E:String,F:String,G:String,H:String;
  405.       var M1:String="[f6ee16>g4a4<f6ee16>a+<crrf6ee16d4e4f16g+6g6f4]";
  406.       var M2:String="[e20>l4eg<d|c+12>a+a10gf2ef2d6el3fef2gfg2a12g+4<f8d8]";
  407.       var M3:String="c+16l2rec+>a+agfed12e4l3fef2gfg2a12g2<g10l1gab<cdefgl2o7";
  408.       A ="@11s8o6l2[[c12cc18|c10crc18]|c10<crc18]dddrrdrcr16> [s6"+M1+M2+M3+"]";
  409.       B ="@7l2[4e12ef18|f10fre18]fffrrfrer16 [l2s6v6[[c6>brr<d6crr>|b<crrc6>a+rr<d6crr>a+<crr]b4<c4c10dedd6c6d4]";
  410.       B+="s2l4[e28dc+16>a+8ag<d16c8d8|c16d8f8]c14g18]";
  411.       C ="@7l2[4c12cc18|c10crc18]dddrrdrcr16 >[l2s6v6[[g6grrg6grrggrr]8a6arra6al4raaf10l6ag+g+f4l2]";
  412.       C+="s2[l32gef|l16fg+]f14g18]";
  413.       D ="@7l2[4g12ga18|g+10g+rg18]g+g+g+rrg+rgr16 [v6o6k2"+M1+M2+M3+"]";
  414.       E ="@1s14l2o3[56c<c>]<cccrrcrc>r16 [[[8c<c>]>[8a+<a+>][7a<a>]g<g>[8f<f>]|<]";
  415.       E+="[[8e<e>][8a<a>][8d<d>]|[8f<f>]][4f<f>]g<g>a<a>a+<a+>b<b]";
  416.       F ="v10@3s32o0k4r116cr[4c1][12r4c4]l2cccl1ccc2l2crcrr[12c1] [[32r4c4] [30r4c4]c4c4c2c2l1cccc]";
  417.       G ="v4@3s64o0l1[224d]r32 [1024d]";
  418.       H ="v16w32s48o4[56c]l2cccl1<gec2>l2crcrrl1<[4g][4e][4c]> l8[128c]";
  419.       _sound = new Sound();
  420.       _sound.addEventListener("sampleData", _onSoundStream);
  421.       _module = new TinySiOPM(8192, _onSoundFrame);
  422.       _sequencer = new Sequencer(4, [A,B,C,D,E,F,G,H]);
  423.     }
  424.     private function _onSoundFrame():void
  425.     {
  426.       _sequencer.onSequence();
  427.     }
  428.     private function _onSoundStream(e:SampleDataEvent):void
  429.     {
  430.       var out:Vector.<Number> = _module.render();
  431.       for (var i:int=0; i<8192; i++) {
  432.         e.data.writeFloat(out[i]);
  433.         e.data.writeFloat(out[i]);
  434.       }
  435.     }
  436.   }
  437. }
  438. class Pillar
  439. {
  440.   public var x:Number;
  441.   public var z:Number;
  442.   public var width:Number;
  443.   public var height:Number;
  444. }
  445. class Sequencer {
  446.   private var tracks:Array, count:int=Track.speed+1;
  447.   function Sequencer(speed:int, mmls:Array) { Track.speed=speed; mml=mmls; }
  448.   public function onSequence() : void {
  449.     if (++count == Track.speed) {
  450.       for each (var tr:Track in tracks) tr.execute();
  451.       count = 0;
  452.     }
  453.   }
  454.   public function set mml(list:Array) : void {
  455.     tracks = [];
  456.     for each (var seq:String in list) tracks.push(new Track(seq));
  457.     count = 0;
  458.   }
  459. }
  460. class Track {
  461.   static public var codeA:int="a".charCodeAt(), nt:Array=[9,11,0,2,4,5,7], speed:int=3;
  462.   public var oct:int, len:int, tl:int, dt:int, cnt:int, seq:String, sgn:int, stac:Array, note:Note;
  463.   private var _rex:RegExp=/([a-gklorsvw<>[|\]$@])([#+])?(\d+)?/g;
  464.   function Track(seq:String) {
  465.     note = new Note(false);
  466.     reset(seq);
  467.   }
  468.   public function reset(seq_:String) : void {
  469.     seq=seq_; oct=5; len=4; tl=256; dt=0; cnt=0; sgn=0; _rex.lastIndex=0; stac=[];
  470.   }
  471.   public function execute() : void {
  472.     if (--cnt <= 0) {
  473.       while (true) {
  474.         var res:* = _rex.exec(seq);
  475.         if (!res) {
  476.           if (sgn) { _rex.lastIndex = sgn; continue; }
  477.           else     { cnt = int.MAX_VALUE; break; }
  478.         }
  479.         var cmd:int = res[1].charCodeAt();
  480.         if (cmd>=codeA && cmd<=codeA+6) {
  481.           cnt = (res[3])?int(res[3]):len;
  482.           if (note.isPlaying()) note.stop();
  483.           note.len = cnt*speed;
  484.           note.tl = tl;
  485.           note.play(((nt[cmd-codeA]+oct*12+((res[2])?1:0))<<4)+dt);
  486.           break;
  487.         } else if (res[1] == 'r') {
  488.           cnt = (res[3])?int(res[3]):len;
  489.           if (note.isPlaying()) note.stop();
  490.           break;
  491.         } else {
  492.           switch(res[1]){
  493.           case 'k': dt  = int(res[3]); break;
  494.           case 'l': len = int(res[3]); break;
  495.           case 'o': oct = int(res[3]); break;
  496.           case 'v': tl  = TinySiOPM.log(int(res[3])*0.0625); break;
  497.           case '<': oct++; break;
  498.           case '>': oct--; break;
  499.           case '@': note.ws = int(res[3]);    break;
  500.           case 's': note.dr = int(res[3])<<2break;
  501.           case 'w': note.sw = -int(res[3]);   break;
  502.           case '$': sgn = _rex.lastIndex; break;
  503.           case '[': stac.unshift({p:_rex.lastIndex,c:((res[3])?int(res[3]):2),j:0}); break;
  504.           case ']': stac[0].j = _rex.lastIndex; if (--stac[0].c == 0) stac.shift(); else _rex.lastIndex = stac[0].p; break;
  505.           case '|':  if (stac[0].c == 1) { _rex.lastIndex = stac[0].j; stac.shift(); } break;
  506.           }
  507.         }
  508.       }
  509.     }
  510.   }
  511. }
  512. class TinySiOPM {
  513.   private var _output:Vector.<Number>, _bufferSize:int, _frameCallBack:Function;
  514.   private var _pitchTable:Vector.<int> = new Vector.<int>(2048true);
  515.   private var _logTable:Vector.<Number> = new Vector.<Number>(6144true);
  516.   
  517.   // Pass the buffer size and the function calls in each frame.
  518.   function TinySiOPM(bufferSize:int=2048, frameCallBack:Function=null) {
  519.     var i:int, j:int, p:Number, v:Number, t:Vector.<int>, ft:Array=[0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0];
  520.     for (i=0, p=0; i<192; i++, p+=0.00520833333)                            // create pitchTable[128*16]
  521.       for(v=Math.pow(2, p)*12441.464342886, j=i; j<2048; v*=2, j+=192) _pitchTable[j] = int(v);
  522.     for (i=0; i<32; i++) _pitchTable[i] = (i+1)<<6;                         // [0:31] for white noize
  523.     for (i=0, p=0.0078125; i<256; i+=2, p+=0.0078125)                       // create logTable[12*256*2]
  524.       for(v=Math.pow(213-p)*0.0001220703125, j=i; j<3328; v*=0.5, j+=256) _logTable[j+1] = -(_logTable[j] = v);
  525.     for (i=3328; i<6144; i++) _logTable[i] = 0;                             // [3328:6144] is 0-fill area
  526.     for (t=Note.table(10), i=0, p=0; i<1024; i++, p+=0.00613592315) t[i] = log(Math.sin(p));  // sin=0
  527.     for (t=Note.table(10), i=0, p=0.75; i<1024; i++, p-=0.00146484375) t[i] = log(p);         // saw=1
  528.     for (t=Note.table(5),  i=0; i<16; i++) t[i+16] = (t[i] = log(ft[i]*0.0625)) + 1;          // famtri=2
  529.     for (t=Note.table(15), i=0; i<32768; i++) t[i] = log(Math.random()-0.5);                  // wnoize=3
  530.     for (i=0; i<8; i++) for (t=Note.table(4), j=0; j<16; j++) t[j] = (j<=i) ? 192 : 193;      // pulse=4-11
  531.     _output = new Vector.<Number>(bufferSize, true);                        // allocate monoral buffer
  532.     _bufferSize = bufferSize; _frameCallBack = frameCallBack;               // set parameters
  533.   }
  534.   
  535.   // calculate index of logTable
  536.   static public function log(n:Number) : int {
  537.     return (n<0) ? ((n<-0.00390625) ? (((int(Math.log(-n) * -184.66496523 + 0.5) + 1) << 1) + 1) : 2047)
  538.                  : ((n> 0.00390625) ? (( int(Math.log( n) * -184.66496523 + 0.5) + 1) << 1)      : 2046);
  539.   }
  540.   
  541.   // Returns monoral output as Vector.<Number>(bufferSize).
  542.   public function render() : Vector.<Number> {
  543.     var note:Note, rep:int, i:int, imax:int, ph:int, dph:int, lout:int, v:int;
  544.     for (i=0; i<_bufferSize; i++) _output[i] = 0;
  545.     for (imax=1024; imax<=_bufferSize; imax+=1024) {
  546.       if (_frameCallBack!=null) _frameCallBack();
  547.       var terminal:Note = Note._tm;
  548.       for (note=terminal.n; note!=terminal; note=note.step()) {
  549.         dph = _pitchTable[note.pt];
  550.         for (i = imax-1024; i < imax; i++) {
  551.           ph = note.ph>>note.sh;
  552.           lout = note.wv[ph] + note.tl;
  553.           _output[i] += _logTable[lout];
  554.           note.ph = (note.ph+dph)&0x3ffffff;
  555.         }
  556.       }
  557.     }
  558.     return _output;
  559.   }
  560.   
  561.   // note on
  562.   public function noteOn(pitch:int, length:int, vol:Number=0.5, wave:int=0, decay:int=6, sweep:int=0) : Note {
  563.     var note:Note = Note.alloc();
  564.     note.len = length;
  565.     note.tl = log(vol);
  566.     note.ws = wave;
  567.     note.dr = decay<<2;
  568.     note.sw = sweep; 
  569.     return note.play(pitch);
  570.   }
  571. }
  572. class Note {
  573.   static public var _w:Array=[], _s:Array=[], _fl:Note=new Note(), _tm:Note=new Note();
  574.   static public function alloc():Note {if(_fl.p==_fl)return new Note();var r:Note=_fl.p;_fl.p=r.p;r.p.n=_fl;return r.reset();}
  575.   static public function table(b:int):Vector.<int>{_w.push(new Vector.<int>(1<<b,true));_s.push(26-b);return _w[_w.length-1];}
  576.   public function into(x:Note):Note{ p=x.p;n=x;p.n=this;n.p=this;return this; }
  577.   public function step():Note { tl+=dr; pt+=sw; pt&=2047return (--len==0||tl>3328) ? (stop().n) : n; }
  578.   public var p:Note, n:Note, pt:int, tl:int, sw:int, dr:int, wv:Vector.<int>, sh:int, len:int, ph:int, fl:Note;
  579.   function Note(useFreeList:Boolean=true) { p=n=this; fl=(useFreeList)?_fl:null; reset(); }
  580.   public function set ws(t:int) : void { wv=_w[t]; sh=_s[t]; }
  581.   public function play(pitch:int) : Note { into(_tm); pt=pitch; return this; }
  582.   public function stop() : Note { var r:Note=p; p.n=n; n.p=p; if(fl)into(fl); pt=-1return r; }
  583.   public function reset() : Note { ph=0; pt=-1; len=0; tl=256; sw=0; dr=24; ws=0return this; }
  584.   public function isPlaying() : Boolean { return (pt>=0); }
  585. }
  586. //////////////////////////////////////////////////////
  587. import flash.display.*
  588. import flash.events.*
  589. import flash.text.*
  590. import flash.filters.*;
  591. import flash.geom.*;
  592. import flash.utils.*
  593. class AA extends Sprite
  594. {
  595.   private var _sprite:Sprite         = new Sprite()
  596.   private var _textField:TextField   = new TextField()
  597.   private var _textFormat:TextFormat = new TextFormat()
  598.   public function AA()
  599.   {
  600.     this.addChild(_sprite);
  601.     _sprite.addChild(_textField);
  602.     SetDefaultFont();
  603.     SetDefaultText();
  604.   }
  605.   public function SetDefaultFont() : void
  606.   {
  607.     _textFormat.font  ="MS Pゴシック";
  608.     _textFormat.align = TextFormatAlign.LEFT;;
  609.     _textFormat.color = "0x000000";
  610.     _textFormat.size  = 12;
  611.     _textFormat.bold = true;
  612.   }
  613.   public function SetDefaultText() : void
  614.   {
  615.     _textField.defaultTextFormat = _textFormat;
  616.     _textField.multiline         = true;
  617.     _textField.autoSize          = TextFieldAutoSize.CENTER;
  618.     _textField.x                 = 0;
  619.     _textField.y                 = 0;
  620.     _textField.text              = "";
  621.   }
  622.   public function setText(text:String) : void
  623.   {
  624.     _textField.text = text;
  625.     _textField.y = - _textField.height; // set origin to texts lower
  626.   }
  627.   public function setTextArray(texts:Array) : void
  628.   {
  629.     var allText:String = "";
  630.     var numTexts:int = texts.length;
  631.     for (var i:int; i < numTexts; i++)
  632.     {
  633.       allText += texts[i];
  634.       if (i < numTexts - 1)
  635.       {
  636.         allText += "\n";
  637.       }
  638.     }
  639.     _textField.text = allText;
  640.     _textField.y = - _textField.height; // set origin to texts lower
  641.   }
  642.   public function setPosition(x:int, y:int) : void
  643.   {
  644.     _sprite.x = x;
  645.     _sprite.y = y;
  646.   }
  647.   public function setScale(scale:Number) : void
  648.   {
  649.     _sprite.scaleX = scale;
  650.     _sprite.scaleY = scale;
  651.   }
  652. }
  653. class Giko
  654. {
  655.   public var _x:Number;
  656.   public var _z:Number;
  657.   public var _isFlying:Boolean;
  658.   public var _flyFrame:int;
  659.   public var _waitAA:AA;
  660.   public var _zukoAA:AA;
  661.   private const COUNT:int = 512;
  662.   public function setAA(waitAA:AA, zukoAA:AA) : void
  663.   {
  664.     _waitAA = waitAA;
  665.     _zukoAA = zukoAA;
  666.   }
  667.   public function setRandomPosition() : void
  668.   {
  669.     _x = (Math.random() * 2.0 - 1.0) * 50;
  670.     _z = Math.random() * COUNT;
  671.     _isFlying = false;
  672.     _flyFrame = 0;
  673.   }
  674.   public function update() : void
  675.   {
  676.     if (isFlying())
  677.     {
  678.       if (++_flyFrame >= 60)
  679.       {
  680.         setRandomPosition();
  681.       }
  682.     }    
  683.   }
  684.   public function draw(buffer:BitmapData, sx:Number, sy:Number, sh:Number) : void
  685.   {
  686.     if (!isFlying())
  687.     {
  688.       _waitAA.setPosition(sx, sy);
  689.       _waitAA.setScale(sh / 4);
  690.       buffer.draw(_waitAA);
  691.     }
  692.     else
  693.     {
  694.       _zukoAA.setPosition(sx + _flyFrame * 2, sy - _flyFrame * 2);
  695.       _zukoAA.setScale(sh / 4);
  696.       buffer.draw(_zukoAA);
  697.     }
  698.   }
  699.   public function isFlying() : Boolean
  700.   {
  701.     return _isFlying;
  702.   }
  703.   public function isHit(harriarX:Number, harriarY:Number, harriarZ:Number) : Boolean 
  704.   {
  705.     if (Math.abs(_x - harriarX) >= 10) { return false; }
  706. //    if (Math.abs(_y - harriarY) >= 10) { return false; }
  707.     var zDiff:Number = _z - harriarZ;
  708.     if (zDiff < -COUNT/2) { zDiff += COUNT; }
  709.     else if (zDiff >= COUNT/2) { zDiff -= COUNT; }
  710.     if (zDiff < 0 || zDiff >= 10) { return false; }
  711.     return true;
  712.   }
  713.   public function fly() : void
  714.   {
  715.     _isFlying = true;
  716.     _flyFrame = 0;
  717.   }
  718. }
  719. //////////////////////////////////////////////////////
noswf
  1. // forked from ABA's forked from: 音楽を付けざるを得ない from:from:Ground
  2. // forked from keim_at_Si's 音楽を付けざるを得ない from:from:Ground
  3. // Ground.as
  4. //  Display a 3d ground surface and pillars.
  5. //  Control: Arrow keys or [WASD] keys.
  6. package
  7. {
  8.   import flash.display.Sprite;
  9.   import flash.display.BitmapData;
  10.   import flash.display.Bitmap;
  11.   import flash.geom.Rectangle;
  12.   import flash.events.Event;
  13.   import flash.events.KeyboardEvent;
  14.   import flash.events.SampleDataEvent;
  15.   import flash.media.Sound;
  16.   [SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
  17.   public class Ground extends Sprite
  18.   {
  19.     private const SCREEN_WIDTH:int = 465;
  20.     private const SCREEN_HEIGHT:int = 465;
  21.     private const COUNT:int = 512;
  22.     private const NEAR_PLANE_DIST:Number = 0.6;
  23.     private const PROJECTION_RATIO:Number = 250;
  24.     private const LOD_RATIO:Number = 1.05;
  25.     private const LOD_START_COUNT:Number = 16;
  26.     private const PILLARS_COUNT:int = 32;
  27.     private const WIRE_WIDTH:int = 2;
  28.     private const HAR_SPEED:Number = 11;
  29.     private const BACK_R:int = 210, BACK_G:int = 190, BACK_B:int = 240;
  30.     private var buffer:BitmapData;
  31.     private var left:Boolean, up:Boolean, right:Boolean, down:Boolean;
  32.     private var rect:Rectangle;
  33.     private var degs:Array;
  34.     private var index:int;
  35.     private var offset:Number;
  36.     private var gys:Array, gzs:Array, gcs:Array, gas:Array, gIndices:Array;
  37.     private var gCount:int;
  38.     private var sightX:Number, sightY:Number;
  39.     private var pillars:Array;
  40.     private var pillarRect:Rectangle;
  41.     private var harX:Number, harY:Number;
  42.     private var wireRect:Rectangle;
  43.     private var _sound:Sound;
  44.     private var _sequencer:Sequencer;
  45.     private var _module:TinySiOPM;
  46.     public function Ground()
  47.     {
  48.       buffer = new BitmapData(SCREEN_WIDTH, SCREEN_HEIGHT, false0);
  49.       var screen:Bitmap = new Bitmap(buffer);
  50.       addChild(screen);
  51.       rect = new Rectangle;
  52.       pillarRect = new Rectangle;
  53.       gys = new Array;
  54.       gzs = new Array;
  55.       gcs = new Array;
  56.       gas = new Array;
  57.       gIndices = new Array;
  58.       var di:Number = 0;
  59.       var did:Number = 1.0;
  60.       gCount = 0;
  61.       while (di < COUNT)
  62.       {
  63.         gys.push(0.0);
  64.         gzs.push(0.0);
  65.         gcs.push(int(0));
  66.         gas.push(int(0));
  67.         gIndices.push(int(0));
  68.         if (di > LOD_START_COUNT)
  69.           did *= LOD_RATIO;
  70.         di += did;
  71.         gCount++;
  72.       }
  73.       var i:int;
  74.       degs = new Array;
  75.       for (i = 0; i < COUNT; i++)
  76.       {
  77.         var d:Number;
  78.         if (i < COUNT / 4)
  79.           d = -0.001;
  80.         else if (i < COUNT / 2)
  81.           d = 0.002;
  82.         else if (i < COUNT / 4 * 3)
  83.           d = -0.003;
  84.         else
  85.           d = 0.004;
  86.         degs.push(d);
  87.       }
  88.       pillars = new Array;
  89.       for (i = 0; i < PILLARS_COUNT; i++)
  90.       {
  91.         var p:Pillar = new Pillar;
  92.         p.x = (Math.random() * 2.0 - 1.0) * 200;
  93.         p.z = Math.random() * COUNT;
  94.         p.width = 2;
  95.         p.height = 10 + Math.random() * 15;
  96.         pillars.push(p);
  97.       }
  98.       index = 0;
  99.       offset = 0;
  100.       sightX = sightY = 0;
  101.       harX = harY = 0;
  102.       wireRect = new Rectangle;
  103.       initializeSound();
  104.       _sound.play();
  105.       stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
  106.       stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
  107.       addEventListener(Event.ENTER_FRAME, onEnterFrame);
  108.     }
  109.     private function onEnterFrame(evt:Event):void
  110.     {
  111.       buffer.fillRect(buffer.rect, BACK_R * 0x10000 + BACK_G * 0x100 + BACK_B);
  112.       goForward(3.3);
  113.       drawGroundAndPillars();
  114.       updateHar();
  115.     }
  116.     private function drawGroundAndPillars():void
  117.     {
  118.       var idx:int = index;
  119.       var d:Number = degs[idx];
  120.       var dv:Number = -offset * d;
  121.       var y:Number = 5 - offset * d;
  122.       var z:Number = 1.0 - offset;
  123.       var di:Number = 0;
  124.       var did:Number = 1.0;
  125.       var i:int;
  126.       var gi:int = 0;
  127.       var r:Number;
  128.       for (i = 0; i < COUNT; i++)
  129.       {
  130.         var py:Number = y;
  131.         var pz:Number = z;
  132.         dv += degs[idx] + sightY * 0.00002;
  133.         y += dv;
  134.         z += 1.0;
  135.         if (i > di)
  136.         {
  137.           r = Number(i) - di;
  138.           gys[gi] = py * r + y * (1 - r);
  139.           gzs[gi] = pz * r + z * (1 - r);
  140.           var a:int = 255 - int(i * 255 / COUNT);
  141.           gas[gi] = a;
  142.           if (idx % 16 < 8)
  143.             gcs[gi] = createColor(0x77, 0xbb, 0x77, a);
  144.           else
  145.             gcs[gi] = createColor(0x99, 0x99, 0x99, a);
  146.           gIndices[gi] = idx;
  147.           gi++;
  148.           if (di > LOD_START_COUNT)
  149.             did *= LOD_RATIO;
  150.           di += did;
  151.         }
  152.         idx++;
  153.         if (idx >= COUNT)
  154.           idx = 0;
  155.       }
  156.       rect.x = 0;
  157.       rect.width = SCREEN_WIDTH;
  158.       var sx:Number;
  159.       var sy:Number;
  160.       var psy:Number = 99999;
  161.       for (i = gCount - 1; i >= 0; i--)
  162.       {
  163.         y = gys[i];
  164.         z = gzs[i];
  165.         sy = y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  166.         if (sy > psy)
  167.         {
  168.           rect.y = psy;
  169.           rect.height = sy - psy;
  170.           buffer.fillRect(rect, gcs[i]);
  171.         }
  172.         if (i < gCount - 1)
  173.         {
  174.           for (var j:int = 0; j < PILLARS_COUNT; j++)
  175.           {
  176.             var p:Pillar = pillars[j];
  177.             if (gIndices[i] > gIndices[i + 1])
  178.             {
  179.               drawPillar(p, gIndices[i], gIndices[i + 1] + COUNT, i);
  180.               drawPillar(p, gIndices[i] - COUNT, gIndices[i + 1], i);
  181.             }
  182.             else
  183.             {
  184.               drawPillar(p, gIndices[i], gIndices[i + 1], i);
  185.             }
  186.           }
  187.         }
  188.         psy = sy;
  189.       }
  190.     }
  191.     private function drawPillar(p:Pillar, si:int, ei:int, i:int):void
  192.     {
  193.       if (p.z >= si && p.z < ei)
  194.       {
  195.         var r:Number = Number(ei - p.z) / (ei - si);
  196.         var y:Number = gys[i] * r + gys[i + 1] * (1 - r);
  197.         var z:Number = gzs[i] * r + gzs[i + 1] * (1 - r);
  198.         var sx:Number = (p.x - sightX) * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_WIDTH / 2;
  199.         var sy:Number = y * NEAR_PLANE_DIST / z * PROJECTION_RATIO + SCREEN_HEIGHT / 2;
  200.         var sh:Number = NEAR_PLANE_DIST / z * PROJECTION_RATIO;
  201.         for (var j:int = 0; j < 5; j++)
  202.         {
  203.           pillarRect.x = sx - sh * p.width * 2 / 5 * j;
  204.           pillarRect.y = sy - sh * p.height;
  205.           pillarRect.width = sh * p.width * 2 / 5;
  206.           pillarRect.height = sh * p.height * 2;
  207.           buffer.fillRect(pillarRect, createColor(0x77 + 0x11 * j, 0x77 + 0x11 * j, 0xcc, gas[i]));
  208.         }
  209.       }
  210.     }
  211.     private function createColor(r:int, g:int, b:int, a:int):int
  212.     {
  213.       return int((r * a + BACK_R * (256 - a)) / 256) * 0x10000 +
  214.              int((g * a + 230 * (256 - a)) / 256) * 0x100 +
  215.              int((b * a + BACK_B * (256 - a)) / 256);
  216.     }
  217.     private function goForward(v:Number):void
  218.     {
  219.       offset += v;
  220.       while (offset >= 1.0)
  221.       {
  222.         offset -= 1.0;
  223.         index++;
  224.         if (index >= COUNT)
  225.           index -= COUNT;
  226.       }
  227.     }
  228.     private function updateHar():void
  229.     {
  230.       if (right && harX < SCREEN_WIDTH / 2 - 20)
  231.         harX += HAR_SPEED;
  232.       if (left && harX > -SCREEN_WIDTH / 2 + 20)
  233.         harX -= HAR_SPEED;
  234.       if (up && harY < SCREEN_HEIGHT / 2 - 40)
  235.         harY += HAR_SPEED;
  236.       if (down && harY > -SCREEN_HEIGHT / 2 + 40)
  237.         harY -= HAR_SPEED;
  238.       sightX = harX * 0.4;
  239.       sightY = harY * 0.6;
  240.       var hx:int = harX + SCREEN_WIDTH / 2;
  241.       var hy:int = harY + SCREEN_HEIGHT / 2;
  242.       rect.x = hx - 12;
  243.       rect.y = hy - 30;
  244.       rect.width = 20;
  245.       rect.height = 40;
  246.       drawWireBox(rect, 0xdd7777);
  247.       rect.x++;
  248.       drawWireBox(rect, 0xaa4444);
  249.       rect.x = hx - 14;
  250.       rect.y = hy - 45;
  251.       rect.width = 16;
  252.       rect.height = 20;
  253.       drawWireBox(rect, 0xdddd77);
  254.       rect.x++;
  255.       drawWireBox(rect, 0xaaaa44);
  256.       rect.x = hx - 20;
  257.       rect.y = hy + 5;
  258.       rect.width = 12;
  259.       rect.height = 40;
  260.       drawWireBox(rect, 0x77dddd);
  261.       rect.x++;
  262.       drawWireBox(rect, 0x44aaaa);
  263.       rect.x = hx - 1;
  264.       rect.y = hy + 10;
  265.       rect.width = 15;
  266.       rect.height = 25;
  267.       drawWireBox(rect, 0x77dddd);
  268.       rect.x++;
  269.       drawWireBox(rect, 0x44aaaa);
  270.       rect.x = hx - 1;
  271.       rect.y = hy - 12;
  272.       rect.width = 16;
  273.       rect.height = 16;
  274.       drawWireBox(rect, 0xee4444);
  275.       rect.x++;
  276.       drawWireBox(rect, 0xbb2222);
  277.     }
  278.     private function drawWireBox(rect:Rectangle, color:int):void
  279.     {
  280.       wireRect.x = rect.x;
  281.       wireRect.y = rect.y;
  282.       wireRect.width = rect.width;
  283.       wireRect.height = WIRE_WIDTH;
  284.       buffer.fillRect(wireRect, color);
  285.       wireRect.y = rect.y + rect.height - WIRE_WIDTH;
  286.       buffer.fillRect(wireRect, color);
  287.       wireRect.y = rect.y;
  288.       wireRect.width = WIRE_WIDTH;
  289.       wireRect.height = rect.height;
  290.       buffer.fillRect(wireRect, color);
  291.       wireRect.x = rect.x + rect.width - WIRE_WIDTH;
  292.       buffer.fillRect(wireRect, color);
  293.     }
  294.     private function onKeyUp(evt:KeyboardEvent):void
  295.     {
  296.       switch (evt.keyCode)
  297.       {
  298.       case 0x25:
  299.       case 0x41:
  300.         left = false;
  301.         break;
  302.       case 0x26:
  303.       case 0x57:
  304.         up = false;
  305.         break;
  306.       case 0x27:
  307.       case 0x44:
  308.         right = false;
  309.         break;
  310.       case 0x28:
  311.       case 0x53:
  312.         down = false;
  313.         break;
  314.       }
  315.     }
  316.     private function onKeyDown(evt:KeyboardEvent):void
  317.     {
  318.       switch (evt.keyCode)
  319.       {
  320.       case 0x25:
  321.       case 0x41:
  322.         left = true;
  323.         break;
  324.       case 0x26:
  325.       case 0x57:
  326.         up = true;
  327.         break;
  328.       case 0x27:
  329.       case 0x44:
  330.         right = true;
  331.         break;
  332.       case 0x28:
  333.       case 0x53:
  334.         down = true;
  335.         break;
  336.       }
  337.     }
  338.     private function initializeSound():void
  339.     {
  340.       var A:String,B:String,C:String,D:String,E:String,F:String,G:String,H:String;
  341.       var M1:String="[f6ee16>g4a4<f6ee16>a+<crrf6ee16d4e4f16g+6g6f4]";
  342.       var M2:String="[e20>l4eg<d|c+12>a+a10gf2ef2d6el3fef2gfg2a12g+4<f8d8]";
  343.       var M3:String="c+16l2rec+>a+agfed12e4l3fef2gfg2a12g2<g10l1gab<cdefgl2o7";
  344.       A ="@11s8o6l2[[c12cc18|c10crc18]|c10<crc18]dddrrdrcr16> [s6"+M1+M2+M3+"]";
  345.       B ="@7l2[4e12ef18|f10fre18]fffrrfrer16 [l2s6v6[[c6>brr<d6crr>|b<crrc6>a+rr<d6crr>a+<crr]b4<c4c10dedd6c6d4]";
  346.       B+="s2l4[e28dc+16>a+8ag<d16c8d8|c16d8f8]c14g18]";
  347.       C ="@7l2[4c12cc18|c10crc18]dddrrdrcr16 >[l2s6v6[[g6grrg6grrggrr]8a6arra6al4raaf10l6ag+g+f4l2]";
  348.       C+="s2[l32gef|l16fg+]f14g18]";
  349.       D ="@7l2[4g12ga18|g+10g+rg18]g+g+g+rrg+rgr16 [v6o6k2"+M1+M2+M3+"]";
  350.       E ="@1s14l2o3[56c<c>]<cccrrcrc>r16 [[[8c<c>]>[8a+<a+>][7a<a>]g<g>[8f<f>]|<]";
  351.       E+="[[8e<e>][8a<a>][8d<d>]|[8f<f>]][4f<f>]g<g>a<a>a+<a+>b<b]";
  352.       F ="v10@3s32o0k4r116cr[4c1][12r4c4]l2cccl1ccc2l2crcrr[12c1] [[32r4c4] [30r4c4]c4c4c2c2l1cccc]";
  353.       G ="v4@3s64o0l1[224d]r32 [1024d]";
  354.       H ="v16w32s48o4[56c]l2cccl1<gec2>l2crcrrl1<[4g][4e][4c]> l8[128c]";
  355.       _sound = new Sound();
  356.       _sound.addEventListener("sampleData", _onSoundStream);
  357.       _module = new TinySiOPM(8192, _onSoundFrame);
  358.       _sequencer = new Sequencer(4, [A,B,C,D,E,F,G,H]);
  359.     }
  360.     private function _onSoundFrame():void
  361.     {
  362.       _sequencer.onSequence();
  363.     }
  364.     private function _onSoundStream(e:SampleDataEvent):void
  365.     {
  366.       var out:Vector.<Number> = _module.render();
  367.       for (var i:int=0; i<8192; i++) {
  368.         e.data.writeFloat(out[i]);
  369.         e.data.writeFloat(out[i]);
  370.       }
  371.     }
  372.   }
  373. }
  374. class Pillar
  375. {
  376.   public var x:Number;
  377.   public var z:Number;
  378.   public var width:Number;
  379.   public var height:Number;
  380. }
  381. class Sequencer {
  382.   private var tracks:Array, count:int=Track.speed+1;
  383.   function Sequencer(speed:int, mmls:Array) { Track.speed=speed; mml=mmls; }
  384.   public function onSequence() : void {
  385.     if (++count == Track.speed) {
  386.       for each (var tr:Track in tracks) tr.execute();
  387.       count = 0;
  388.     }
  389.   }
  390.   public function set mml(list:Array) : void {
  391.     tracks = [];
  392.     for each (var seq:String in list) tracks.push(new Track(seq));
  393.     count = 0;
  394.   }
  395. }
  396. class Track {
  397.   static public var codeA:int="a".charCodeAt(), nt:Array=[9,11,0,2,4,5,7], speed:int=3;
  398.   public var oct:int, len:int, tl:int, dt:int, cnt:int, seq:String, sgn:int, stac:Array, note:Note;
  399.   private var _rex:RegExp=/([a-gklorsvw<>[|\]$@])([#+])?(\d+)?/g;
  400.   function Track(seq:String) {
  401.     note = new Note(false);
  402.     reset(seq);
  403.   }
  404.   public function reset(seq_:String) : void {
  405.     seq=seq_; oct=5; len=4; tl=256; dt=0; cnt=0; sgn=0; _rex.lastIndex=0; stac=[];
  406.   }
  407.   public function execute() : void {
  408.     if (--cnt <= 0) {
  409.       while (true) {
  410.         var res:* = _rex.exec(seq);
  411.         if (!res) {
  412.           if (sgn) { _rex.lastIndex = sgn; continue; }
  413.           else     { cnt = int.MAX_VALUE; break; }
  414.         }
  415.         var cmd:int = res[1].charCodeAt();
  416.         if (cmd>=codeA && cmd<=codeA+6) {
  417.           cnt = (res[3])?int(res[3]):len;
  418.           if (note.isPlaying()) note.stop();
  419.           note.len = cnt*speed;
  420.           note.tl = tl;
  421.           note.play(((nt[cmd-codeA]+oct*12+((res[2])?1:0))<<4)+dt);
  422.           break;
  423.         } else if (res[1] == 'r') {
  424.           cnt = (res[3])?int(res[3]):len;
  425.           if (note.isPlaying()) note.stop();
  426.           break;
  427.         } else {
  428.           switch(res[1]){
  429.           case 'k': dt  = int(res[3]); break;
  430.           case 'l': len = int(res[3]); break;
  431.           case 'o': oct = int(res[3]); break;
  432.           case 'v': tl  = TinySiOPM.log(int(res[3])*0.0625); break;
  433.           case '<': oct++; break;
  434.           case '>': oct--; break;
  435.           case '@': note.ws = int(res[3]);    break;
  436.           case 's': note.dr = int(res[3])<<2break;
  437.           case 'w': note.sw = -int(res[3]);   break;
  438.           case '$': sgn = _rex.lastIndex; break;
  439.           case '[': stac.unshift({p:_rex.lastIndex,c:((res[3])?int(res[3]):2),j:0}); break;
  440.           case ']': stac[0].j = _rex.lastIndex; if (--stac[0].c == 0) stac.shift(); else _rex.lastIndex = stac[0].p; break;
  441.           case '|':  if (stac[0].c == 1) { _rex.lastIndex = stac[0].j; stac.shift(); } break;
  442.           }
  443.         }
  444.       }
  445.     }
  446.   }
  447. }
  448. class TinySiOPM {
  449.   private var _output:Vector.<Number>, _bufferSize:int, _frameCallBack:Function;
  450.   private var _pitchTable:Vector.<int> = new Vector.<int>(2048true);
  451.   private var _logTable:Vector.<Number> = new Vector.<Number>(6144true);
  452.   
  453.   // Pass the buffer size and the function calls in each frame.
  454.   function TinySiOPM(bufferSize:int=2048, frameCallBack:Function=null) {
  455.     var i:int, j:int, p:Number, v:Number, t:Vector.<int>, ft:Array=[0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0];
  456.     for (i=0, p=0; i<192; i++, p+=0.00520833333)                            // create pitchTable[128*16]
  457.       for(v=Math.pow(2, p)*12441.464342886, j=i; j<2048; v*=2, j+=192) _pitchTable[j] = int(v);
  458.     for (i=0; i<32; i++) _pitchTable[i] = (i+1)<<6;                         // [0:31] for white noize
  459.     for (i=0, p=0.0078125; i<256; i+=2, p+=0.0078125)                       // create logTable[12*256*2]
  460.       for(v=Math.pow(213-p)*0.0001220703125, j=i; j<3328; v*=0.5, j+=256) _logTable[j+1] = -(_logTable[j] = v);
  461.     for (i=3328; i<6144; i++) _logTable[i] = 0;                             // [3328:6144] is 0-fill area
  462.     for (t=Note.table(10), i=0, p=0; i<1024; i++, p+=0.00613592315) t[i] = log(Math.sin(p));  // sin=0
  463.     for (t=Note.table(10), i=0, p=0.75; i<1024; i++, p-=0.00146484375) t[i] = log(p);         // saw=1
  464.     for (t=Note.table(5),  i=0; i<16; i++) t[i+16] = (t[i] = log(ft[i]*0.0625)) + 1;          // famtri=2
  465.     for (t=Note.table(15), i=0; i<32768; i++) t[i] = log(Math.random()-0.5);                  // wnoize=3
  466.     for (i=0; i<8; i++) for (t=Note.table(4), j=0; j<16; j++) t[j] = (j<=i) ? 192 : 193;      // pulse=4-11
  467.     _output = new Vector.<Number>(bufferSize, true);                        // allocate monoral buffer
  468.     _bufferSize = bufferSize; _frameCallBack = frameCallBack;               // set parameters
  469.   }
  470.   
  471.   // calculate index of logTable
  472.   static public function log(n:Number) : int {
  473.     return (n<0) ? ((n<-0.00390625) ? (((int(Math.log(-n) * -184.66496523 + 0.5) + 1) << 1) + 1) : 2047)
  474.                  : ((n> 0.00390625) ? (( int(Math.log( n) * -184.66496523 + 0.5) + 1) << 1)      : 2046);
  475.   }
  476.   
  477.   // Returns monoral output as Vector.<Number>(bufferSize).
  478.   public function render() : Vector.<Number> {
  479.     var note:Note, rep:int, i:int, imax:int, ph:int, dph:int, lout:int, v:int;
  480.     for (i=0; i<_bufferSize; i++) _output[i] = 0;
  481.     for (imax=1024; imax<=_bufferSize; imax+=1024) {
  482.       if (_frameCallBack!=null) _frameCallBack();
  483.       var terminal:Note = Note._tm;
  484.       for (note=terminal.n; note!=terminal; note=note.step()) {
  485.         dph = _pitchTable[note.pt];
  486.         for (i = imax-1024; i < imax; i++) {
  487.           ph = note.ph>>note.sh;
  488.           lout = note.wv[ph] + note.tl;
  489.           _output[i] += _logTable[lout];
  490.           note.ph = (note.ph+dph)&0x3ffffff;
  491.         }
  492.       }
  493.     }
  494.     return _output;
  495.   }
  496.   
  497.   // note on
  498.   public function noteOn(pitch:int, length:int, vol:Number=0.5, wave:int=0, decay:int=6, sweep:int=0) : Note {
  499.     var note:Note = Note.alloc();
  500.     note.len = length;
  501.     note.tl = log(vol);
  502.     note.ws = wave;
  503.     note.dr = decay<<2;
  504.     note.sw = sweep; 
  505.     return note.play(pitch);
  506.   }
  507. }
  508. class Note {
  509.   static public var _w:Array=[], _s:Array=[], _fl:Note=new Note(), _tm:Note=new Note();
  510.   static public function alloc():Note {if(_fl.p==_fl)return new Note();var r:Note=_fl.p;_fl.p=r.p;r.p.n=_fl;return r.reset();}
  511.   static public function table(b:int):Vector.<int>{_w.push(new Vector.<int>(1<<b,true));_s.push(26-b);return _w[_w.length-1];}
  512.   public function into(x:Note):Note{ p=x.p;n=x;p.n=this;n.p=this;return this; }
  513.   public function step():Note { tl+=dr; pt+=sw; pt&=2047return (--len==0||tl>3328) ? (stop().n) : n; }
  514.   public var p:Note, n:Note, pt:int, tl:int, sw:int, dr:int, wv:Vector.<int>, sh:int, len:int, ph:int, fl:Note;
  515.   function Note(useFreeList:Boolean=true) { p=n=this; fl=(useFreeList)?_fl:null; reset(); }
  516.   public function set ws(t:int) : void { wv=_w[t]; sh=_s[t]; }
  517.   public function play(pitch:int) : Note { into(_tm); pt=pitch; return this; }
  518.   public function stop() : Note { var r:Note=p; p.n=n; n.p=p; if(fl)into(fl); pt=-1return r; }
  519.   public function reset() : Note { ph=0; pt=-1; len=0; tl=256; sw=0; dr=24; ws=0return this; }
  520.   public function isPlaying() : Boolean { return (pt>=0); }
  521. }
noswf
Get Adobe Flash Player