チェンジセット 3059

差分発生行の前後
無視リスト:
コミット日時:
2009/09/02 22:11:32 (3 年前)
コミッタ:
keim
ログメッセージ:

サウンドライブラリ SiON ver0.5.7 更新 仕様拡張,バグフィックスなど

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/SiOPM/trunk/samples/SiONTenorion/Tenorion.as

    r3015 r3059  
    66    import org.si.sion.*; 
    77    import org.si.sion.events.*; 
    8     import org.si.sion.sequencer.SiMMLTrack; 
    98    import org.si.sion.utils.SiONPresetVoice; 
    109     
     
    1817         
    1918        // voices, notes and tracks 
    20         public var tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(16); 
    21         public var voices:Vector.<int>
    22         public var notes:Vector.<int>
     19        public var voices:Vector.<SiONVoice> = new Vector.<SiONVoice>(16); 
     20        public var notes :Vector.<int> = Vector.<int>([36,48,60,72, 43,48,55,60, 65,67,70,72, 77,79,82,84])
     21        public var length:Vector.<int> = Vector.<int>([ 1, 1, 1, 1,  1, 1, 1, 1,  4, 4, 4, 4,  4, 4, 4, 4])
    2322         
    2423        // beat counter 
     
    3029        // constructor 
    3130        function Tenorion() { 
    32             // set voices of "%6@0-4" from preset 
     31            var i:int; 
     32             
     33            // set voices from preset 
    3334            var percusVoices:Array = presetVoice["valsound.percus"]; 
    34             driver.setVoice(0, percusVoices[0]);  // bass drum 
    35             driver.setVoice(1, percusVoices[27]); // snare drum 
    36             driver.setVoice(2, percusVoices[16]); // close hihat 
    37             driver.setVoice(3, percusVoices[21]); // open hihat 
    38             driver.setVoice(4, presetVoice["valsound.bass18"]); // bas
     35            voices[0] = percusVoices[0];  // bass drum 
     36            voices[1] = percusVoices[27]; // snare drum 
     37            voices[2] = percusVoices[16]; // close hihat 
     38            voices[3] = percusVoices[22]; // open hihat 
     39            for (i=4; i<8; i++) voices[i] = presetVoice["valsound.bass18"]; // other
    3940             
    40             // notes and voices 
    41             notes  = Vector.<int>([36,48,60,72, 43,48,55,60, 65,67,70,72, 77,79,82,84]); 
    42             voices = Vector.<int>([ 0, 1, 2, 3,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4]); 
    43              
    44             // listen click 
    45             driver.setTimerInterruption(1, _onTimerInterruption); 
     41            // listen 
    4642            driver.setBeatCallbackInterval(1); 
    4743            driver.addEventListener(SiONTrackEvent.BEAT, _onBeat); 
    48             driver.addEventListener(SiONEvent.STREAM_START, _onStreamStart); 
     44            driver.setTimerInterruption(1, _onTimerInterruption); 
    4945             
    5046            // control pad 
     
    5349 
    5450            // start streaming 
     51            beatCounter = 0; 
    5552            driver.play(); 
    56         } 
    57          
    58          
    59         // _onStreamStart (SiONEvent.STREAM_START) is called back first of all after SiONDriver.play(). 
    60         private function _onStreamStart(e:SiONEvent) : void 
    61         { 
    62             // create new controlable tracks and set voice 
    63             for (var i:int=0; i<16; i++) { 
    64                 tracks[i] = driver.sequencer.newControlableTrack(); 
    65                 tracks[i].setChannelModuleType(6, 0, voices[i]); 
    66             } 
    67             beatCounter = 0; 
    6853        } 
    6954         
     
    8166            var beatIndex:int = beatCounter & 15; 
    8267            for (var i:int=0; i<16; i++) { 
    83                 if (matrixPad.sequences[i] & (1<<beatIndex)) tracks[i].keyOn(notes[i]); 
     68                if (matrixPad.sequences[i] & (1<<beatIndex)) driver.noteOn(notes[i], voices[i], length[i]); 
    8469            } 
    8570            beatCounter++; 
     
    10691    function MatrixPad(stage:Stage) { 
    10792        super(new BitmapData(320, 320, false, 0)); 
    108         for (var i:int=0; i<256; i++) { 
     93        var i:int; 
     94        for (i=0; i<256; i++) { 
    10995            pt.x = (i&15)*20; 
    11096            pt.y = (i&240)*1.25; 
    11197            buffer.copyPixels(padOff, padOff.rect, pt); 
    11298            bitmapData.copyPixels(padOff, padOff.rect, pt); 
    113             sequences[i] = 0; 
    11499        } 
    115          
     100        for (i=0; i<16; i++) sequences[i] = 0; 
    116101        addEventListener("enterFrame", _onEnterFrame); 
    117102        stage.addEventListener("click",  _onClick); 
     
    138123    private function _onClick(e:Event) : void { 
    139124        if (mouseX>=0 && mouseX<320 && mouseY>=0 && mouseY<320) { 
    140             var track:int = 15-int(mouseY*0.05),  
    141                 beat :int = int(mouseX*0.05); 
     125            var track:int = 15-int(mouseY*0.05), beat:int = int(mouseX*0.05); 
    142126            sequences[track] ^= 1<<beat; 
    143127            pt.x = beat*20; 
  • as3/SiOPM/trunk/src/org/si/midi/SiMIDIModule.as

    r2990 r3059  
    8989        public function noteOff(trackNumber:int, note:int) : SiMMLTrack 
    9090        { 
    91             var trackID:int = (trackNumber & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.MIDI_TRACK_ID_OFFSET, 
    92                 midiTrack:SiMIDITrack = tracks[trackNumber], 
    93                 seqTrack:SiMMLTrack = _sequencer.findControlableTrack(trackID, note); 
    94             if (seqTrack) seqTrack.keyOff(); 
    95             return seqTrack; 
     91            var trackID:int = (trackNumber & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.MIDI_TRACK_ID_OFFSET; 
     92            for each (var mmlTrack:SiMMLTrack in _sequencer.tracks) { 
     93                if (mmlTrack.trackID == trackID) { 
     94                    if (note == -1 || (note == mmlTrack.note && mmlTrack.channel.isNoteOn())) { 
     95                        mmlTrack.keyOff(0); 
     96                        return mmlTrack; 
     97                    } 
     98                } 
     99            } 
     100            return null; 
    96101        } 
    97102         
  • as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as

    r3028 r3059  
    5454    //---------------------------------------- 
    5555        /** version number */ 
    56         static public const VERSION:String = "0.5.6"; 
     56        static public const VERSION:String = "0.5.7"; 
    5757         
    5858         
     
    9393         
    9494        // private: 
    95         private var _data:SiONData;             // data to compile or process 
    96         private var _tempData:SiONData;         // temporary data 
    97         private var _mmlString:String;          // mml string of previous compiling 
    98         private var _sound:Sound;               // sound stream instance 
     95        //----- general 
     96        private var _data:SiONData;         // data to compile or process 
     97        private var _tempData:SiONData;     // temporary data 
     98        private var _mmlString:String;      // mml string of previous compiling 
     99        //----- sound related 
     100        private var _sound:Sound;                   // sound stream instance 
    99101        private var _soundChannel:SoundChannel;     // sound channel instance 
    100102        private var _soundTransform:SoundTransform; // sound transform 
    101103        private var _fader:Fader;                   // sound fader 
    102  
    103         private var _backgroundSound:Sound;      // background Sound 
    104         private var _backgroundLevel:Number;     // background Sound mixing level 
    105         private var _backgroundBuffer:ByteArray; // buffer for background Sound 
    106          
     104        //----- SiOPM module related 
    107105        private var _channelCount:int;          // module output channels (1 or 2) 
    108106        private var _sampleRate:int;            // module output frequency ratio (44100 or 22050) 
     
    112110        private var _dispatchStreamEvent:Boolean; // dispatch steam event 
    113111        private var _dispatchFadingEvent:Boolean; // dispatch fading event 
    114         private var _cannotChangeBPM:Boolean;     // internal flag not to change bpm 
    115112        private var _inStreaming:Boolean;         // in streaming 
    116113        private var _preserveStop:Boolean;        // preserve stop after streaming 
    117114        private var _isFinishSeqDispatched:Boolean; // FINISH_SEQUENCE event already dispacthed 
    118  
     115        //----- operation related 
     116        private var _autoStop:Boolean;          // auto stop when the sequence finished 
     117        private var _noteOnExceptionMode:int;   // track id exception mode 
     118        private var _isPaused:Boolean;          // flag to pause 
     119        private var _position:Number;           // start position [ms] 
     120        private var _masterVolume:Number;       // master volume 
     121        private var _faderVolume:Number;        // fader volume 
     122        //----- background sound 
     123        private var _backgroundSound:Sound;      // background Sound 
     124        private var _backgroundLevel:Number;     // background Sound mixing level 
     125        private var _backgroundBuffer:ByteArray; // buffer for background Sound 
     126        //----- queue 
    119127        private var _queueInterval:int;         // interupting interval to execute queued jobs 
    120128        private var _queueLength:int;           // queue length to execute 
    121129        private var _jobProgress:Number;        // progression of current job 
    122130        private var _currentJob:int;            // current job 0=no job, 1=compile, 2=render 
    123          
    124         private var _autoStop:Boolean;          // auto stop when the sequence finished 
    125         private var _noteOnExceptionMode:int;  // track id exception mode 
    126         private var _isPaused:Boolean;          // flag to pause 
    127         private var _position:Number;           // start position [ms] 
    128         private var _masterVolume:Number;       // master volume 
    129         private var _faderVolume:Number;        // fader volume 
    130          
    131         private var _trackEventQueue:Vector.<SiONTrackEvent>; 
    132         private var _timerSequence:MMLSequence; 
    133         private var _timerIntervalEvent:MMLEvent; 
    134         private var _timerCallback:Function; 
    135          
     131        private var _jobQueue:Vector.<SiONDriverJob> = null;   // compiling/rendering jobs queue 
     132        private var _trackEventQueue:Vector.<SiONTrackEvent>;  // SiONTrackEvents queue 
     133        //----- timer interruption 
     134        private var _timerSequence:MMLSequence;     // global sequence 
     135        private var _timerIntervalEvent:MMLEvent;   // MMLEvent.WAIT event 
     136        private var _timerCallback:Function;        // callback function 
     137        //----- rendering 
    136138        private var _renderBuffer:Vector.<Number>;  // rendering buffer 
    137139        private var _renderBufferChannelCount:int;  // rendering buffer channel count 
    138140        private var _renderBufferIndex:int;         // rendering buffer writing index 
    139141        private var _renderBufferSizeMax:int;       // maximum value of rendering buffer size 
    140          
     142        //----- timers 
    141143        private var _timeCompile:int;           // previous compiling time. 
    142144        private var _timeRender:int;            // previous rendering time. 
     
    149151        private var _prevFrameTime:int;         // previous frame time 
    150152        private var _frameRate:int;             // frame rate 
    151          
     153        //----- listeners management 
    152154        private var _eventListenerPrior:int;    // event listeners priority 
    153155        private var _listenEvent:int;           // current lintening event 
    154156         
    155         private var _jobQueue:Vector.<SiONDriverJob> = null;   // compiling/rendering jobs queue 
    156          
     157        // mutex instance 
    157158        static private var _mutex:SiONDriver = null;     // unique instance 
    158159         
     
    262263        public function set bpm(t:Number) : void { 
    263264            if (sequencer.isReadyToProcess) { 
    264                 if (_cannotChangeBPM) throw errorCannotChangeBPM(); 
     265                if (sequencer.isEnableChangeBPM) throw errorCannotChangeBPM(); 
    265266                sequencer.bpm = t; 
    266267            } else { 
     
    322323            _dispatchStreamEvent = false; 
    323324            _dispatchFadingEvent = false; 
    324             _cannotChangeBPM = false; 
    325325            _preserveStop = false; 
    326326            _inStreaming = false; 
     
    495495        public function startQueue(interval:int=500) : int 
    496496        { 
    497             stop(); 
    498             _queueLength = _jobQueue.length; 
    499             if (_jobQueue.length > 0) { 
    500                 _queueInterval = interval; 
    501                 _executeNextJob(); 
    502                 _queue_addAllEventListners(); 
     497            try { 
     498                stop(); 
     499                _queueLength = _jobQueue.length; 
     500                if (_jobQueue.length > 0) { 
     501                    _queueInterval = interval; 
     502                    _executeNextJob(); 
     503                    _queue_addAllEventListners(); 
     504                } 
     505            } catch (e:Error) { 
     506                // error 
     507                _removeAllEventListners(); 
     508                _cancelAllJobs(); 
     509                if (_debugMode) throw e; 
     510                else dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, e.message)); 
    503511            } 
    504512            return _queueLength; 
     
    677685         
    678686         
    679         /** Set PCM data rederd from %7. 
     687        /** Set PCM data rederd by %7. 
    680688         *  @param index PCM data number. 
    681689         *  @param data Vector.<Number> wave data. This type ussualy comes from render(). 
     
    691699         
    692700         
    693         /** Set PCM sound rederd from %7. 
     701        /** Set PCM sound rederd by %7. 
    694702         *  @param index PCM data number. 
    695703         *  @param sound Sound instance to set. 
     
    819827        /** Note on. This function only is available after play(). The NOTE_ON_STREAM event is dispatched inside. 
    820828         *  @param note note number [0-127]. 
    821          *  @param voice SiONVoice to play note. You can spqcify null, but it sets only a default square wave. 
     829         *  @param voice SiONVoice to play note. You can specify null, but it sets only a default square wave. 
    822830         *  @param length note length in 16th beat. 0 sets no note off, this means you should call noteOff(). 
    823831         *  @param delay note on delay units in 16th beat. 
     
    827835         *  @param noteOnTrigger note on trigger type. 
    828836         *  @param noteOffTrigger note off trigger type. 
    829          *  @return SiMMLTrack to play the note. 
     837         *  @return SiMMLTrack to play the note. Returns null when tracks are overflowed. 
    830838         */ 
    831839        public function noteOn(note:int,  
     
    872880         *  @param delay note off delay units in 16th beat. 
    873881         *  @param quant quantize in 16th beat. 0 sets no quantization. 4 sets quantization by 4th beat. 
    874          *  @return The SiMMLTrack switched key off. Returns null when tracks are overflowed
    875          */ 
    876         public function noteOff(note:int, trackID:int=0, delay:Number=0, quant:Number=0) : SiMMLTrack 
     882         *  @return All SiMMLTracks switched key off
     883         */ 
     884        public function noteOff(note:int, trackID:int=0, delay:Number=0, quant:Number=0) : Vector.<SiMMLTrack> 
    877885        { 
    878886            trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_NOTE_ID_OFFSET; 
    879             var mmlTrack:SiMMLTrack = sequencer.findControlableTrack(trackID, note), 
    880                 delaySamples:int = sequencer.calcSampleDelay(0, delay, quant); 
    881             if (mmlTrack) mmlTrack.keyOff(delaySamples); 
    882             return mmlTrack; 
     887            var delaySamples:int = sequencer.calcSampleDelay(0, delay, quant),  
     888                tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(); 
     889            for each (var mmlTrack:SiMMLTrack in sequencer.tracks) { 
     890                if (mmlTrack.trackID == trackID) { 
     891                    if (note == -1 || (note == mmlTrack.note && mmlTrack.channel.isNoteOn())) { 
     892                        mmlTrack.keyOff(delaySamples); 
     893                        tracks.push(mmlTrack); 
     894                    } 
     895                } 
     896            } 
     897            return tracks; 
    883898        } 
    884899         
     
    891906         *  @param quant quantize in 16th beat. 0 sets no quantization. 4 sets quantization by 4th beat. 
    892907         *  @param trackID new tracks id. 
    893          *  @return SiMMLTrack of the last sequence channel
     908         *  @return list of SiMMLTracks to play sequence
    894909         */ 
    895910        public function sequenceOn(data:SiONData,  
     
    898913                                   delay:Number     = 0,  
    899914                                   quant:Number     = 1,  
    900                                    trackID:int      = 0) : SiMMLTrack 
     915                                   trackID:int      = 0) : Vector.<SiMMLTrack> 
    901916        { 
    902917            trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_SEQUENCE_ID_OFFSET; 
    903918            // create new sequence tracks 
    904             var mmlTrack:SiMMLTrack,  
     919            var mmlTrack:SiMMLTrack, tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(),  
    905920                seq:MMLSequence = data.sequenceGroup.headSequence,  
    906921                delaySamples:int = sequencer.calcSampleDelay(0, delay, quant), 
     
    910925                mmlTrack.sequenceOn(seq, delaySamples, lengthSamples); 
    911926                if (voice) voice.setTrackVoice(mmlTrack); 
     927                tracks.push(mmlTrack); 
    912928                seq = seq.nextSequence; 
    913929            } 
    914             return mmlTrack
     930            return tracks
    915931        } 
    916932         
     
    920936         *  @param delay sequence off delay units in 16th beat. 
    921937         *  @param quant quantize in 16th beat. 0 sets no quantization. 4 sets quantization by 4th beat. 
    922          *  @return SiMMLTrack of the last stopped channel
    923          */ 
    924         public function sequenceOff(trackID:int, delay:Number=0, quant:Number=1) : SiMMLTrack 
     938         *  @return list of SiMMLTracks stopped to play sequence
     939         */ 
     940        public function sequenceOff(trackID:int, delay:Number=0, quant:Number=1) : Vector.<SiMMLTrack> 
    925941        { 
    926942            trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_SEQUENCE_ID_OFFSET; 
    927             var delaySamples:int = sequencer.calcSampleDelay(0, delay, quant), stoppedTrack:SiMMLTrack = null; 
     943            var delaySamples:int = sequencer.calcSampleDelay(0, delay, quant), stoppedTrack:SiMMLTrack = null, 
     944                tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(); 
    928945            for each (var mmlTrack:SiMMLTrack in sequencer.tracks) { 
    929946                if (mmlTrack.trackID == trackID) { 
    930947                    mmlTrack.sequenceOff(delaySamples); 
    931                     stoppedTrack = mmlTrack
     948                    tracks.push(mmlTrack)
    932949                } 
    933950            } 
    934             return stoppedTrack; 
     951            return tracks; 
     952        } 
     953         
     954         
     955        /** Create new user controlable track. 
     956         *  @param new tracks id. 
     957         */ 
     958        public function newUserControlableTrack(trackID:int=0) : SiMMLTrack 
     959        { 
     960            trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.USER_CONTROLLED_ID_OFFSET; 
     961            return sequencer.getFreeControlableTrack(trackID) || sequencer.newControlableTrack(trackID); 
    935962        } 
    936963         
     
    11261153            } catch (e:Error) { 
    11271154                // error 
     1155                _removeAllEventListners(); 
    11281156                _cancelAllJobs(); 
    11291157                if (_debugMode) throw e; 
     
    11391167        private function _prepareCompile(mml:String, data:SiONData) : void 
    11401168        { 
    1141             try { 
    1142                 _data = data || new SiONData(); 
    1143                 _mmlString = mml; 
    1144                 sequencer.prepareCompile(_data, _mmlString); 
    1145                 _jobProgress = 0.01; 
    1146                 _timeCompile = 0;  
    1147                 _currentJob = 1; 
    1148             } catch (e:Error) { 
    1149                 // error 
    1150                 _cancelAllJobs(); 
    1151                 if (_debugMode) throw e; 
    1152                 else dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, e.message)); 
    1153             } 
     1169            _data = data || new SiONData(); 
     1170            _mmlString = mml; 
     1171            sequencer.prepareCompile(_data, _mmlString); 
     1172            _jobProgress = 0.01; 
     1173            _timeCompile = 0;  
     1174            _currentJob = 1; 
    11541175        } 
    11551176         
     
    12921313                    var t:int = getTimer(); 
    12931314                    // processing 
    1294                     _cannotChangeBPM = true; 
    12951315                    sequencer.process(); 
    12961316                    effector.process(); 
    12971317                    module.limitLevel(); 
    1298                     _cannotChangeBPM = false; 
    12991318                     
    13001319                    // calculate the average of processing time 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelBase.as

    r2989 r3059  
    474474    // processing 
    475475    //-------------------------------------------------- 
    476         /** Prepare buffering */ 
    477         public function prepareBuffer() : void 
     476        /** reset channel buffering status */ 
     477        public function resetChannelBufferStatus() : void 
    478478        { 
    479479            _bufferIndex = 0; 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelFM.as

    r2989 r3059  
    520520         
    521521        /** Prepare buffering */ 
    522         override public function prepareBuffer() : void 
     522        override public function resetChannelBufferStatus() : void 
    523523        { 
    524524            _bufferIndex = 0; 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelKS.as

    r3027 r3059  
    277277         
    278278        /** Prepare buffering */ 
    279         override public function prepareBuffer() : void 
     279        override public function resetChannelBufferStatus() : void 
    280280        { 
    281281            _bufferIndex = 0; 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperator.as

    r2989 r3059  
    693693                    _eg_incTable = _table.eg_incTables[_table.eg_tableSelector[r]]; 
    694694                    _eg_timer_step = _table.eg_timerSteps[r]; 
    695                      
    696695                    break; 
    697696                } 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLData.as

    r2989 r3059  
    1818    //---------------------------------------- 
    1919        /** envelop tables */ 
    20         protected var _envelops:Vector.<SiMMLEnvelopTable>; 
     20        public var envelops:Vector.<SiMMLEnvelopTable>; 
    2121        /** voice data */ 
    22         protected var _voices:Vector.<SiMMLVoice>; 
     22        public var voices:Vector.<SiMMLVoice>; 
    2323         
    2424         
     
    3030        function SiMMLData() 
    3131        { 
    32             _envelops = new Vector.<SiMMLEnvelopTable>(SiMMLTable.ENV_TABLE_MAX); 
    33             _voices   = new Vector.<SiMMLVoice>(SiMMLTable.VOICE_MAX); 
     32            envelops = new Vector.<SiMMLEnvelopTable>(SiMMLTable.ENV_TABLE_MAX); 
     33            voices   = new Vector.<SiMMLVoice>(SiMMLTable.VOICE_MAX); 
    3434        } 
    3535         
     
    4444            super.clear(); 
    4545            var i:int, imax:int; 
    46             imax = _envelops.length; 
    47             for (i=0; i<imax; i++) _envelops[i] = null; 
    48             imax = _voices.length; 
    49             for (i=0; i<imax; i++) _voices[i] = null; 
     46            imax = envelops.length; 
     47            for (i=0; i<imax; i++) envelops[i] = null; 
     48            imax = voices.length; 
     49            for (i=0; i<imax; i++) voices[i] = null; 
    5050        } 
    5151         
     
    5757        public function setEnvelopTable(index:int, envelop:SiMMLEnvelopTable) : void 
    5858        { 
    59             if (index >= 0 && index < SiMMLTable.ENV_TABLE_MAX) _envelops[index] = envelop; 
     59            if (index >= 0 && index < SiMMLTable.ENV_TABLE_MAX) envelops[index] = envelop; 
    6060        } 
    6161         
     
    6969            if (index >= 0 && index < SiMMLTable.VOICE_MAX) { 
    7070                if (!voice._isSuitableForFMVoice) throw errorNotGoodFMVoice(); 
    71                  _voices[index] = voice; 
     71                 voices[index] = voice; 
    7272            } 
    7373        } 
     
    7878    // internal function 
    7979    //-------------------------------------------------- 
    80         /** @private [internal use] Register all tables before processing audio. */ 
    81         override public function _regiterTables() : void 
    82         { 
    83             super._regiterTables(); 
    84             SiMMLTable.instance.stencilEnvelops = _envelops; 
    85             SiMMLTable.instance.stencilVoices   = _voices; 
    86         } 
    87          
    88          
    8980        /** @private [internal use] Set envelop table data */ 
    9081        internal function _setEnvelopTable(index:int, head:SLLint, tail:SLLint) : void 
     
    9283            var t:SiMMLEnvelopTable = new SiMMLEnvelopTable(); 
    9384            t._initialize(head, tail); 
    94             _envelops[index] = t; 
     85            envelops[index] = t; 
    9586        } 
    9687         
     
    10192            var v:SiMMLVoice = new SiMMLVoice(); 
    10293            v.channelParam = new SiOPMChannelParam(); 
    103             _voices[index] = v; 
     94            voices[index] = v; 
    10495            return v.channelParam; 
    10596        } 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as

    r2989 r3059  
    5252        private var _module:SiOPMModule;                // Module instance 
    5353        private var _connector:MMLExecutorConnector;    // MMLExecutorConnector 
    54         private var _currentTrack:SiMMLTrack;  // Current processing track 
     54        private var _currentTrack:SiMMLTrack;           // Current processing track 
    5555        private var _macroStrings:Vector.<String>;      // Macro strings 
    5656        private var _flagMacroExpanded:uint;            // Expanded macro flag to avoid circular reference 
    5757        private var _envelopEventID:int;                // Event id of first envelop 
    5858        private var _macroExpandDynamic:Boolean;        // Macro expantion mode 
     59        private var _enableChangeBPM:Boolean;           // internal flag enable to change bpm 
    5960         
    6061        private var _p:Vector.<int> = new Vector.<int>(PARAM_MAX);  // temporary area to get plural parameters 
     
    8990        /** Is finish executing sequence ? */ 
    9091        public function get isSequenceFinished() : Boolean { return _isSequenceFinished; } 
     92         
     93        /** Is enable to change BPM ? */ 
     94        public function get isEnableChangeBPM() : Boolean { return _enableChangeBPM; } 
     95 
    9196         
    9297        /** Current working track */ 
     
    273278         
    274279         
    275         /** Find track except for mml sequencer track by trackID and note.  
    276          *  @param trackID Search Tracks ID. 
    277          *  @param trackID Search note number. The value of -1 hits all tracks. 
    278          *  @return found track instance. Returns null when didnt find. 
    279          */ 
    280         public function findControlableTrack(trackID:int, note:int=-1) : SiMMLTrack 
    281         { 
    282             var i:int, trk:SiMMLTrack; 
    283             for (i=tracks.length-1; i>=0; i--) { 
    284                 trk = tracks[i]; 
    285                 if (trk.trackID == trackID && (note == -1 || (note == trk.note && trk.channel.isNoteOn()))) return trk; 
    286             } 
    287             return null; 
    288         } 
    289          
    290          
    291280        /** Get free controlable track. 
    292281         *  @param trackID New Tracks ID. 
     
    320309        { 
    321310            track._initialize(null, 60, (trackID>=0) ? trackID : 0, _eventTriggerOn, _eventTriggerOff); 
    322             track.reset(0); 
     311            track.reset(globalBufferIndex); 
    323312             
    324313            track.velocity   = setting.defaultVolume<<3; 
     
    360349            freeAllTracks(); 
    361350            _processedSampleCount = 0; 
     351            _enableChangeBPM = true; 
    362352             
    363353            // call super function (set mmlData/grobalSequence/defaultBPM inside) 
     
    386376        override public function process() : void 
    387377        { 
    388             var i:int, bufferingTick:int, len:int, trk:SiMMLTrack
     378            var i:int, bufferingTick:int, len:int, trk:SiMMLTrack, data:SiMMLData
    389379             
    390380            // prepare buffering 
    391             for each (trk in tracks) trk.channel.prepareBuffer(); 
     381            for each (trk in tracks) trk.channel.resetChannelBufferStatus(); 
    392382 
    393383            // clear all buffers 
    394384            _module.clearAllBuffers(); 
    395              
     385 
    396386            // buffering 
    397387            _isSequenceFinished = true; 
     
    399389            do { 
    400390                bufferingTick = executeGlobalSequence(); 
     391                _enableChangeBPM = false; 
    401392                for each (trk in tracks) { 
    402393                    _currentTrack = trk; 
    403394                    len = trk.prepareBuffer(bufferingTick); 
     395                    _bpm = trk._bpmSetting ||  _changableBPM; 
    404396                    _isSequenceFinished = processMMLExecutor(trk.executor, len) && _isSequenceFinished; 
    405397                } 
     398                _enableChangeBPM = true; 
    406399            } while (!isEndGlobalSequence()); 
    407400            _currentTrack = null; 
     
    416409        public function dummyProcess(sampleCount:int) : void 
    417410        { 
    418             var i:int, bufferingTick:int, len:int, count:int, trk:SiMMLTrack, 
     411            var i:int, bufferingTick:int, len:int, count:int, trk:SiMMLTrack, data:SiMMLData, 
    419412                bufCount:int = sampleCount / _module.bufferLength; 
    420413             
     
    426419            for (count=0; count<bufCount; count++) { 
    427420                // prepare buffering 
    428                 for each (trk in tracks) trk.channel.prepareBuffer(); 
     421                for each (trk in tracks) trk.channel.resetChannelBufferStatus(); 
    429422                 
    430423                // buffering 
     
    435428                        _currentTrack = trk; 
    436429                        len = trk.prepareBuffer(bufferingTick); 
     430                        _bpm = trk._bpmSetting || _changableBPM; 
    437431                        processMMLExecutor(trk.executor, len); 
    438432                    } 
     
    454448         */ 
    455449        public function calcSampleLength(beat16:Number) : Number { 
    456             return beat16 * sampleParBeat16; 
     450            return beat16 * _bpm.sampleParBeat16; 
    457451        } 
    458452         
     
    464458         */ 
    465459        public function calcSampleDelay(sampleOffset:int=0, beat16Offset:Number=0, quant:Number=0) : Number { 
    466             if (quant == 0) return sampleOffset + beat16Offset * sampleParBeat16; 
    467             var iBeats:int = int(sampleOffset * beat16ParSample + globalBeat16 + beat16Offset + 0.9999847412109375); //=65535/65536 
     460            if (quant == 0) return sampleOffset + beat16Offset * _bpm.sampleParBeat16; 
     461            var iBeats:int = int(sampleOffset * _bpm.beat16ParSample + globalBeat16 + beat16Offset + 0.9999847412109375); //=65535/65536 
    468462            if (quant != 1) iBeats = (int((iBeats+quant-1) / quant)) * quant; 
    469             return (iBeats - globalBeat16) * sampleParBeat16; 
     463            return (iBeats - globalBeat16) * _bpm.sampleParBeat16; 
    470464        } 
    471465         
     
    612606        { 
    613607            for each (var trk:SiMMLTrack in tracks) { 
    614                 trk.executor._onTempoChanged(changingRatio); 
     608                if (trk._bpmSetting == null) trk.executor._onTempoChanged(changingRatio); 
    615609            } 
    616610            if (_callbackTempoChanged != null) _callbackTempoChanged(globalBufferIndex); 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as

    r3027 r3059  
    1313    import org.si.sion.sequencer.base.MMLSequence; 
    1414    import org.si.sion.sequencer.base.MMLExecutor; 
    15      
     15    import org.si.sion.sequencer.base.BeatPerMinutes; 
    1616 
    1717    /** Track for SiMMLSequencer. <br/> 
     
    3333        static public const TRACK_ID_FILTER:int = 0xffff; 
    3434        /** track type filter */ 
    35         static public const TRACK_TYPE_FILTER:int = 0xff0000; 
     35        static public const TRACK_TYPE_FILTER:int = 0x1ff0000; 
     36        /** flag to activate always */ 
     37        static public const FLAG_ACTIVE:int = 0x1000000; 
    3638        /** MML track id offset */ 
    37         static public const MML_TRACK_ID_OFFSET:int = 0x10000; 
     39        static public const MML_TRACK_ID_OFFSET:int = 0x1010000; 
    3840        /** MIDI track id offset */ 
    3941        static public const MIDI_TRACK_ID_OFFSET:int = 0x20000; 
    40         /** driver track id offset */ 
     42        /** driver track id offset for noteOn() */ 
    4143        static public const DRIVER_NOTE_ID_OFFSET:int = 0x30000; 
    42         /** driver track id offset */ 
    43         static public const DRIVER_SEQUENCE_ID_OFFSET:int = 0x30000; 
     44        /** driver track id offset for sequenceOn() */ 
     45        static public const DRIVER_SEQUENCE_ID_OFFSET:int = 0x40000; 
     46        /** user controlled id offset */ 
     47        static public const USER_CONTROLLED_ID_OFFSET:int = 0x1050000; 
     48         
    4449         
    4550        // _processMode 
     
    8792        private var _eventTriggerTypeOff:int; 
    8893         
    89         private var _trackID:int;           // track ID number 
     94        private var _trackID:int;               // track ID number 
    9095 
    9196        // internal use 
    92         private var _mmlData:MMLData;       // mml data 
     97        private var _mmlData:SiMMLData;     // mml data 
    9398        private var _table:SiMMLTable;      // table 
    9499        private var _keyOnCounter:int;      // key on counter 
     
    181186        public function get trackStopDelay() : int { return _trackStopDelay; } 
    182187         
    183         /** Is controlable ? */ 
    184         public function get isControlable() : Boolean { return ((_trackID & TRACK_TYPE_FILTER) != MML_TRACK_ID_OFFSET); } 
    185          
    186188        /** Is activate ? This function always returns true from the MML sequence track. */ 
    187         public function get isActive() : Boolean { return (!isControlable || !channel.isIdling || _keyOnCounter>0 || _trackStartDelay>0); } 
     189        public function get isActive() : Boolean { return ((Boolean(_trackID & FLAG_ACTIVE)) || !channel.isIdling || _keyOnCounter>0 || _trackStartDelay>0); } 
    188190         
    189191        /** Is finish to buffering ? */ 
    190192        public function get isFinished() : Boolean { return (executor.pointer==null && channel.isIdling && _keyOnCounter==0 && _trackStartDelay==0); } 
    191          
    192193         
    193194        /** velocity(0-256). linked to operator's total level. */ 
     
    213214         
    214215        /** pannning */ 
    215         public function get pan() : int { 
    216             return channel.pan; 
    217         } 
     216        public function get pan() : int { return channel.pan; } 
    218217         
    219218        /** program number. this value has no meaning. */ 
    220         public function get programNumber() : int { 
    221             return _tone; 
     219        public function get programNumber() : int { return _tone; } 
     220         
     221        /** mml data to play */ 
     222        public function get mmlData() : SiMMLData { return _mmlData; } 
     223         
     224         
     225        /** @private [internal use] bpm setting */ 
     226        internal function get _bpmSetting() : BeatPerMinutes {  
     227            return ((_trackID & TRACK_TYPE_FILTER) != MML_TRACK_ID_OFFSET && _mmlData) ? _mmlData._initialBPM : null; 
    222228        } 
    223229         
     
    267273            _eventTriggerTypeOn = 0; 
    268274            _eventTriggerTypeOff = 0; 
    269             _mmlData = (seq) ? seq._owner : null; 
     275            _mmlData = (seq) ? (seq._owner as SiMMLData) : null; 
    270276            executor.initialize(seq); 
    271277             
     
    405411            _trackStartDelay = delay; 
    406412            _trackStopDelay = length; 
     413            _mmlData = (seq) ? (seq._owner as SiMMLData) : null; 
    407414            executor.initialize(seq); 
    408415            return this; 
     
    699706        internal function prepareBuffer(bufferingTick:int) : int 
    700707        { 
    701             // register tables 
    702             if (_mmlData) _mmlData._regiterTables(); 
     708            if (_mmlData) { 
     709                // register tables 
     710                SiOPMTable.instance.stencilCustomWaveTables = _mmlData.waveTables; 
     711                SiOPMTable.instance.stencilPCMData          = _mmlData.pcmData; 
     712                SiOPMTable.instance.stencilSamplerData      = _mmlData.samplerData; 
     713                SiMMLTable.instance.stencilEnvelops         = _mmlData.envelops; 
     714                SiMMLTable.instance.stencilVoices           = _mmlData.voices; 
     715            } 
    703716             
    704717            // almost executing this 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as

    r3013 r3059  
    2222        public var globalSequence:MMLSequence; 
    2323         
    24         /** default BPM */ 
    25         public var defaultBPM:int; 
    2624        /** default FPS */ 
    2725        public var defaultFPS:int; 
     
    3028        /** Author */ 
    3129        public var author:String; 
     30        /** @private [internal use] default BPM */ 
     31        public var _initialBPM:BeatPerMinutes; 
    3232         
    3333        /** wave tables */ 
     
    5252    // properties 
    5353    //-------------------------------------------------- 
    54          
     54        /** Beat per minutes. Returns 0 when there are no bpm definitions. */ 
     55        public function get bpm() : Number { 
     56            return (_initialBPM) ? _initialBPM.bpm : 0; 
     57        } 
    5558         
    5659         
     
    6366            globalSequence = new MMLSequence(); 
    6467             
    65             defaultBPM = 120
     68            _initialBPM = null
    6669            defaultFPS = 60; 
    6770            title = ""; 
     
    8790            globalSequence.free(); 
    8891             
    89             defaultBPM = 120
     92            _initialBPM = null
    9093            defaultFPS = 60; 
    9194            title = ""; 
     
    183186            return samplerData[index]; 
    184187        } 
    185          
    186          
    187          
    188          
    189     // internal function 
    190     //-------------------------------------------------- 
    191         /** @private [internal use] Register all tables before processing audio. */ 
    192         public function _regiterTables() : void 
    193         { 
    194             SiOPMTable.instance.stencilCustomWaveTables = waveTables; 
    195             SiOPMTable.instance.stencilPCMData          = pcmData; 
    196             SiOPMTable.instance.stencilSamplerData      = samplerData; 
    197         } 
    198188    } 
    199189} 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as

    r2989 r3059  
    2323    //-------------------------------------------------- 
    2424        /** bits for fixed decimal */ 
    25         protected const FIXED_BITS:int = 8; 
     25        internal static const FIXED_BITS:int = 8; 
    2626        /** filter for decimal fraction area */ 
    27         protected const FIXED_FILTER:int = (1<<FIXED_BITS)-1; 
     27        internal static const FIXED_FILTER:int = (1<<FIXED_BITS)-1; 
    2828         
    2929         
     
    4343        /** Current MMLData to compile or process */ 
    4444        protected var mmlData:MMLData; 
     45        /** changable beat per minutes */ 
     46        protected var _changableBPM:BeatPerMinutes; 
     47        /** beat per minutes */ 
     48        protected var _bpm:BeatPerMinutes; 
    4549         
    4650        /** buffer index for global sequence */ 
     
    4852        /** beat counter in 16th */ 
    4953        protected var globalBeat16:Number; 
    50         /** 16th beat par sample */ 
    51         protected var beat16ParSample:Number; 
    52         /** sample par 16th beat */ 
    53         protected var sampleParBeat16:Number; 
    5454        /** filter for onBeat() callback. 0=16th beat, 1=8th beat, 3=4th beat, 7=2dn beat, 15=whole tone ...*/ 
    5555        protected var _onBeatCallbackFilter:int; 
     
    6565        private var _globalExecuteSampleCount:int;  // executing buffer length in global sequence 
    6666         
    67         private var _bpm:Number;                    // beat per minute 
    68         private var _samplePerTick:int;             // samples per tick << FIXED_BITS 
    6967        private var _bufferLength:int;              // buffering length 
    7068         
     
    7472    //-------------------------------------------------- 
    7573        /** beat per minute. */ 
    76         public function set bpm(b:Number) : void 
    77         { 
    78             if (b<1) b=1; 
    79             else if (b>511) b=511; 
    80             _samplePerTick = int((sampleRate * 240 / (setting.resolution * b)) * (1<<FIXED_BITS)); 
    81             beat16ParSample = b / (sampleRate * 15); // 60/4 
    82             sampleParBeat16 = 1 / beat16ParSample; 
    83             onTempoChanged(_bpm/b); 
    84             _bpm = b; 
    85         } 
    86         public function get bpm() : Number { return _bpm; } 
     74        public function get bpm() : Number {  
     75            return _changableBPM.bpm; 
     76        } 
     77        public function set bpm(newValue:Number) : void {  
     78            var oldValue:Number=_changableBPM.bpm; 
     79            if (_changableBPM.update(newValue, sampleRate)) { 
     80                onTempoChanged(oldValue/newValue); 
     81            } 
     82        } 
    8783                 
    8884         
     
    110106            _newUserDefinedEventID = MMLEvent.USER_DEFINE; 
    111107             
     108            _changableBPM = new BeatPerMinutes(120, 44100); 
     109            _bpm = _changableBPM; 
    112110            globalExecutor = new MMLExecutor(); 
    113111             
     
    235233            _bufferLength = bufferLength; 
    236234            if (mmlData == null) { 
    237                 bpm = setting.defaultBPM
     235                _changableBPM.update(setting.defaultBPM, sampleRate)
    238236                globalExecutor.initialize(null); 
    239237            } else { 
    240                 bpm = mmlData.defaultBPM
     238                _changableBPM.update(mmlData._initialBPM.bpm, sampleRate)
    241239                globalExecutor.initialize(mmlData.globalSequence); 
    242                 mmlData._regiterTables(); 
    243             } 
     240                //mmlData._regiterTables(); /**/ 
     241            } 
     242            _bpm = _changableBPM; 
    244243            globalBufferIndex = 0; 
    245244            globalBeat16 = 0; 
     
    295294                floorPrevBeat:int = int(prevBeat); 
    296295            globalBufferIndex += _globalExecuteSampleCount; 
    297             globalBeat16 += _globalExecuteSampleCount * beat16ParSample; 
     296            globalBeat16 += _globalExecuteSampleCount * _bpm.beat16ParSample; 
    298297            var floorCurrBeat:int = int(globalBeat16);  
    299298            while (floorPrevBeat < floorCurrBeat) { 
    300299                floorPrevBeat++; 
    301300                if ((floorPrevBeat & _onBeatCallbackFilter) == 0) { 
    302                     onBeat((floorPrevBeat - prevBeat) * sampleParBeat16, floorPrevBeat); 
     301                    onBeat((floorPrevBeat - prevBeat) * _bpm.sampleParBeat16, floorPrevBeat); 
    303302                } 
    304303            } 
    305             return (_globalBufferSampleCount == 0); 
     304            if (_globalBufferSampleCount == 0) { 
     305                globalBufferIndex = 0; 
     306                return true; 
     307            } 
     308            return false; 
    306309        } 
    307310         
     
    340343        protected function calcSampleCount(len:int) : int 
    341344        { 
    342             return (len * _samplePerTick) >> FIXED_BITS; 
     345            return (len * _bpm._samplePerTick) >> FIXED_BITS; 
    343346        } 
    344347         
     
    489492            list = list.sortOn(length, Array.NUMERIC); 
    490493            pos = 0; 
    491             defaultBPM = setting.defaultBPM
     494            defaultBPM = 0
    492495            for each (e in list) { 
    493496                if (e.length == 0 && e.id == MMLEvent.TEMPO) { 
    494                     // first tempo command is defaultBPM
     497                    // first tempo command is default bpm
    495498                    defaultBPM = e.data; 
    496499                } else { 
     
    505508             
    506509            // set default bpm in mmlData 
    507             mmlData.defaultBPM = defaultBPM; 
     510            if (defaultBPM > 0) { 
     511                mmlData._initialBPM = new BeatPerMinutes(defaultBPM, 44100, setting.resolution); 
     512            } 
    508513        } 
    509514         
     
    534539            // set processing length 
    535540            if (exec._residueSampleCount == 0) { 
    536                 var sampleCountFixed:int = e.length * _samplePerTick + exec._decimalFractionSampleCount; 
     541                var sampleCountFixed:int = e.length * _bpm._samplePerTick + exec._decimalFractionSampleCount; 
    537542                exec._residueSampleCount = sampleCountFixed >> FIXED_BITS; 
    538543                exec._decimalFractionSampleCount = sampleCountFixed & FIXED_FILTER; 
     
    563568            // set processing length 
    564569            if (exec._residueSampleCount == 0) { 
    565                 var sampleCountFixed:int = e.length * _samplePerTick + exec._decimalFractionSampleCount; 
     570                var sampleCountFixed:int = e.length * _bpm._samplePerTick + exec._decimalFractionSampleCount; 
    566571                exec._residueSampleCount = sampleCountFixed >> FIXED_BITS; 
    567572                exec._decimalFractionSampleCount = sampleCountFixed & FIXED_FILTER; 
     
    592597            // set processing length 
    593598            if (exec._residueSampleCount == 0) { 
    594                 var sampleCountFixed:int = e.length * _samplePerTick + exec._decimalFractionSampleCount; 
     599                var sampleCountFixed:int = e.length * _bpm._samplePerTick + exec._decimalFractionSampleCount; 
    595600                exec._residueSampleCount = sampleCountFixed >> FIXED_BITS; 
    596601                exec._decimalFractionSampleCount = sampleCountFixed & FIXED_FILTER; 
  • as3/SiOPM/trunk/src/org/si/sound/Arpeggiator.as

    r3013 r3059  
    2727        /** Note events in the sequence with portament */ 
    2828        protected var _noteEventsPort:Vector.<MMLEvent>; 
     29        /** Slur events in the sequence with portament */ 
     30        protected var _slurEventsPort:Vector.<MMLEvent>; 
    2931        /** Note length */ 
    3032        protected var _step:int; 
     
    8284            for (i=0; i<imax; i++) { 
    8385                _noteEventsNormal[i].length = _step; 
    84                 _noteEventsPort[i].length   = _step; 
     86                _slurEventsPort[i].length   = _step; 
    8587            } 
    8688        } 
     
    9092        public function set pattern(pat:Array) : void 
    9193        { 
    92             if (track) { 
     94            if (!track) { 
    9395                _dataNormal.clear(); 
    9496                _dataPort.clear(); 
    9597                if (pat) { 
    9698                    _arpeggio = Vector.<int>(pat); 
    97                     var i:int, imax:int = pat.length, note:int, 
     99                    var i:int, imax:int = pat.length, note:int = 60,  
    98100                        seqNormal:MMLSequence = _dataNormal.appendNewSequence(), 
    99101                        seqPort:MMLSequence   = _dataPort.appendNewSequence(); 
    100102                    _noteEventsNormal.length = imax; 
    101103                    _noteEventsPort.length = imax; 
     104                    _slurEventsPort.length = imax; 
    102105                    seqNormal.alloc().appendNewEvent(MMLEvent.REPEAT_ALL, 0); 
    103106                    seqPort.alloc().appendNewEvent(MMLEvent.REPEAT_ALL, 0); 
    104107                    for (i=0; i<imax; i++) { 
    105                         note = scale.getNote(pat[i]); 
    106                         if (note>=0 && note<128) { 
     108                        var newNote:int = scale.getNote(pat[i]); 
     109                        if (newNote>=0 && newNote<128) { 
     110                            note = newNote; 
    107111                            _noteEventsNormal[i] = seqNormal.appendNewEvent(MMLEvent.NOTE, note, _step); 
    108112                            _noteEventsPort[i]   = seqPort.appendNewEvent(MMLEvent.NOTE, note, 0); 
    109                             seqPort.appendNewEvent(MMLEvent.SLUR, 0, _step); 
     113                            _slurEventsPort[i]   = seqPort.appendNewEvent(MMLEvent.SLUR, 0, _step); 
    110114                        } else { 
    111115                            _noteEventsNormal[i] = seqNormal.appendNewEvent(MMLEvent.REST, 0, _step); 
    112                             _noteEventsPort[i]   = seqPort.appendNewEvent(MMLEvent.REST, 0, _step); 
     116                            _noteEventsPort[i]   = seqPort.appendNewEvent(MMLEvent.NOTE, note, 0); 
     117                            _slurEventsPort[i]   = seqPort.appendNewEvent(MMLEvent.SLUR, 0, _step); 
    113118                        } 
    114119                    } 
     
    135140            _noteEventsNormal = new Vector.<MMLEvent>(); 
    136141            _noteEventsPort = new Vector.<MMLEvent>(); 
     142            _slurEventsPort = new Vector.<MMLEvent>(); 
    137143            this.noteLength = noteLength; 
    138144            this.pattern = pattern; 
  • as3/SiOPM/trunk/src/org/si/sound/base/SingleTrackObject.as

    r3013 r3059  
    143143        { 
    144144            var oldTrack:SiMMLTrack = track; 
    145             _track = driver.sequenceOn(_data, voice, _length, _delay, _quantize, _trackID); 
    146             if (_track) { 
    147                 if (oldTrack) oldTrack.sequenceOff(_track.trackStartDelay-8); 
     145            var tracks:Vector.<SiMMLTrack> = driver.sequenceOn(_data, voice, _length, _delay, _quantize, _trackID); 
     146            if (tracks.length > 0) { 
     147                _track = tracks[0]; 
     148                if (oldTrack) oldTrack.sequenceOff(_track.trackStartDelay-1); 
    148149                _track.channel.pan = _totalPan; 
    149150                _track.channel.masterVolume = (_totalMute) ? 0 : _totalVolume*128; 
    150151                _track.quantRatio = _noteQuantize * 0.125; 
    151152                _track.setEventTrigger(_eventTriggerID, _noteOnTrigger, _noteOffTrigger); 
     153            } else { 
     154                _track = null; 
     155                if (oldTrack) oldTrack.sequenceOff(0); 
    152156            } 
    153157        }