Changeset 15293 for lang/actionscript

Show
Ignore:
Timestamp:
07/06/08 22:12:37 (6 years ago)
Author:
tekisuke
Message:

lang/actionscript/flmml/: 音量モードを変更するxコマンド実装。

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

Legend:

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

    r14833 r15293  
    2525        private var m_lpfFrq:Number; 
    2626        private var m_lpfRes:Number; 
     27        private var m_volMode:int; 
    2728        public    static var PITCH_RESOLUTION:int = 100; 
    2829        protected static var s_init:int = 0; 
    2930        protected static var s_frequencyMap:Array = new Array(128 * PITCH_RESOLUTION); 
    3031        protected static var s_frequencyLen:int; 
     32        protected static var s_volumeMap:Array = new Array(128); 
     33        protected static var s_volumeLen:int; 
    3134        protected static var s_samples:Array; 
    3235 
     
    5457            m_lpfFrq   = 0; 
    5558            m_lpfRes   = 0; 
     59            m_volMode  = 0; 
    5660        } 
    5761        public static function boot(numSamples:int):void { 
     
    6165                for(i = 0; i < s_frequencyLen; i++) { 
    6266                    s_frequencyMap[i] = 440.0 * Math.pow(2.0, (i-69*PITCH_RESOLUTION)/(12*PITCH_RESOLUTION)); 
     67                } 
     68                s_volumeLen = s_volumeMap.length; 
     69                s_volumeMap[0] = 0.0; 
     70                for(i = 1; i < s_volumeLen; i++) { 
     71                    s_volumeMap[i] = Math.pow(10.0, (i-127.0)*(48.0/(127.0*20.0))); // min:-48db 
     72                    //trace(i+","+s_volumeMap[i]); 
    6373                } 
    6474                s_init = 1; 
     
    8797            m_oscillator2.resetPhase(); 
    8898            m_filter.reset(); 
    89             m_velocity = velocity / 127.0; 
     99            m_velocity = (m_volMode) ? s_volumeMap[velocity] : velocity / 127.0; 
    90100            m_onCounter = 0; 
    91101        } 
     
    157167            if (m_lpfRes > 1.0) m_lpfRes = 1.0; 
    158168        } 
    159         protected function getNextSample():Number { 
    160             return m_oscillator1.getNextSample() * m_envelope1.getNextAmplitude() * m_velocity; 
     169        public function setVolMode(m:int):void { 
     170            m_volMode = m; 
     171        } 
     172        protected function getNextSampleLinear():Number { 
     173            return m_oscillator1.getNextSample() * m_envelope1.getNextAmplitudeLinear() * m_velocity; 
     174        } 
     175        protected function getNextSampleNonLinear():Number { 
     176            return m_oscillator1.getNextSample() * m_envelope1.getNextAmplitudeNonLinear() * m_velocity; 
    161177        } 
    162178        protected function getNextCutoff():Number { 
    163             var cut:Number = m_lpfFrq + m_lpfAmt * m_envelope2.getNextAmplitude(); 
     179            var cut:Number = m_lpfFrq + m_lpfAmt * m_envelope2.getNextAmplitudeLinear(); 
    164180            cut = getFrequency(cut) * m_oscillator1.getFrequency() * (2.0 * Math.PI / (Audio.RATE44100 * 440.0)); 
    165181            if (cut < (1.0/127.0)) cut = 0.0; 
     
    178194                // no LFO 
    179195                m_oscillator1.getSamples(s_samples, start, end); 
    180                 m_envelope1.ampSamples(s_samples, start, end, m_velocity); 
     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); 
    181198            } 
    182199            else { 
    183                 // with LFO 
    184                 for(i = start; i < end; i++) { 
    185                     freqNo = m_freqNo; 
    186                     if (m_onCounter >= m_lfoDelay && (m_lfoEnd == 0 || m_onCounter < m_lfoEnd)) { 
    187                         freqNo += m_oscillator2.getNextSample() * m_osc2Sign * m_lfoDepth; 
     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++; 
    188210                    } 
    189                     m_oscillator1.setFrequency(getFrequency(freqNo)); 
    190                     s_samples[i] = getNextSample(); 
    191                     m_onCounter++; 
     211                } 
     212                // with LFO, non linear 
     213                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++; 
     222                    } 
    192223                } 
    193224            } 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MEnvelope.as

    r13769 r15293  
    2020                private var m_timeInSamples:int; 
    2121                private var m_startAmplitude:Number; 
     22        protected static var s_init:int = 0; 
     23        protected static var s_volumeMap:Array = new Array(256); 
     24        protected static var s_volumeLen:int; 
    2225 
    2326                public function MEnvelope(attack:Number, decay:Number, sustain:Number, release:Number) { 
     
    3134                        m_releaseStep = 0; 
    3235                } 
     36 
     37        public static function boot():void { 
     38            if (!s_init) { 
     39                s_volumeLen = s_volumeMap.length; 
     40                s_volumeMap[0] = 0.0; 
     41                for(var i:int = 1; i < s_volumeLen; i++) { 
     42                    s_volumeMap[i] = Math.pow(10.0, (i-255.0)*(48.0/(255.0*20.0))); // min:-48db 
     43                } 
     44                s_init = 1; 
     45            } 
     46        } 
    3347 
    3448                public function setAD(attack:Number, decay:Number):void { 
     
    5569                } 
    5670                 
    57                 public function getNextAmplitude():Number { 
     71                public function getNextAmplitudeLinear():Number { 
    5872                        if (!m_playing) return 0; 
    5973                        var val:Number; 
     
    8296                        return m_currentVal; 
    8397                } 
     98                public function getNextAmplitudeNonLinear():Number { 
     99                        if (!m_playing) return 0; 
     100                        var val:Number; 
     101                        var offset:Number = (m_timeInSamples as Number) / Audio.RATE44100; 
     102                         
     103                        if (!m_releasing) { 
     104                                if (offset < m_attack) {                                   // attack phase 
     105                                        val = m_startAmplitude + (1 - m_startAmplitude) * offset / m_attack; 
     106                                } 
     107                                else if (offset < (m_attack + m_decay)) {  //decay phase 
     108                                        val = 1.0 - ((offset - m_attack) / m_decay) * (1.0 - m_sustain); 
     109                                } 
     110                                else if (offset >= (m_attack + m_decay)) { //sustain phase 
     111                                        val = m_sustain; 
     112                                } 
     113                        } 
     114                        else { 
     115                                val = m_currentVal - m_releaseStep;                //release phase 
     116                        } 
     117                         
     118                        if (val < 0) { 
     119                                m_playing = false; 
     120                        } 
     121                        m_currentVal = Math.max(0, val); 
     122                        ++m_timeInSamples; 
     123            var d:int = m_currentVal * 255.0; 
     124                        return s_volumeMap[d]; 
     125                } 
    84126 
    85         public function ampSamples(samples:Array, start:int, end:int, velocity:Number):void { 
     127        public function ampSamplesLinear(samples:Array, start:int, end:int, velocity:Number):void { 
    86128            var i:int; 
    87129            for(i = start; i < end; i++) { 
    88                 samples[i] = Number(samples[i]) * getNextAmplitude() * velocity; 
     130                samples[i] = Number(samples[i]) * getNextAmplitudeLinear() * velocity; 
     131            } 
     132        } 
     133        public function ampSamplesNonLinear(samples:Array, start:int, end:int, velocity:Number):void { 
     134            var i:int; 
     135            for(i = start; i < end; i++) { 
     136                samples[i] = Number(samples[i]) * getNextAmplitudeNonLinear() * velocity; 
    89137            } 
    90138        } 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MEvent.as

    r14830 r15293  
    3939        public function setLPFFRQRES(frq:int, res:int):void   { set(MStatus.LPF_FRQRES, frq, res); } 
    4040        public function setClose():void                       { set(MStatus.CLOSE, 0, 0); } 
     41        public function setVolMode(m:int):void                { set(MStatus.VOL_MODE, m, 0); } 
    4142        public function setDelta(delta:int):void              { m_delta = delta; } 
    4243        public function getStatus():int     { return m_status; } 
     
    6667        public function getLPFFrq():int     { return m_data0; } 
    6768        public function getLPFRes():int     { return m_data1; } 
     69        public function getVolMode():int    { return m_data0; } 
    6870    } 
    6971} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MFilter.as

    r14830 r15293  
    4646            if (amt > 0.0001 || amt < -0.0001) { 
    4747                for(i = start; i < end; i++) { 
    48                     cut = MChannel.getFrequency(frq + amt * envelope.getNextAmplitude()) * k; 
     48                    cut = MChannel.getFrequency(frq + amt * envelope.getNextAmplitudeLinear()) * k; 
    4949                    if (cut < (1.0/127.0))  cut = 0.0; 
    5050                    if (cut > (1.0-0.0001)) cut = 1.0-0.0001; 
     
    7070            var k:Number = key * (2.0 * Math.PI / (Audio.RATE44100 * 440.0)); 
    7171            for(var i:int = start; i < end; i++) { 
    72                 var cut:Number = MChannel.getFrequency(frq + amt * envelope.getNextAmplitude()) * k; 
     72                var cut:Number = MChannel.getFrequency(frq + amt * envelope.getNextAmplitudeLinear()) * k; 
    7373                if (cut < (1.0/127.0)) cut = 0.0; 
    7474                if (cut > 1.0) cut = 1.0; 
     
    9898            if (amt > 0.0001 || amt < -0.0001) { 
    9999                for(i = start; i < end; i++) { 
    100                     cut = MChannel.getFrequency(frq + amt * envelope.getNextAmplitude()) * k; 
     100                    cut = MChannel.getFrequency(frq + amt * envelope.getNextAmplitudeLinear()) * k; 
    101101                    if (cut < (1.0/127.0))  cut = 0.0; 
    102102                    if (cut > (1.0-0.0001)) cut = 1.0-0.0001; 
     
    126126            var k:Number = key * (2.0 * Math.PI / (Audio.RATE44100 * 440.0)); 
    127127            for(var i:int = start; i < end; i++) { 
    128                 var cut:Number = MChannel.getFrequency(frq + amt * envelope.getNextAmplitude()) * k; 
     128                var cut:Number = MChannel.getFrequency(frq + amt * envelope.getNextAmplitudeLinear()) * k; 
    129129                if (cut < (1.0/127.0)) cut = 0.0; 
    130130                if (cut > 1.0) cut = 1.0; 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MML.as

    r14830 r15293  
    242242            case '@': 
    243243                atmark(); 
     244                break; 
     245            case 'x': 
     246                m_tracks[m_trackNo].recVolMode(getUInt(1)); 
    244247                break; 
    245248            default: 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MSequencer.as

    r14830 r15293  
    2424            MChannel.boot(multiple * Audio.RATE44100); 
    2525            MOscillator.boot(); 
     26            MEnvelope.boot(); 
    2627            m_trackArr = new Array(); 
    2728            m_volume = 100; 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MStatus.as

    r14830 r15293  
    2424        public static const LPF_FRQRES:int   = 19; 
    2525        public static const CLOSE:int        = 20; 
     26        public static const VOL_MODE:int     = 21; 
    2627    } 
    2728} 
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MTrack.as

    r14833 r15293  
    123123                                m_ch.setLpfFrqRes(e.getLPFFrq(), e.getLPFRes()); 
    124124                                break; 
     125                            case MStatus.VOL_MODE: 
     126                                m_ch.setVolMode(e.getVolMode()); 
     127                                break; 
    125128                            case MStatus.CLOSE: 
    126129                                m_ch.close(); 
     
    326329            e = new MEvent(); 
    327330            e.setLPFFRQRES(frq, res); 
     331            m_events.push(e); 
     332        } 
     333 
     334        public function recVolMode(m:int): void { 
     335            var e:MEvent = new MEvent(); 
     336            recDelta(e); 
     337            e.setVolMode(m); 
    328338            m_events.push(e); 
    329339        }