チェンジセット 3565

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

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

ファイル:

凡例:

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

    r3480 r3565  
    115115    //-------------------------------------------------- 
    116116        /** Set by SiOPMChannelParam. */ 
    117         public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean) : void {} 
     117        public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean, withModulation:Boolean=true) : void {} 
    118118        /** Get SiOPMChannelParam. */ 
    119119        public function getSiOPMChannelParam(param:SiOPMChannelParam) : void {} 
  • as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelFM.as

    r3530 r3565  
    175175            _am_depth = depth<<2; 
    176176            _am_out = (_lfo_waveTable[_lfo_phase] * _am_depth) >> 7 << 3; 
    177             _lfoSwitch(_pm_depth > 0 || _am_depth > 0); 
     177            _lfoSwitch(_pm_depth != 0 || _am_depth > 0); 
    178178        } 
    179179         
     
    186186            _pm_depth = depth; 
    187187            _pm_out = (((_lfo_waveTable[_lfo_phase]<<1)-255) * _pm_depth) >> 8; 
    188             _lfoSwitch(_pm_depth > 0 || _am_depth > 0); 
     188            _lfoSwitch(_pm_depth != 0 || _am_depth > 0); 
    189189            if (_pm_depth == 0) { 
    190190                if (operator[0]) operator[0].detune2 = 0; 
     
    214214         *  @param param SiOPMChannelParam. 
    215215         *  @param withVolume Set volume when its true. 
     216         *  @param withModulation Set modulation when its true. 
    216217         */ 
    217         override public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean) : void 
     218        override public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean, withModulation:Boolean=true) : void 
    218219        { 
    219220            var i:int; 
     
    229230            setAlgorism(param.opeCount, param.alg); 
    230231            setFeedBack(param.fb, param.fbc); 
    231             initializeLFO(param.lfoWaveShape); 
    232             _lfo_timer = (param.lfoFreqStep>0) ? 1 : 0; 
    233             _lfo_timer_step = param.lfoFreqStep; 
    234             setAmplitudeModulation(param.amd); 
    235             setPitchModulation(param.pmd); 
     232            if (withModulation) { 
     233                trace(param.pmd); 
     234                initializeLFO(param.lfoWaveShape); 
     235                _lfo_timer = (param.lfoFreqStep>0) ? 1 : 0; 
     236                _lfo_timer_step = param.lfoFreqStep; 
     237                setAmplitudeModulation(param.amd); 
     238                setPitchModulation(param.pmd); 
     239            } 
    236240            setLPFilter(param.cutoff, param.resonance, param.far, param.fdr1, param.fdr2, param.frr, param.fdc1, param.fdc2, param.fsc, param.frc); 
    237241            for (i=0; i<_operatorCount; i++) { 
     
    635639                op = op.next; 
    636640            } 
    637              
     641 
    638642            // update pointers 
    639643            _inPipe   = ip; 
  • as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelSampler.as

    r3480 r3565  
    6666         *  @param withVolume Set volume when its true. 
    6767         */ 
    68         override public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean) : void 
     68        override public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean, withModulation:Boolean=true) : void 
    6969        { 
    7070            var i:int; 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as

    r3450 r3565  
    117117                voice = SiMMLTable.instance.getSiMMLVoice(voiceIndex); 
    118118                if (voice) { // this module changes only channel params, not track params. 
    119                     track.channel.setSiOPMChannelParam(voice.channelParam, false); 
     119                    track.channel.setSiOPMChannelParam(voice.channelParam, false, false); 
    120120                    return (voice.channelParam.initSequence.isEmpty()) ? null : voice.channelParam.initSequence; 
    121121                } 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as

    r3450 r3565  
    604604            // free previous table 
    605605            if (table[1]) SLLint.freeList(table[1]); 
    606              
    607             if (depth < end_depth) { 
     606 
     607            if ((0<=depth && depth<end_depth) || (depth<0 && depth>end_depth)) { 
    608608                // make table and envelop on 
    609609                table[1] = _makeModulationTable(depth, end_depth, delay, term); 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLVoice.as

    r3480 r3565  
    3131        /** tone number, 1st argument of '&#64;'. -1;do nothing. @default -1 */ 
    3232        public var toneNum:int; 
     33        /** preferable note. -1;no preferable note. @default -1 */ 
     34        public var preferableNote:int 
    3335         
    3436        /** parameters for FM sound channel. */ 
     
    225227            channelNum = 0; 
    226228            toneNum = -1; 
     229            preferableNote = -1; 
    227230             
    228231            channelParam = new SiOPMChannelParam(); 
     
    274277            channelNum = src.channelNum; 
    275278            toneNum = src.toneNum; 
     279            preferableNote = src.preferableNote; 
    276280            channelParam.copyFrom(src.channelParam); 
    277281             
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as

    r3564 r3565  
    127127            for (i=0; i<SiOPMTable.PCM_DATA_MAX; i++) { 
    128128                if (pcmData[i]) { 
    129                     pcmData[i].._siopm_module_internal::_free(); 
     129                    pcmData[i]._siopm_module_internal::_free(); 
    130130                    pcmData[i] = null; 
    131131                } 
  • as3/SiOPM/trunk/src/org/si/sion/utils/SiONPresetVoice.as

    r3480 r3565  
    1414     
    1515     
    16     /** Preset voice data. 457 voices are available now (default:11, valsound:258, GM:128, GMdrum:60). 
     16    /** Preset voice data. 462 voices are available now (default:16, valsound:258, GM:128, GMdrum:60). 
    1717@example Create new instance and access voices by key. 
    1818<listing version="3.0"> 
     
    8080                _new("ramp",      "Ramp wave sample",   new SiONVoice(5,160)); 
    8181 
    82                 _percuss("bassdrum",  "Simple bass drum",      0, 63, 28, -128); 
    83                 _percuss("snare",    "Simple snare drum",    17, 63, 32, 0, 64, 1); 
    84                 _percuss("closedhh", "Simple closed hi-hat", 19, 63, 40, 0); 
    85                 _percuss("openedhh", "Simple opened hi-hat", 19, 63, 28, 0); 
    86                 _percuss("symbal",    "Simple symbal",        16, 48, 24, 0); 
     82                _percuss("bass",     "Simple 1operator bass drum",      0, 63, 28, -128); 
     83                _percuss("snare",    "Simple 1operator snare drum",    17, 63, 32, 0, 64, 1); 
     84                _percuss("closedhh", "Simple 1operator closed hi-hat", 19, 63, 40, 0); 
     85                _percuss("openedhh", "Simple 1operator opened hi-hat", 19, 63, 28, 0); 
     86                _percuss("crash",    "Simple 1operator crash symbal",  16, 48, 24, 0); 
    8787                 
    8888                _analog("dualsaw",      "Dual saw",      0, 1, 1, 0, 8); 
  • as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as

    r3516 r3565  
    137137            for (i=0; i<imax;) { 
    138138                data = src.readUnsignedByte(); 
    139                 r0 = (data >> 4) & 0x0f; 
    140                 r1 = data & 0x0f; 
     139                r0 = data & 0x0f; 
     140                r1 = (data >> 4) & 0x0f; 
    141141                 
    142                 predRate = (predRate * crTable[r0]) >> 3; 
     142                predRate *= crTable[r0]; 
     143                predRate >>= 3; 
    143144                output += predRate; 
    144145                dst[i] = output * 0.000030517578125; 
    145                 predRate = (predRate * puTable[r0]) >> 6; 
    146                      if (predRate < 127)   predRate = 127; 
    147                 else if (predRate > 24576) predRate = 24576; 
     146                predRate *= puTable[r0] 
     147                predRate >>= 6; 
     148                if (predRate>0) { 
     149                         if (predRate < 127)   predRate = 127; 
     150                    else if (predRate > 24576) predRate = 24576; 
     151                } else { 
     152                         if (predRate > -127)   predRate = -127; 
     153                    else if (predRate < -24576) predRate = -24576; 
     154                } 
    148155                i++; 
    149156                 
    150                 predRate = (predRate * crTable[r1]) >> 3; 
     157                predRate *= crTable[r1]; 
     158                predRate >>= 3; 
    151159                output += predRate; 
    152160                dst[i] = output * 0.000030517578125; 
    153                 predRate = (predRate * puTable[r1]) >> 6; 
    154                      if (predRate < 127)   predRate = 127; 
    155                 else if (predRate > 24576) predRate = 24576; 
     161                predRate *= puTable[r1]; 
     162                predRate >>= 6; 
     163                if (predRate>0) { 
     164                         if (predRate < 127)   predRate = 127; 
     165                    else if (predRate > 24576) predRate = 24576; 
     166                } else { 
     167                         if (predRate > -127)   predRate = -127; 
     168                    else if (predRate < -24576) predRate = -24576; 
     169                } 
    156170                i++; 
     171            } 
     172             
     173            for (i=0; i<imax; i++) { 
     174                if (dst[i] < -1) dst[i] = -1; 
     175                else if (dst[i] > 1) dst[i] = 1; 
    157176            } 
    158177             
  • as3/SiOPM/trunk/src/org/si/sound/Note.as

    r3504 r3565  
    2020        /** Voice index refering from PatternSequencer.voiceList, -1 (or all negatives) sets no voice changing. @see si.org.sound.PatternSequencer.voiceList */ 
    2121        public var voiceIndex:Number = 0; 
     22        /** Any informations */ 
     23        public var data:* = null; 
    2224         
    2325         
     
    3133         *  @param length Length in 16th beat [16 for whole tone], Number.NaN sets playing with sequencers default length. 
    3234         *  @param voiceIndex Voice index refering from PatternSequencer.voiceList, -1 (or all negatives) sets no voice changing. @see si.org.sound.PatternSequencer.voiceList. 
     35         *  @param data Any informations you want. 
    3336         */ 
    34         function Note(note:int=-1, velocity:int=0, length:Number=Number.NaN, voiceIndex:int=-1
     37        function Note(note:int=-1, velocity:int=0, length:Number=Number.NaN, voiceIndex:int=-1, data:*=null
    3538        { 
    3639            this.note = note; 
     
    3841            this.length = length; 
    3942            this.voiceIndex = voiceIndex; 
     43            this.data = data; 
    4044        } 
    4145 
     
    5054         *  @param length Length in 16th beat [16 for whole tone], Number.NaN sets playing with sequencers default length. 
    5155         *  @param voiceIndex Voice index refering from PatternSequencer.voiceList, -1 (or all negatives) sets no voice changing. @see si.org.sound.PatternSequencer.voiceList. 
     56         *  @param data Any informations you want. 
    5257         *  @return this instance. 
    5358         */ 
    54         public function setNote(note:int=-1, velocity:int=-1, length:Number=Number.NaN, voiceIndex:int=-1) : Note 
     59        public function setNote(note:int=-1, velocity:int=-1, length:Number=Number.NaN, voiceIndex:int=-1, data:*=null) : Note 
    5560        { 
    5661            this.note = note; 
     
    5863            this.length = length; 
    5964            this.voiceIndex = voiceIndex; 
     65            this.data = data; 
    6066            return this; 
    6167        } 
  • as3/SiOPM/trunk/src/org/si/sound/RhythmBox.as

    r3504 r3565  
    1919    // variables 
    2020    //---------------------------------------- 
    21         /** interruption step */ 
    22         protected var _interruptStep:int; 
    23          
    2421        /** bass drum pattern sequencer */ 
    2522        public var bass:PatternSequencer; 
     
    6057        { 
    6158            super("RhythmBox"); 
    62             _interruptStep = 120; 
    6359            addChild(bass  = new PatternSequencer(16, 36, 255, 1)); 
    6460            addChild(snare = new PatternSequencer(16, 68, 128, 1)); 
  • as3/SiOPM/trunk/src/org/si/sound/mdx/MDXData.as

    r3564 r3565  
    9999            if (pdxData) { 
    100100                imax = 96; 
    101                 for (i=0; i<imax; i++) data.setPCMData(i, pdxData.pcmData[i]); 
     101                for (i=0; i<imax; i++) { 
     102                    data.setPCMData(i, pdxData.pcmData[i]); 
     103                } 
    102104            } 
    103105             
     
    105107            imax = (isPCM8) ? 16 : 9; 
    106108            for (i=0; i<imax; i++) { 
    107                 executors[i].initialize(data.appendNewSequence().initialize(), tracks[i], _noiseVoiceNumber); 
     109                if (tracks[i].hasNoData) executors[i].initialize(null, tracks[i], _noiseVoiceNumber); 
     110                else executors[i].initialize(data.appendNewSequence().initialize(), tracks[i], _noiseVoiceNumber); 
    108111            } 
    109112 
     
    122125            } 
    123126             
     127            data.title = title; 
     128             
    124129            return data; 
    125130        } 
     
    141146            titleLength = bytes.position - 3; 
    142147            bytes.position = 0; 
    143             title = bytes.readMultiByte(titleLength, "us-ascii"); //shift_jis 
     148            title = bytes.readMultiByte(titleLength, "shift_jis"); //us-ascii 
    144149            bytes.position = titleLength + 3; 
    145150             
     
    147152            while (true) { if (bytes.readByte() == 0) break; } 
    148153            pdxLength = bytes.position - titleLength - 4; 
    149             pdxFileName = bytes.readMultiByte(pdxLength, "us-ascii"); 
     154            bytes.position = titleLength + 3; 
     155            if (pdxLength != 0) pdxFileName = bytes.readMultiByte(pdxLength, "shift_jis"); //us-ascii 
    150156            bytes.position = titleLength + pdxLength + 4; 
    151157             
     
    153159            dataPointer = bytes.position; 
    154160            voiceOffset = bytes.readUnsignedShort();  // tone data 
    155             for (i=0; i<16; i++) trace(mmlOffsets[i] = dataPointer + bytes.readUnsignedShort()); 
     161            for (i=0; i<16; i++) mmlOffsets[i] = dataPointer + bytes.readUnsignedShort(); 
    156162            // check pcm8 
    157163            bytes.position = mmlOffsets[0]; 
     
    212218                } 
    213219                 
    214                 trace(voice.getMML(voiceNumber)); 
     220//trace(voice.getMML(voiceNumber)); 
    215221            } 
    216222             
  • as3/SiOPM/trunk/src/org/si/sound/mdx/MDXEvent.as

    r3564 r3565  
    7070                i = (data+15)%12; 
    7171                return "o"+String(((data+15)/12)>>0)+_noteText[i]+";"+String(deltaClock); 
     72            case GATE:   return "q"+String(data); 
     73            case DETUNE: return "k"+String(data>>8); 
    7274            case REPEAT_BEGIN: return "["+String(data); 
    7375            case REPEAT_BREAK: return "|"; 
     
    7880            case PAN: return "p"+String(data); 
    7981            case VOLUME: return (data<16) ? "v"+String(data) : "@v"+String(data&127); 
     82            case LFO_DELAY:  return "LFO_delay"+String(data); 
     83            case PITCH_LFO:  return "LFO"+(data&255).toString(16)+" mp"+(data>>8)+","+(data2); 
     84            case VOLUME_LFO: return "LFO"+(data&255).toString(16)+" ma"+(data>>8)+","+(data2); 
     85            case FREQUENCY:  return "FREQ"+String(data); 
     86            case TIMERB:     return "TIMER_B "+String(data); 
     87            case SET_PCM8:   return "PCM8"; 
    8088            default:   return "#"+ type.toString(16) + "; " + String(data); 
    8189            } 
  • as3/SiOPM/trunk/src/org/si/sound/mdx/MDXExecutor.as

    r3564 r3565  
    2929        internal var gateTime:int; 
    3030        internal var waitSync:Boolean; 
     31        internal var volume:int; 
     32        internal var fineVolumeFlag:Boolean; 
     33         
    3134         
    3235        static private var _panTable:Array = [4,0,8,4]; 
     
    3740        private var eventIDFadeOut:int; 
    3841        private var eventIDPan:int; 
     42        private var eventIDExp:int; 
    3943        private var eventIDPShift:int; 
    4044        private var eventIDLFO:int; 
     
    6670            voiceID = 0; 
    6771            adpcmID = -1; 
    68             anFreq = (mdxtrack.channelNumber<8) ? -1 : 3
     72            anFreq = (mdxtrack.channelNumber<8) ? -1 : 4
    6973            repeatStac = []; 
    7074            lfoDelay = 0; 
     
    7478            gateTime = 0; 
    7579            waitSync = false; 
    76              
    77             if (mdxtrack.channelNumber < 8) mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 6); // use FM voice 
    78             else                            mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 7); // use PCM voice 
    79              
    80             var sequencer:SiMMLSequencer = SiONDriver.mutex.sequencer; 
    81             eventIDFadeOut = sequencer.getEventID("@fadeout"); 
    82             eventIDPan     = sequencer.getEventID("p"); 
    83             eventIDPShift  = sequencer.getEventID("k"); 
    84             eventIDLFO     = sequencer.getEventID("@lfo"); 
    85             eventIDAMod    = sequencer.getEventID("ma"); 
    86             eventIDPMod    = sequencer.getEventID("mp"); 
    87             eventIDIndex   = sequencer.getEventID("i"); 
     80            volume = 8; 
     81            fineVolumeFlag = false; 
     82             
     83            if (mmlseq) { 
     84                if (mdxtrack.channelNumber < 8) { 
     85                    mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 6); // use FM voice 
     86                    mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, 32); 
     87                } else { 
     88                    mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 7); // use PCM voice 
     89                    mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, 128); 
     90                } 
     91             
     92                var sequencer:SiMMLSequencer = SiONDriver.mutex.sequencer; 
     93                eventIDFadeOut = sequencer.getEventID("@fadeout"); 
     94                eventIDExp     = sequencer.getEventID("x"); 
     95                eventIDPan     = sequencer.getEventID("p"); 
     96                eventIDPShift  = sequencer.getEventID("k"); 
     97                eventIDLFO     = sequencer.getEventID("@lfo"); 
     98                eventIDAMod    = sequencer.getEventID("ma"); 
     99                eventIDPMod    = sequencer.getEventID("mp"); 
     100                eventIDIndex   = sequencer.getEventID("i"); 
     101            } 
    88102        } 
    89103         
     
    92106        internal function exec(totalClock:uint, bpm:Number) : uint  
    93107        { 
     108            if (mmlseq == null) return uint.MAX_VALUE; 
     109             
    94110            var e:MDXEvent = null, me:MMLEvent, v:int, l:int; 
    95111             
     
    110126                        mmlseq.appendNewEvent(MMLEvent.NOTE, anFreq, e.deltaClock*10); 
    111127                    } else { // ADPCM 
    112                         if (adpcmID != e.data) mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, (adpcmID = e.data)); 
     128                        if (adpcmID != e.data) { 
     129                            adpcmID = e.data; 
     130                            mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, adpcmID); 
     131                        } 
    113132                        mmlseq.appendNewEvent(MMLEvent.NOTE, _freqTable[anFreq], e.deltaClock*10);  
    114133                    } 
     
    130149                    case MDXEvent.FADEOUT:  { mmlseq.appendNewEvent(eventIDFadeOut, e.data2); }break; 
    131150                    case MDXEvent.VOICE: 
    132                         voiceID = e.data; 
    133                         mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, voiceID); 
     151                        if (mdxtrack.channelNumber < 8) { // ...? 
     152                            voiceID = e.data; 
     153                            mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, voiceID); 
     154                        } 
    134155                        break; 
    135156                    case MDXEvent.PAN: 
    136157                        if (e.data == 0) { 
    137                             mmlseq.appendNewEvent(MMLEvent.VOLUME, 0); 
    138                         } else { 
    139                             mmlseq.appendNewEvent(MMLEvent.VOLUME, 16); 
     158                            mmlseq.appendNewEvent(eventIDExp, 0); 
     159                        } else { 
     160                            _vol(); 
    140161                            mmlseq.appendNewEvent(eventIDPan, _panTable[e.data]); 
    141162                        } 
    142163                        break; 
    143164                    case MDXEvent.VOLUME: 
    144                         if (e.data < 16) mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, _volTable[e.data]); 
    145                         else mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, _tlTable[e.data & 127]); 
     165                        if (mdxtrack.channelNumber < 8) { 
     166                            if (e.data < 16) { 
     167                                volume = e.data; 
     168                                fineVolumeFlag = false; 
     169                            } else { 
     170                                volume = e.data & 127; 
     171                                fineVolumeFlag = true; 
     172                            } 
     173                            _vol(); 
     174                        } else { 
     175                            mmlseq.appendNewEvent(eventIDExp, 127); 
     176                        } 
    146177                        break; 
    147178                    case MDXEvent.VOLUME_DEC: 
    148                         mmlseq.appendNewEvent(MMLEvent.VOLUME_SHIFT, -1); 
     179                        if (--volume == 0) volume=0; 
     180                        _vol(); 
    149181                        break; 
    150182                    case MDXEvent.VOLUME_INC: 
    151                         mmlseq.appendNewEvent(MMLEvent.VOLUME_SHIFT, 1); 
     183                        l = (fineVolumeFlag) ? 127 : 15; 
     184                        if (++volume == l) volume = l; 
     185                        _vol(); 
    152186                        break; 
    153187                    case MDXEvent.GATE: 
     
    168202                            e = mdxtrack.sequence[pointer]; 
    169203                            mmlseq.appendNewEvent(MMLEvent.NOTE, e.data+15, 0); 
    170                             mmlseq.appendNewEvent(MMLEvent.SLUR_WEAK, 0, e.deltaClock*10); 
     204                            mmlseq.appendNewEvent(MMLEvent.SLUR, 0, e.deltaClock*10); 
    171205                        } 
    172206                        break; 
     
    188222                    case MDXEvent.LFO_DELAY: 
    189223                        lfoDelay = e.data*75/bpm; 
     224                        if (mp>0) _mod(eventIDPMod, mp, lfows, lfofq); 
     225                        if (ma>0) _mod(eventIDAMod, ma, lfows, lfofq); 
    190226                        break; 
    191227                    case MDXEvent.PITCH_LFO: 
    192                         if (e.data & 0x80) { 
     228                        if ((e.data & 0x80) != 0) { 
    193229                            if ((e.data & 0xff) == 0x80) mmlseq.appendNewEvent(eventIDPMod, 0); 
    194                             else _mod(eventIDPMod, mp); 
    195                         } else { 
    196                             lfows = e.data&3; 
    197                             lfofq = (e.data>>8)*75/bpm * ((lfows)?2:1); 
    198                             mp = e.data2>>((e.data&0x40000)?0:8); 
    199                             _mod(eventIDPMod, mp); 
     230                            else _mod(eventIDPMod, mp, lfows, lfofq); 
     231                        } else { 
     232                            l = e.data>>8; 
     233                            mp = ((e.data2>>(((e.data&4)==0)?8:0)) * l) >> 1; 
     234                            _mod(eventIDPMod, mp, e.data&3, l*75/bpm * ((lfows)?2:1)); 
    200235                        } 
    201236                        break; 
    202237                    case MDXEvent.VOLUME_LFO: 
    203                         if (e.data & 0x80) { 
     238                        /* ...  
     239                        if ((e.data & 0x80) != 0) { 
    204240                            if ((e.data & 0xff) == 0x80) mmlseq.appendNewEvent(eventIDAMod, 0); 
    205                             else _mod(eventIDAMod, ma); 
    206                         } else { 
    207                             lfows = e.data&3
    208                             lfofq = (e.data>>8)*75/bpm * ((lfows)?2:1)
    209                             ma = e.data2>>8
    210                             _mod(eventIDAMod, ma); 
    211                         } 
     241                            else _mod(eventIDAMod, ma, lfows, lfofq); 
     242                        } else { 
     243                            l = e.data>>8
     244                            ma = (e.data2 * l) >> 1
     245                            _mod(eventIDAMod, ma, e.data&3, l*75/bpm * ((lfows)?2:1))
     246                        } 
     247                        */ 
    212248                        break; 
    213249                    case MDXEvent.FREQUENCY: 
     
    250286                         
    251287            return (pointer >= pointerMax || waitSync) ? uint.MAX_VALUE : clock; 
    252              
    253             function _mod(eventID:int, data:int) : void { 
    254                 mmlseq.appendNewEvent(eventID, lfofq); 
    255                 mmlseq.appendNewEvent(MMLEvent.PARAMETER, lfows); 
    256                 if (lfoDelay) { 
     288 
     289            function _vol() : void { 
     290                mmlseq.appendNewEvent(eventIDExp, (fineVolumeFlag) ? _tlTable[volume] : _volTable[volume]); 
     291            } 
     292             
     293            function _mod(eventID:int, data:int, ws:int, fq:int) : void { 
     294                if (lfows != ws || lfofq != fq) { 
     295                    lfofq = fq; 
     296                    lfows = ws; 
     297                    mmlseq.appendNewEvent(eventIDLFO, lfofq); 
     298                    mmlseq.appendNewEvent(MMLEvent.PARAMETER, lfows); 
     299                } 
     300                if (lfoDelay>0) { 
    257301                    mmlseq.appendNewEvent(eventID, 0); 
    258302                    mmlseq.appendNewEvent(MMLEvent.PARAMETER, data); 
     
    290334         
    291335        internal function sync(currentClock:uint) : void { 
     336trace(currentClock, clock); 
    292337            if (currentClock > clock) { 
    293338                mmlseq.appendNewEvent(MMLEvent.REST, 0, (currentClock - clock)*10); 
  • as3/SiOPM/trunk/src/org/si/sound/mdx/MDXTrack.as

    r3564 r3565  
    3131    // properties 
    3232    //-------------------------------------------------------------------------------- 
     33        /** has no data. */ 
     34        public function get hasNoData() : Boolean { 
     35            return (sequence.length <= 1); 
     36        } 
     37         
    3338        /** to string. */ 
    3439        public function toString():String 
     
    7277            clear(); 
    7378             
    74             var code:int, v:int, pos:int, mem:Array=[], exitLoop:Boolean = false; 
     79            var clock:int, code:int, v:int, pos:int, mem:Array=[], exitLoop:Boolean = false; 
    7580             
    7681            while (!exitLoop && bytes.bytesAvailable>0) { 
     
    7984                if (code<0x80) { // rest 
    8085                    newEvent(MDXEvent.REST, 0, 0, code+1); 
     86                    clock += code+1; 
    8187                } else 
    8288                if (code<0xe0) { // note 
    8389                    v = bytes.readUnsignedByte() + 1; 
    8490                    newEvent(MDXEvent.NOTE, code - 0x80, 0, v); 
     91                    clock += v; 
    8592                } else { 
    8693                    switch(code) { 
     
    127134                    case MDXEvent.TIMERB: 
    128135                        v = bytes.readUnsignedByte(); 
    129                         if (timerB == -1) timerB = v; 
     136                        if (clock == 0) timerB = v; 
    130137                        newEvent(code, v); 
    131138                        break; 
     
    134141                        v = bytes.readUnsignedByte(); 
    135142                        if (v == 0x80 || v == 0x81) newEvent(code, v); 
    136                         else newEvent(code, v | (bytes.readUnsignedShort()<<8), bytes.readUnsignedShort()); 
     143                        else newEvent(code, v | (bytes.readUnsignedShort()<<8), bytes.readShort()); 
    137144                        break; 
    138145                    case MDXEvent.OPM_LFO: 
     
    141148                        else { 
    142149                            v = (v<<16) | (bytes.readUnsignedByte()<<8) | bytes.readUnsignedByte(); 
    143                             newEvent(code, v, bytes.readUnsignedShort()); 
     150                            newEvent(code, v, bytes.readShort()); 
    144151                        } 
    145152                        break; 
    146153                    case MDXEvent.DATA_END: // ...? 
    147                         v = bytes.readUnsignedShort(); 
    148                         newEvent(code, bytes.readUnsignedShort()); 
    149                         if (v!=0) segnoPointer = mem[v]; 
     154                        v = bytes.readShort(); 
     155                        newEvent(code, v); 
     156                        if (v>0 && pos-v+3>=0) segnoPointer = mem[pos-v+3]; 
     157                        else if (v<0 && pos+v+3>=0) segnoPointer = mem[pos+v+3]; 
    150158                        exitLoop = true; 
    151159                        break; 
     
    166174            } 
    167175 
    168 trace("------------------- ch", channelNumber, "-------------------"); 
    169 trace(String(this)); 
     176//trace("------------------- ch", channelNumber, "-------------------"); 
     177//trace(String(this)); 
    170178            return this; 
    171179        }