チェンジセット 3564: as3

差分発生行の前後
無視リスト:
コミット日時:
2010/03/17 02:45:00 (3 年前)
コミッタ:
keim
ログメッセージ:

SiON ver0.59 updated. This version is only for development.

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as

    r3480 r3564  
    150150        //----- SiOPM module related 
    151151        private var _channelCount:int;          // module output channels (1 or 2) 
    152         private var _sampleRate:int;            // module output frequency ratio (44100 or 22050) 
    153         private var _bitRate:int;               // module output bitrate (0 or 8 or 16) 
     152        private var _sampleRate:Number;         // module output frequency ratio (44100 or 22050) 
     153        private var _bitRate:int;               // module output bitrate 
    154154        private var _bufferLength:int;          // module and streaming buffer size (8192, 4096 or 2048) 
    155155        private var _debugMode:Boolean;         // true; throw Error, false; throw ErrorEvent 
     
    237237        /** Streaming buffer length. */ 
    238238        public function get bufferLength() : int { return _bufferLength; } 
     239        /** Sample rate (44100 is only available in current version). */ 
     240        public function get sampleRate() : Number { return _sampleRate; } 
     241        /** bit rate, 0 means float value[-1 - +1]. */ 
     242        public function get bitRate() : Number { return _bitRate; } 
    239243         
    240244        /** Sound volume. */ 
     
    348352         *  @param bufferLength Buffer size of sound stream. 8192, 4096 or 2048 is available, but no check. 
    349353         *  @param channel Channel count. 1(monoral) or 2(stereo) is available. 
    350          *  @param sampleRate Sampling ratio of wave. 22050 or 44100 is available
    351          *  @param bitRate Bit ratio of wave. 0, 8 or 16 is available. 0 means float value [-1 to 1]. 
     354         *  @param sampleRate Sampling ratio of wave. 44100 is only available in current version
     355         *  @param bitRate Bit ratio of wave. 0 means float value [-1 to 1]. 
    352356         */ 
    353357        function SiONDriver(bufferLength:int=2048, channelCount:int=2, sampleRate:int=44100, bitRate:int=0) 
     
    369373            _tempData = null; 
    370374            _channelCount = channelCount; 
    371             _sampleRate = 44100; // sampleRate; 44100 is only available now
     375            _sampleRate = 44100; // sampleRate; 44100 is only in current version
    372376            _bitRate = bitRate; 
    373377            _bufferLength = bufferLength; 
     
    711715        } 
    712716         
     717         
     718        /** Force dispatch stream event. The SiONEvent.STREAM is dispatched only when the event listener is set BEFORE calling play(). You can let SiONDriver to dispatch SiONEvent.STREAM event by this function.  
     719         *  @param dispatch Set true to force dispatching. Or set false to not dispatching if there are no listeners. 
     720         */ 
     721        _sion_internal function forceDispatchStreamEvent(dispatch:Boolean=true) : void 
     722        { 
     723            _dispatchStreamEvent = dispatch || (hasEventListener(SiONEvent.STREAM)); 
     724        } 
    713725         
    714726         
     
    13121324             
    13131325            // THESE FUNCTIONS ORDER IS VERY IMPORTANT !! 
    1314             module.initialize(_channelCount, _bufferLength); 
     1326            module.initialize(_channelCount, _bitRate, _bufferLength); 
    13151327            module.reset();                                                 // reset channels 
    13161328            sequencer._prepareProcess(_data, _sampleRate, _bufferLength);   // set track channels (this must be called after module.reset()). 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMModule.as

    r3480 r3564  
    3636        public var streamSlot:Vector.<SiOPMStream>; 
    3737         
    38         // buffer length 
    39         private var _bufferLength:int; 
     38        private var _bufferLength:int;  // buffer length 
     39        private var _bitRate:int;       // bit rate 
    4040         
    4141        // pipes 
     
    5050        /** Buffer channel count */ 
    5151        public function get channelCount() : int { return outputStream.channels; } 
     52        /** Bit rate */ 
     53        public function get bitRate() : int { return _bitRate; } 
    5254        /** Buffer length */ 
    5355        public function get bufferLength() : int { return _bufferLength; } 
     
    9294        /** Initialize module and all tone generators. 
    9395         *  @param channelCount ChannelCount 
     96         *  @param bitRate bit rate  
    9497         *  @param bufferLength Maximum buffer size processing at once. 
    9598         */ 
    96         public function initialize(channelCount:int, bufferLength:int) : void 
     99        public function initialize(channelCount:int, bitRate:int, bufferLength:int) : void 
    97100        { 
     101            _bitRate = bitRate; 
     102             
    98103            var i:int, stream:SiOPMStream; 
    99104 
     
    137142        { 
    138143            outputStream.limit(); 
     144            if (_bitRate != 0) outputStream.quantize(_bitRate); 
    139145        } 
    140146         
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMStream.as

    r3480 r3564  
    5858                     if (n < -1) buffer[i] = -1; 
    5959                else if (n >  1) buffer[i] =  1; 
     60            } 
     61        } 
     62         
     63         
     64        /** Quantize buffer by bit rate. */ 
     65        public function quantize(bitRate:int) : void 
     66        { 
     67            var i:int, imax:int = buffer.length, 
     68                r:Number = 1<<bitRate, ir:Number = 2/r; 
     69            for (i=0; i<imax; i++) { 
     70                buffer[i] = ((buffer[i] * r) >> 1) * ir; 
    6071            } 
    6172        } 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as

    r3450 r3564  
    133133            sampleTable._siopm_module_internal::_free(); 
    134134            _systemCommands.length = 0; 
     135             
     136            globalSequence.initialize(); 
    135137        } 
    136138         
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as

    r3480 r3564  
    507507            seq = mmlData.globalSequence; 
    508508             
    509             seq.initialize(); 
    510509            list = list.sortOn(length, Array.NUMERIC); 
    511510            pos = 0; 
  • as3/SiOPM/trunk/src/org/si/sion/utils/Fader.as

    r2989 r3564  
    4747        function Fader(callback:Function=null, valueFrom:Number=0, valueTo:Number=1, term:int=60) 
    4848        { 
    49             if (callback != null) setFade(callback, valueFrom, valueTo, term); 
     49            setFade(callback, valueFrom, valueTo, term); 
    5050        } 
    5151         
     
    6363        public function setFade(callback:Function, valueFrom:Number=0, valueTo:Number=1, term:int=60) : Fader 
    6464        { 
     65            _value = valueFrom; 
    6566            if (term == 0 || callback == null) { 
    6667                _counter = 0; 
     
    6869            } 
    6970            _callback = callback; 
    70             _value = valueFrom; 
    7171            _end = valueTo; 
    7272            _step = (valueTo - valueFrom) / term; 
  • as3/SiOPM/trunk/src/org/si/sound/base/SoundObject.as

    r3504 r3564  
    99    import org.si.sion.*; 
    1010    import org.si.sion.utils.Translator; 
     11    import org.si.sion.utils.Fader; 
     12    import org.si.sion.namespaces._sion_internal; 
     13    import org.si.sion.events.SiONEvent; 
    1114    import org.si.sion.module.SiOPMModule; 
    1215    import org.si.sion.effector.SiEffectBase; 
     
    4447        /** tracks for sequenceOn() */ 
    4548        protected var _tracks:Vector.<SiMMLTrack>; 
     49        /** Auto-fader to fade in/out. */ 
     50        protected var _fader:Fader; 
     51        /** Fader volume. */ 
     52        protected var _faderVolume:Number; 
    4653         
    4754        /** Sound length uint in 16th beat, 0 sets inifinity length. @default 0. */ 
     
    273280            _track = null; 
    274281            _tracks = null; 
     282            _fader = new Fader(null, 1); 
    275283            _volumes = new Vector.<int>(SiOPMModule.STREAM_SEND_SIZE); 
     284            _faderVolume = 1; 
    276285             
    277286            _note = 60; 
     
    317326            _quantize = 1; 
    318327             
     328            _fader.setFade(null, 1); 
    319329            _effectChain = null; 
    320330            _volumes[0] = 64; 
    321331            for (var i:int=1; i<SiOPMModule.STREAM_SEND_SIZE; i++) _volumes[i] = 0; 
     332            _faderVolume = 1; 
    322333            _pan = 0; 
    323334            _mute = false; 
     
    359370        { 
    360371            _volumes[slot] = (volume<0) ? 0 : (volume>1) ? 128 : (volume * 128); 
     372        } 
     373         
     374         
     375        /** Set fading in.  
     376         *  @param time fading time[sec]. 
     377         */ 
     378        public function fadeIn(time:Number) : void 
     379        { 
     380            var drv:SiONDriver = driver; 
     381            if (drv) { 
     382                if (!_fader.isActive) { 
     383                    drv.addEventListener(SiONEvent.STREAM, _onStream); 
     384                    drv._sion_internal::forceDispatchStreamEvent(); 
     385                } 
     386                _fader.setFade(_fadeVolume, 0, 1, time * drv.sampleRate / drv.bufferLength); 
     387            } 
     388        } 
     389         
     390         
     391        /** Set fading out. 
     392         *  @param time fading time[sec]. 
     393         */ 
     394        public function fadeOut(time:Number) : void 
     395        { 
     396            var drv:SiONDriver = driver; 
     397            if (drv) { 
     398                if (!_fader.isActive) { 
     399                    drv.addEventListener(SiONEvent.STREAM, _onStream); 
     400                    drv._sion_internal::forceDispatchStreamEvent(); 
     401                } 
     402                _fader.setFade(_fadeVolume, 1, 0, time * drv.sampleRate / drv.bufferLength); 
     403            } 
    361404        } 
    362405         
     
    511554        internal function _updateVolume() : void 
    512555        { 
    513             if (_parent) _volumes[0] = _parent._volumes[0] * _thisVolume
    514             else _volumes[0] = _thisVolume * 128; 
     556            if (_parent) _volumes[0] = _parent._volumes[0] * _thisVolume * _faderVolume
     557            else _volumes[0] = _thisVolume * _faderVolume * 128; 
    515558        } 
    516559         
     
    537580            if (_pan < -1) _pan = -1; 
    538581            else if (_pan > 1) _pan = 1; 
     582        } 
     583 
     584         
     585        /** Handler for SiONEvent.STREAM */ 
     586        protected function _onStream(e:SiONEvent) : void 
     587        { 
     588            if (!_fader.execute()) { 
     589                driver.removeEventListener(SiONEvent.STREAM, _onStream); 
     590                driver._sion_internal::forceDispatchStreamEvent(false); 
     591            } 
     592        } 
     593         
     594         
     595        /** call from fader */ 
     596        protected function _fadeVolume(v:Number) : void 
     597        { 
     598            _faderVolume = v; 
     599            _updateVolume(); 
    539600        } 
    540601    } 
  • as3/SiOPM/trunk/src/org/si/sound/mdx/MDXData.as

    r3530 r3564  
    77 
    88package org.si.sound.mdx { 
    9     import org.si.sion.SiONData
    10     import org.si.sion.SiONVoice; 
     9    import org.si.sion.*
     10    import org.si.sion.module.SiOPMTable; 
    1111    import org.si.sion.module.SiOPMChannelParam; 
    1212    import org.si.sion.module.SiOPMOperatorParam; 
     
    2424        public var title:String = null; 
    2525        public var pdxFileName:String = null; 
    26         public var voices:Vector.<SiONVoice>  = new Vector.<SiONVoice>(256, true); 
    27         public var tracks:Vector.<MDXTrack>  = new Vector.<MDXTrack>(16, true); 
    28         public var globalEvents:Vector.<MDXEvent> = new Vector.<MDXEvent>(); 
    29          
     26        public var voices:Vector.<SiONVoice> = new Vector.<SiONVoice>(256, true); 
     27        public var tracks:Vector.<MDXTrack> = new Vector.<MDXTrack>(16, true); 
     28        public var executors:Vector.<MDXExecutor> = new Vector.<MDXExecutor>(16, true); 
     29        public var currentBPM:Number; 
     30        private var _noiseVoice:SiONVoice; 
     31        private var _noiseVoiceNumber:int; 
    3032         
    3133         
     
    5153        function MDXData() 
    5254        { 
    53              
     55            for (var i:int=0; i<16; i++) executors[i] = new MDXExecutor(); 
     56            _noiseVoice = new SiONVoice(2, 1); 
     57            _noiseVoice.channelParam.operatorParam[0].ptType = SiOPMTable.PT_OPM_NOISE; 
    5458        } 
    5559         
     
    6771            title = null; 
    6872            pdxFileName = null; 
    69             globalEvents.length = 0; 
    7073            for (i=0; i<16; i++) tracks[i] = null; 
    7174            for (i=0; i<256; i++) voices[i] = null; 
     75            _noiseVoiceNumber = -1; 
    7276            return this; 
    7377        } 
     
    8084        public function convertToSiONData(data:SiONData=null, pdxData:PDXData=null) : SiONData 
    8185        { 
    82             var i:int, imax:int, prevClock:uint, currentClock:uint; 
     86            if (SiONDriver.mutex == null) throw new Error("MDXData.convertToSiONData() : This function can be called after creating SiONDriver."); 
     87             
     88            var i:int, imax:int; 
    8389             
    8490            if (data == null) data = new SiONData(); 
    8591            data.clear(); 
    86              
    8792            data.bpm = bpm; 
    88             data.globalSequence.initialize(); 
    89             imax = globalEvents.length; 
    90             currentClock = prevClock = 0; 
    91             for (i=0; i<imax; i++) { 
    92                 switch(globalEvents[i].type) { 
    93                 case MDXEvent.TIMERB: 
    94                     currentClock = globalEvents[i].clock; 
    95                     if (prevClock < currentClock) data.globalSequence.appendNewEvent(MMLEvent.WAIT, (currentClock-prevClock)*10); 
    96                     data.globalSequence.appendNewEvent(MMLEvent.TEMPO, 4883/(256-globalEvents[i].data)); 
    97                     prevClock = currentClock; 
    98                     break; 
    99                 } 
    100             } 
    101  
    102             imax = (isPCM8) ? 16 : 9; 
    103             for (i=0; i<imax; i++) { 
    104                 tracks[i]._constructMMLSequence(data.appendNewSequence()); 
    105             } 
    106              
     93             
     94            // set voice data 
    10795            imax = voices.length; 
    108             for (i=0; i<imax; i++) { 
    109                 data.voices[i] = voices[i] 
    110             } 
    111              
     96            for (i=0; i<imax; i++) data.voices[i] = voices[i]; 
     97             
     98            // set adpcm data 
    11299            if (pdxData) { 
    113100                imax = 96; 
    114101                for (i=0; i<imax; i++) data.setPCMData(i, pdxData.pcmData[i]); 
     102            } 
     103             
     104            // construct mml sequences 
     105            imax = (isPCM8) ? 16 : 9; 
     106            for (i=0; i<imax; i++) { 
     107                executors[i].initialize(data.appendNewSequence().initialize(), tracks[i], _noiseVoiceNumber); 
     108            } 
     109 
     110            var totalClock:uint=0, nextClock:uint, c:uint; 
     111            currentBPM = bpm; 
     112            while (totalClock != uint.MAX_VALUE) { 
     113                // sync 
     114                for (i=0; i<imax; i++) executors[i].globalExec(totalClock, this); 
     115                // exec 
     116                nextClock = uint.MAX_VALUE; 
     117                for (i=0; i<imax; i++) { 
     118                    c = executors[i].exec(totalClock, currentBPM); 
     119                    if (c < nextClock) nextClock = c; 
     120                } 
     121                totalClock = nextClock; 
    115122            } 
    116123             
     
    146153            dataPointer = bytes.position; 
    147154            voiceOffset = bytes.readUnsignedShort();  // tone data 
    148             for (i=0; i<16; i++) mmlOffsets[i] = dataPointer + bytes.readUnsignedShort(); 
     155            for (i=0; i<16; i++) trace(mmlOffsets[i] = dataPointer + bytes.readUnsignedShort()); 
    149156            // check pcm8 
    150157            bytes.position = mmlOffsets[0]; 
     
    189196                    v = (reg[0] >> (opi<<3)) & 255; 
    190197                    opp.dt1  = (v >> 4) & 7; 
    191                     opp.fmul = (v & 7) << 7
     198                    opp.mul  = v & 15
    192199                    opp.tl   = (reg[1] >> (opi<<3)) & 127; 
    193200                    v = (reg[2] >> (opi<<3)) & 255; 
     
    204211                    opp.rr = (v & 15) << 2; 
    205212                } 
     213                 
     214                trace(voice.getMML(voiceNumber)); 
     215            } 
     216             
     217            _noiseVoiceNumber = -1; 
     218            for (i=255; i>=0; --i) { 
     219                if (voices[i] == null) { 
     220                    _noiseVoiceNumber = i; 
     221                    voices[i] = _noiseVoice; 
     222                } 
    206223            } 
    207224        } 
     
    213230            var i:int, imax:int = (isPCM8) ? 16 : 9; 
    214231            // load tracks 
     232            bpm = 0; 
    215233            for (i=0; i<imax; i++) { 
    216234                bytes.position = mmlOffsets[i]; 
    217235                tracks[i] = new MDXTrack(this, i); 
    218236                tracks[i].loadBytes(bytes); 
    219             } 
    220              
    221             // sort all global events 
    222             globalEvents = globalEvents.sort(function(a:MDXEvent, b:MDXEvent) : Number { return (a.clock - b.clock); }); 
    223              
    224             // load bpm 
    225             bpm = 87.19642857142857; // 4883/(256-200) 
    226             imax = globalEvents.length; 
    227             for (i=0; i<imax; i++) { 
    228                 if (globalEvents[i].clock > 0) break; 
    229                 if (globalEvents[i].type == MDXEvent.TIMERB) { 
    230                     bpm = 4883/(256-globalEvents[i].data);//4370.285//4883 
    231                     break; 
    232                 } 
    233             } 
     237                if (tracks[i].timerB != -1 && bpm == 0) { 
     238                    bpm = 4883/(256-tracks[i].timerB); 
     239                } 
     240            } 
     241            if (bpm == 0) bpm = 87.19642857142857; // 4883/(256-200) 
     242        } 
     243         
     244         
     245        /** @private [internal] call from MDXExecutor.sync() */ 
     246        internal function onSyncSend(channelNumber:int, syncClock:uint) : void 
     247        { 
     248            executors[channelNumber & 15].sync(syncClock); 
     249        } 
     250         
     251         
     252        /** @private [internal] call from MDXExecutor.sync() */ 
     253        internal function onTimerB(timerB:int) : void 
     254        { 
     255            currentBPM = 4883/(256-timerB); 
    234256        } 
    235257    } 
    236258} 
    237259 
    238  
  • as3/SiOPM/trunk/src/org/si/sound/mdx/MDXEvent.as

    r3530 r3564  
    5454        public var data:int = 0; 
    5555        public var data2:int = 0; 
    56         public var clock:uint = 0; 
    5756        public var deltaClock:uint = 0; 
    5857         
     
    6564        public function toString() : String 
    6665        { 
    67  
     66            var i:int; 
     67            switch (type) { 
     68            case REST: return "r ;"+String(deltaClock); 
     69            case NOTE:  
     70                i = (data+15)%12; 
     71                return "o"+String(((data+15)/12)>>0)+_noteText[i]+";"+String(deltaClock); 
     72            case REPEAT_BEGIN: return "["+String(data); 
     73            case REPEAT_BREAK: return "|"; 
     74            case REPEAT_END: return "]"; 
     75            case PORTAMENT: return "po"; 
     76            case SLUR: return "&"; 
     77            case VOICE: return "@"+String(data); 
     78            case PAN: return "p"+String(data); 
     79            case VOLUME: return (data<16) ? "v"+String(data) : "@v"+String(data&127); 
     80            default:   return "#"+ type.toString(16) + "; " + String(data); 
     81            } 
    6882            return ""; 
    6983        } 
     
    7488    // constructor 
    7589    //-------------------------------------------------------------------------------- 
    76         function MDXEvent(type:int, data:int, data2:int, clock:int, deltaClock:int)  
     90        function MDXEvent(type:int, data:int, data2:int, deltaClock:int)  
    7791        { 
    7892            this.type = type; 
    7993            this.data = data; 
    8094            this.data2 = data2; 
    81             this.clock = clock; 
    8295            this.deltaClock = deltaClock; 
    8396        } 
  • as3/SiOPM/trunk/src/org/si/sound/mdx/MDXTrack.as

    r3530 r3564  
    88package org.si.sound.mdx { 
    99    import flash.utils.ByteArray; 
    10     import org.si.sion.SiONDriver; 
    11     import org.si.sion.sequencer.SiMMLSequencer; 
    12     import org.si.sion.sequencer.base.MMLSequence; 
    13     import org.si.sion.sequencer.base.MMLEvent; 
    1410     
    1511     
     
    2319        /** Return pointer of segno */ 
    2420        public var segnoPointer:MDXEvent; 
     21        /** timer B value to set */ 
     22        public var timerB:int; 
     23 
     24        /** owner MDXData */ 
     25        public var owner:MDXData; 
    2526        /** channel number */ 
    2627        public var channelNumber:int; 
    27         /** owner MDXData */ 
    28         public var owner:MDXData; 
    2928         
    3029         
     
    3534        public function toString():String 
    3635        { 
    37             var text:String = ""; 
     36            var text:String = "", i:int, imax:int = sequence.length; 
     37            for (i=0; i<imax; i++) text += sequence[i] +"\n"; 
    3838            return text; 
    3939        } 
     
    6262            sequence.length = 0; 
    6363            segnoPointer = null; 
     64            timerB = -1; 
    6465            return this; 
    6566        } 
     
    7172            clear(); 
    7273             
    73             var code:int, v:int, clock:uint, pos:int, mem:Array=[], exitLoop:Boolean = false; 
    74             clock = 0; 
     74            var code:int, v:int, pos:int, mem:Array=[], exitLoop:Boolean = false; 
    7575             
    7676            while (!exitLoop && bytes.bytesAvailable>0) { 
     
    7979                if (code<0x80) { // rest 
    8080                    newEvent(MDXEvent.REST, 0, 0, code+1); 
    81                     clock += code+1; 
    8281                } else 
    8382                if (code<0xe0) { // note 
    8483                    v = bytes.readUnsignedByte() + 1; 
    8584                    newEvent(MDXEvent.NOTE, code - 0x80, 0, v); 
    86                     clock += v; 
    8785                } else { 
    8886                    switch(code) { 
     
    10098                    case MDXEvent.FREQUENCY: 
    10199                    case MDXEvent.LFO_DELAY: 
     100                    case MDXEvent.SYNC_SEND: 
    102101                        newEvent(code, bytes.readUnsignedByte()); 
    103102                        break; 
     
    107106                    case MDXEvent.SLUR: 
    108107                    case MDXEvent.SET_PCM8: 
     108                    case MDXEvent.SYNC_WAIT: 
    109109                        newEvent(code); 
    110110                        break; 
     
    119119                        break; 
    120120                    case MDXEvent.REPEAT_END: 
    121                         v = pos+(bytes.readShort()); // REPEAT_BEGIN 
    122                         newEvent(code, v); 
     121                        newEvent(code, pos+bytes.readShort());  // position of REPEAT_BEGIN 
    123122                        break; 
    124123                    case MDXEvent.REPEAT_BREAK: 
    125                         v = pos+(bytes.readShort()+2); // REPEAT_END 
    126                         newEvent(code, v); 
     124                        newEvent(code, pos+bytes.readShort()+2); // position of REPEAT_END 
    127125                        break; 
    128126                    //----- others 
    129127                    case MDXEvent.TIMERB: 
    130                     case MDXEvent.SYNC_SEND: 
    131128                        v = bytes.readUnsignedByte(); 
    132                         owner.globalEvents.push(newEvent(code, v)); 
    133                         break; 
    134                     case MDXEvent.SYNC_WAIT: 
    135                         owner.globalEvents.push(newEvent(code)); 
     129                        if (timerB == -1) timerB = v; 
     130                        newEvent(code, v); 
    136131                        break; 
    137132                    case MDXEvent.PITCH_LFO: 
    138133                    case MDXEvent.VOLUME_LFO: 
    139134                        v = bytes.readUnsignedByte(); 
    140                         if (v == 0x80 || v == 0x81) newEvent(code, v<<24); 
    141                         else newEvent(code, (v<<16) | bytes.readUnsignedShort(), bytes.readUnsignedShort()); 
     135                        if (v == 0x80 || v == 0x81) newEvent(code, v); 
     136                        else newEvent(code, v | (bytes.readUnsignedShort()<<8), bytes.readUnsignedShort()); 
    142137                        break; 
    143138                    case MDXEvent.OPM_LFO: 
    144139                        v = bytes.readUnsignedByte(); 
    145                         if (v == 0x80 || v == 0x81) newEvent(code, v<<24); 
     140                        if (v == 0x80 || v == 0x81) newEvent(code, v<<16); 
    146141                        else { 
    147142                            v = (v<<16) | (bytes.readUnsignedByte()<<8) | bytes.readUnsignedByte(); 
     
    165160             
    166161            function newEvent(type:int, data:int=0, data2:int=0, deltaClock:int=0) : MDXEvent { 
    167                 var inst:MDXEvent = new MDXEvent(type, data, data2, clock, deltaClock); 
     162                var inst:MDXEvent = new MDXEvent(type, data, data2, deltaClock); 
    168163                sequence.push(inst); 
    169164                mem[pos] = inst; 
    170165                return inst; 
    171166            } 
    172              
     167 
     168trace("------------------- ch", channelNumber, "-------------------"); 
     169trace(String(this)); 
    173170            return this; 
    174         } 
    175          
    176          
    177         /** @private [internal] construct MMLSequence */ 
    178         internal function _constructMMLSequence(mmlseq:MMLSequence) : void 
    179         { 
    180             if (SiONDriver.mutex == null) return; 
    181              
    182             var i:int, v:int, imax:int, e:MDXEvent, me:MMLEvent, sequencer:SiMMLSequencer = SiONDriver.mutex.sequencer,   
    183                 panTable:Array = [4,0,8,4], freqTable:Array = [18,23,30,35,42], adpcmFreq:int = 4, adpcmID:int = -1, 
    184                 repeatStac:Array = [], lastNoteMDX:MDXEvent, lastNoteMML:MMLEvent,  
    185                 lfoDelay:int=0, lfofq:int=0, lfows:int=2, mp:int=0, ma:int=0,  
    186                 eventIDFadeOut:int = sequencer.getEventID("@fadeout"), 
    187                 eventIDPan:int     = sequencer.getEventID("p"), 
    188                 eventIDPShift:int  = sequencer.getEventID("k"), 
    189                 eventIDLFO:int     = sequencer.getEventID("@lfo"), 
    190                 eventIDAMod:int    = sequencer.getEventID("ma"), 
    191                 eventIDPMod:int    = sequencer.getEventID("mp"), 
    192                 eventIDIndex:int   = sequencer.getEventID("i"); 
    193              
    194                  
    195             mmlseq.initialize(); 
    196             if (channelNumber < 8) mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 6); // use FM voice 
    197             else                   mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 7); // use PCM voice 
    198              
    199             imax = sequence.length; 
    200             for (i=0; i<imax; i++) { 
    201                 e = sequence[i]; 
    202                 if (segnoPointer === e) mmlseq.appendNewEvent(MMLEvent.REPEAT_ALL, 0); 
    203                 if (e.type < 0x80) { 
    204                     mmlseq.appendNewEvent(MMLEvent.REST, 0, e.deltaClock*10); 
    205                 } else if (e.type < 0xe0) { 
    206                      lastNoteMDX = e; 
    207                     if (channelNumber < 8) { 
    208                         lastNoteMML = mmlseq.appendNewEvent(MMLEvent.NOTE, e.data+12, e.deltaClock*10); // use FM voice 
    209                     } else { 
    210                         // use PCM voice 
    211                         if (adpcmID != e.data) { 
    212                             adpcmID = e.data; 
    213                             mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, adpcmID); 
    214                         } 
    215                         lastNoteMML = mmlseq.appendNewEvent(MMLEvent.NOTE, freqTable[adpcmFreq], e.deltaClock*10);  
    216                     } 
    217                 } else { 
    218                     switch(e.type) { 
    219                     case MDXEvent.REGISTER: 
    220                         mmlseq.appendNewEvent(MMLEvent.REGISTER, (e.data << 8) | e.data2); 
    221                         break; 
    222                     case MDXEvent.FADEOUT: 
    223                         mmlseq.appendNewEvent(eventIDFadeOut, e.data2); 
    224                         break; 
    225                     case MDXEvent.VOICE: 
    226                         mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, e.data); 
    227                         break; 
    228                     case MDXEvent.PAN: 
    229                         if (e.data == 0) mmlseq.appendNewEvent(MMLEvent.VOLUME, 0); 
    230                         else { 
    231                             mmlseq.appendNewEvent(MMLEvent.VOLUME, 16); 
    232                             mmlseq.appendNewEvent(eventIDPan, panTable[e.data]); 
    233                         } 
    234                         break; 
    235                     case MDXEvent.VOLUME: 
    236                         if (e.data < 16) mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, e.data<<3); 
    237                         else mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, e.data & 127); 
    238                         break; 
    239                     case MDXEvent.GATE: 
    240                         if (e.data < 9) { 
    241                             mmlseq.appendNewEvent(MMLEvent.QUANT_RATIO, e.data); 
    242                             mmlseq.appendNewEvent(MMLEvent.QUANT_COUNT, 0); 
    243                         } else { 
    244                             mmlseq.appendNewEvent(MMLEvent.QUANT_RATIO, 8); 
    245                             mmlseq.appendNewEvent(MMLEvent.QUANT_COUNT, (256-e.data)*10); 
    246                         } 
    247                         break; 
    248                     case MDXEvent.KEY_ON_DELAY: 
    249                         mmlseq.appendNewEvent(MMLEvent.KEY_ON_DELAY, e.data*10); 
    250                         break; 
    251                     case MDXEvent.VOLUME_DEC: 
    252                         mmlseq.appendNewEvent(MMLEvent.VOLUME_SHIFT, -1); 
    253                         break; 
    254                     case MDXEvent.VOLUME_INC: 
    255                         mmlseq.appendNewEvent(MMLEvent.VOLUME_SHIFT, 1); 
    256                         break; 
    257                     case MDXEvent.SLUR: 
    258                         if (lastNoteMML) { 
    259                             mmlseq.appendNewEvent(MMLEvent.SLUR_WEAK, 0, lastNoteMML.length); 
    260                             lastNoteMML.length = 0; 
    261                         } 
    262                         break; 
    263                     case MDXEvent.REPEAT_BEGIN: 
    264                         repeatStac.unshift(mmlseq.appendNewEvent(MMLEvent.REPEAT_BEGIN, e.data)); 
    265                         break; 
    266                     case MDXEvent.REPEAT_BREAK: 
    267                         me = mmlseq.appendNewEvent(MMLEvent.REPEAT_BREAK, 0); 
    268                         me.jump = repeatStac[0]; 
    269                         break; 
    270                     case MDXEvent.REPEAT_END: 
    271                         me = mmlseq.appendNewEvent(MMLEvent.REPEAT_END, 0); 
    272                         me.jump = repeatStac.shift(); 
    273                         me.jump.jump = me; 
    274                         break; 
    275                     case MDXEvent.DETUNE: 
    276                         mmlseq.appendNewEvent(eventIDPShift, e.data); 
    277                         break; 
    278                     case MDXEvent.PORTAMENT: 
    279                         if (lastNoteMML) { 
    280                             v = lastNoteMML.data + (e.data * (e.clock - lastNoteMDX.clock) + 8192)/16384; 
    281                             if (v<0) v=0; 
    282                             else if (v>127) v=127; 
    283                             mmlseq.appendNewEvent(MMLEvent.PITCHBEND, 0, lastNoteMML.length); 
    284                             lastNoteMML.length = 0; 
    285                             mmlseq.appendNewEvent(MMLEvent.NOTE, v, 0); 
    286                         } 
    287                         break; 
    288                     case MDXEvent.LFO_DELAY: 
    289                         lfoDelay = e.data*75/owner.bpm; 
    290                         break; 
    291                     case MDXEvent.PITCH_LFO: 
    292                         if (e.data>>24) { 
    293                             if ((e.data>>24) == 0x80) mmlseq.appendNewEvent(eventIDPMod, 0); 
    294                             else _mod(eventIDPMod, mp); 
    295                         } else { 
    296                             lfows = (e.data>>16)&3; 
    297                             lfofq = (e.data&0xffff)*75/owner.bpm * ((lfows)?2:1); 
    298                             mp = e.data2>>((e.data&0x40000)?0:8); 
    299                             _mod(eventIDPMod, mp); 
    300                         } 
    301                         break; 
    302                     case MDXEvent.VOLUME_LFO: 
    303                         if (e.data>>24) { 
    304                             if ((e.data>>24) == 0x80) mmlseq.appendNewEvent(eventIDAMod, 0); 
    305                             else _mod(eventIDPMod, ma); 
    306                         } else { 
    307                             lfows = (e.data>>16)&3; 
    308                             lfofq = (e.data&0xffff)*75/owner.bpm * ((lfows)?2:1); 
    309                             ma = e.data2>>8; 
    310                             _mod(eventIDAMod, ma); 
    311                         } 
    312                         break; 
    313                     case MDXEvent.FREQUENCY: 
    314                         if (channelNumber == 7) { 
    315                             /**/ 
    316                         } else  
    317                         if (channelNumber >= 8) { 
    318                             adpcmFreq = e.data; 
    319                         } 
    320                         break; 
    321                     case MDXEvent.DATA_END: 
    322                     case MDXEvent.SET_PCM8: 
    323                     case MDXEvent.TIMERB: 
    324                         break; 
    325                     case MDXEvent.SYNC_SEND: 
    326                     case MDXEvent.SYNC_WAIT: 
    327                     case MDXEvent.OPM_LFO: 
    328                     default: 
    329                         // not supported 
    330                         break; 
    331                     } 
    332                 } 
    333             } 
    334              
    335              
    336             function _mod(eventID:int, data:int) : void { 
    337                 mmlseq.appendNewEvent(eventID, lfofq); 
    338                 mmlseq.appendNewEvent(MMLEvent.PARAMETER, lfows); 
    339                 if (lfoDelay) { 
    340                     mmlseq.appendNewEvent(eventID, 0); 
    341                     mmlseq.appendNewEvent(MMLEvent.PARAMETER, data); 
    342                     mmlseq.appendNewEvent(MMLEvent.PARAMETER, lfoDelay); 
    343                 } else { 
    344                     mmlseq.appendNewEvent(eventID, data); 
    345                 } 
    346             } 
    347171        } 
    348172    } 
  • as3/SiOPM/trunk/src/org/si/sound/synthesizer/SynthesizerBase.as

    r3480 r3564  
    3636         
    3737         
    38     // valiables 
     38    // properties 
    3939    //---------------------------------------- 
    4040        /** voice setting */ 
     
    7070         
    7171        /** request voice update */ 
    72         public function requestUpdateVoice() : void 
     72        public function requestUpdate() : void 
    7373        { 
    7474            _requireVoiceUpdate = true;