root/lang/javascript/jsmml/trunk/src/JSMML.as @ 639

Revision 639, 4.4 kB (checked in by secondlife, 6 years ago)

lang/javascript/jsmml: removed debuglog

Line 
1/*
2 * Author: Yuichi Tateno
3 * http://rails2u.com/
4 *
5 * The MIT Licence.
6 */
7
8package {
9    import flash.display.Sprite;
10    import flash.utils.Timer;
11    import flash.events.TimerEvent;
12    import flash.external.ExternalInterface;
13    import flash.system.Security;
14    import flash.events.Event;
15
16    public class JSMML extends Sprite {
17        public static const VERSION:String = '1.0.2';
18
19        public var mmlPlayers:Object = {};
20
21        public function JSMML() {
22            Security.allowDomain('*');
23            initJS();
24        }
25
26        public const CALLBACKS:Array = ['create', 'play', 'stop' ,'pause', 'destroy'];
27        public function initJS():void {
28            ExternalInterface.call('JSMML.setSWFVersion', JSMML.VERSION);
29            for each(var cName:String in CALLBACKS) {
30                ExternalInterface.addCallback('_' + cName, this[cName]);
31            }
32            ExternalInterface.call('JSMML.initASFinish()');
33        }
34
35        public function create():Number {
36            var uNum:Number = getUNum();
37            mmlPlayers[uNum] = new MMLPlayer();
38            player(uNum).addEventListener(Event.COMPLETE, playerCompleteHandlerBindNum(uNum));
39            return uNum;
40        }
41
42        public function getUNum(uNum:Number = NaN):Number {
43            if (isNaN(uNum)) {
44                uNum = (new Date).getTime();
45            } else {
46                uNum++;
47            }
48
49            if (mmlPlayers[uNum]) {
50                return getUNum(uNum);
51            } else {
52                return uNum;
53            }
54        }
55
56        public function playerCompleteHandlerBindNum(uNum:Number):Function {
57            return function(e:*):void {
58                ExternalInterface.call('JSMML.instances["' + uNum + '"].onFinish()');
59            };
60        }
61
62        public function removeFinishCallback(uNum:Number, func:Function):void {
63            player(uNum).removeEventListener(Event.COMPLETE, func);
64        }
65
66        public function play(uNum:Number, mml:String = undefined):void {
67            if (mml) setMML(uNum, mml);
68            player(uNum)._play();
69        }
70
71        /*
72        public function time(uNum:Number):Number {
73            return player(uNum).time;
74        }
75        */
76
77        public function setMML(uNum:Number, mml:String):void {
78            player(uNum).setMML(mml);
79        }
80
81        public function stop(uNum:Number):void {
82            player(uNum).stop();
83        }
84
85        public function pause(uNum:Number):void {
86            player(uNum).pause();
87        }
88
89        public function destroy(uNum:Number):void {
90            stop(uNum);
91            delete mmlPlayers[uNum];
92        }
93
94        public function player(uNum:Number):MMLPlayer {
95            if (!mmlPlayers[uNum]) new Error("Player is not found: " + uNum);
96            return mmlPlayers[uNum];
97        }
98    }
99}
100
101import com.txt_nifty.sketch.flmml.MML;
102import com.txt_nifty.sketch.flmml.MOscillator;
103import flash.events.Event;
104
105internal class MMLPlayer extends MML {
106    public function MMLPlayer(mml:String = undefined) {
107        super();
108        var self:MMLPlayer = this;
109        m_sequencer.addEventListener(Event.COMPLETE, function(e:Event):void {
110            self.dispatchEvent(new Event(Event.COMPLETE));
111        });
112        if (mml) setMML(mml);
113    }
114
115    // original code form MML#play
116    public function setMML(str:String):void {
117        m_sequencer.disconnectAll();
118        m_tracks = new Array();
119        m_tracks[0] = createTrack();
120        m_sequencer.connect(m_tracks[0]);
121
122        m_trackNo = 0;
123        m_octave = 4;
124        m_velocity = 100;
125        m_length = 4;
126        m_tempo  = 120;
127        m_keyoff = 1;
128        m_gate = 15;
129        m_maxGate = 16;
130        m_form = MOscillator.PULSE;
131
132        processMacro(str);
133        m_string = removeWhitespace(m_string);
134        processRepeat();
135        //trace("string "+m_string);
136        process();
137
138        // add ends of tracks
139        for(var i:int = 0; i < m_tracks.length; i++) {
140            m_tracks[i].recRest(384);
141            m_tracks[i].recEOT();
142        }
143        // play start
144    }
145
146    /*
147    public function get time():Number {
148        return m_sequencer.now;
149    }
150    */
151
152    // MML#proxy don't override because the method call on arg.
153    public function _play():void {
154        // play start
155        m_sequencer.play();
156    }
157
158    public override function stop():void {
159        super.stop();
160        m_sequencer.disconnectAll();
161    }
162
163    public function pause():void {
164        m_sequencer.stop();
165    }
166
167}
Note: See TracBrowser for help on using the browser.