チェンジセット 4540

差分発生行の前後
無視リスト:
コミット日時:
2011/05/19 02:05:13 (1 年前)
コミッタ:
keim
ログメッセージ:

SiON v0.63 candidate

ファイル:

凡例:

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

    r4264 r4540  
    4646         *  @param keyRangeFrom Assigning key range starts from 
    4747         *  @param keyRangeTo Assigning key range ends at 
     48         *  @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 
    4849         *  @see #render() 
    4950         */ 
    50         public function setPCMData(index:int, wavelet:Vector.<Number>, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127) : SiOPMWavePCMData 
     51        public function setPCMData(index:int, wavelet:Vector.<Number>, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127, isStereoSample:Boolean=false) : SiOPMWavePCMData 
    5152        { 
    5253            index &= (SiOPMTable.PCM_DATA_MAX-1); 
    5354            if (!pcmData[index]) pcmData[index] = new SiOPMWavePCMTable(); 
    54             return pcmData[index].setSample(new SiOPMWavePCMData(wavelet, samplingOctave), keyRangeFrom, keyRangeTo); 
     55            return pcmData[index].setSample(new SiOPMWavePCMData(wavelet, samplingOctave, isStereoSample), keyRangeFrom, keyRangeTo); 
    5556        } 
    5657         
     
    7576         *  @param data Vector.&lt;Number&gt; wave data. This type ussualy comes from SiONDriver.render(). 
    7677         *  @param ignoreNoteOff True to set ignoring note off. 
    77          *  @param channelCount 1 for monoral, 2 for stereo. 
     78         *  @param channelCount of this data, 1 for monoral, 2 for stereo. 
    7879         *  @return created data instance 
    7980         *  @see #org.si.sion.SiONDriver.render() 
     
    8990         *  @param sound Sound instance to set. 
    9091         *  @param ignoreNoteOff True to set ignoring note off. 
    91          *  @param channelCount 1 for monoral, 2 for stereo. 
     92         *  @param channelCount of extracted data, 1 for monoral, 2 for stereo. 
    9293         *  @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 
    9394         *  @return created instance 
  • as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as

    r4451 r4540  
    101101    //---------------------------------------- 
    102102        /** version number */ 
    103         static public const VERSION:String = "0.6.2"; 
     103        static public const VERSION:String = "0.6.3"; 
    104104         
    105105         
     
    159159        private var _inStreaming:Boolean;         // in streaming 
    160160        private var _preserveStop:Boolean;        // preserve stop after streaming 
    161         private var _isFirstStreaming:Boolean;      // first streaming 
     161        private var _suspendStreaming:Boolean;      // suspend streaming 
     162        private var _suspendWhileLoading:Boolean;   // suspend starting steam while loading 
     163        private var _loadingSoundList:Array;        // loading sound list 
     164        private var _completeSoundList:Array;       // complete sound list 
     165        private var _errorSoundList:Array;          // errored sound list 
    162166        private var _isFinishSeqDispatched:Boolean; // FINISH_SEQUENCE event already dispacthed 
    163167        //----- operation related 
     
    330334        public function set autoStop(mode:Boolean) : void { _autoStop = mode; } 
    331335         
     336        /** pause while loading sound @default true */ 
     337        public function get pauseWhileLoading() : Boolean { return _suspendWhileLoading; } 
     338        public function set pauseWhileLoading(b:Boolean) : void { _suspendWhileLoading = b; } 
     339         
    332340        /** Debug mode, true; throw Error / false; throw ErrorEvent when error appears inside. @default false */ 
    333341        public function get debugMode() : Boolean { return _debugMode; } 
     
    366374            // initialize tables 
    367375            var dummy:*; 
    368             dummy = SiOPMTable.instance; //initialize(3580000, 1789772.5, 44100) sampleRate)
     376            dummy = SiOPMTable.instance; //initialize(3580000, 1789772.5, 44100) sampleRate
    369377            dummy = SiMMLTable.instance; //initialize(); 
    370378             
     
    378386            _fader = new Fader(); 
    379387            _timerSequence = new MMLSequence(); 
     388            _loadingSoundList = []; 
     389            _completeSoundList = []; 
     390            _errorSoundList = []; 
    380391 
    381392            // initialize 
     
    390401            _preserveStop = false; 
    391402            _inStreaming = false; 
    392             _isFirstStreaming = false; 
     403            _suspendStreaming = false; 
     404            _suspendWhileLoading = true; 
    393405            _autoStop = false; 
    394406            _noteOnExceptionMode = NEM_IGNORE; 
     
    578590            return _queueLength; 
    579591        } 
     592                 
     593         
     594        /** Listen loading status of flash.media.Sound instance.  
     595         *  When SiONDriver.pauseWhileLoading is true, SiONDriver starts streaming after all Sound instances passed by this function are loaded. 
     596         *  @param sound Sound instance to listern  
     597         *  @see #pauseWhileLoading() 
     598         *  @see #clearLoadingSoundList() 
     599         */ 
     600        public function listenSoundLoadingStatus(sound:Sound) : void  
     601        { 
     602            if (_loadingSoundList.indexOf(sound) != -1) return; 
     603            if (_completeSoundList.indexOf(sound) != -1) return; 
     604            if (_errorSoundList.indexOf(sound) != -1) return; 
     605            if (sound.bytesLoaded == sound.bytesTotal) { 
     606                _completeSoundList.push(sound); 
     607            } else { 
     608                _loadingSoundList.push(sound); 
     609                sound.addEventListener(Event.COMPLETE, _onSoundEvent); 
     610                sound.addEventListener(IOErrorEvent.IO_ERROR, _onSoundEvent); 
     611            } 
     612        } 
     613         
     614         
     615        /** Clear all listening sound list registerd by SiONDriver.listenLoadingStatus(). 
     616         */ 
     617        public function clearSoundLoadingList() : void 
     618        { 
     619            _loadingSoundList.length = 0; 
     620            _completeSoundList.length = 0; 
     621            _errorSoundList.length = 0; 
     622        } 
    580623         
    581624         
     
    612655                     
    613656                    // start streaming 
    614                     _isFirstStreaming = true; 
     657                    _suspendStreaming = true; 
    615658                    _soundChannel = _sound.play(); 
    616659                    _soundChannel.soundTransform = _soundTransform; 
     
    767810         *  @param keyRangeFrom Assigning key range starts from 
    768811         *  @param keyRangeTo Assigning key range ends at 
     812         *  @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 
    769813         *  @see #render() 
    770814         */ 
    771         public function setPCMData(index:int, wavelet:Vector.<Number>, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127) : SiOPMWavePCMData 
    772         { 
    773             return SiOPMTable._instance.getPCMWaveTable(index).setSample(new SiOPMWavePCMData(wavelet, samplingOctave), keyRangeFrom, keyRangeTo); 
     815        public function setPCMData(index:int, wavelet:Vector.<Number>, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127, isStereoSample:Boolean=false) : SiOPMWavePCMData 
     816        { 
     817            return SiOPMTable._instance.getPCMWaveTable(index).setSample(new SiOPMWavePCMData(wavelet, samplingOctave, isStereoSample), keyRangeFrom, keyRangeTo); 
    774818        } 
    775819         
     
    794838         *  @param data Vector.&lt;Number&gt; wave data. This type ussualy comes from render(). 
    795839         *  @param ignoreNoteOff True to set "one shot" sound. The "one shot" sound ignores note off. 
    796          *  @param channelCount 1 for monoral, 2 for stereo. 
     840         *  @param channelCount of this data, 1 for monoral, 2 for stereo. 
    797841         *  @see #render() 
    798842         */ 
     
    807851         *  @param sound Sound instance to set. 
    808852         *  @param ignoreNoteOff True to set "one shot" sound. The "one shot" sound ignores note off. 
    809          *  @param channelCount 1 for monoral, 2 for stereo. 
     853         *  @param channelCount of extracted data, 1 for monoral, 2 for stereo. 
    810854         *  @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 
    811855         */ 
     
    10411085         
    10421086         
    1043         /** Create new user controlable track. 
     1087        /** Create new user controlable track. This function only is available after play().  
    10441088         *  @trackID new user controlable track's ID. 
    10451089         *  @return new user controlable track. This track is NOT disposable. 
     
    11421186            } 
    11431187            _listenEvent = NO_LISTEN; 
     1188        } 
     1189         
     1190         
     1191        // handler for Sound COMPLETE/IO_ERROR Event  
     1192        private function _onSoundEvent(e:Event) : void 
     1193        { 
     1194            var sound:Sound = e.target as Sound; 
     1195            sound.removeEventListener(Event.COMPLETE, _onSoundEvent); 
     1196            sound.removeEventListener(IOErrorEvent.IO_ERROR, _onSoundEvent); 
     1197             
     1198            var i:int = _loadingSoundList.indexOf(sound); 
     1199            if (i != -1) _loadingSoundList.splice(i, 1); 
     1200             
     1201            if (e.type == Event.COMPLETE) _completeSoundList.push(sound); 
     1202            else _errorSoundList.push(sound); 
    11441203        } 
    11451204         
     
    13851444             
    13861445            // first streaming 
    1387             if (_isFirstStreaming) { 
    1388                 _onFirstFrameAfterStartingStream(); 
     1446            if (_suspendStreaming) { 
     1447                _onSuspendStream(); 
    13891448            } else { 
    13901449                // preserve stop 
     
    14091468         
    14101469         
    1411         // first frame after starting stream 
    1412         private function _onFirstFrameAfterStartingStream() : void { 
    1413             _isFirstStreaming = false; 
    1414              
     1470        // suspend starting stream 
     1471        private function _onSuspendStream() : void { 
     1472            // reset suspending 
     1473            _suspendStreaming = _suspendWhileLoading && (_loadingSoundList.length > 0); 
     1474 
    14151475            // dispatch streaming start event 
    14161476            var event:SiONEvent = new SiONEvent(SiONEvent.STREAM_START, this, null, true); 
     
    14191479        } 
    14201480         
    1421          
     1481 
    14221482        // on sampleData 
    14231483        private function _streaming(e:SampleDataEvent) : void 
     
    14361496                _inStreaming = true; 
    14371497                 
    1438                 if (_isPaused || _isFirstStreaming) { 
     1498                if (_isPaused || _suspendStreaming) { 
    14391499                    // fill silence 
    14401500                    _fillzero(e.data); 
  • as3/SiOPM/trunk/src/org/si/sion/SiONVoice.as

    r4421 r4540  
    321321         
    322322         
    323         /** Set low pass filter envelop parameters. 
     323        /** Set filter envelop parameters. 
     324         *  @param filterType filter type (0:Low-pass, 1:Band-pass, 2:High-pass) 
     325         *  @param cutoff filter cutoff (0-128) 
     326         *  @param resonance filter resonance (0-9) 
     327         *  @param far filter attack rate (0-63) 
     328         *  @param fdr1 filter decay rate 1 (0-63) 
     329         *  @param fdr2 filter decay rate 2 (0-63) 
     330         *  @param frr filter release rate (0-63) 
     331         *  @param fdc1 filter decay cutoff 1 (0-128) 
     332         *  @param fdc2 filter decay cutoff 2 (0-128) 
     333         *  @param fsc filter sustain cutoff (0-128) 
     334         *  @param frc filter release cutoff (0-128) 
     335         *  @return this SiONVoice instance 
     336         */ 
     337        public function setFilterEnvelop(filterType:int=0, cutoff:int=128, resonance:int=0, far:int=0, fdr1:int=0, fdr2:int=0, frr:int=0, fdc1:int=128, fdc2:int=64, fsc:int=32, frc:int=128) : SiONVoice  
     338        { 
     339            channelParam.filterType = filterType; 
     340            channelParam.cutoff = cutoff; 
     341            channelParam.resonance = resonance; 
     342            channelParam.far = far; 
     343            channelParam.fdr1 = fdr1; 
     344            channelParam.fdr2 = fdr2; 
     345            channelParam.frr = frr; 
     346            channelParam.fdc1 = fdc1; 
     347            channelParam.fdc2 = fdc2; 
     348            channelParam.fsc = fsc; 
     349            channelParam.frc = frc; 
     350            return this; 
     351        } 
     352         
     353         
     354        /** [Pleas use setFilterEnvelop() instead of this function]. Set low pass filter envelop parameters. This function is for compatibility of old versions. 
    324355         *  @param cutoff LP filter cutoff (0-128) 
    325356         *  @param resonance LP filter resonance (0-9) 
     
    333364         *  @param frc LP filter release cutoff (0-128) 
    334365         *  @return this SiONVoice instance 
     366         *  @see setFilterEnvelop() 
    335367         */ 
    336368        public function setLPFEnvelop(cutoff:int=128, resonance:int=0, far:int=0, fdr1:int=0, fdr2:int=0, frr:int=0, fdc1:int=128, fdc2:int=64, fsc:int=32, frc:int=128) : SiONVoice  
    337369        { 
    338             channelParam.cutoff = cutoff; 
    339             channelParam.resonance = resonance; 
    340             channelParam.far = far; 
    341             channelParam.fdr1 = fdr1; 
    342             channelParam.fdr2 = fdr2; 
    343             channelParam.frr = frr; 
    344             channelParam.fdc1 = fdc1; 
    345             channelParam.fdc2 = fdc2; 
    346             channelParam.fsc = fsc; 
    347             channelParam.frc = frc; 
    348             return this; 
     370            return setFilterEnvelop(0, cutoff, resonance, far, fdr1, fdr2, frr, fdc1, fdc2, fsc, frc); 
    349371        } 
    350372         
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelParam.as

    r3638 r4540  
    4444        public var pan:int; 
    4545 
    46         /** LP filter cutoff */ 
     46        /** filter type */ 
     47        public var filterType:int; 
     48        /** filter cutoff */ 
    4749        public var cutoff:int; 
    48         /** LP filter resonance */ 
     50        /** filter resonance */ 
    4951        public var resonance:int; 
    50         /** LP filter attack rate */ 
     52        /** filter attack rate */ 
    5153        public var far:int; 
    52         /** LP filter decay rate 1 */ 
     54        /** filter decay rate 1 */ 
    5355        public var fdr1:int; 
    54         /** LP filter decay rate 2 */ 
     56        /** filter decay rate 2 */ 
    5557        public var fdr2:int; 
    56         /** LP filter release rate */ 
     58        /** filter release rate */ 
    5759        public var frr:int; 
    58         /** LP filter decay offset 1 */ 
     60        /** filter decay offset 1 */ 
    5961        public var fdc1:int; 
    60         /** LP filter decay offset 2 */ 
     62        /** filter decay offset 2 */ 
    6163        public var fdc2:int; 
    62         /** LP filter sustain offset */ 
     64        /** filter sustain offset */ 
    6365        public var fsc:int; 
    64         /** LP filter release offset */ 
     66        /** filter release offset */ 
    6567        public var frc:int; 
    6668         
     
    114116            pan = 64; 
    115117             
     118            filterType = 0; 
    116119            cutoff = 128; 
    117120            resonance = 0; 
     
    151154            pan = org.pan; 
    152155             
     156            filterType = org.filterType; 
    153157            cutoff = org.cutoff; 
    154158            resonance = org.resonance; 
     
    181185            $2("amd", amd, "pmd", pmd); 
    182186            $2("vol", volumes[0],  "pan", pan-64); 
     187            $("filter type", filterType); 
    183188            $2("co", cutoff, "res", resonance); 
    184189            str += "fenv=" + String(far) + "/" + String(fdr1) + "/"+ String(fdr2) + "/"+ String(frr) + "\n"; 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMTable.as

    r4451 r4540  
    6666        static public const PT_PSG_NOISE:int = 4; 
    6767        static public const PT_APU_NOISE:int = 5; 
    68         static public const PT_MAX:int = 5; 
     68//        static public const PT_APU_DPCM:int = 6; 
     69        static public const PT_MAX:int = 6; 
    6970                 
    7071        // pulse generator type (0-511) 
     
    524525            phaseStepShiftFilter[PT_PSG] = 0; 
    525526             
     527/* 
     528            // APU DPCM period table 
     529            var fc_df:Array = [428, 380, 340, 320, 286, 254, 226, 214, 190, 160, 142, 128, 106, 85, 72, 54]; 
     530            imax  = 16<<HALF_TONE_BITS; 
     531            table = new Vector.<int>(imax, true); 
     532            n = psg_clock/(rate*0.018581361171917529); 
     533            for (i=0; i<16; i++) { 
     534                iv = Math.log(n / fc_df[i]) * 1.4426950408889633 * PHASE_MAX / rate; 
     535                for (j=0; j<HALF_TONE_RESOLUTION; j++) { 
     536                    table[(i<<HALF_TONE_BITS)+j] = iv; 
     537                } 
     538            } 
     539            pitchTable[PT_APU_DPCM] = table; 
     540            phaseStepShiftFilter[PT_APU_DPCM] = 0xffffffff; 
     541*/ 
     542             
     543             
    526544             
    527545        // Noise period tables. 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMWavePCMData.as

    r4339 r4540  
    5555         *  @param data wave data, Sound, Vector.&lt;Number&gt; or Vector.&lt;int&gt;. The Sound is extracted inside. 
    5656         *  @param samplingOctave sampling data's octave (octave 5 as 44.1kHz) 
     57         *  @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 
    5758         */ 
    58         function SiOPMWavePCMData(data:*=null, samplingOctave:int=5
     59        function SiOPMWavePCMData(data:*=null, samplingOctave:int=5, isStereoSample:Boolean=false
    5960        { 
    6061            super(SiMMLTable.MT_PCM); 
     
    7071         *  @param data wave data, Sound, Vector.&lt;Number&gt; or Vector.&lt;int&gt;. The Sound is extracted inside. 
    7172         *  @param samplingOctave sampling data's octave (specified octave as 44.1kHz) 
     73         *  @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 
    7274         *  @return this instance. 
    7375         */ 
    74         public function initialize(data:*, samplingOctave:int=5) : SiOPMWavePCMData 
     76        public function initialize(data:*, samplingOctave:int=5, isStereoSample:Boolean=false) : SiOPMWavePCMData 
    7577        { 
    7678            if (data is Sound) wavelet = SiONUtil.logTrans(data as Sound, null, 1048576, 0); 
    77             else if (data is Vector.<Number>) wavelet = SiONUtil.logTransVector(data as Vector.<Number>); 
     79            else if (data is Vector.<Number>) wavelet = SiONUtil.logTransVector(data as Vector.<Number>, isStereoSample); 
    7880            else if (data is Vector.<int>) wavelet = data as Vector.<int>; 
    7981            else if (data == null) wavelet = null; 
  • as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelBase.as

    r4451 r4540  
    7575        // LPFilter 
    7676        /** filter switch */    protected var _filterOn:Boolean; 
    77         /** filter mode */      protected var _filterMode:int; 
     77        /** filter type */      protected var _filterType:int; 
    7878        /** cutoff frequency */ protected var _cutoff:int; 
    7979        /** cutoff frequency */ protected var _cutoff_offset:int; 
     
    9393        /** lfo timer */        protected var _lfo_timer:int; 
    9494        /** lfo timer step */   protected var _lfo_timer_step:int; 
     95        /** lfo step buffer */  protected var _lfo_timer_step_:int; 
    9596        /** lfo phase */        protected var _lfo_phase:int; 
    9697        /** lfo wave table */   protected var _lfo_waveTable:Vector.<int>; 
     
    201202         
    202203        /** filter mode */ 
    203         public function get filterMode() : int { return _filterMode; } 
    204         public function set filterMode(mode:int) : void 
    205         { 
    206             _filterMode = (mode<0 || mode>2) ? 0 : mode; 
     204        public function get filterType() : int { return _filterType; } 
     205        public function set filterType(mode:int) : void 
     206        { 
     207            _filterType = (mode<0 || mode>2) ? 0 : mode; 
    207208        } 
    208209         
     
    290291            _lfo_waveShape = waveform; 
    291292            _lfo_timer = 1; 
    292             _lfo_timer_step = 0; 
     293            _lfo_timer_step_ = _lfo_timer_step = 0; 
    293294            _lfo_phase = 0; 
    294295        } 
     
    300301            _lfo_timer = 0; 
    301302            // 0.17294117647058824 = 44100/(1000*255) 
    302             _lfo_timer_step = (SiOPMTable.LFO_TIMER_INITIAL/(ms*0.17294117647058824)) << _table.sampleRatePitchShift; 
     303            _lfo_timer_step_ = _lfo_timer_step = (SiOPMTable.LFO_TIMER_INITIAL/(ms*0.17294117647058824)) << _table.sampleRatePitchShift; 
    303304             
    304305            //set OPM LFO frequency 
    305306            //_lfo_timer = 0; 
    306             //_lfo_timer_step = _table.lfo_timerSteps[freq & 255]; 
     307            //_lfo_timer_step_ = _lfo_timer_step = _table.lfo_timerSteps[freq & 255]; 
    307308        } 
    308309         
     
    505506            _filterVriables[0] = _filterVriables[1] = _filterVriables[2] = 0; 
    506507            _cutoff_offset = 0; 
    507             _filterMode = FILTER_LP; 
     508            _filterType = FILTER_LP; 
    508509            setSVFilter(); 
    509510            shiftSVFilterState(EG_OFF); 
     
    641642                    _filterVriables[1] += _filterVriables[2] * cut; 
    642643                    _filterVriables[0] += _filterVriables[1] * cut; 
    643                     pointer.i = int(_filterVriables[_filterMode]); 
     644                    pointer.i = int(_filterVriables[_filterType]); 
    644645                    pointer   = pointer.next; 
    645646                } 
     
    664665                _filterVriables[1] += _filterVriables[2] * cut; 
    665666                _filterVriables[0] += _filterVriables[1] * cut; 
    666                 pointer.i = int(_filterVriables[_filterMode]); 
     667                pointer.i = int(_filterVriables[_filterType]); 
    667668                pointer   = pointer.next; 
    668669            } 
  • as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelFM.as

    r4451 r4540  
    7676        /** pm output level */  protected var _pm_out:int; 
    7777         
     78         
    7879        // tone generator setting 
    7980        /** ENV_TIMER_INITIAL * freq_ratio */  protected var _eg_timer_initial:int; 
     
    201202        protected function _lfoSwitch(sw:Boolean) : void 
    202203        { 
    203             var new_lfo_on:int = int(sw); 
    204             if (_lfo_on != new_lfo_on) { 
    205                 _lfo_on = new_lfo_on; 
    206                 _funcProcess = _funcProcessList[_lfo_on][_funcProcessType]; 
    207             } 
     204            _lfo_on = int(sw); 
     205            _funcProcess = _funcProcessList[_lfo_on][_funcProcessType]; 
     206            _lfo_timer_step = (sw) ? _lfo_timer_step_ : 0; 
    208207        } 
    209208         
     
    235234                initializeLFO(param.lfoWaveShape); 
    236235                _lfo_timer = (param.lfoFreqStep>0) ? 1 : 0; 
    237                 _lfo_timer_step = param.lfoFreqStep; 
     236                _lfo_timer_step_ = _lfo_timer_step = param.lfoFreqStep; 
    238237                setAmplitudeModulation(param.amd); 
    239238                setPitchModulation(param.pmd); 
    240239            } 
     240            filterType = param.filterType; 
    241241            setSVFilter(param.cutoff, param.resonance, param.far, param.fdr1, param.fdr2, param.frr, param.fdc1, param.fdc2, param.fsc, param.frc); 
    242242            for (i=0; i<_operatorCount; i++) { 
     
    267267            } 
    268268            param.lfoWaveShape = _lfo_waveShape; 
    269             param.lfoFreqStep  = _lfo_timer_step
     269            param.lfoFreqStep  = _lfo_timer_step_
    270270            param.amd = _am_depth; 
    271271            param.pmd = _pm_depth; 
     
    378378                    v = _table.lfo_timerSteps[data]; 
    379379                    _lfo_timer = (v>0) ? 1 : 0; 
    380                     _lfo_timer_step = v; 
     380                    _lfo_timer_step_ = _lfo_timer_step = v; 
    381381                    break; 
    382382                case 25: // A(0)/P(1):7 DEPTH:6-0 for all 8 channels 
  • as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelKS.as

    r4451 r4540  
    230230            _ks_seedType = 0; 
    231231            _ks_seedIndex = 0; 
    232             setSiOPMParameters(48, 48, 0, 63, 15, 0, 0, 0, 1, 0, 0, 0, 0, 0); 
     232            setSiOPMParameters(48, 48, 0, 63, 15, 0, 0, 0, 1, 0, 0, 0, -1, 0); 
    233233            activeOperator.pgType = SiOPMTable.PG_NOISE_PINK; 
    234234            activeOperator.ptType = SiOPMTable.PT_PCM; 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as

    r4451 r4540  
    8787                track.channel = SiOPMChannelManager.newChannel(_channelType, prev, bufferIndex); 
    8888                SiOPMChannelManager.deleteChannel(prev); 
     89            } else { 
     90                // initialize channel 
     91                track.channel.initialize(track.channel, bufferIndex); 
     92                track._resetVolumeOffset(); 
    8993            } 
    9094 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as

    r4451 r4540  
    901901        static private var _tempNumberList    :SLLint = SLLint.alloc(0); 
    902902        static private var _tempNumberListLast:SLLint = null; 
    903         static private var _tempWaveTable10:Vector.<Number> = new Vector.<Number>(1024, false); 
    904         static private var _tempWaveTable5:Vector.<Number> = new Vector.<Number>(32, false); 
     903        static private var _tempWaveTable:Vector.<Number> = new Vector.<Number>(); 
    905904 
    906905         
     
    908907        private function _parseTableMacro(dat:String, pfx:String) : Boolean 
    909908        { 
    910             return (__parseTableNumbers(dat, pfx, 8192) != null); 
     909            return (__parseTableNumbers(dat, pfx, 65536).pointer != null); 
    911910        } 
    912911         
     
    915914        private function _parseWavMacro(dat:String, pfx:String) : Vector.<Number> 
    916915        { 
    917             var i:int, j:int, jmax:int, v:Number; 
    918              
    919             var num:SLLint = __parseTableNumbers(dat, pfx, 32); 
    920             for (i=0; i<32 && num!=null; i++) { 
     916            var i:int, imax:int, v:Number; 
     917             
     918            var res:* = __parseTableNumbers(dat, pfx, 1024), 
     919                num:SLLint = res.pointer; 
     920            for (imax=2; imax<1024; imax<<=1) { 
     921                if (imax >= res.length) break; 
     922            } 
     923            trace(imax, res.length); 
     924            _tempWaveTable.length = imax; 
     925            for (i=0; i<imax && num!=null; i++) { 
    921926                v = (num.i + 0.5) * 0.0078125; 
    922                 _tempWaveTable5[j++] = (v>1) ? 1 : (v<-1) ? -1 : v; 
     927                _tempWaveTable[i] = (v>1) ? 1 : (v<-1) ? -1 : v; 
    923928                num = num.next; 
    924929            } 
    925             while (i<32) { _tempWaveTable5[i++] = 0; } 
    926              
    927             return _tempWaveTable5
     930            for (; i<imax; i++) { _tempWaveTable[i] = 0; } 
     931             
     932            return _tempWaveTable
    928933        } 
    929934         
     
    932937        private function _parseWavbMacro(dat:String) : Vector.<Number> 
    933938        { 
    934             var ub:int, i:int, j:int, jmax:int, v:Number
     939            var ub:int, i:int, imax:int
    935940             
    936941            dat = dat.replace(/\s+/gm, ''); 
    937             for (i=0; i<32; i++) { 
    938                 ub = (i*2+1 < dat.length) ? int("0x" + dat.substr(i*2,2)) : 0; 
    939                 _tempWaveTable5[j++] = (ub<128) ? (ub * 0.0078125) : ((ub-256) * 0.0078125); 
    940             } 
    941              
    942             return _tempWaveTable5; 
     942            imax = dat.length >> 1; 
     943            _tempWaveTable.length = imax; 
     944            for (i=0; i<imax; i++) { 
     945                ub = parseInt(dat.substr(i<<1,2), 16); 
     946                _tempWaveTable[i] = (ub<128) ? (ub * 0.0078125) : ((ub-256) * 0.0078125); 
     947            } 
     948             
     949            return _tempWaveTable; 
    943950        } 
    944951 
     
    972979         
    973980        // parse table numbers 
    974         private function __parseTableNumbers(dat:String, pfx:String, maxIndex:int) : SLLint 
     981        private function __parseTableNumbers(dat:String, pfx:String, maxIndex:int) : * 
    975982        { 
    976983            var index:int = 0, i:int, imax:int, j:int, v:int, ti0:int, ti1:int, tr:Number,  
     
    10571064            _tempNumberListLast = last; 
    10581065            if (rep) last.next = rep.next; 
    1059             // returns length 
    1060             return _tempNumberList.next; 
     1066            return {'pointer':_tempNumberList.next, 'length':index, 'repeated':(rep!=null)}; 
    10611067        } 
    10621068         
     
    12221228            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    12231229            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1224             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1230            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    12251231            _currentTrack.setToneEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 
    12261232            return e.next; 
     
    12331239            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    12341240            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1235             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1241            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    12361242            _currentTrack.setAmplitudeEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 
    12371243            return e.next; 
     
    12441250            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    12451251            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1246             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1252            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    12471253            _currentTrack.setAmplitudeEnvelop(1, _table.getEnvelopTable(idx), _p[1], true); 
    12481254            return e.next; 
     
    12551261            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    12561262            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1257             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1263            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    12581264            _currentTrack.setPitchEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 
    12591265            return e.next; 
     
    12661272            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    12671273            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1268             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1274            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    12691275            _currentTrack.setNoteEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 
    12701276            return e.next; 
     
    12771283            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    12781284            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1279             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1285            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    12801286            _currentTrack.setFilterEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 
    12811287            return e.next; 
     
    12881294            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    12891295            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1290             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1296            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    12911297            _currentTrack.setToneEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 
    12921298            return e.next; 
     
    12991305            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    13001306            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1301             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1307            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    13021308            _currentTrack.setAmplitudeEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 
    13031309            return e.next; 
     
    13101316            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    13111317            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1312             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1318            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    13131319            _currentTrack.setPitchEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 
    13141320            return e.next; 
     
    13211327            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    13221328            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1323             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1329            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    13241330            _currentTrack.setNoteEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 
    13251331            return e.next; 
     
    13321338            if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next;   // check mask 
    13331339            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    1334             var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255
     1340            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1
    13351341            _currentTrack.setFilterEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 
    13361342            return e.next; 
     
    13611367        private function _onFilterMode(e:MMLEvent) : MMLEvent 
    13621368        { 
    1363             _currentTrack.channel.filterMode = e.data; 
     1369            _currentTrack.channel.filterType = e.data; 
    13641370            return e.next; 
    13651371        } 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTable.as

    r4264 r4540  
    218218    // operations 
    219219    //-------------------------------------------------- 
     220        /** @private [internal use] reset all user tables */ 
     221        _sion_internal function resetAllUserTables() : void 
     222        { 
     223        } 
     224         
     225         
    220226        /** Register envelop table. 
    221227         *  @param index table number refered by &#64;&#64;,na,np,nt,nf,_&#64;&#64;,_na,_np,_nt and _nf. 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as

    r4451 r4540  
    803803            _residue = 0; 
    804804            _priority = 0; 
     805            _env_exp    = null; 
     806            _env_tone   = null; 
     807            _env_note   = _env_zero_table; 
     808            _env_pitch  = _env_zero_table; 
     809            _env_filter = null; 
     810            _env_ma = null; 
     811            _env_mp = null; 
    805812             
    806813            // reset envelop tables 
     
    854861            } 
    855862             
    856             // sounding now, almost executing this 
     863            // no delay, usually 
    857864            if (_trackStartDelay == 0) { 
    858865                return bufferingLength; 
     
    865872            } 
    866873             
    867             // start sounding at this buffering 
     874            // start sound in this frame 
    868875            var len:int = bufferingLength - _trackStartDelay; 
    869876            channel.nop(_trackStartDelay); 
  • as3/SiOPM/trunk/src/org/si/sion/utils/SiONPresetVoice.as

    r3793 r4540  
    633633            voice.gateTime = 0; 
    634634            voice.releaseSweep = sw; 
    635             voice.setLPFEnvelop(cut, res); 
     635            voice.setFilterEnvelop(0, cut, res); 
    636636            voice.name = name; 
    637637            _categolyList.push(voice); 
  • as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as

    r4451 r4540  
    99    import flash.media.*; 
    1010    import flash.utils.ByteArray; 
     11    //import mx.utils.Base64Decoder; 
    1112    import org.si.sion.module.SiOPMTable; 
    1213    import org.si.sion.module.SiOPMWaveTable; 
     
    116117         
    117118         
     119        /** extract 2a03's DPCM data.<br/> 
     120         * DPCM frequency table = [ 
     121         * 0=k14o2e, 
     122         * 1=k18o2f+, 
     123         * 2=k13o2g+, 
     124         * 3=k16o2a, 
     125         * 4=k13o2b, 
     126         * 5=k16o3c+, 
     127         * 6=k17o3d+, 
     128         * 7=k14o3e, 
     129         * 8=k18o3f+, 
     130         * 9=k16o3a, 
     131         * 10=k20o3b, 
     132         * 11=k7o4c+, 
     133         * 12=k24o4e, 
     134         * 13=k13o4g+, 
     135         * 14=k5o4b, 
     136         * 15=k4o5e] 
     137         *  @param src The DPCM ByteArray data extracting from. 
     138         *  @param initValue initial value of $4011. 
     139         *  @param dst The Vector.&lt;Number&gt; instance to put result. You can pass null to create new Vector.&lt;Number&gt; inside. 
     140         *  @param dstChannelCount channel count of extracted data. 1 for monoral, 2 for stereo. 
     141         *  @return extracted data. 
     142         */ 
     143        static public function extractDPCM(src:ByteArray, initValue:int=0, dst:Vector.<Number>=null, dstChannelCount:int=1) : Vector.<Number> 
     144        { 
     145            var data:int, i:int, imax:int, j:int, sample:Number, output:int; 
     146             
     147            imax = src.length * dstChannelCount * 8; 
     148            if (dst == null) dst = new Vector.<Number>(); 
     149            dst.length = imax; 
     150             
     151            output = initValue; 
     152            src.position = 0; 
     153            for (i=0; i<imax;) { 
     154                data = src.readUnsignedByte(); 
     155                for (j=7; j>=0; --j) { 
     156                    if ((data >> j) & 1) if (output<126) output += 2; 
     157                    else                 if (output>1)   output -= 2; 
     158                    sample = (output - 64) * 0.015625; 
     159                    dst[i] = sample; i++; 
     160                    if (dstChannelCount == 2) { dst[i] = sample; i++; } 
     161                } 
     162            } 
     163             
     164            return dst; 
     165        } 
     166         
     167         
    118168        /** extract ADPCM data (YM2151). this algorism is from x68ksound.dll's source code. 
     169         *  _freqTable:Array = [26, 31, 38, 43, 50]; 
    119170         *  @param src The ADPCM ByteArray data extracting from.  
    120171         *  @param dst The Vector.&lt;Number&gt; instance to put result. You can pass null to create new Vector.&lt;Number&gt; inside. 
     
    135186            var DCT:Vector.<int> = Vector.<int>([-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8]); 
    136187 
    137             imax = src.length * 4
     188            imax = src.length * dstChannelCount * 2
    138189            if (dst == null) dst = new Vector.<Number>(); 
    139190            dst.length = imax; 
     
    154205                sample = output * 0.0000019073486328125; 
    155206                dst[i] = sample; i++; 
    156                 dst[i] = sample; i++; 
     207                if (dstChannelCount == 2) { dst[i] = sample; i++; } 
    157208                 
    158209                r = (data >> 4) & 0x0f; 
     
    168219                sample = output * 0.0000019073486328125; 
    169220                dst[i] = sample; i++; 
    170                 dst[i] = sample; i++; 
     221                if (dstChannelCount == 2) { dst[i] = sample; i++; } 
    171222            } 
    172223             
     
    183234        static public function extractYM2608ADPCM(src:ByteArray, dst:Vector.<Number>=null, dstChannelCount:int=1) : Vector.<Number> 
    184235        { 
    185             var data:int, r0:int, r1:int, i:int, imax:int,  
     236            var data:int, r0:int, r1:int, i:int, imax:int, sample:Number,  
    186237                predRate:int = 127, output:int = 0; 
    187238         
     
    191242            var puTable:Vector.<int> = Vector.<int>([57,57,57,57,77,102,128,153,57,57,57,57,77,102,128,153]); 
    192243             
    193             imax = src.length * 2; 
     244            imax = src.length * dstChannelCount * 2; 
    194245            if (dst == null) dst = new Vector.<Number>(); 
    195246            dst.length = imax; 
     
    203254                predRate >>= 3; 
    204255                output += predRate; 
    205                 dst[i] = output * 0.000030517578125; 
     256                sample = output * 0.000030517578125; 
     257                dst[i] = sample; i++; 
     258                if (dstChannelCount == 2) { dst[i] = sample; i++; } 
    206259                predRate *= puTable[r0] 
    207260                predRate >>= 6; 
     
    213266                    else if (predRate < -24576) predRate = -24576; 
    214267                } 
    215                 i++; 
    216268                 
    217269                predRate *= crTable[r1]; 
    218270                predRate >>= 3; 
    219271                output += predRate; 
    220                 dst[i] = output * 0.000030517578125; 
     272                sample = output * 0.000030517578125; 
     273                dst[i] = sample; i++; 
     274                if (dstChannelCount == 2) { dst[i] = sample; i++; } 
    221275                predRate *= puTable[r1]; 
    222276                predRate >>= 6; 
     
    228282                    else if (predRate < -24576) predRate = -24576; 
    229283                } 
    230                 i++; 
    231284            } 
    232285             
  • as3/SiOPM/trunk/src/org/si/sion/utils/SoundClass.as

    r4264 r4540  
    99    import flash.display.Loader; 
    1010    import flash.events.Event; 
     11    import flash.events.IOErrorEvent; 
    1112    import flash.utils.ByteArray; 
    1213    import flash.media.Sound; 
     
    3132        ]); 
    3233        static private var _footer:Vector.<uint> = Vector.<uint>([ // little endian 
    33             0x000f133f, 0x00010000, 0x6f530001, 0x43646e75, 0x7373616c, 0x0f0b4400, 0x40000000, 0x00000000 
     34            0x000f133f, 0x00010000, 0x6f530001, 0x43646e75, 0x7373616c, 0x0f0b4400, 0x40000000 
    3435        ]); 
     36         
     37         
     38        static private const _bitRateList:Vector.<int> = Vector.<int>([ 
     39            0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0,0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0 
     40        ]); 
     41        static private const _frequencyList:Vector.<int> = Vector.<int>([44100,48000,32000,0]); 
     42         
     43        /** load Sound class from mp3 data. 
     44         */ 
     45        static public function loadMP3FromByteArray(bytes:ByteArray, onComplete:Function) : void { 
     46            var head:uint, version:int, bitrate:int, frequency:int, padding:int, channels:int, frameLength:int; 
     47            bytes.position = 0; 
     48            var id:String; 
     49            if (bytes.readMultiByte(3,"us-ascii") == "ID3") { 
     50                bytes.position += 3; // slip version and flag 
     51                bytes.position += ((bytes.readByte()&127)<<21)|((bytes.readByte()&127)<<14)|((bytes.readByte()&127)<<7)|(bytes.readByte()&127); 
     52            } else { 
     53                bytes.position -= 3; 
     54            } 
     55            var frameCount:int = 0, byteCount:int = 9, headPosition:uint = bytes.position; 
     56            while (bytes.bytesAvailable) { 
     57                head = bytes.readUnsignedInt(); 
     58                if ((uint(head & 0xffe60000)) != 0xffe20000) throw new Error("frame data broken"); // check frameSync & layerIII 
     59                version = [2,-1,1,0][(head>>19) & 3]; // 0=v1, 1=v2, 2=v2.5 
     60                bitrate = _bitRateList[((head>>12) & 15) + ((version == 0) ? 0 : 16)]; 
     61                frequency = _frequencyList[((head>>10) & 3)] >> version; 
     62                padding = (head>>9) & 1; 
     63                channels = (((head>>6) & 3) > 2) ? 1 : 2; 
     64                frameLength = 144000 * bitrate / frequency + padding - 4; 
     65                byteCount += frameLength; 
     66                bytes.position += frameLength; 
     67            } 
     68            var src:ByteArray = new ByteArray(); 
     69            src.writeInt(frameCount*1152); 
     70            src.writeShort(0); 
     71            src.writeBytes(bytes, headPosition, byteCount); 
     72            loadPCMFromByteArray(src, onComplete, true, frequency, 16, channels); 
     73        } 
     74         
     75        /** load Sound class from PCM data. 
     76         */ 
     77        static public function loadPCMFromByteArray(src:ByteArray, onComplete:Function, compressed:Boolean=false, sampleRate:int=44100, bitRate:int=16, channels:int=2) : void { 
     78            var size:int = src.length, typeDef:int, 
     79                bytes:ByteArray = new ByteArray(); 
     80            typeDef  = (compressed) ? 0x20 : 0x30; 
     81            typeDef |= (channels==2) ? 0x01: 0x00; 
     82            switch (sampleRate) { 
     83            case 44100: typeDef |= 0xc; break; 
     84            case 22050: typeDef |= 0x8; break; 
     85            case 11025: typeDef |= 0x4; break; 
     86            case  5512: break; 
     87            default: throw new Error("sampleRate not valid."); 
     88            } 
     89            switch (bitRate) { 
     90            case 16: typeDef |= 0x2; break; 
     91            case 8:  break; 
     92            default: throw new Error("bitRate not valid."); 
     93            } 
     94            bytes.endian = "littleEndian"; 
     95            bytes.length = size + 299; 
     96            bytes.position = 0; 
     97            _write(_header); 
     98            bytes.position = 4; 
     99            bytes.writeUnsignedInt(size + 299); 
     100            bytes.position = 257; 
     101            bytes.writeUnsignedInt(size + 7); 
     102            bytes.position = 263; 
     103            bytes.writeByte(typeDef); 
     104            bytes.writeBytes(src); 
     105            _write(_footer); 
     106            bytes.writeByte(0); 
     107            bytes.writeByte(0); 
     108            bytes.writeByte(0); 
     109            bytes.position = 0; 
     110             
     111            var loader:Loader = new Loader(); 
     112            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event) : void { 
     113                var soundClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("SoundClass") as Class; 
     114                onComplete((soundClass) ? (new soundClass()) as Sound : null); 
     115            }); 
     116            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event) : void { 
     117                throw new Error(e.toString()); 
     118            }); 
     119            loader.loadBytes(bytes); 
     120             
     121            function _write(vu:Vector.<uint>) : void { 
     122                for (var i:int=0; i<vu.length; i++) bytes.writeUnsignedInt(vu[i]); 
     123            } 
     124             
     125        } 
    35126         
    36127         
     
    55146            for (i=0; i<imax; i++) { bytes.writeShort(samples[i]*32767); } 
    56147            _write(_footer); 
     148            bytes.writeByte(0); 
     149            bytes.writeByte(0); 
     150            bytes.writeByte(0); 
     151            bytes.position = 0; 
    57152             
    58153            var loader:Loader = new Loader(); 
    59             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete); 
     154            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event) : void { 
     155                trace(loader.content); 
     156                var soundClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("SoundClass") as Class; 
     157                onComplete((soundClass) ? (new soundClass()) as Sound : null); 
     158            }); 
     159            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event) : void { 
     160                throw new Error(e.toString()); 
     161            }); 
    60162            loader.loadBytes(bytes); 
    61163             
    62164            function _write(vu:Vector.<uint>) : void { for each (var ui:uint in vu) { bytes.writeUnsignedInt(ui); } } 
    63              
    64             function _onComplete(e:Event) : void { 
    65                 var soundClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("SoundClass") as Class; 
    66                 onComplete((soundClass) ? (new soundClass()) as Sound : null); 
    67             } 
    68165        } 
    69166    } 
  • as3/SiOPM/trunk/src/org/si/sound/synthesizers/BasicSynth.as

    r4451 r4540  
    6262         
    6363         
     64        /** filter type (0:lowpass, 1:bandpass, 2:highpass) */ 
     65        public function set filterType() : int { return _voice.channelParam.filterType; } 
     66        public function get filterType(t:int) : void { 
     67            _voice.channelParam.filterType = t; 
     68            for (i=0; i<imax; i++) { 
     69                _tracks[i].channel.filterType = t; 
     70            } 
     71        } 
     72         
     73         
     74         
    6475        /** modulation (low-frequency oscillator) wave shape, 0=saw, 1=square, 2=triangle, 3=random. */ 
    6576        public function get lfoWaveShape() : int { return _voice.channelParam.lfoWaveShape; } 
     
    161172    // operations 
    162173    //---------------------------------------- 
    163         /** set low-pass filter envelop (same as '&#64;f' command in MML). 
     174        /** set filter envelop (same as '&#64;f' command in MML). 
    164175         *  @param cutoff LP filter cutoff (0-1) 
    165176         *  @param resonance LP filter resonance (0-1) 
     
    173184         *  @param frc LP filter release cutoff (0-1) 
    174185         */ 
     186        public function setFilterEnvelop(filterType:int=0, cutoff:Number=1, resonance:Number=0, far:int=0, fdr1:int=0, fdr2:int=0, frr:int=0, fdc1:Number=1, fdc2:Number=0.5, fsc:Number=0.25, frc:Number=1) : void 
     187        { 
     188            _voice.setFilterEnvelop(filterType, cutoff*128, resonance*9, far, fdr1, fdr2, frr, fdc1*128, fdc2*128, fsc*128, frc*128); 
     189            _voiceUpdateNumber++; 
     190        } 
     191         
     192         
     193        /** [Please use setFilterEnvelop instead of this function]. This function is for compatibility of old versions. 
     194         *  @param cutoff LP filter cutoff (0-1) 
     195         *  @param resonance LP filter resonance (0-1) 
     196         *  @param far LP filter attack rate (0-63) 
     197         *  @param fdr1 LP filter decay rate 1 (0-63) 
     198         *  @param fdr2 LP filter decay rate 2 (0-63) 
     199         *  @param frr LP filter release rate (0-63) 
     200         *  @param fdc1 LP filter decay cutoff 1 (0-1) 
     201         *  @param fdc2 LP filter decay cutoff 2 (0-1) 
     202         *  @param fsc LP filter sustain cutoff (0-1) 
     203         *  @param frc LP filter release cutoff (0-1) 
     204         */ 
    175205        public function setLPFEnvelop(cutoff:Number=1, resonance:Number=0, far:int=0, fdr1:int=0, fdr2:int=0, frr:int=0, fdc1:Number=1, fdc2:Number=0.5, fsc:Number=0.25, frc:Number=1) : void 
    176206        { 
    177             _voice.setLPFEnvelop(cutoff*128, resonance*9, far, fdr1, fdr2, frr, fdc1*128, fdc2*128, fsc*128, frc*128); 
    178             _voiceUpdateNumber++; 
     207            setFilterEnvelop(0, cutoff, resonance, far, fdr1, fdr2, frr, fdc1, fdc2, fsc, frc); 
    179208        } 
    180209         
  • as3/SiOPM/trunk/src/org/si/sound/synthesizers/DrumMachinePresetVoice.as

    r3793 r4540  
    130130            voice.channelParam.operatorParam[0].tl = tl; 
    131131            voice.releaseSweep = sw; 
    132             voice.setLPFEnvelop(cut, res); 
     132            voice.setFilterEnvelop(0, cut, res); 
    133133            voice.name = name; 
    134134            _categolyList.push(voice); 
  • as3/SiOPM/trunk/src/org/si/sound/synthesizers/PCMSynth.as

    r4264 r4540  
    4444         *  @param data wave data, Sound or Vector.&lt;Number&gt; can be set, the Sound is extracted inside. 
    4545         *  @param samplingOctave sampling data's octave (specified octave is as 44.1kHz) 
     46         *  @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 
    4647         */ 
    47         function PCMSynth(data:*=null, samplingOctave:int=5
     48        function PCMSynth(data:*=null, samplingOctave:int=5, isStereoSample:Boolean=false
    4849        { 
    49             _defaultPCMData = new SiOPMWavePCMData(data, samplingOctave); 
     50            _defaultPCMData = new SiOPMWavePCMData(data, samplingOctave, isStereoSample); 
    5051            _pcmTable = new SiOPMWavePCMTable(); 
    5152            _pcmTable.clear(_defaultPCMData); 
     
    9091         *  @param keyRangeFrom Assigning key range starts from 
    9192         *  @param keyRangeTo Assigning key range ends at. -1 to set only at the key of argument "keyRangeFrom". 
     93         *  @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 
    9294         *  @return assigned SiOPMWavePCMData. 
    9395         */ 
    94         public function setSample(data:*, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127) : SiOPMWavePCMData 
     96        public function setSample(data:*, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127, isStereoSample:Boolean=false) : SiOPMWavePCMData 
    9597        { 
    9698            var pcmData:SiOPMWavePCMData; 
     
    99101                pcmData = _defaultPCMData; 
    100102            } else { 
    101                 pcmData = new SiOPMWavePCMData(data, samplingOctave); 
     103                pcmData = new SiOPMWavePCMData(data, samplingOctave, isStereoSample); 
    102104            } 
    103105            _voiceUpdateNumber++; 
  • as3/SiOPM/trunk/src/org/si/sound/synthesizers/PMGuitarSynth.as

    r3825 r4540  
    1111     
    1212     
    13     /** Physical Modeling Guitar Synthesizer (NOT IMPLEMENTED) 
     13    /** Physical Modeling Guitar Synthesizer 
    1414     */ 
    1515    public class PMGuitarSynth extends BasicSynth 
     
    2727        protected var _plunkVelocity:Number; 
    2828         
     29        /** @private [protected] tl offset by attack rate. */ 
     30        protected var _tlOffsetByAR:Number; 
    2931         
    3032         
     
    3739            _voice.pmsTension = t * 63; 
    3840            _voiceUpdateNumber++; 
    39 /* 
    40             var i:int, imax:int = _tracks.length, ch:SiOPMChannelFM; 
     41            var i:int, imax:int = _tracks.length, ch:SiOPMChannelKS; 
    4142            for (i=0; i<imax; i++) { 
    4243                ch = _tracks[i].channel as SiOPMChannelKS; 
    43                 if (ch != null) { 
    44                     ch.operator[0].setAllReleaseRate(_voice.pmsTension); 
    45                 } 
     44                if (ch != null) ch.setAllReleaseRate(_voice.pmsTension); 
    4645            } 
    47 */         
    48         } 
    49          
    50          
    51         /** strength of left hand mute [0-1]. */ 
    52         public function get mute() : Number { return _voice.pmsTension * 0.015873015873015872; } 
    53         public function set mute(t:Number) : void { 
    54             _voice.pmsTension = t * 63; 
    55             _voiceUpdateNumber++; 
    56 /* 
    57             var i:int, imax:int = _tracks.length, ch:SiOPMChannelFM; 
    58             for (i=0; i<imax; i++) { 
    59                 ch = _tracks[i].channel as SiOPMChannelKS; 
    60                 if (ch != null) { 
    61                     ch.operator[0].setAllReleaseRate(_voice.pmsTension); 
    62                 } 
    63             } 
    64 */         
    6546        } 
    6647         
     
    7051        public function set plunkVelocity(v:Number) : void { 
    7152            _plunkVelocity = (v<0) ? 0 : (v>1) ? 1 : v; 
    72             _voice.channelParam.operatorParam[0].tl = (_plunkVelocity==0) ? 127 : _plunkVelocity * 64
     53            _voice.channelParam.operatorParam[0].tl = (_plunkVelocity==0) ? 127 : (_plunkVelocity * 64 - _tlOffsetByAR)
    7354            _voiceUpdateNumber++; 
    7455        } 
    7556         
     57         
     58        /** wave shape of plunk noise. @default 20 (SiOPMTable.PG_NOISE_PINK) */ 
     59        public function get seedWaveShape() : int { return _voice.channelParam.operatorParam[0].ws; } 
     60        public function set seedWaveShape(ws:int) : void {  
     61            _voice.channelParam.operatorParam[0].ws = ws; 
     62            _voiceUpdateNumber++; 
     63        } 
     64         
     65         
     66        /** pitch of plunk noise. @default 68 */ 
     67        public function get seedPitch() : int { return _voice.channelParam.operatorParam[0].fixedPitch; } 
     68        public function set seedPitch(p:int) : void {  
     69            _voice.channelParam.operatorParam[0].fixedPitch = p; 
     70            _voiceUpdateNumber++; 
     71        } 
     72         
     73         
     74        /** attack time of plunk noise (0-1). */ 
     75        override public function get attackTime() : Number {  
     76            var iar:int = _voice.channelParam.operatorParam[0].ar; 
     77            return  (iar > 48) ? 0 : (1 - (iar - 16)* 0.03125); 
     78        } 
     79        override public function set attackTime(n:Number) : void {  
     80            var iar:int = ((1 - n) * 32) + 16; 
     81            _tlOffsetByAR = n * 16; 
     82            _voice.channelParam.operatorParam[0].ar = iar; 
     83            _voice.channelParam.operatorParam[0].tl = (_plunkVelocity==0) ? 127 : (_plunkVelocity * 64 - _tlOffsetByAR); 
     84            _voiceUpdateNumber++; 
     85        } 
     86         
     87         
     88        /** release time of guitar synthesizer is equal to (1-tension). */ 
     89        override public function get releaseTime() : Number { return tension; } 
     90        override public function set releaseTime(n:Number) : void { tension = 1-n; } 
    7691         
    7792         
     
    85100        function PMGuitarSynth(tension:Number=0.125) 
    86101        { 
     102            super(); 
     103            _voice.setPMSGuitar(48, 48, 0, 68, 20, int(tension*63)); 
     104            attackTime = 0; 
     105            plunkVelocity = 1; 
    87106        } 
    88107         
     
    92111    // operation 
    93112    //---------------------------------------- 
     113        /** Set all parameters of phisical modeling synth guitar voice. 
     114         *  @param ar attack rate of plunk energy 
     115         *  @param dr decay rate of plunk energy 
     116         *  @param tl total level of plunk energy 
     117         *  @param fixedPitch plunk noise pitch 
     118         *  @param ws wave shape of plunk 
     119         *  @param tension sustain rate of the tone 
     120         */ 
     121        public function setPMSGuitar(ar:int=48, dr:int=48, tl:int=0, fixedPitch:int=68, ws:int=20, tension:int=8) : PMGuitarSynth 
     122        { 
     123            _voice.setPMSGuitar(ar, dr, tl, fixedPitch, ws, tension); 
     124            _voiceUpdateNumber++; 
     125            return this; 
     126        } 
    94127    } 
    95128}