Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package
- {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.Sprite;
- import flash.display.StageAlign;
- import flash.display.StageScaleMode;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.events.SampleDataEvent;
- import flash.geom.Rectangle;
- import flash.media.Sound;
- import flash.media.SoundChannel;
- import flash.text.TextField;
- import flash.text.TextFieldAutoSize;
- import flash.text.TextFieldType;
- import flash.text.TextFormat;
- import flash.utils.ByteArray;
- /**
- * ...
- * @author YellowAfterlife
- */
- public class Main extends Sprite
- {
- public var sb:ByteArray; // soundBytes
- public var so:Sound; // soundObject
- public var sc:SoundChannel; // soundChannel
- //
- public function Main():void {
- if (stage) init();
- else addEventListener(Event.ADDED_TO_STAGE, init);
- }
- // listener for sound.SampleData, for writing data into sound
- public function so_bytes(event:SampleDataEvent):void {
- var bytes:ByteArray = new ByteArray();
- sb.readBytes(bytes, 0, Math.min(sb.bytesAvailable, 8 * 8192));
- event.data.writeBytes(bytes, 0, bytes.length);
- }
- // event handler for sound.COMPLETE
- public function so_complete(event:Event):void {
- dispatchEvent(event);
- }
- // different types of sound generation
- // l is length in seconds, f is frequency
- public function so_add(l:Number, f:Number):void {
- if (f == 0) { so_sil(l); return; }
- var i:int, v:Number, m:Number;
- m = l * 44100;
- for (i = 0; i < m; i++) {
- v = Math.sin(i / f) * 0.5;
- sb.writeFloat(v);
- sb.writeFloat(v);
- }
- }
- // fade-in
- public function so_addu(l:Number, f:Number):void {
- if (f == 0) { so_sil(l); return; }
- var i:int, v:Number, m:Number;
- m = l * 44100;
- for (i = 0; i < m; i++) {
- v = Math.sin(i / f) * 0.5 * (i / m);
- sb.writeFloat(v);
- sb.writeFloat(v);
- }
- }
- // fade-out
- public function so_addl(l:Number, f:Number):void {
- if (f == 0) { so_sil(l); return; }
- var i:int, v:Number, m:Number;
- m = l * 44100;
- for (i = 0; i < m; i++) {
- v = Math.sin(i / f) * 0.5 * (1 - i / m);
- sb.writeFloat(v);
- sb.writeFloat(v);
- }
- }
- // smoothed
- public function so_adds(l:Number, f:Number):void {
- if (f == 0) { so_sil(l); return; }
- var i:int, v:Number, m:Number, t:Number;
- m = l * 44100;
- for (i = 0; i < m; i++) {
- t = i / m;
- v = Math.sin(i / f) * 0.5;
- if (t < 0.1) v *= t * t * 100;
- if (t > 0.9) v *= (1 - t) * (1 - t) * 100;
- sb.writeFloat(v);
- sb.writeFloat(v);
- }
- }
- // silence
- public function so_sil(l:Number):void
- {
- var i:int, m:Number;
- m = l * 44100;
- for (i = 0; i < m; i++)
- {
- sb.writeFloat(0);
- sb.writeFloat(0);
- }
- }
- private var tt:uint = 1; // time passed
- private var ts:Number = 0; // total time
- // handler for onFrame event of stage, increments time
- private function tick(e:Event = null):void {
- tt++;
- ts = tt / stage.frameRate;
- }
- // parses string and converts it into sound
- private function psound(s:String = null):void
- {
- sb = new ByteArray();
- var i:int, z:String, l:Number, f:Number, c:String;
- for (i = 0; i < s.length; i++)
- {
- if (s.charAt(i) == "#") for (i++; s.charCodeAt(i) != 13 && i < s.length; i++) { }
- if (s.charAt(i) == "{")
- {
- l = 0;
- for (i++; (s.charAt(i) != "}" || l != 0) && i < s.length; i++) l += (s.charAt(i) == "{" ? 1 : (s.charAt(i) == "}" ? -1 : 0));
- }
- c = s.charAt(i);
- if (c == "~" || c == "*" || c == "=" || c == "/" || c == "\\")
- {
- z = "";
- for (i++; s.charAt(i) != "," && s.charAt(i) != "{" && s.charAt(i) != "#" && s.charCodeAt(i) != 13 && i < s.length; i++) z += s.charAt(i);
- l = parseFloat(z);
- z = "";
- for (i++; s.charAt(i) != ";" && s.charAt(i) != "{" && s.charAt(i) != "#" && s.charCodeAt(i) != 13 && i < s.length; i++) z += s.charAt(i);
- f = parseFloat(z);
- switch(c)
- {
- case "*": so_adds(l, f); break;
- case "~": so_adds(l, f); break;
- case "=": so_add(l, f); break;
- case "/": so_addu(l, f); break;
- case "\\": so_addl(l, f); break;
- }
- }
- }
- // making the actual sound:
- sb.position = 0;
- so = new Sound();
- so.addEventListener(SampleDataEvent.SAMPLE_DATA, so_bytes);
- sc = so.play();
- sc.addEventListener(Event.SOUND_COMPLETE, so_complete);
- }
- private function click(e:MouseEvent = null):void
- {
- if (e.stageY < 32 && e.stageX < 128)
- {
- psound(ti.text);
- }
- }
- public var ti:TextField = new TextField(), ty:TextField = new TextField();
- // Slider stuff
- public var sd_bmdt:BitmapData = new BitmapData(320, 8, false, 0x000000);
- public var sd_bmdt0:BitmapData = new BitmapData(320, 8, false, 0x000000);
- public var sd_bm:Bitmap = new Bitmap(sd_bmdt);
- public var sd_bm0:Bitmap = new Bitmap(sd_bmdt0);
- public var sd_v0:Number = 1, sd_v1:Number = 1;
- public var sd_a0:Number = 0, sd_b0:Number = 4;
- public var sd_a1:Number = 0, sd_b1:Number = 64;
- public function sd_click(e:MouseEvent):void
- {
- var r:Rectangle = new Rectangle(), n:Number;
- if (sd_bm0.hitTestPoint(e.stageX, e.stageY, false))
- {
- n = e.stageX - sd_bm.x;
- sd_v0 = n / sd_bm.width;
- ty.text = "*" + (sd_a0 + sd_v0 * (sd_b0 - sd_a0)) + "," + (sd_a1 + sd_v1 * (sd_b1 - sd_a1)) + ";";
- psound(ty.text + "*0.1,0;");
- r.x = r.y = 0;
- r.height = 8;
- r.width = n;
- sd_bmdt0.fillRect(r, 0x000000);
- r.x = r.width;
- r.width = sd_bm.width - r.width;
- sd_bmdt0.fillRect(r, 0xCCCCCC);
- }
- if (sd_bm.hitTestPoint(e.stageX, e.stageY, false))
- {
- n = e.stageX - sd_bm.x;
- sd_v1 = n / sd_bm.width;
- ty.text = "*" + (sd_a0 + sd_v0 * (sd_b0 - sd_a0)) + "," + (sd_a1 + sd_v1 * (sd_b1 - sd_a1)) + ";";
- psound(ty.text + "*0.1,0;");
- r.x = r.y = 0;
- r.height = 8;
- r.width = n;
- sd_bmdt.fillRect(r, 0x000000);
- r.x = r.width;
- r.width = sd_bm.width - r.width;
- sd_bmdt.fillRect(r, 0xCCCCCC);
- }
- if (ty.hitTestPoint(e.stageX, e.stageY, false))
- {
- ti.appendText(ty.text);
- }
- }
- public function sd_init():void
- {
- sd_bm.x = sd_bm0.x = 128;
- sd_bm.y = 20; sd_bm0.y = 8;
- stage.addEventListener(MouseEvent.CLICK, sd_click);
- addChild(sd_bm);
- addChild(sd_bm0);
- }
- private function init(e:Event = null):void
- {
- stage.scaleMode = StageScaleMode.NO_SCALE;
- stage.align = StageAlign.TOP_LEFT;
- removeEventListener(Event.ADDED_TO_STAGE, init);
- stage.addEventListener(Event.ENTER_FRAME, tick);
- stage.addEventListener(MouseEvent.CLICK, click);
- stage.addEventListener(Event.RESIZE, function(e:Event = null):void { ti.width = stage.stageWidth - 32; ti.height = stage.stageHeight - 48; } );
- // entry point
- sd_init();
- ty.autoSize = TextFieldAutoSize.LEFT;
- ty.y = 8;
- ty.x = 456;
- ty.text = "*";
- stage.addChild(ty);
- var tj:TextField = new TextField();
- tj.x = 24;
- tj.y = 12;
- tj.selectable = false;
- tj.defaultTextFormat = ty.defaultTextFormat = ti.defaultTextFormat = new TextFormat("Courier New", 12, 0x333333);
- tj.text = "[Play sound]";
- stage.addChild(tj);
- // main textfield:
- ti.border = true;
- ti.backgroundColor = 0xFEFEFE;
- ti.background = true;
- ti.x = 16;
- ti.y = 32;
- ti.width = stage.stageWidth - 32;
- ti.height = stage.stageHeight - 48;
- ti.type = TextFieldType.INPUT;
- ti.multiline = true;
- ti.tabEnabled = true;
- ti.text =
- "{" +
- "\n SoundTest 0.0.1" +
- "\n Sound format:" +
- "\n (type)(length),(freq)(;)" +
- "\n type : sound type" +
- "\n * Smooth" +
- "\n / Fade-in" +
- "\n = Plain" +
- "\n \\ Fade-out" +
- "\n length : sound length (in seconds)" +
- "\n freq : frequency. Range of [0.1 .. 23] can be heard." +
- "\n ; is required if placing several commands on one line"+
- "\n Other:" +
- "\n { text } : multi-line comment." +
- "\n # text : single-line comment." +
- "\n Example:" +
- "\n *1, 15 # play sound with freq. 15 for 1 second"+
- "\n}\n"
- stage.addChild(ti);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement