Пишем музыку на FlashPlayer 10

В итоге получим blink-182 – Stay Together for the Kids

Синтаксис в строках такой:
d-4 – Ре 4 октава
f#4 – Фа 4 октава диез
/ – разделение между нотами
= – означает что в конце играния ноты не будет короткого прерывания, будет так, как будь-то нажали и не отпускаете ноту

Слушать

StayTogether.as

package {
    import flash.display.Sprite;
    import flash.events.SampleDataEvent;
    import flash.media.Sound;
    import flash.media.SoundTransform;
   
    [SWF(width="550", height="400", backgroundColor="#000000")]
   
    public class StayTogether extends Sprite {
        private var sound:Sound;
        private var noiseSolo:Number = 0;
        private var noiseBass:Number = 0;
        private var now:int = 0;
        private var hold:int = 0;
        private var speed:int = 5;
        private var soloArr:Array;
        private var bassArr:Array;
       
        public function StayTogether() {
            // stay together for the kids
            var str:String =
            "d-4/d-4/d-4/a-4/d-4/d-4/f#4/d-4/" +
            "c#4/d-4/c#4/a-4/c#4/d-4/f#4/d-4/" +
            "b-3/d-4/b-3/f#4/b-3/d-4/g-4/d-4/" +
            "a-3/e-4/a-3/f#4/g-4/f#4/e-4/d-4/" +
            "d-4/d-4/d-4/a-4/d-4/d-4/f#4/d-4/" +
            "c#4/d-4/c#4/a-4/c#4/d-4/f#4/d-4/" +
            "b-3/d-4/b-3/f#4/b-3/d-4/g-4/d-4/" +
            "a-3/e-4/a-3/f#4/g-4/f#4/e-4/d-4/" +
           
            "d-4/d-4/d-5=/d-5/d-4/d-4/d-5=/d-5/d-4/d-4/d-5=/d-5/d-4/d-4/d-5=/d-5/" +
            "c#4/c#4/d-5=/d-5/c#4/c#4/d-5=/d-5/c#4/c#4/d-5=/d-5/c#4/c#4/d-5=/d-5/" +
            "a-3/a-3/d-5=/d-5/a-3/a-3/d-5=/d-5/a-3/a-3/d-5=/d-5/a-3/a-3/d-5=/d-5/" +
            "a-3/a-3/e-5=/e-5/a-3/a-3/e-5=/e-5/a-3/a-3/c#5=/c#5/a-3/a-3/c#5=/c#5/" +
           
            "d-4/d-4/d-5=/d-4/d-4/d-4/d-5=/d-4/d-4/d-4/d-5=/d-4/d-4/d-4/d-5=/d-4/" +
            "c#4/c#4/d-5=/c#4/c#4/c#4/d-5=/c#4/c#4/c#4/d-5=/c#4/c#4/c#4/d-5=/c#4/" +
            "a-3/a-3/d-5=/a-3/a-3/a-3/d-5=/a-3/a-3/a-3/d-5=/a-3/a-3/a-3/d-5=/a-3/" +
            "a-3/a-3/e-5=/a-3/a-3/a-3/e-5=/a-3/a-3/a-3/c#5=/a-3/a-3/a-3/c#5=/a-3/" +
           
            "d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/" +
            "c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/b-3/c#4/" +
            "d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/d-4/" +
            "c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/c#4/b-3/c#4";
            soloArr = notesToHertz(str);
           
            // stay together for the kids
            str =
            "d-3/d-3/d-3/d-3/d-3/d-3/d-3/d-3/" +
            "c#3/c#3/c#3/c#3/c#3/c#3/c#3/c#3/" +
            "b-2/b-2/b-2/b-2/b-2/b-2/b-2/b-2/" +
            "a-2/a-2/a-2/a-2/a-2/a-2/a-2/a-2/" +
            "d-3/d-3/d-3/d-3/d-3/d-3/d-3/d-3/" +
            "c#3/c#3/c#3/c#3/c#3/c#3/c#3/c#3/" +
            "b-2/b-2/b-2/b-2/b-2/b-2/b-2/b-2/" +
            "a-2/a-2/a-2/a-2/a-2/a-2/a-2/a-2/" +
           
            "d-3/d-3/a-4=/a-4/d-3/d-3/a-4=/a-4/d-3/d-3/a-4=/a-4/d-3/d-3/a-4=/a-4/" +
            "c#3/c#3/a-4=/a-4/c#3/c#3/a-4=/a-4/c#3/c#3/a-4=/a-4/c#3/c#3/a-4=/a-4/" +
            "a-2/a-2/a-4=/a-4/a-2/a-2/a-4=/a-4/a-2/a-2/a-4=/a-4/a-2/a-2/a-4=/a-4/" +
            "a-2/a-2/a-4=/a-4/a-2/a-2/a-4=/a-4/a-2/a-2/a-4=/a-4/a-2/a-2/a-4=/a-4/" +
           
            "d-3/d-3/a-4=/d-3/d-3/d-3/a-4=/d-3/d-3/d-3/a-4=/d-3/d-3/d-3/a-4=/d-3/" +
            "c#3/c#3/a-4=/c#3/c#3/c#3/a-4=/c#3/c#3/c#3/a-4=/c#3/c#3/c#3/a-4=/c#3/" +
            "a-2/a-2/a-4=/a-2/a-2/a-2/a-4=/a-2/a-2/a-2/a-4=/a-2/a-2/a-2/a-4=/a-2/" +
            "a-2/a-2/a-4=/a-2/a-2/a-2/a-4=/a-2/a-2/a-2/a-4=/a-2/a-2/a-2/a-4=/a-2/" +
           
            "g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/" +
            "f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/e-2/f#2/" +
            "g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/g-2/" +
            "f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/f#2/e-2/f#2";
            bassArr = notesToHertz(str);
           
            sound = new Sound();
            sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onCallback);
            sound.play(0, 0, new SoundTransform(.25, -.1));
        }
       
        private function onCallback(e:SampleDataEvent):void {
            var sample1:Number;
            var sample2:Number;
            var flag:Boolean = hold<speed-soloArr[now].short;
           
            for (var i:uint=0; i<2048; i++){
                noiseSolo += soloArr[now].hz;
                sample1 = noiseSolo * Math.PI;
                sample1 = Math.min(1, Math.tan(sample1));
           
                noiseBass += bassArr[now].hz;
                sample2 = noiseBass * Math.PI;
                sample2 = Math.min(1, Math.tan(sample2));
               
                if (!flag && i>=1024) {
                    sample1 = 0;
                    sample2 = 0;
                }
               
                e.data.writeFloat(sample1);
                e.data.writeFloat(sample2);
            }
           
            hold++;
            if (hold==speed) {
                hold = 0;
                now++;
                now==soloArr.length ? now=0 : null;
            }
        }
       
        private function notesToHertz(str:String):Array {
            var str:String = str.toUpperCase();
            var arr:Array = str.split("/");
           
            for (var i:uint=0; i<arr.length; i++){
                var a:Array = arr[i].split("");
                var num:Number;
                if (a[1] == "#") {
                    num = Notes[a[0]+"_"];
                } else {
                    num = Notes[a[0]];
                }
                num = 2 + num + 12*Number(a[2]) - 12*6;
                var hz:Number = Math.pow(2, num/12) * 440;
                hz /= 44100;
               
                var short:int;
                if (a[3]=="=") short = 0;
                    else short = 1;
               
                arr[i] = {hz:hz, short:short};
            }
            return arr;
        }
    }
}

Notes.as

package {
    public class Notes {
        public static const C:Number = 1;
        public static const C_:Number = 2;
        public static const D:Number = 3;
        public static const D_:Number = 4;
        public static const E:Number = 5;
        public static const F:Number = 6;
        public static const F_:Number = 7;
        public static const G:Number = 8;
        public static const G_:Number = 9;
        public static const A:Number = 10;
        public static const A_:Number = 11;
        public static const B:Number = 12;
       
        public function Notes() {}
    }
}

1 comment so far

  1. Как в мобильных старых))) Здорово:)


Ответить