Changeset 608 for lang/javascript/jsmml

Show
Ignore:
Timestamp:
10/22/07 14:20:12 (6 years ago)
Author:
secondlife
Message:

lang/javascript/jsmml: JS init tyming changed. based on FlMML 0.62

Location:
lang/javascript/jsmml/trunk
Files:
10 modified

Legend:

Unmodified
Added
Removed
  • lang/javascript/jsmml/trunk/examples/textarea_play.html

    r395 r608  
    99    function play() { 
    1010        mml.play(document.getElementById('ta').value); 
     11      console.log(mml._uNum); 
    1112    } 
    1213    </script> 
  • lang/javascript/jsmml/trunk/src/JSMML.as

    r469 r608  
    1515 
    1616    public class JSMML extends Sprite { 
    17         public static const VERSION:String = '1.0.1'; 
     17        public static const VERSION:String = '1.0.2'; 
    1818 
    1919        public var mmlPlayers:Object = {}; 
     
    3434 
    3535        public function create():Number { 
    36             var uNum:Number = (new Date).getTime(); 
     36            var uNum:Number = getUNum(); 
     37            log(uNum); 
    3738            mmlPlayers[uNum] = new MMLPlayer(); 
    3839            player(uNum).addEventListener(Event.COMPLETE, playerCompleteHandlerBindNum(uNum)); 
    3940            return uNum; 
     41        } 
     42 
     43        public function getUNum(uNum:Number = NaN):Number { 
     44            if (isNaN(uNum)) { 
     45                uNum = (new Date).getTime(); 
     46            } else { 
     47                uNum++; 
     48            } 
     49 
     50            if (mmlPlayers[uNum]) { 
     51                return getUNum(uNum); 
     52            } else { 
     53                return uNum; 
     54            } 
    4055        } 
    4156 
     
    116131        m_form = MOscillator.PULSE; 
    117132 
    118         preProcess(str); 
     133        processMacro(str); 
     134        m_string = removeWhitespace(m_string); 
     135        processRepeat(); 
     136        //trace("string "+m_string); 
    119137        process(); 
    120138 
     
    124142            m_tracks[i].recEOT(); 
    125143        } 
     144        // play start 
    126145    } 
    127146 
     
    138157    } 
    139158 
    140     public function stop():void { 
    141         m_sequencer.stop(); 
     159    public override function stop():void { 
     160        super.stop(); 
    142161        m_sequencer.disconnectAll(); 
    143162    } 
  • lang/javascript/jsmml/trunk/src/JSMML.js

    r447 r608  
    1313})(); 
    1414 
    15 JSMML.VESION = '1.0.0'; 
     15JSMML.VESION = '1.0.2'; 
    1616JSMML.setSWFVersion = function(v) { JSMML.SWF_VERSION = v }; 
    1717JSMML.SWF_VERSION = 'SWF don\'t load, yet.'; 
     
    7171JSMML.prototype = { 
    7272    initialize: function() { 
    73         this.uNum = this.mmlPlayer._create(); 
    74         JSMML.instances[this.uNum] = this; 
    7573        this.onFinish = function() {}; 
    7674        this.pauseNow = false; 
    7775    }, 
     76    uNum: function() { 
     77        if (!this._uNum) { 
     78            this._uNum = this.mmlPlayer._create(); 
     79            JSMML.instances[this._uNum] = this; 
     80        } 
     81        return this._uNum; 
     82    }, 
    7883    play: function(_mml) { 
    7984        if (!_mml && this.pauseNow) { 
    80             this.mmlPlayer._play(this.uNum); 
     85            this.mmlPlayer._play(this.uNum()); 
    8186        } else { 
    8287            if (_mml) this.score = _mml; 
    83             this.mmlPlayer._play(this.uNum, this.score); 
     88            this.mmlPlayer._play(this.uNum(), this.score); 
    8489        } 
    8590        this.pauseNow = false; 
    8691    }, 
    8792    stop: function() { 
    88         this.mmlPlayer._stop(this.uNum); 
     93        this.mmlPlayer._stop(this.uNum()); 
    8994    }, 
    9095    pause: function() { 
    9196        this.pauseNow = true; 
    92         this.mmlPlayer._pause(this.uNum); 
     97        this.mmlPlayer._pause(this.uNum()); 
    9398    }, 
    9499    destroy: function() { 
    95         this.mmlPlayer._destroy(this.uNum); 
    96         delete JSMML.instances[this.uNum]; 
     100        this.mmlPlayer._destroy(this.uNum()); 
     101        delete JSMML.instances[this.uNum()]; 
    97102    } 
    98103    /* 
    99104    , 
    100105    time: function() { 
    101         return this.mmlPlayer._time(this.uNum); 
     106        return this.mmlPlayer._time(this.uNum()); 
    102107    } 
    103108    */ 
  • lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/FlMML.as

    r447 r608  
    1212            m_mml.play(mml); 
    1313                } 
     14 
     15        public function stop():void { 
     16            m_mml.stop(); 
     17        } 
     18 
     19        public function setMasterVolume(vol:int):void { 
     20            m_mml.setMasterVolume(vol); 
     21        } 
    1422        } 
    1523} 
  • lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MEnvelope.as

    r447 r608  
    3939                public function setSR(sustain:Number, release:Number):void { 
    4040                        m_sustain = sustain; 
    41                         m_release = (release > 0) ? release : 1; 
     41                        m_release = (release > 0) ? release : (1/127); 
    4242                } 
    4343                 
  • lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MML.as

    r447 r608  
    1 package com.txt_nifty.sketch.flmml { 
     1package com.txt_nifty.sketch.flmml { 
    22        import de.popforge.audio.output.*; 
    33        import flash.events.EventDispatcher; 
     4    import mx.utils.StringUtil; 
    45 
    56        public class MML extends EventDispatcher { 
     
    153154 
    154155                protected function getCharNext():String { 
    155                         var c:String = ''; 
    156                         do { 
    157                                 c = m_string.charAt(m_letter++); 
    158                         } while (c == ' ' && m_letter < m_string.length); 
    159                         return c; 
     156                        return (m_letter < m_string.length) ? m_string.charAt(m_letter++) : ''; 
    160157                } 
    161158 
    162159                protected function getChar():String { 
    163                         var l:int = m_letter; 
    164                         var c:String = ''; 
    165                         do { 
    166                                 c = m_string.charAt(l++); 
    167                         } while (c == ' ' && l < m_string.length); 
    168                         return c; 
     160                        return (m_letter < m_string.length) ? m_string.charAt(m_letter) : ''; 
    169161                } 
    170162 
     
    227219                } 
    228220 
    229                 protected function preProcess(str:String):void { 
    230                         m_string = str.toLowerCase(); 
     221                protected function processRepeat():void { 
     222                        m_string = m_string.toLowerCase(); 
    231223                        m_letter = 0; 
    232224                        var repeat:Array = new Array(); 
     
    271263                } 
    272264 
     265        protected function replaceMacro(str:String, startIndex:int, id:String, val:String):String { 
     266            var letter:int = startIndex; 
     267            var top:int = 1; 
     268            loop : while(letter < str.length) { 
     269                                var c:String = str.charAt(letter++); 
     270                                switch(c) { 
     271                                case '$': 
     272                    if (top) { 
     273                        var last:int = str.indexOf(";", letter); 
     274                        if (last > letter) { 
     275                            var macro:String = str.substring(letter, last); 
     276                            var token:Array = macro.split("="); 
     277                            if (token.length >= 2 && 
     278                                token[0].length >= 1) { 
     279                                var ids:Array = token[0].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); 
     280                                if (ids != null) { 
     281                                    if (ids[0] == id) break loop; 
     282                                } 
     283                                letter += token[0].length; 
     284                            } 
     285                        } 
     286                    } 
     287                    if (str.substr(letter, id.length) == id) { 
     288                        str = str.substring(0, letter-1) + val + str.substring(letter + id.length); 
     289                        letter += id.length; 
     290                    } 
     291                    top = 0; 
     292                    break; 
     293                case ';': 
     294                    top = 1; 
     295                    break; 
     296                default: 
     297                    if (!StringUtil.isWhitespace(c) && c != ' ') top = 0; 
     298                    break; 
     299                } 
     300            } 
     301            return str; 
     302        } 
     303 
     304        protected function processMacro(str:String):void { 
     305            m_string = str; 
     306                        m_letter = 0; 
     307            var top:int = 1; 
     308            // [a-zA-Z][a-zA-Z0-9#\+\(\)_]* 
     309            // ex.) $Am    =/:4a<ce>a:/; 
     310            //      $EonG# =/:4g#b<e>b:/; 
     311            //      $Gm    =/:4gb-<d>b-:/; 
     312            //      $DonF# =/:4f#a<d>a:/; 
     313            //      $Am $EonG# $Gm $DonF# 
     314                        while(m_letter < m_string.length) { 
     315                                var c:String = getCharNext(); 
     316                                switch(c) { 
     317                                case '$': 
     318                    if (top) { 
     319                        var last:int = m_string.indexOf(";", m_letter); 
     320                        if (last > m_letter) { 
     321                            var macro:String = m_string.substring(m_letter, last); 
     322                            var token:Array = macro.split("="); 
     323                            if (token.length >= 2 && 
     324                                token[0].length >= 1) { 
     325                                m_letter--; 
     326                                m_string = remove(m_string, m_letter, last); 
     327                                var id:Array = token[0].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); 
     328                                trace(token[0], id); 
     329                                if (id != null) { 
     330                                    //trace("macro:$"+id[0]+"="+token[1]); 
     331                                    //trace("rest:"+m_string); 
     332                                    if (id[0].length > 0) 
     333                                        m_string = replaceMacro(m_string, m_letter, id[0], token[1]); 
     334                                } 
     335                            } 
     336                        } 
     337                    } 
     338                    break; 
     339                case ';': 
     340                    top = 1; 
     341                    break; 
     342                default: 
     343                    if (!StringUtil.isWhitespace(c) && c != ' ') top = 0; 
     344                    break; 
     345                } 
     346            } 
     347        } 
     348 
     349        static public function removeWhitespace(str:String):String { 
     350            return str.replace(new RegExp("[ \t\n\r\f]+","g"),""); 
     351        } 
     352 
     353        static public function remove(str:String, start:int, end:int):String { 
     354            return str.substring(0, start) + str.substring(end+1); 
     355        } 
     356 
    273357                public function play(str:String):void { 
    274358                        m_sequencer.disconnectAll(); 
     
    287371                        m_form = MOscillator.PULSE; 
    288372 
    289                         preProcess(str); 
     373            processMacro(str); 
     374            m_string = removeWhitespace(m_string); 
     375                        processRepeat(); 
     376            //trace("string "+m_string); 
    290377                        process(); 
    291378 
     
    299386                } 
    300387 
     388        public function stop():void { 
     389            m_sequencer.stop(); 
     390        } 
     391 
     392        public function setMasterVolume(vol:int):void { 
     393            m_sequencer.setMasterVolume(vol); 
     394        } 
     395 
    301396                public function getGlobalTick():uint { 
    302397                        return m_sequencer.getGlobalTick(); 
  • lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MSequencer.as

    r447 r608  
    55         
    66        public class MSequencer extends EventDispatcher { 
    7                 public var onSignal:Function; 
     7                public var onSignal:Function = null; 
    88                 
    99                protected static const STATUS_STOP:int          = 0; 
     
    2323                        m_trackArr = new Array(); 
    2424                        m_volume = 100; 
    25                         m_signalArr = new Array(4); 
     25                        m_signalArr = new Array(3); 
    2626                        for(var i:int = 0; i < m_signalArr.length; i++) { 
    2727                                m_signalArr[i] = new MSignal(i); 
     
    3333                        m_audioBuffer.onComplete = onAudioBufferComplete; 
    3434                        m_status = STATUS_STOP; 
    35                         m_signalInterval = 96/4; 
     35                        m_signalInterval = 96; 
    3636                } 
    3737 
     
    4242                } 
    4343 
    44                 public function pause():void { 
    45                         m_audioBuffer.stop(); 
    46                         m_status = STATUS_PLAY; 
    47                 } 
    48  
    4944                public function stop():void { 
    5045                        m_audioBuffer.stop(); 
    5146                        m_status = STATUS_STOP; 
    5247                } 
     48 
     49        public function setMasterVolume(vol:int):void { 
     50            m_volume = vol; 
     51        } 
    5352 
    5453                public function isPlaying():Boolean { 
     
    103102                                } 
    104103                        } 
    105                         var mvol:Number = m_volume * (0.5 / 127.0); 
     104                        var mvol:Number = m_volume * (0.4 / 127.0); 
    106105                        for(i = 0; i < sLen; i++) { 
    107106                sample = samples[i]; 
  • lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MSignal.as

    r469 r608  
    1111                protected var m_timer:Timer; 
    1212                protected var m_func:Function; 
     13        protected var m_preTime:Number; 
    1314 
    14                 public function MSignal(id:int, maxEachBuffer:int = 32) { 
     15                public function MSignal(id:int, maxEachBuffer:int = 60) { 
    1516                        m_id = id; 
    1617                        m_msArr = new Array(maxEachBuffer); 
     
    4041 
    4142                public function reset():void { 
     43            // flush 
     44            m_timer.reset(); 
     45            if (m_func != null) { 
     46                while(m_msArr[m_ptr] >= 0) { 
     47                    //trace("id:"+m_id+" ns:"+m_msArr[m_ptr]+" ptr:"+m_ptr+" gt:"+m_gtArr[m_ptr]+"(flush)"); 
     48                    m_func(m_gtArr[m_ptr], m_evArr[m_ptr]); 
     49                    m_ptr++; 
     50                } 
     51            } 
     52            // reset 
    4253                        m_ptr = 0; 
    4354                        m_msArr[0] = -1; 
     
    4556 
    4657                public function start():void { 
     58            m_preTime = new Date().getTime(); 
    4759                        m_ptr = 0; 
    4860                        next(); 
     
    5062 
    5163                protected function onSignal(timerEvent:TimerEvent):void { 
     64            //trace("id:"+m_id+" ns:"+m_msArr[m_ptr]+" ptr:"+m_ptr+" gt:"+m_gtArr[m_ptr]); 
    5265                        if (m_func != null) m_func(m_gtArr[m_ptr], m_evArr[m_ptr]); 
     66            var time:Number = new Date().getTime(); 
     67            var over:Number = (time - m_preTime) - m_msArr[m_ptr]; 
     68            m_preTime = time; 
    5369                        m_ptr++; 
    54                         next(); 
     70            if (m_ptr < m_gtArr.length) { 
     71                // adjust 
     72                var i:int = m_ptr; 
     73                while (over > 0 && m_msArr[i] >= 0) { 
     74                    if (m_msArr[i] >= over) { 
     75                        m_msArr[i] -= over; 
     76                        break; 
     77                    } 
     78                    else { 
     79                        over -= m_msArr[i]; 
     80                        m_msArr[i] = 0; 
     81                    } 
     82                    i++; 
     83                } 
     84                next(); 
     85            } 
    5586                } 
    5687 
     
    5889                        var ns:int = m_msArr[m_ptr]; 
    5990                        if (ns > 0) { 
    60                                 //trace("id:"+m_id+" ns:"+ns+" ptr:"+m_ptr+" gt:"+m_gtArr[m_ptr]); 
    6191                                m_timer.reset(); 
    6292                                m_timer.delay = ns; 
     
    6696                        } 
    6797                        else if (ns == 0) { 
    68                                 //trace("id:"+m_id+" ns:0 ptr:"+m_ptr+" gt:"+m_gtArr[m_ptr]); 
    69                 while(ns == 0) { 
    70                     if (m_func != null) m_func(m_gtArr[m_ptr], m_evArr[m_ptr]); 
    71                     m_ptr++; 
    72                     ns = m_msArr[m_ptr]; 
    73                     if (ns == 0) 
    74                         return; 
    75                 } 
     98                                onSignal(null); 
    7699                        } 
    77100                } 
  • lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MTrack.as

    r447 r608  
    11package com.txt_nifty.sketch.flmml { 
    2     import de.popforge.audio.output.*; 
    3  
    4     public class MTrack { 
    5         private var m_bpm:Number;     // beat per minute 
    6         private var m_spt:Number;     // samples per tick 
    7         private var m_ch:MChannel;            // channel (instrument) 
    8         private var m_needle:Number           // delta time 
    9         private var m_volume:int;             // default volume    (max:127) 
    10         private var m_gate:Number;            // default gate time (max:1.0) 
    11         private var m_events:Array;           // 
    12         private var m_pointer:int;            // current event no. 
    13         private var m_delta:int; 
    14         private var m_isEnd:int; 
    15         private var m_globalTick:uint; 
    16         private var m_signalCnt:int; 
    17         public  var m_signalInterval:int; 
    18          
    19         public function MTrack() { 
    20             m_isEnd              = 0; 
    21             m_ch                = new MChannel(); 
    22             m_needle            = 0.0; 
    23             playTempo(120); 
    24             m_volume            = 100; 
    25             m_gate              = 15/16; 
    26             m_events            = new Array(); 
    27             m_pointer = 0; 
    28             m_delta = 0; 
    29             m_globalTick = 0; 
    30             m_signalInterval = 96/4; // (quater note = 96ticks) 
    31             m_signalCnt = 0; 
    32         } 
    33  
    34         public function onAudioBufferComplete(samples:Array, signal:MSignal = null):void { 
    35             var startCnt:int = m_signalCnt; 
    36             if (signal != null) signal.reset(); 
    37             var sLen:int = samples.length; 
    38             // first signal 
    39             if (m_globalTick == 0 && signal != null) { 
    40                 signal.add(0, 0, 0); 
    41             } 
    42             for (var i:int = 0; i < sLen;) { 
    43                 // exec events 
    44                 var exec:int = 0; 
    45                 var eLen:int = m_events.length; 
    46                 var e:MEvent; 
    47                 var delta:Number; 
    48                 do { 
    49                     exec = 0; 
    50                     if (m_pointer < eLen) { 
    51                         e = m_events[m_pointer]; 
    52                         delta = e.getDelta() * m_spt; 
    53                         if (m_needle >= delta) { 
    54                             //trace(m_pointer+"/global:"+(int)(m_globalTick/m_spt)+"/status:"+e.getStatus()+"/delta:"+delta+"-"+e.getDelta()+"/noteNo:"+e.getNoteNo()); 
    55                             exec = 1; 
    56                             switch(e.getStatus()) { 
    57                             case MStatus.NOTE_ON: 
    58                                 m_ch.noteOn(MEvent.getFrequency(e.getNoteNo()), e.getVelocity()); 
    59                                 break; 
    60                             case MStatus.NOTE_OFF: 
    61                                 m_ch.noteOff(); 
    62                                 break; 
    63                             case MStatus.NOTE: 
    64                                 m_ch.setFrequency(MEvent.getFrequency(e.getNoteNo())); 
    65                                 break; 
    66                             case MStatus.VOLUME: 
    67                                 break; 
    68                             case MStatus.TEMPO: 
    69                                 playTempo(e.getTempo()); 
    70                                 break; 
    71                             case MStatus.FORM: 
    72                                 m_ch.setForm(e.getForm()); 
    73                                 break; 
    74                             case MStatus.ENVELOPE_AD: 
    75                                 m_ch.setEnvelopeAD(e.getEnvelopeA(), e.getEnvelopeD()); 
    76                                 break; 
    77                             case MStatus.ENVELOPE_SR: 
    78                                 m_ch.setEnvelopeSR(e.getEnvelopeS(), e.getEnvelopeR()); 
    79                                 break; 
     2        import de.popforge.audio.output.*; 
     3 
     4        public class MTrack { 
     5                private var m_bpm:Number;         // beat per minute 
     6                private var m_spt:Number;         // samples per tick 
     7                private var m_ch:MChannel;                        // channel (instrument) 
     8                private var m_needle:Number                       // delta time 
     9                private var m_volume:int;                         // default volume        (max:127) 
     10                private var m_gate:Number;                        // default gate time (max:1.0) 
     11                private var m_events:Array;                       // 
     12                private var m_pointer:int;                        // current event no. 
     13                private var m_delta:int; 
     14                private var m_isEnd:int; 
     15                private var m_globalTick:uint; 
     16                private var m_signalCnt:int; 
     17                public  var m_signalInterval:int; 
     18                 
     19                public function MTrack() { 
     20                        m_isEnd                          = 0; 
     21                        m_ch                            = new MChannel(); 
     22                        m_needle                        = 0.0; 
     23                        playTempo(120); 
     24                        m_volume                        = 100; 
     25                        m_gate                          = 15/16; 
     26                        m_events                        = new Array(); 
     27                        m_pointer = 0; 
     28                        m_delta = 0; 
     29                        m_globalTick = 0; 
     30                        m_signalInterval = 96/4; // (quater note = 96ticks) 
     31                        m_signalCnt = 0; 
     32                } 
     33 
     34                public function onAudioBufferComplete(samples:Array, signal:MSignal = null):void { 
     35                        var startCnt:int = m_signalCnt; 
     36                        if (signal != null) signal.reset(); 
     37                        var sLen:int = samples.length; 
     38                        // first signal 
     39                        if (m_globalTick == 0 && signal != null) { 
     40                                signal.add(0, 0, 0); 
     41                        } 
     42                        for (var i:int = 0; i < sLen;) { 
     43                                // exec events 
     44                                var exec:int = 0; 
     45                                var eLen:int = m_events.length; 
     46                                var e:MEvent; 
     47                                var delta:Number; 
     48                                do { 
     49                                        exec = 0; 
     50                                        if (m_pointer < eLen) { 
     51                                                e = m_events[m_pointer]; 
     52                                                delta = e.getDelta() * m_spt; 
     53                                                if (m_needle >= delta) { 
     54                                                        //trace(m_pointer+"/global:"+(int)(m_globalTick/m_spt)+"/status:"+e.getStatus()+"/delta:"+delta+"-"+e.getDelta()+"/noteNo:"+e.getNoteNo()); 
     55                                                        exec = 1; 
     56                                                        switch(e.getStatus()) { 
     57                                                        case MStatus.NOTE_ON: 
     58                                                                m_ch.noteOn(MEvent.getFrequency(e.getNoteNo()), e.getVelocity()); 
     59                                                                break; 
     60                                                        case MStatus.NOTE_OFF: 
     61                                                                m_ch.noteOff(); 
     62                                                                break; 
     63                                                        case MStatus.NOTE: 
     64                                                                m_ch.setFrequency(MEvent.getFrequency(e.getNoteNo())); 
     65                                                                break; 
     66                                                        case MStatus.VOLUME: 
     67                                                                break; 
     68                                                        case MStatus.TEMPO: 
     69                                                                playTempo(e.getTempo()); 
     70                                                                break; 
     71                                                        case MStatus.FORM: 
     72                                                                m_ch.setForm(e.getForm()); 
     73                                                                break; 
     74                                                        case MStatus.ENVELOPE_AD: 
     75                                                                m_ch.setEnvelopeAD(e.getEnvelopeA(), e.getEnvelopeD()); 
     76                                                                break; 
     77                                                        case MStatus.ENVELOPE_SR: 
     78                                                                m_ch.setEnvelopeSR(e.getEnvelopeS(), e.getEnvelopeR()); 
     79                                                                break; 
    8080                            case MStatus.NOISE_FREQ: 
    8181                                m_ch.setNoiseFreq(e.getNoiseFreq()); 
     
    8484                                m_ch.setPWM(e.getPWM()); 
    8585                                break; 
    86                             case MStatus.EOT: 
    87                                 m_ch.noteOff(); 
    88                                 m_isEnd = 1; 
    89                                 break; 
    90                             case MStatus.NOP: 
    91                                 break; 
    92                             default: 
    93                                 break; 
    94                             } 
    95                             m_needle -= delta; 
    96                             m_pointer++; 
    97                         } 
    98                     } 
    99                 } while(exec); 
    100  
    101                 // create a short wave 
    102                 var di:int; 
    103                 if (m_pointer < eLen) { 
    104                     e = m_events[m_pointer]; 
    105                     delta = e.getDelta() * m_spt; 
    106                     di = Math.ceil(delta - m_needle); 
    107                     if (i + di >= sLen) di = sLen - i; 
    108                     m_needle += di; 
    109                     m_ch.getSamples(samples, i, di); 
    110                     i += di; 
    111                 } 
    112                 else { 
    113                     break; 
    114                 } 
    115  
    116                 // periodic signal 
    117                 if (signal != null) { 
    118                     m_signalCnt += di; 
    119                     var intervalSample:int = int(m_signalInterval * m_spt); 
    120                     while (m_signalCnt >= intervalSample) { 
    121                         m_globalTick += m_signalInterval; 
    122                         signal.add(int((intervalSample - startCnt) * (1000.0/44100.0)), m_globalTick, 0); 
    123                         m_signalCnt -= intervalSample; 
    124                         startCnt = 0; 
    125                     } 
    126                 } 
    127             } 
    128             if (signal != null) signal.terminate(); 
    129         } 
    130  
    131         public function seek(delta:int):void { 
    132             m_delta += delta; 
    133         } 
    134  
    135         public function recDelta(e:MEvent):void { 
    136             e.setDelta(m_delta); 
    137             m_delta = 0; 
    138         } 
    139  
    140         public function recNote(noteNo:int, len:int, vel:int, keyon:int = 1, keyoff:int = 1):void { 
    141             var e0:MEvent = new MEvent(); 
    142             if (keyon) { 
    143                 e0.setNoteOn(noteNo, vel); 
    144             } 
    145             else { 
    146                 e0.setNote(noteNo); 
    147             } 
    148             recDelta(e0); 
    149             m_events.push(e0); 
    150             var e1:MEvent = new MEvent(); 
    151             if (keyoff) { 
    152                 var gate:int = (int)(len * m_gate); 
    153                 seek(gate); 
    154                 e1.setNoteOff(noteNo, vel); 
    155                 recDelta(e1); 
    156                 m_events.push(e1); 
    157                 seek(len - gate); 
    158             } 
    159             else { 
    160                 seek(len); 
    161             } 
    162         } 
    163  
    164         public function recRest(len:int):void { 
    165             seek(len); 
    166         } 
    167  
    168         public function recVolume(vol:int):void { 
    169             var e:MEvent = new MEvent(); 
    170             recDelta(e); 
    171             e.setVolume(vol); 
    172             m_events.push(e); 
    173         } 
    174  
    175         public function recTempo(tempo:Number):void { 
    176             var e:MEvent = new MEvent(); 
    177             recDelta(e); 
    178             e.setTempo(tempo); 
    179             m_events.push(e); 
    180         } 
    181  
    182         public function recEOT():void { 
    183             var e:MEvent = new MEvent(); 
    184             recDelta(e); 
    185             e.setEOT(); 
    186             m_events.push(e); 
    187         } 
    188  
    189         public function recGate(gate:Number):void { 
    190             m_gate = gate; 
    191         } 
    192  
    193         public function recForm(form:int):void { 
    194             var e:MEvent = new MEvent(); 
    195             recDelta(e); 
    196             e.setForm(form); 
    197             m_events.push(e); 
    198         } 
    199  
    200         public function recEnvelope(attack:int, decay:int, sustain:int, release:int):void { 
    201             var e:MEvent = new MEvent(); 
    202             recDelta(e); 
    203             e.setEnvelopeAD(attack, decay); 
    204             m_events.push(e); 
    205             e = new MEvent(); 
    206             e.setEnvelopeSR(sustain, release); 
    207             m_events.push(e); 
    208         } 
     86                                                        case MStatus.EOT: 
     87                                                                m_ch.noteOff(); 
     88                                                                m_isEnd = 1; 
     89                                                                break; 
     90                                                        case MStatus.NOP: 
     91                                                                break; 
     92                                                        default: 
     93                                                                break; 
     94                                                        } 
     95                                                        m_needle -= delta; 
     96                                                        m_pointer++; 
     97                                                } 
     98                                        } 
     99                                } while(exec); 
     100 
     101                                // create a short wave 
     102                                var di:int; 
     103                                if (m_pointer < eLen) { 
     104                                        e = m_events[m_pointer]; 
     105                                        delta = e.getDelta() * m_spt; 
     106                                        di = Math.ceil(delta - m_needle); 
     107                                        if (i + di >= sLen) di = sLen - i; 
     108                                        m_needle += di; 
     109                                        m_ch.getSamples(samples, i, di); 
     110                                        i += di; 
     111                                } 
     112                                else { 
     113                                        break; 
     114                                } 
     115 
     116                                // periodic signal 
     117                                if (signal != null) { 
     118                                        m_signalCnt += di; 
     119                                        var intervalSample:int = int(m_signalInterval * m_spt); 
     120                                        while (m_signalCnt >= intervalSample) { 
     121                                                m_globalTick += m_signalInterval; 
     122                                                signal.add(int((intervalSample - startCnt) * (1000.0/44100.0)), m_globalTick, 0); 
     123                                                m_signalCnt -= intervalSample; 
     124                                                startCnt = 0; 
     125                                        } 
     126                                } 
     127                        } 
     128                        if (signal != null) signal.terminate(); 
     129                } 
     130 
     131                public function seek(delta:int):void { 
     132                        m_delta += delta; 
     133                } 
     134 
     135                public function recDelta(e:MEvent):void { 
     136                        e.setDelta(m_delta); 
     137                        m_delta = 0; 
     138                } 
     139 
     140                public function recNote(noteNo:int, len:int, vel:int, keyon:int = 1, keyoff:int = 1):void { 
     141                        var e0:MEvent = new MEvent(); 
     142                        if (keyon) { 
     143                                e0.setNoteOn(noteNo, vel); 
     144                        } 
     145                        else { 
     146                                e0.setNote(noteNo); 
     147                        } 
     148                        recDelta(e0); 
     149                        m_events.push(e0); 
     150                        var e1:MEvent = new MEvent(); 
     151                        if (keyoff) { 
     152                                var gate:int = (int)(len * m_gate); 
     153                                seek(gate); 
     154                                e1.setNoteOff(noteNo, vel); 
     155                                recDelta(e1); 
     156                                m_events.push(e1); 
     157                                seek(len - gate); 
     158                        } 
     159                        else { 
     160                                seek(len); 
     161                        } 
     162                } 
     163 
     164                public function recRest(len:int):void { 
     165                        seek(len); 
     166                } 
     167 
     168                public function recVolume(vol:int):void { 
     169                        var e:MEvent = new MEvent(); 
     170                        recDelta(e); 
     171                        e.setVolume(vol); 
     172                        m_events.push(e); 
     173                } 
     174 
     175                public function recTempo(tempo:Number):void { 
     176                        var e:MEvent = new MEvent(); 
     177                        recDelta(e); 
     178                        e.setTempo(tempo); 
     179                        m_events.push(e); 
     180                } 
     181 
     182                public function recEOT():void { 
     183                        var e:MEvent = new MEvent(); 
     184                        recDelta(e); 
     185                        e.setEOT(); 
     186                        m_events.push(e); 
     187                } 
     188 
     189                public function recGate(gate:Number):void { 
     190                        m_gate = gate; 
     191                } 
     192 
     193                public function recForm(form:int):void { 
     194                        var e:MEvent = new MEvent(); 
     195                        recDelta(e); 
     196                        e.setForm(form); 
     197                        m_events.push(e); 
     198                } 
     199 
     200                public function recEnvelope(attack:int, decay:int, sustain:int, release:int):void { 
     201                        var e:MEvent = new MEvent(); 
     202                        recDelta(e); 
     203                        e.setEnvelopeAD(attack, decay); 
     204                        m_events.push(e); 
     205                        e = new MEvent(); 
     206                        e.setEnvelopeSR(sustain, release); 
     207                        m_events.push(e); 
     208                } 
    209209 
    210210        public function recNoiseFreq(freq:int):void { 
     
    222222        } 
    223223 
    224         public function isEnd():int { 
    225             return m_isEnd; 
    226         } 
    227  
    228         private function playTempo(bpm:Number):void { 
    229             m_bpm = bpm; 
    230             var tps:Number = m_bpm * 96.0 / 60.0; // ticks per second (quater note = 96ticks) 
    231             m_spt = 44100.0 / tps;              // samples per tick 
    232             //trace("spt:"+m_spt) 
    233         } 
    234     } 
     224                public function isEnd():int { 
     225                        return m_isEnd; 
     226                } 
     227 
     228                private function playTempo(bpm:Number):void { 
     229                        m_bpm = bpm; 
     230                        var tps:Number = m_bpm * 96.0 / 60.0; // ticks per second (quater note = 96ticks) 
     231                        m_spt = 44100.0 / tps;                          // samples per tick 
     232                        //trace("spt:"+m_spt) 
     233                } 
     234        } 
    235235}