Changeset 31399 for lang/actionscript

Show
Ignore:
Timestamp:
03/20/09 16:27:08 (3 years ago)
Author:
tekisuke
Message:

マクロ展開時のバグを修正。再生時間を表示するよう修正。

Location:
lang/actionscript/flmml/trunk/src
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/FlMML.as

    r27173 r31399  
    4646            return m_mml.getWarnings(); 
    4747        } 
     48 
     49        public function getTotalMSec():uint { 
     50            return m_mml.getTotalMSec(); 
     51        } 
     52        public function getTotalTimeStr():String { 
     53            return m_mml.getTotalTimeStr(); 
     54        } 
     55        public function getNowMSec():uint { 
     56            return m_mml.getNowMSec(); 
     57        } 
     58        public function getNowTimeStr():String { 
     59            return m_mml.getNowTimeStr(); 
     60        } 
    4861    } 
    4962} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MML.as

    r30438 r31399  
    489489            for(i = 0; i < idArr.length; i++) { 
    490490                var id:String = idArr[i]; 
     491                //trace("["+m_string.substr(m_letter, id.length)+"]"); 
    491492                if (m_string.substr(m_letter, id.length) == idArr[i]) { 
    492493                    //trace("["+m_string.substr(m_letter, id.length)+"]"); 
    493494                    m_string = m_string.substring(0, m_letter-1) + valArr[i] + m_string.substring(m_letter + id.length); 
    494                     m_letter += id.length; 
     495                    //m_letter += valArr[i].length; 
    495496                    break; 
    496497                } 
     
    704705            // post process 
    705706            for(var i:int = MTrack.TEMPO_TRACK; i < m_tracks.length; i++) { 
    706                 m_tracks[i].recRest(384); 
    707                 m_tracks[i].recClose(); 
    708                 m_tracks[i].recRest(96); 
    709                 m_tracks[i].recEOT(); 
     707                if (i > MTrack.TEMPO_TRACK) { 
     708                    m_tracks[i].recRestMSec(2000); 
     709                    m_tracks[i].recClose(); 
     710                } 
    710711                m_sequencer.connect(m_tracks[i]); 
    711712            } 
     713 
     714            // initialize modules 
    712715            m_sequencer.createPipes(m_maxPipe+1); 
    713716 
     
    746749            return m_sequencer.isPaused(); 
    747750        } 
     751 
     752        public function getTotalMSec():uint { 
     753            return m_tracks[MTrack.TEMPO_TRACK].getTotalMSec(); 
     754        } 
     755        public function getTotalTimeStr():String { 
     756            return m_tracks[MTrack.TEMPO_TRACK].getTotalTimeStr(); 
     757        } 
     758        public function getNowMSec():uint { 
     759            return m_sequencer.getNowMSec(); 
     760        } 
     761        public function getNowTimeStr():String { 
     762            return m_sequencer.getNowTimeStr(); 
     763        } 
    748764    } 
    749765} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MSequencer.as

    r28311 r31399  
    3535        protected var m_processTrack:int; 
    3636        protected var m_processOffset:int; 
    37         protected var m_output:Boolean; 
     37        protected var m_output:Boolean; //! ���݃o�b�t�@�������ݒ����ǂ��� 
    3838        protected var m_trackArr:Array; 
    3939        protected var m_signalArr:Array; 
     
    4242        protected var m_status:int; 
    4343        protected var m_signalInterval:int; 
    44         protected var m_stopTimer:Timer; 
    45         protected var m_buffTimer:Timer; 
    46         protected var m_procTimer:Timer; 
     44        protected var m_stopTimer:Timer; //! �������L�b�N�p�̃^�C�}�[ 
     45        protected var m_buffTimer:Timer; //! �ꎞ�����o�b�t�@�����O�����L�b�N�p�̃^�C�}�[ 
     46        protected var m_procTimer:Timer; //! �o�b�t�@�������ݏ����L�b�N�p�̃^�C�}�[ 
    4747        protected var m_multiple:int; 
     48        protected var m_startTime:uint; 
     49        protected var m_pausedPos:Number; 
     50        protected var m_restTimer:Timer; 
    4851        protected var m_debugDate:Date; 
    4952 
     
    7376            m_soundChannel = new SoundChannel(); 
    7477            m_soundTransform = new SoundTransform(); 
     78            m_pausedPos = 0; 
    7579            setMasterVolume(100); 
    7680            m_signalInterval = 96; 
    7781            stop(); 
    7882            m_sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); 
     83            m_restTimer = null; 
    7984        } 
    8085 
     
    8691                    m_trackArr[i].seekTop(); 
    8792                } 
    88             } 
    89             m_status = STATUS_BUFFERING; 
    90             processStart(); 
     93                m_status = STATUS_BUFFERING; 
     94                processStart(); 
     95            } 
     96            else { 
     97                m_status = STATUS_PLAY; 
     98                m_soundChannel = m_sound.play(m_pausedPos); 
     99                m_startTime = getTimer(); 
     100                var totl:uint = getTotalMSec(); 
     101                var rest:uint = (totl > m_pausedPos) ? (totl - m_pausedPos) : 0; 
     102                m_restTimer = new Timer(rest, 1); 
     103                m_restTimer.addEventListener(TimerEvent.TIMER, onStopReq); 
     104                m_restTimer.start(); 
     105            } 
    91106            m_debugDate = new Date(); 
    92107        } 
     
    99114            m_procTimer = new Timer(2, 1); 
    100115            m_procTimer.addEventListener(TimerEvent.TIMER_COMPLETE, processAll); 
     116            if (m_restTimer) m_restTimer.stop(); 
    101117            if (m_soundChannel) m_soundChannel.stop(); 
    102118            m_status = STATUS_STOP; 
     119            m_pausedPos = 0; 
    103120        } 
    104121 
    105122        public function pause():void { 
     123            if (m_restTimer) m_restTimer.stop(); 
    106124            if (m_soundChannel) m_soundChannel.stop(); 
     125            m_pausedPos = getNowMSec(); 
    107126            m_status = STATUS_PAUSE; 
    108127        } 
     
    160179        } 
    161180 
     181        //! �o�b�t�@�������݃��N�G�X�g 
    162182        private function processStart():void { 
    163183            m_step = STEP_PRE; 
     
    165185            m_procTimer.start(); 
    166186        } 
     187        //! ��ۂ̃o�b�t�@�������� 
     188        // UI�̃t���[�Y����邽�߁A���X�e�b�v�ɕ����ď������ 
    167189        private function processAll(e:Event):void { 
    168190            var sLen:int = MSequencer.BUFFER_SIZE * m_multiple; 
     
    222244                    m_soundChannel = m_sound.play(); 
    223245                    //trace("play"); 
     246                    m_startTime = getTimer(); 
     247                    var totl:uint = getTotalMSec(); 
     248                    var rest:uint = (totl > m_pausedPos) ? (totl - m_pausedPos) : 0; 
     249                    m_restTimer = new Timer(rest, 1); 
     250                    m_restTimer.addEventListener(TimerEvent.TIMER, onStopReq); 
     251                    m_restTimer.start(); 
    224252                } 
    225253                break; 
     
    229257        } 
    230258 
     259        //! 
    231260        private function onSampleData(e:SampleDataEvent):void { 
     261            var latency:Number = e.position / 44.1 - m_soundChannel.position; 
     262            //trace((e.position / 44.1) + "-" + (m_soundChannel.position) + "="+latency); 
     263             
    232264            m_output = true; 
    233265            if (m_playSize >= m_multiple) { 
     266                // �o�b�t�@�����ς݂̏ꍇ 
    234267                if (m_step == STEP_COMPLETE) { 
    235268                    m_playSide = 1 - m_playSide; 
     
    237270                    processStart(); 
    238271                } 
     272                // �o�b�t�@���������̏ꍇ 
    239273                else { 
    240274                    m_output = false; 
     
    244278                if (m_status == STATUS_LAST) { 
    245279                    m_output = false; 
    246                     reqStop(); 
    247                     return; 
     280                    //reqStop(); stop��estTimer�ɔC����                    return; 
    248281                } 
    249282                else if (m_status == STATUS_PLAY) { 
    250                     var n:int = 0; 
    251                     for (i = 0; i < m_trackArr.length; i++) { 
    252                         if (m_trackArr[i].isEnd()) n++; 
    253                     } 
    254                     if (n >= m_trackArr.length) { 
     283                    if (m_trackArr[MTrack.TEMPO_TRACK].isEnd()) { 
    255284                        m_status = STATUS_LAST; 
    256285                    } 
     
    272301            MChannel.createPipes(num); 
    273302        } 
     303        public function getTotalMSec():uint { 
     304            return m_trackArr[MTrack.TEMPO_TRACK].getTotalMSec(); 
     305        } 
     306        public function getNowMSec():uint { 
     307            var now:uint = 0; 
     308            var tot:uint = getTotalMSec(); 
     309            switch (m_status) { 
     310                case STATUS_PLAY: 
     311                case STATUS_LAST: 
     312                now = getTimer() - m_startTime + m_pausedPos; 
     313                return (now < tot) ? now : tot; 
     314                default: 
     315                return m_pausedPos; 
     316            } 
     317            return 0; 
     318        } 
     319        public function getNowTimeStr():String { 
     320            var sec:int = Math.ceil(Number(getNowMSec()) / 1000); 
     321            var smin:String = "0" + int(sec / 60); 
     322            var ssec:String = "0" + (sec % 60); 
     323            return smin.substr(smin.length-2, 2) + ":" + ssec.substr(ssec.length-2, 2); 
     324        } 
    274325    } 
    275326} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MTrack.as

    r30715 r31399  
    55        public static const TEMPO_TRACK:int = 0; 
    66        public static const FIRST_TRACK:int = 1; 
     7        public static const DEFAULT_BPM:int = 120; 
    78        private var m_bpm:Number;         // beat per minute 
    89        private var m_spt:Number;         // samples per tick 
     
    1920        private var m_signalCnt:int; 
    2021        private var m_lfoWidth:Number; 
     22        private var m_totalMSec:uint; 
    2123        public  var m_signalInterval:int; 
    2224 
     
    2527            m_ch                 = new MChannel(); 
    2628            m_needle             = 0.0; 
    27             playTempo(120); 
     29            playTempo(DEFAULT_BPM); 
    2830            m_volume             = 100; 
    2931            recGate(15/16); 
     
    3638            m_signalCnt = 0; 
    3739            m_lfoWidth = 0.0; 
     40            m_totalMSec = 0; 
    3841        } 
    3942 
     
    4346 
    4447        public function onSampleData(samples:Vector.<Number>, start:int, end:int, signal:MSignal = null):void { 
     48            if (isEnd()) return; 
    4549            var startCnt:int = m_signalCnt; 
    4650            if (signal != null) signal.reset(); 
     
    219223            seek(len); 
    220224        } 
     225        public function recRestMSec(msec:int):void { 
     226            var len:int = msec * 44010 / (m_spt * 1000); 
     227            seek(len); 
     228        } 
    221229 
    222230        public function recVolume(vol:int):void { 
     
    390398            var nj:int = trackArr.length; 
    391399            var globalTick:uint = 0; 
     400            var globalSample:uint = 0; 
     401            var spt:Number = calcSpt(DEFAULT_BPM); 
    392402            var i:int, j:int; 
    393403            var e:MEvent; 
     
    395405                e = m_events[i]; 
    396406                globalTick += e.getDelta(); 
     407                globalSample += e.getDelta() * spt; 
    397408                switch(e.getStatus()) { 
    398409                case MStatus.TEMPO: 
    399410                    for (j = FIRST_TRACK; j < nj; j++) { 
    400411                        trackArr[j].recTempo(globalTick, e.getTempo()); 
     412                        spt = calcSpt(e.getTempo()); 
    401413                    } 
    402414                    break; 
     
    410422            } 
    411423            e = new MEvent(); 
    412             e.setEOT(); 
     424            e.setClose(); 
    413425            recGlobal(maxGlobalTick, e); 
    414         } 
    415  
     426            globalSample += (maxGlobalTick - globalTick) * spt; 
     427 
     428            recRestMSec(3000); 
     429            recEOT(); 
     430            globalSample += 3 * 44100; 
     431 
     432            m_totalMSec = globalSample*1000/44100; 
     433        } 
     434        // calc number of samples per tick 
     435        private function calcSpt(bpm:Number):Number { 
     436            var tps:Number = bpm * 96.0 / 60.0; // ticks per second (quater note = 96ticks) 
     437            return 44100.0 / tps;              // samples per tick 
     438        } 
     439        // set tempo 
    416440        private function playTempo(bpm:Number):void { 
    417441            m_bpm = bpm; 
    418             var tps:Number = m_bpm * 96.0 / 60.0; // ticks per second (quater note = 96ticks) 
    419             m_spt = 44100.0 / tps;              // samples per tick 
     442            m_spt = calcSpt(bpm); 
    420443            //trace("spt:"+m_spt) 
     444        } 
     445        public function getTotalMSec():uint { 
     446            return m_totalMSec; 
     447        } 
     448        public function getTotalTimeStr():String { 
     449            var sec:int = Math.ceil(Number(m_totalMSec) / 1000); 
     450            var smin:String = "0" + int(sec / 60); 
     451            var ssec:String = "0" + (sec % 60); 
     452            return smin.substr(smin.length-2, 2) + ":" + ssec.substr(ssec.length-2, 2); 
    421453        } 
    422454    } 
  • lang/actionscript/flmml/trunk/src/flmml.mxml

    r27173 r31399  
    77    <![CDATA[ 
    88            import com.txt_nifty.sketch.flmml.MMLEvent; 
     9            protected var m_timer:Timer; 
    910 
    1011            public function init():void { 
     
    1516              player.addEventListener(MMLEvent.COMPLETE,         onComplete); 
    1617              player.addEventListener(MMLEvent.BUFFERING,        onBuffering); 
     18              m_timer = new Timer(1000, 0); 
     19              m_timer.addEventListener(TimerEvent.TIMER, onSecond); 
    1720            } 
    1821 
     
    5154            public function play():void { 
    5255              if (!player.isPlaying()) { 
     56                if (player.isPaused()) m_timer.start(); 
    5357                player.play(input.text); 
    5458                playButton.label = "Pause"; 
     
    5761                player.pause(); 
    5862                playButton.label = "Play"; 
     63                m_timer.stop(); 
    5964              } 
    6065            } 
     
    6368              player.stop(); 
    6469              playButton.label = "Play"; 
     70              m_timer.reset(); 
    6571              progress.text = ""; 
    6672            } 
     
    6874            public function onComplete(e:Event):void { 
    6975              playButton.label = "Play"; 
     76              m_timer.reset(); 
     77              progress.text = ""; 
    7078            } 
    7179 
    7280            public function onBuffering(e:MMLEvent):void { 
    73               progress.text = (e.progress >= 100) ? "" : ("Buffering " + e.progress + "%"); 
     81              if (e.progress < 100) progress.text = "Buffering " + e.progress + "%"; 
     82              else { 
     83                onSecond(e); 
     84                m_timer.start(); 
     85              } 
     86            } 
     87 
     88            public function onSecond(e:Event):void { 
     89              progress.text = player.getNowTimeStr() + " / " + player.getTotalTimeStr(); 
    7490            } 
    7591        ]]>