Show
Ignore:
Timestamp:
10/02/08 01:32:37 (3 months ago)
Author:
tekisuke
Message:

lang/actionscript/flmml/: マクロを再帰的定義したときのバグをとりあえず修正。FM音源はまだ封印。

Files:
1 modified

Legend:

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

    r15293 r20421  
    2626        private var m_lpfRes:Number; 
    2727        private var m_volMode:int; 
     28        private var m_inSens:int; 
     29        private var m_inPipe:int; 
     30        private var m_outMode:int; 
     31        private var m_outPipe:int; 
    2832        public    static var PITCH_RESOLUTION:int = 100; 
    2933        protected static var s_init:int = 0; 
     
    3337        protected static var s_volumeLen:int; 
    3438        protected static var s_samples:Array; 
     39        protected static var s_pipeArr:Array; 
    3540 
    3641        public function MChannel() { 
     
    5863            m_lpfRes   = 0; 
    5964            m_volMode  = 0; 
     65            setInput(0, 0); 
     66            setOutput(0, 0); 
    6067        } 
    6168        public static function boot(numSamples:int):void { 
     
    7582            } 
    7683            s_samples = new Array(numSamples); 
     84        } 
     85        public static function createPipes(num:int):void { 
     86            s_pipeArr = new Array(num); 
     87            for (var i:int = 0; i < num; i++) { 
     88                s_pipeArr[i] = new Array(s_samples.length); 
     89                for (var j:int = 0; j < s_samples.length; j++) { 
     90                    var arr:Array = s_pipeArr[i]; 
     91                    arr[j] = 0; 
     92                } 
     93            } 
    7794        } 
    7895        public static function getFrequency(freqNo:int):Number { 
     
    169186        public function setVolMode(m:int):void { 
    170187            m_volMode = m; 
     188        } 
     189        public function setInput(i:int, p:int):void { 
     190            m_inSens = i * 100; 
     191            m_inPipe = p; 
     192        } 
     193        public function setOutput(o:int, p:int):void { 
     194            m_outMode = o; 
     195            m_outPipe = p; 
    171196        } 
    172197        protected function getNextSampleLinear():Number { 
     
    189214            var freqNo:int; 
    190215            var i:int; 
     216            var arr:Array; 
    191217            if (end >= max) end = max; 
    192218            var key:Number = m_oscillator1.getFrequency(); 
    193             if (m_osc2Connect == 0) { 
    194                 // no LFO 
    195                 m_oscillator1.getSamples(s_samples, start, end); 
    196                 if (m_volMode == 0) m_envelope1.ampSamplesLinear(s_samples, start, end, m_velocity); 
    197                 else m_envelope1.ampSamplesNonLinear(s_samples, start, end, m_velocity); 
    198             } 
     219            if (m_inSens == 0) { 
     220                if (m_osc2Connect == 0) { 
     221                    // no input, no LFO 
     222                    m_oscillator1.getSamples(s_samples, start, end); 
     223                    if (m_volMode == 0) m_envelope1.ampSamplesLinear(s_samples, start, end, m_velocity); 
     224                    else m_envelope1.ampSamplesNonLinear(s_samples, start, end, m_velocity); 
     225                } 
     226                else { 
     227                    // no input, with LFO, linear 
     228                    if (m_volMode == 0) { 
     229                        for(i = start; i < end; i++) { 
     230                            freqNo = m_freqNo; 
     231                            if (m_onCounter >= m_lfoDelay && (m_lfoEnd == 0 || m_onCounter < m_lfoEnd)) { 
     232                                freqNo += m_oscillator2.getNextSample() * m_osc2Sign * m_lfoDepth; 
     233                            } 
     234                            m_oscillator1.setFrequency(getFrequency(freqNo)); 
     235                            s_samples[i] = getNextSampleLinear(); 
     236                            m_onCounter++; 
     237                        } 
     238                    } 
     239                    // no input, with LFO, non linear 
     240                    else { 
     241                        for(i = start; i < end; i++) { 
     242                            freqNo = m_freqNo; 
     243                            if (m_onCounter >= m_lfoDelay && (m_lfoEnd == 0 || m_onCounter < m_lfoEnd)) { 
     244                                freqNo += m_oscillator2.getNextSample() * m_osc2Sign * m_lfoDepth; 
     245                            } 
     246                            m_oscillator1.setFrequency(getFrequency(freqNo)); 
     247                            s_samples[i] = getNextSampleNonLinear(); 
     248                            m_onCounter++; 
     249                        } 
     250                    } 
     251                } 
     252            } 
     253            // with input 
    199254            else { 
    200                 // with LFO, linear 
    201                 if (m_volMode == 0) { 
    202                     for(i = start; i < end; i++) { 
    203                         freqNo = m_freqNo; 
    204                         if (m_onCounter >= m_lfoDelay && (m_lfoEnd == 0 || m_onCounter < m_lfoEnd)) { 
    205                             freqNo += m_oscillator2.getNextSample() * m_osc2Sign * m_lfoDepth; 
    206                         } 
    207                         m_oscillator1.setFrequency(getFrequency(freqNo)); 
    208                         s_samples[i] = getNextSampleLinear(); 
    209                         m_onCounter++; 
    210                     } 
    211                 } 
    212                 // with LFO, non linear 
     255                //trace("input "+m_inPipe); 
     256                if (m_osc2Connect == 0) { 
     257                    // with input, no LFO 
     258                    arr = s_pipeArr[m_inPipe]; 
     259                    freqNo = getFrequency(m_freqNo); 
     260                    if (m_volMode == 0) { 
     261                        for(i = start; i < end; i++) { 
     262                            m_oscillator1.setFrequency(freqNo + arr[i] * m_inSens); 
     263                            s_samples[i] = getNextSampleLinear(); 
     264                        } 
     265                    } 
     266                    else { 
     267                        for(i = start; i < end; i++) { 
     268                            m_oscillator1.setFrequency(freqNo + arr[i] * m_inSens); 
     269                            s_samples[i] = getNextSampleNonLinear(); 
     270                        } 
     271                    } 
     272                } 
    213273                else { 
    214                     for(i = start; i < end; i++) { 
    215                         freqNo = m_freqNo; 
    216                         if (m_onCounter >= m_lfoDelay && (m_lfoEnd == 0 || m_onCounter < m_lfoEnd)) { 
    217                             freqNo += m_oscillator2.getNextSample() * m_osc2Sign * m_lfoDepth; 
    218                         } 
    219                         m_oscillator1.setFrequency(getFrequency(freqNo)); 
    220                         s_samples[i] = getNextSampleNonLinear(); 
    221                         m_onCounter++; 
     274                    // with input, with LFO, linear 
     275                    if (m_volMode == 0) { 
     276                        arr = s_pipeArr[m_inPipe]; 
     277                        for(i = start; i < end; i++) { 
     278                            freqNo = m_freqNo; 
     279                            if (m_onCounter >= m_lfoDelay && (m_lfoEnd == 0 || m_onCounter < m_lfoEnd)) { 
     280                                freqNo += m_oscillator2.getNextSample() * m_osc2Sign * m_lfoDepth; 
     281                            } 
     282                            m_oscillator1.setFrequency(getFrequency(freqNo) + arr[i] * m_inSens); 
     283                            s_samples[i] = getNextSampleLinear(); 
     284                            m_onCounter++; 
     285                        } 
     286                    } 
     287                    // with input, with LFO, non linear 
     288                    else { 
     289                        arr = s_pipeArr[m_inPipe]; 
     290                        for(i = start; i < end; i++) { 
     291                            freqNo = m_freqNo; 
     292                            if (m_onCounter >= m_lfoDelay && (m_lfoEnd == 0 || m_onCounter < m_lfoEnd)) { 
     293                                freqNo += m_oscillator2.getNextSample() * m_osc2Sign * m_lfoDepth; 
     294                            } 
     295                            m_oscillator1.setFrequency(getFrequency(freqNo) + arr[i] * m_inSens); 
     296                            s_samples[i] = getNextSampleNonLinear(); 
     297                            m_onCounter++; 
     298                        } 
    222299                    } 
    223300                } 
     
    225302            m_formant.run(s_samples, start, end); 
    226303            m_filter.run(s_samples, start, end, m_envelope2, m_lpfFrq, m_lpfAmt, m_lpfRes, key); 
    227             for(i = start; i < end; i++) { 
    228                 amplitude = s_samples[i]; 
    229                 sample = samples[i]; 
    230                 sample.left  += amplitude * m_panL; 
    231                 sample.right += amplitude * m_panR; 
     304            switch(m_outMode) { 
     305            case 0: 
     306                //trace("output audio"); 
     307                for(i = start; i < end; i++) { 
     308                    amplitude = s_samples[i]; 
     309                    sample = samples[i]; 
     310                    sample.left  += amplitude * m_panL; 
     311                    sample.right += amplitude * m_panR; 
     312                } 
     313                break; 
     314            case 1: // overwrite 
     315                //trace("output "+m_outPipe); 
     316                arr = s_pipeArr[m_outPipe]; 
     317                for(i = start; i < end; i++) { 
     318                    arr[i] = s_samples[i]; 
     319                } 
     320                break; 
     321            case 2: // add 
     322                arr = s_pipeArr[m_outPipe]; 
     323                for(i = start; i < end; i++) { 
     324                    arr[i] += s_samples[i]; 
     325                } 
     326                break; 
     327            default: 
     328                break; 
    232329            } 
    233330        }