Show
Ignore:
Timestamp:
11/09/09 20:39:14 (5 years ago)
Author:
arche
Message:

OffGaoさんより報告のあったDPCM音源のバグ修正と全体的な高速化

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

Legend:

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

    r34488 r35879  
    2020        private var m_velocity:Number;         // velocity (max:1.0) 
    2121        private var m_ampLevel:Number;         // amplifier level (max:1.0) 
    22         private var m_panL:Number; 
    23         private var m_panR:Number; 
     22        private var m_pan:Number;                               // left 0.0 - 1.0 right 
    2423        private var m_onCounter:int; 
    2524        private var m_lfoDelay:int; 
     
    201200        } 
    202201        public function setPan(pan:int):void { 
    203             // left 0 - 64 - 127 right 
    204             // master_vol = 0.25 
    205             m_panR = (pan - 1) * (0.25 / 63.0); 
    206             if (m_panR < 0) m_panR = 0; 
    207             m_panL = (2.0 * 0.25) - m_panR; 
     202            // left 1 - 64 - 127 right 
     203            // master_vol = (0.25 * 2) 
     204            m_pan = (pan - 1) * (0.5 / 63.0); 
     205            if (m_pan < 0) m_pan = 0; 
    208206        } 
    209207        public function setFormant(vowel:int):void { 
     
    273271        public function getSamples(samples:Vector.<Number>, max:int, start:int, delta:int):void { 
    274272            var end:int = start + delta; 
    275             var amplitude:Number; 
     273            var amplitude:Number, rightAmplitude:Number; 
     274            var playing:Boolean = m_envelope1.isPlaying(), tmpFlag:Boolean; 
    276275            var freqNo:int; 
    277             var i:int; 
     276            var i:int, j:int; 
    278277            if (end >= max) end = max; 
    279278            var key:Number = m_oscMod1.getFrequency(); 
    280             if (!m_envelope1.isPlaying()) { 
    281                 for(i = start; i < end; i++) s_samples[i] = 0.0; 
     279            if (!playing) { 
     280                // for(i = start; i < end; i++) s_samples[i] = 0.0; 
    282281            } 
    283282            else if (m_inSens < 0.000001) { 
     
    353352                } 
    354353            } 
    355             if (m_ringSens >= 0.000001) { 
     354            if (playing && (m_ringSens >= 0.000001)) { 
    356355                // with ring 
    357356                for(i = start; i < end; i++){ 
     
    359358                                } 
    360359            } 
    361             m_formant.run(s_samples, start, end); 
    362             m_filter.run(s_samples, start, end, m_envelope2, m_lpfFrq, m_lpfAmt, m_lpfRes, key); 
    363             switch(m_outMode) { 
    364             case 0: 
    365                 //trace("output audio"); 
     360             
     361            // フォルマントフィルタを経由した後の音声が無音であればスキップ 
     362            tmpFlag = playing; 
     363            playing = playing || m_formant.checkToSilence(); 
     364            if(playing != tmpFlag){ 
     365                for(i = start; i < end; i++) s_samples[i] = 0; 
     366            } 
     367            if(playing){ 
     368                m_formant.run(s_samples, start, end); 
     369            } 
     370 
     371            // フィルタを経由した後の音声が無音であればスキップ 
     372            tmpFlag = playing; 
     373            playing = playing || m_filter.checkToSilence(); 
     374            if(playing != tmpFlag){ 
     375                for(i = start; i < end; i++) s_samples[i] = 0; 
     376            } 
     377            if(playing){ 
     378                m_filter.run(s_samples, start, end, m_envelope2, m_lpfFrq, m_lpfAmt, m_lpfRes, key); 
     379            } 
     380             
     381            if(playing){ 
     382                switch(m_outMode) { 
     383                case 0: 
     384                    //trace("output audio"); 
     385                    for(i = start; i < end; i++) { 
     386                        j = i << 1; 
     387                        amplitude = s_samples[i] * 0.5; 
     388                        rightAmplitude = amplitude * m_pan; 
     389                        samples[j]   += amplitude - rightAmplitude; 
     390                        samples[j+1] += rightAmplitude; 
     391                    } 
     392                    break; 
     393                case 1: // overwrite 
     394                    //trace("output "+m_outPipe); 
     395                    for(i = start; i < end; i++) { 
     396                        s_pipeArr[m_outPipe][i] = s_samples[i]; 
     397                    } 
     398                    break; 
     399                case 2: // add 
     400                    for(i = start; i < end; i++) { 
     401                        s_pipeArr[m_outPipe][i] += s_samples[i]; 
     402                    } 
     403                    break; 
     404                } 
     405            }else if(m_outMode == 1){ 
    366406                for(i = start; i < end; i++) { 
    367                     amplitude = s_samples[i]; 
    368                     samples[i+i]   += amplitude * m_panL; 
    369                     samples[i+i+1] += amplitude * m_panR; 
    370                 } 
    371                 break; 
    372             case 1: // overwrite 
    373                 //trace("output "+m_outPipe); 
    374                 for(i = start; i < end; i++) { 
    375                     s_pipeArr[m_outPipe][i] = s_samples[i]; 
    376                 } 
    377                 break; 
    378             case 2: // add 
    379                 for(i = start; i < end; i++) { 
    380                     s_pipeArr[m_outPipe][i] += s_samples[i]; 
    381                 } 
    382                 break; 
    383             default: 
    384                 break; 
     407                    s_pipeArr[m_outPipe][i] = 0; 
     408                } 
    385409            } 
    386410        } 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MFilter.as

    r28292 r35879  
    2828            reset(); 
    2929            sw = s; 
     30        } 
     31        // 無音入力時に何かの信号を出力するかのチェック 
     32        public function checkToSilence():Boolean { 
     33            switch(sw){ 
     34                case 0: 
     35                    return false; 
     36                case 1: 
     37                case -1: 
     38                    return (-0.000001 <= b0 && b0 <= 0.000001 && -0.000001 <= b1 && b1 <= 0.000001); 
     39                case 2: 
     40                case -2: 
     41                    return ( 
     42                        -0.000001 <= t1 && t1 <= 0.000001 && 
     43                        -0.000001 <= t2 && t2 <= 0.000001 && 
     44                        -0.000001 <= b0 && b0 <= 0.000001 && 
     45                        -0.000001 <= b1 && b1 <= 0.000001 && 
     46                        -0.000001 <= b2 && b2 <= 0.000001 && 
     47                        -0.000001 <= b3 && b3 <= 0.000001 && 
     48                        -0.000001 <= b4 && b4 <= 0.000001 
     49                    );  
     50            } 
     51            return false; 
    3052        } 
    3153        public function run(samples:Vector.<Number>, start:int, end:int, envelope:MEnvelope, frq:Number, amt:Number, res:Number, key:Number):void { 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MFormant.as

    r24369 r35879  
    6464            for(var i:int = m_len-1; i >= 0; i--) m_lMemory[i] = m_rMemory[i] = 0; 
    6565        } 
     66 
     67        // 無音入力時に何かの信号を出力するかのチェック 
     68        public function checkToSilence():Boolean { 
     69            return m_power && ( 
     70                -0.000001 <= m_lMemory[0] && m_lMemory[0] <= 0.000001 && 
     71                -0.000001 <= m_lMemory[1] && m_lMemory[1] <= 0.000001 && 
     72                -0.000001 <= m_lMemory[2] && m_lMemory[2] <= 0.000001 && 
     73                -0.000001 <= m_lMemory[3] && m_lMemory[3] <= 0.000001 && 
     74                -0.000001 <= m_lMemory[4] && m_lMemory[4] <= 0.000001 && 
     75                -0.000001 <= m_lMemory[5] && m_lMemory[5] <= 0.000001 && 
     76                -0.000001 <= m_lMemory[6] && m_lMemory[6] <= 0.000001 && 
     77                -0.000001 <= m_lMemory[7] && m_lMemory[7] <= 0.000001 && 
     78                -0.000001 <= m_lMemory[8] && m_lMemory[8] <= 0.000001 && 
     79                -0.000001 <= m_lMemory[9] && m_lMemory[9] <= 0.000001 
     80            ); 
     81        } 
    6682         
    6783        public function run(samples:Vector.<Number>, start:int, end:int):void { 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscFcDpcm.as

    r33297 r35879  
    11package com.txt_nifty.sketch.flmml { 
    22    /** 
    3        09/05/11 by OffGao 
     3       DPCM Oscillator by OffGao 
     4       09/05/11:作成 
     5       09/11/05:波形データ格納処理で、データが32bitごとに1bit抜けていたのを修正 
    46     */ 
    57    import __AS3__.vec.Vector; 
     
    2426        protected static var s_length:Vector.<int>;     //再生レングス 
    2527        protected var m_waveNo:int; 
    26         protected static var s_interval:Vector.<int> = Vector.<int>([ 
     28        protected static var s_interval:Vector.<int> = Vector.<int>([ //音程 
    2729                        428, 380, 340, 320, 286, 254, 226, 214, 190, 160, 142, 128, 106,  85,  72,  54, 
    2830                ]); 
     
    8082                } 
    8183                                for(i = 5; i >=0 ; i--) { 
    82                                         s_table[waveNo][intPos] += ((code >> i) & 1) << (intCnt*8 + 8-intCn2); 
     84                                        s_table[waveNo][intPos] += ((code >> i) & 1) << (intCnt*8 + 7-intCn2); 
    8385                                        intCn2++; 
    8486                                        if (intCn2 >= 8) {