チェンジセット 2697

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

サウンドライブラリ SiON ver0.5.3 更新 tutrial 追加など

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/SiOPM/trunk/doc/mml_reference/siopm_mml_ref_05.html

    r2625 r2697  
    22  <head> 
    33    <meta http-equiv='content-type' content='text/html;charset=utf-8'> 
    4     <title>SiOPM MML reference (version 0.5.2)</title> 
     4    <title>SiOPM MML reference (version 0.5.3)</title> 
    55    <script type='text/javascript' src='jquery.js'></script> 
    66    <script type='text/javascript' src='siopm.js'></script> 
     
    139139  </head> 
    140140  <body> 
    141     <h1>SiOPM MML reference (version 0.5.2)</h1> 
     141    <h1>SiOPM MML reference (version 0.5.3)</h1> 
    142142    <div class='copyright'>(c) keim +Si+ 2009</div> 
    143143 
     
    563563                <td class='range'>time;Delay time[ms](200)<br/>fb;Feedback[%](25)<br/>cross;Stereo channel crossing(0)</td> 
    564564                <td class='desc'><b><u>DELAY</u></td> 
     565              </tr> 
     566              <tr> 
     567                <td class='state'>reverb<i>dly1,dly2,fb</i></td> 
     568                <td class='range'>dly1;Long delay time[%](65)<br/>dly1;Short delay time[%](15)<br/>fb;Feedback[%](90)</td> 
     569                <td class='desc'><b><u>REVERB</u></td> 
    565570              </tr> 
    566571              <tr> 
  • as3/SiOPM/trunk/doc/mml_reference/siopm_mml_ref_05_e.html

    r2625 r2697  
    22  <head> 
    33    <meta http-equiv='content-type' content='text/html;charset=utf-8'> 
    4     <title>SiOPM MML reference (version 0.5.2)</title> 
     4    <title>SiOPM MML reference (version 0.5.3)</title> 
    55    <script type='text/javascript' src='jquery.js'></script> 
    66    <script type='text/javascript' src='siopm.js'></script> 
     
    139139  </head> 
    140140  <body> 
    141     <h1>SiOPM MML reference (version 0.5.2)</h1> 
     141    <h1>SiOPM MML reference (version 0.5.3)</h1> 
    142142    <div class='copyright'>(c) keim +Si+ 2009</div> 
    143143 
     
    563563                <td class='range'>time;Delay time[ms](200)<br/>fb;Feedback[%](25)<br/>cross;Stereo channel crossing(0)</td> 
    564564                <td class='desc'><b><u>DELAY</u></td> 
     565              </tr> 
     566              <tr> 
     567                <td class='state'>reverb<i>dly1,dly2,fb</i></td> 
     568                <td class='range'>dly1;Long delay time[%](65)<br/>dly1;Short delay time[%](15)<br/>fb;Feedback[%](90)</td> 
     569                <td class='desc'><b><u>REVERB</u></td> 
    565570              </tr> 
    566571              <tr> 
     
    14781483            <td class='state'>@lfo<i>n1</i>,<i>n2</i></td> 
    14791484            <td class='range'>n1; 1 - (20)<br/>n2; 0 - 3 (2)</td> 
    1480             <td class='desc'><b>(<u>L</u>ow <u>F</u>requency <u>O</u>scilator)Setting of LFO.</b> The 1st argument sets frequency of LFO and 2nd argument sets wave shape (0;downward saw, 1;square, 2;triangle, 3;random). This command initilaizes settings of 'mp' and 'ma' ("mp0ma0"). 
     1485            <td class='desc'><b>(<u>L</u>ow <u>F</u>requency <u>O</u>scilator)Setting of LFO.</b> The 1st argument sets time cycle of LFO (60=1[sec]) and 2nd argument sets wave shape (0;downward saw, 1;square, 2;triangle, 3;random). This command initilaizes settings of 'mp' and 'ma' ("mp0ma0"). 
    14811486<pre class='example'> 
    14821487@lfo30 mp32c1 @lfo10 mp32c1 
  • as3/SiOPM/trunk/samples/SiOPMJavaScriptBridge/SiOPMJavaScriptBridge.as

    r2625 r2697  
    2929            driver = new SiONDriver(); 
    3030            data = new SiONData(); 
    31             addChild(driver)
     31            driver.autoStop = true
    3232             
    3333            //new pcmExample(driver); 
     
    5050            driver.addEventListener(SiONEvent.STREAM_START,   _onStreamStart); 
    5151            driver.addEventListener(SiONEvent.STREAM_STOP,    _onStreamStop); 
     52            driver.addEventListener(SiONEvent.FADE_IN_COMPLETE,  _onFadeInComplete); 
     53            driver.addEventListener(SiONEvent.FADE_OUT_COMPLETE, _onFadeOutComplete); 
    5254             
    5355            // callback onLoad 
     
    6668        private function _onStreamStop(e:SiONEvent)      : void { ExternalInterface.call('SIOPM._internal_onStreamStop'); } 
    6769        private function _onCompileComplete(e:SiONEvent) : void { ExternalInterface.call('SIOPM._internal_onCompileComplete', data.title); } 
     70        private function _onFadeInComplete(e:SiONEvent)  : void { ExternalInterface.call('SIOPM._internal_onFadeInComplete'); } 
     71        private function _onFadeOutComplete(e:SiONEvent) : void { ExternalInterface.call('SIOPM._internal_onFadeOutComplete'); } 
    6872         
    6973         
     
    117121            return driver.position; 
    118122        } 
     123         
     124         
     125        private function _fadeIn(t:*) : void 
     126        { 
     127            var time:Number = Number(t); 
     128            if (!isNaN(time)) { 
     129                driver.fadeIn(time); 
     130            } else { 
     131                driver.fadeIn(3); 
     132            } 
     133        } 
     134         
     135         
     136        private function _fadeOut(t:*) : void 
     137        { 
     138            var time:Number = Number(t); 
     139            if (!isNaN(time)) { 
     140                driver.fadeOut(time); 
     141            } else { 
     142                driver.fadeOut(3); 
     143            } 
     144        } 
    119145    } 
    120146} 
     
    141167    function pcmExample(driver:SiONDriver) 
    142168    { 
    143         driver.setPCMData(0, new hit_mp3()); 
    144         driver.setWaveData(60, new kick_mp3()); //o5c 
    145         driver.setWaveData(62, new sdw_mp3());  //o5d 
    146         driver.setWaveData(64, new sds_mp3());  //o5e 
    147         driver.setWaveData(65, new toml_mp3()); //o5f 
    148         driver.setWaveData(67, new tomh_mp3()); //o5g 
    149         driver.setWaveData(48, new hatc_mp3()); //o4c 
    150         driver.setWaveData(50, new hath_mp3()); //o4d 
    151         driver.setWaveData(52, new hato_mp3()); //o4e 
    152         driver.setWaveData(53, new crash_mp3()); //o4f 
    153         driver.setWaveData(55, new bell_mp3());  //o4g 
     169        driver.setPCMSound(0, new hit_mp3()); 
     170        driver.setSamplerSound(60, new kick_mp3()); //o5c 
     171        driver.setSamplerSound(62, new sdw_mp3());  //o5d 
     172        driver.setSamplerSound(64, new sds_mp3());  //o5e 
     173        driver.setSamplerSound(65, new toml_mp3()); //o5f 
     174        driver.setSamplerSound(67, new tomh_mp3()); //o5g 
     175        driver.setSamplerSound(48, new hatc_mp3()); //o4c 
     176        driver.setSamplerSound(50, new hath_mp3()); //o4d 
     177        driver.setSamplerSound(52, new hato_mp3()); //o4e 
     178        driver.setSamplerSound(53, new crash_mp3()); //o4f 
     179        driver.setSamplerSound(55, new bell_mp3());  //o4g 
    154180    } 
    155181} 
  • as3/SiOPM/trunk/samples/SiOPMJavaScriptBridge/siopm.js

    r2526 r2697  
    2020// version informations 
    2121//------------------------------ 
    22 SIOPM.VERSION = '0.3.0'; 
     22SIOPM.VERSION = '0.4.0'; 
    2323SIOPM.SWF_VERSION = 'SWF has not loaded.'; 
    2424SIOPM.toString = function() { return 'SIOPM_VERSION: ' + SIOPM.VERSION + '/ SWF_VERSION: ' + SIOPM.SWF_VERSION; }; 
     
    7979SIOPM.onStreamStop = function() {}; 
    8080 
     81// call back after fading in. 
     82SIOPM.onFadeInComplete = function() {}; 
     83 
     84// call back after fading out. 
     85SIOPM.onFadeOutComplete = function() {}; 
     86 
    8187// call back when error appears. 
    8288SIOPM.onError = function() {}; 
     
    111117// control/refer position by Number (unit in milli-second), you can refer the position to call this without any arguments. 
    112118SIOPM.position = function() { return SIOPM.mmlPlayer._position(arguments[0]); } 
     119 
     120// fade in time (unit in second). 
     121SIOPM.fadeIn = function() { return SIOPM.mmlPlayer._fadeIn(arguments[0]); } 
     122 
     123// fade out time (unit in second). 
     124SIOPM.fadeOut = function() { return SIOPM.mmlPlayer._fadeOut(arguments[0]); } 
    113125 
    114126// initialize. call this first of all. ussualy call this in body.onLoad(). this calls back onLoad() when the SiOPM is initialized successfully. 
     
    203215    SIOPM.onStreamStop(); 
    204216} 
    205  
    206  
     217SIOPM._internal_onFadeInComplete = function () { 
     218    SIOPM.onFadeInComplete(); 
     219
     220SIOPM._internal_onFadeOutComplete = function () { 
     221    SIOPM.onFadeOutComplete(); 
     222
     223 
     224 
  • as3/SiOPM/trunk/samples/Tutorials/EventTrigger.as

    r2625 r2697  
    1818        function EventTrigger() { 
    1919            // compile with event trigger command (%t) 
    20             mainMelody = driver.compile("%t0,1,1 t100 l8 [ccggaag4 ffeeddc4 | [ggffeed4]2 ]2") 
     20            mainMelody = driver.compile("%t0,1,1 t100 l8 [ccggaag4 ffeeddc4 | [ggffeed4]2 ]2"); 
    2121             
    2222            // listen triggers 
  • as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as

    r2633 r2697  
    2626    import org.si.sion.effector.SiEffectModule; 
    2727    import org.si.sion.utils.SiONUtil; 
     28    import org.si.sion.utils.Fader; 
    2829     
    2930     
     
    4950    //---------------------------------------- 
    5051        /** version number */ 
    51         static public const VERSION:String = "0.5.2"; 
     52        static public const VERSION:String = "0.5.3"; 
     53         
     54         
     55        /** note-on exception mode "ignore", No exception. */ 
     56        static public const NEM_IGNORE:int = 0; 
     57        /** note-on exception mode "reject", Reject new note. */ 
     58        static public const NEM_REJECT:int = 1; 
     59        /** note-on exception mode "overwrite", Overwrite current note. */ 
     60        static public const NEM_OVERWRITE:int = 2; 
     61        /** note-on exception mode "shift", Shift sound timing. */ 
     62        static public const NEM_SHIFT:int = 3; 
     63         
     64        static private const NEM_MAX:int = 4; 
    5265         
    5366         
     
    8295        private var _soundChannel:SoundChannel;     // sound channel instance 
    8396        private var _soundTransform:SoundTransform; // sound transform 
     97        private var _fader:Fader;                   // sound fader 
    8498 
    8599        private var _backgroundSound:Sound;      // background Sound 
     
    93107        private var _debugMode:Boolean;         // true; throw Error, false; throw ErrorEvent 
    94108        private var _dispatchStreamEvent:Boolean; // dispatch steam event 
     109        private var _dispatchFadingEvent:Boolean; // dispatch fading event 
    95110        private var _cannotChangeBPM:Boolean;     // internal flag not to change bpm 
     111        private var _inStreaming:Boolean;         // in streaming 
     112        private var _preserveStop:Boolean;        // preserve stop after streaming 
    96113 
    97114        private var _queueInterval:int;         // interupting interval to execute queued jobs 
     
    100117        private var _currentJob:int;            // current job 0=no job, 1=compile, 2=render 
    101118         
    102          
     119        private var _autoStop:Boolean;          // auto stop when the sequence finished 
     120        private var _noteOnExceptionMode:int;  // track id exception mode 
    103121        private var _isPaused:Boolean;          // flag to pause 
    104122        private var _position:Number;           // start position [ms] 
     123        private var _masterVolume:Number;       // master volume 
     124        private var _faderVolume:Number;        // fader volume 
    105125         
    106126        private var _triggerEventQueue:Vector.<SiONTrackEvent>; 
    107127         
    108128        private var _renderBuffer:Vector.<Number>;  // rendering buffer 
     129        private var _renderBufferChannelCount:int;  // rendering buffer channel count 
    109130        private var _renderBufferIndex:int;         // rendering buffer writing index 
    110131        private var _renderBufferSizeMax:int;       // maximum value of rendering buffer size 
     
    147168        public function get sound() : Sound { return _sound; } 
    148169         
    149         /** Sound channel. This property is only available during playing sound. */ 
     170        /** Sound channel, this property is only available during playing sound. */ 
    150171        public function get soundChannel() : SoundChannel { return _soundChannel; } 
     172 
     173        /** Fader to control fade-in/out. fader.isActive refers fading or not. */ 
     174        public function get fader() : Fader { return _fader; } 
    151175         
    152176         
     
    159183         
    160184        /** Sound volume. */ 
    161         public function get volume() : Number { return _soundTransform.volume; } 
     185        public function get volume() : Number { return _masterVolume; } 
    162186        public function set volume(v:Number) : void { 
    163             _soundTransform.volume = v;  
     187            _masterVolume = v; 
     188            _soundTransform.volume = _masterVolume * _faderVolume; 
    164189            if (_soundChannel) _soundChannel.soundTransform = _soundTransform; 
    165190        } 
     
    208233         
    209234        // operation 
    210         /** Buffering position[ms] on mml data. */ 
     235        /** Buffering position[ms] on mml data. @default 0 */ 
    211236        public function get position() : Number { 
    212237            return sequencer.processedSampleCount * 1000 / _sampleRate; 
     
    220245        } 
    221246         
    222         /** Beat par minute. */ 
     247        /** Beat par minute. @default 120 */ 
    223248        public function get bpm() : Number { 
    224249            return (sequencer.isReadyToProcess) ? sequencer.bpm : sequencer.setting.defaultBPM; 
     
    233258        } 
    234259         
    235         /** Debug mode, true; throw Error / false; throw ErrorEvent when error appears. */ 
     260        /** Auto stop when the sequence finished or fade-outed. @default false */ 
     261        public function get autoStop() : Boolean { return _autoStop; } 
     262        public function set autoStop(mode:Boolean) : void { _autoStop = mode; } 
     263         
     264        /** Debug mode, true; throw Error / false; throw ErrorEvent when error appears. @default false */ 
    236265        public function get debugMode() : Boolean { return _debugMode; } 
    237266        public function set debugMode(mode:Boolean) : void { _debugMode = mode; } 
    238267         
     268        /** track id exception mode. This value have to be SiONDriver.NEM_*. @default NEM_IGNORE.  
     269         *  @see #NEM_IGNORE 
     270         *  @see #NEM_REJECT 
     271         *  @see #NEM_OVERWRITE 
     272         *  @see #NEM_SHIFT 
     273         *  @see #NEM_SHIFT_OVERWRITE 
     274         */ 
     275        public function get noteOnExceptionMode() : int { return _noteOnExceptionMode; } 
     276        public function set noteOnExceptionMode(mode:int) : void { _noteOnExceptionMode = (0<mode && mode<NEM_MAX) ? mode : 0; } 
     277         
    239278         
    240279         
     
    242281    // constructor 
    243282    //---------------------------------------- 
    244         /** Create driver to manage the sound module, sequencer and effectors. 
     283        /** Create driver to manage the sound module, sequencer and effectors. Only one SiONDriver instance can be created. 
    245284         *  @param bufferLength Buffer size of sound stream. 8192, 4096 or 2048 is available, but no check. 
    246285         *  @param channel Channel count. 1 or 2 is available. 
     
    261300            _sound = new Sound(); 
    262301            _soundTransform = new SoundTransform(); 
     302            _fader = new Fader(); 
    263303 
    264304            // initialize 
     
    270310            _listenEvent = NO_LISTEN; 
    271311            _dispatchStreamEvent = false; 
     312            _dispatchFadingEvent = false; 
    272313            _cannotChangeBPM = false; 
     314            _preserveStop = false; 
     315            _inStreaming = false; 
     316            _autoStop = false; 
     317            _noteOnExceptionMode = NEM_IGNORE; 
    273318            _debugMode = false; 
    274319             
     
    277322            _backgroundBuffer = null; 
    278323             
    279             _soundTransform.volume = 1; 
     324            _position = 0; 
     325            _masterVolume = 1; 
     326            _faderVolume = 1; 
    280327            _soundTransform.pan = 0; 
    281             _position = 0
     328            _soundTransform.volume = _masterVolume * _faderVolume
    282329             
    283330            _eventListenerPrior = 1; 
     
    350397        { 
    351398            if (mml == null || data == null) return _jobQueue.length; 
    352             return _jobQueue.push(new SiONDriverJob(mml, null, data)); 
     399            return _jobQueue.push(new SiONDriverJob(mml, null, data, 2)); 
    353400        } 
    354401         
     
    361408         *  @param data SiONData or mml String to play. 
    362409         *  @param renderBuffer Rendering target. null to create new buffer. The length of renderBuffer limits rendering length except for 0. 
     410         *  @param renderBufferChannelCount Channel count of renderBuffer. 2 for stereo and 1 for monoral. 
    363411         *  @param resetEffector reset all effectors before play data. 
    364412         *  @return rendered data. 
    365413         */ 
    366         public function render(data:*, renderBuffer:Vector.<Number>=null, resetEffector:Boolean=true) : Vector.<Number> 
     414        public function render(data:*, renderBuffer:Vector.<Number>=null, renderBufferChannelCount:int=2, resetEffector:Boolean=true) : Vector.<Number> 
    367415        { 
    368416            try { 
     
    373421                var t:int = getTimer(); 
    374422                if (resetEffector) effector.initialize(); 
    375                 _prepareRender(data, renderBuffer); 
     423                _prepareRender(data, renderBuffer, renderBufferChannelCount); 
    376424                while(true) { if (_rendering()) break; } 
    377425                _timeRender = getTimer() - t; 
     
    390438         *  @param data SiONData or mml String to render. 
    391439         *  @param renderBuffer Rendering target. The length of renderBuffer limits rendering length except for 0. 
     440         *  @param renderBufferChannelCount Channel count of renderBuffer. 2 for stereo and 1 for monoral. 
    392441         *  @return Queue length. 
    393442         *  @see #startQueue() 
    394443         */ 
    395         public function renderQueue(data:*, renderBuffer:Vector.<Number>) : int 
     444        public function renderQueue(data:*, renderBuffer:Vector.<Number>, renderBufferChannelCount:int=2) : int 
    396445        { 
    397446            if (data == null || renderBuffer == null) return _jobQueue.length; 
     
    399448            if (data is String) { 
    400449                var compiled:SiONData = new SiONData(); 
    401                 _jobQueue.push(new SiONDriverJob(data as String, null, compiled)); 
    402                 return _jobQueue.push(new SiONDriverJob(null, renderBuffer, compiled)); 
     450                _jobQueue.push(new SiONDriverJob(data as String, null, compiled, 2)); 
     451                return _jobQueue.push(new SiONDriverJob(null, renderBuffer, compiled, renderBufferChannelCount)); 
    403452            } else  
    404453            if (data is SiONData) { 
    405                 return _jobQueue.push(new SiONDriverJob(null, renderBuffer, data as SiONData)); 
     454                return _jobQueue.push(new SiONDriverJob(null, renderBuffer, data as SiONData, renderBufferChannelCount)); 
    406455            } 
    407456             
     
    497546        public function stop() : void 
    498547        { 
    499             _removeAllEventListners(); 
    500548            if (_soundChannel) { 
    501                 _soundChannel.stop(); 
    502                 _soundChannel = null; 
    503                 _latency = 0; 
    504                  
    505                 // dispatch streaming stop event 
    506                 dispatchEvent(new SiONEvent(SiONEvent.STREAM_STOP, this)); 
     549                if (_inStreaming) { 
     550                    _preserveStop = true; 
     551                } else { 
     552                    _removeAllEventListners(); 
     553                    _preserveStop = false; 
     554                    _soundChannel.stop(); 
     555                    _soundChannel = null; 
     556                    _latency = 0; 
     557                    _faderVolume = 1; 
     558                    _soundTransform.volume = _masterVolume; 
     559                     
     560                    // dispatch streaming stop event 
     561                    dispatchEvent(new SiONEvent(SiONEvent.STREAM_STOP, this)); 
     562                } 
    507563            } 
    508564        } 
     
    538594         
    539595         
    540          
    541          
    542     // Interface for data register 
     596        /** Fade in. 
     597         *  @param term Fading time [second]. 
     598         */ 
     599        public function fadeIn(term:Number) : void 
     600        { 
     601            _fader.setFade(_fadeVolume, 0, 1, term * _sampleRate / _bufferLength); 
     602            _dispatchFadingEvent = (hasEventListener(SiONEvent.FADE_PROGRESS)); 
     603        } 
     604         
     605         
     606        /** Fade out. 
     607         *  @param term Fading time [second]. 
     608         */ 
     609        public function fadeOut(term:Number) : void 
     610        { 
     611            _fader.setFade(_fadeVolume, 1, 0, term * _sampleRate / _bufferLength); 
     612            _dispatchFadingEvent = (hasEventListener(SiONEvent.FADE_PROGRESS)); 
     613        } 
     614         
     615         
     616         
     617         
     618    // Interface for public data registration 
    543619    //---------------------------------------- 
    544620        /** Set wave table data refered by %4. 
     
    551627            for (len=table.length; len>0; len>>=1) bits++; 
    552628            if (bits<2) return; 
    553             var serialized:Vector.<int> = SiONUtil.serializeVectorPCM(table, new Vector.<int>()); 
    554             serialized.length = 1<<bits; 
    555             SiOPMTable.registerWaveTable(index, serialized, bits); 
     629            var waveTable:Vector.<int> = SiONUtil.logTransVector(table); 
     630            waveTable.length = 1<<bits; 
     631            SiOPMTable.registerWaveTable(index, waveTable); 
    556632        } 
    557633         
    558634         
    559635        /** Set PCM data rederd from %7. 
     636         *  @param index PCM data number. 
     637         *  @param data Vector.<Number> wave data. This type ussualy comes from render(). 
     638         *  @param isDataStereo Flag that the wave data is stereo or monoral. 
     639         *  @param samplingOctave Sampling frequency. The value of 5 means that "o5a" is original frequency. 
     640         *  @see #render() 
     641         */ 
     642        public function setPCMData(index:int, data:Vector.<Number>, isDataStereo:Boolean=true, samplingOctave:int=5) : void 
     643        { 
     644            var pcm:Vector.<int> = SiONUtil.logTransVector(data, isDataStereo); 
     645            SiOPMTable.registerPCMData(index, pcm, samplingOctave); 
     646        } 
     647         
     648         
     649        /** Set PCM sound rederd from %7. 
    560650         *  @param index PCM data number. 
    561651         *  @param sound Sound instance to set. 
    562652         *  @param samplingOctave Sampling frequency. The value of 5 means that "o5a" is original frequency. 
    563653         */ 
    564         public function setPCMData(index:int, sound:Sound, samplingOctave:int=5) : void 
    565         { 
    566             var data:Vector.<int> = SiONUtil.serialize(sound); 
     654        public function setPCMSound(index:int, sound:Sound, samplingOctave:int=5) : void 
     655        { 
     656            var data:Vector.<int> = SiONUtil.logTrans(sound); 
    567657            SiOPMTable.registerPCMData(index, data, samplingOctave); 
    568658        } 
    569659         
    570660         
    571         /** Set wave data refered by %10. 
    572          *  @param index note number. 128-255 for bank1. 
     661        /** Set sampler data refered by %10. 
     662         *  @param index note number. 0-127 for bank0, 128-255 for bank1. 
     663         *  @param data Vector.<Number> wave data. This type ussualy comes from render(). 
     664         *  @param isOneShot True to set "one shot" sound. The "one shot" sound ignores note off. 
     665         *  @param channelCount 1 for monoral, 2 for stereo. 
     666         *  @see #render() 
     667         */ 
     668        public function setSamplerData(index:int, data:Vector.<Number>, isOneShot:Boolean=true, channelCount:int=1) : void 
     669        { 
     670            SiOPMTable.registerSamplerData(index, data, isOneShot, channelCount); 
     671        } 
     672         
     673         
     674        /** Set sampler sound refered by %10. 
     675         *  @param index note number. 0-127 for bank0, 128-255 for bank1. 
    573676         *  @param sound Sound instance to set. 
    574677         *  @param isOneShot True to set "one shot" sound. The "one shot" sound ignores note off. 
    575          *  @param isStereo True to set as stereo data. 
    576          */ 
    577         public function setWaveData(index:int, sound:Sound, isOneShot:Boolean=true, isStereo:Boolean=false) : void 
    578         { 
    579             var data:Vector.<int> = SiONUtil.getRawData(sound); 
    580             SiOPMTable.registerSample(index, data, ((isOneShot) ? 2 : 0) + ((isStereo) ? 1 : 0)); 
     678         *  @param channelCount 1 for monoral, 2 for stereo. 
     679         *  @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 
     680         */ 
     681        public function setSamplerSound(index:int, sound:Sound, isOneShot:Boolean=true, channelCount:int=2, sampleMax:int=1048576) : void 
     682        { 
     683            var data:Vector.<Number> = SiONUtil.extract(sound, null, channelCount, sampleMax); 
     684            SiOPMTable.registerSamplerData(index, data, isOneShot, channelCount); 
     685        } 
     686         
     687         
     688        /** Set envelop table data refered by @@,na,np,nt,nf,_@@,_na,_np,_nt and _nf. 
     689         *  @param index envelop table number. 
     690         *  @param table envelop table vector. 
     691         *  @param loopPoint returning point index of looping. -1 sets no loop. 
     692         */ 
     693        public function setEnvelopTable(index:int, table:Vector.<int>, loopPoint:int=-1) : void 
     694        { 
     695            var tail:SLLint, head:SLLint, loop:SLLint, i:int, imax:int = table.length; 
     696            head = tail = SLLint.allocList(imax); 
     697            loop = null; 
     698            for (i=0; i<imax-1; i++) { 
     699                if (loopPoint == i) loop = tail; 
     700                tail.i = table[i]; 
     701                tail = tail.next; 
     702            } 
     703            tail.i = table[i]; 
     704            tail.next = loop; 
     705            var env:SiMMLEnvelopTable = new SiMMLEnvelopTable(); 
     706            env._initialize(head, tail); 
     707            SiMMLTable.registerMasterEnvelopTable(index, env); 
     708        } 
     709         
     710         
     711        /** Set wave table data refered by %6. 
     712         *  @param index wave table number. 
     713         *  @param voice voice to register. 
     714         */ 
     715        public function setVoice(index:int, voice:SiONVoice) : void 
     716        { 
     717            if (!voice._isSuitableForFMVoice) throw errorNotGoodFMVoice(); 
     718            SiMMLTable.registerMasterVoice(index, voice); 
    581719        } 
    582720         
     
    586724    // Interface for intaractivity 
    587725    //---------------------------------------- 
     726        /** Play sound registered in sampler table (registered by setSamplerData()). */ 
     727        public function playSound() : SiMMLTrack 
     728        { 
     729            return null; 
     730        } 
     731         
     732         
    588733        /** Note on. This function only is available after play(). The NOTE_ON_STREAM event is dispatched inside. 
    589734         *  @param note note number [0-127]. 
     
    602747                               eventTriggerID:int=0, noteOnTrigger:int=0, noteOffTrigger:int=0) : SiMMLTrack 
    603748        { 
    604             trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_TRACK_ID_OFFSET; 
    605             var mmlTrack:SiMMLTrack = sequencer.getFreeControlableTrack(trackID) || sequencer.newControlableTrack(trackID), 
    606                 delaySamples:int = sequencer.calcSampleDelay(0, delay, quant); 
     749            trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_NOTE_ID_OFFSET; 
     750            var mmlTrack:SiMMLTrack = null,  
     751                delaySamples:Number = sequencer.calcSampleDelay(0, delay, quant); 
     752             
     753            // check track id exception 
     754            if (_noteOnExceptionMode != NEM_IGNORE) { 
     755                // find a track sounds at same timing 
     756                mmlTrack = sequencer.findActiveTrack(trackID, delaySamples); 
     757                if (_noteOnExceptionMode == NEM_REJECT && mmlTrack != null) return null; // reject 
     758                else if (_noteOnExceptionMode == NEM_SHIFT) { // shift timing 
     759                    var step:int = sequencer.calcSampleLength(quant); 
     760                    while (mmlTrack) { 
     761                        delaySamples += step; 
     762                        mmlTrack = sequencer.findActiveTrack(trackID, delaySamples); 
     763                    } 
     764                } 
     765            } 
     766             
     767            mmlTrack = mmlTrack || sequencer.getFreeControlableTrack(trackID) || sequencer.newControlableTrack(trackID); 
    607768            if (mmlTrack) { 
    608769                if (voice) voice.setTrackVoice(mmlTrack); 
     
    615776         
    616777        /** Note off. This function only is available after play(). The NOTE_OFF_STREAM event is dispatched inside. 
    617          *  @param note note number [0-127]
     778         *  @param note note number [-1-127]. The value of -1 ignores note number
    618779         *  @param trackID track id to note off. 
    619780         *  @param delay note off delay units in 16th beat. 
     
    623784        public function noteOff(note:int, trackID:int=0, delay:Number=0, quant:Number=0) : SiMMLTrack 
    624785        { 
    625             trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_TRACK_ID_OFFSET; 
     786            trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_NOTE_ID_OFFSET; 
    626787            var mmlTrack:SiMMLTrack = sequencer.findControlableTrack(trackID, note), 
    627788                delaySamples:int = sequencer.calcSampleDelay(0, delay, quant); 
     
    643804                                   length:Number=0, delay:Number=0, quant:Number=1, trackID:int=0) : int 
    644805        { 
    645             trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_TRACK_ID_OFFSET; 
     806            trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_SEQUENCE_ID_OFFSET; 
    646807            // create new sequence tracks 
    647808            var mmlTrack:SiMMLTrack,  
     
    667828        public function sequenceOff(trackID:int, delay:Number=0, quant:Number=1) : int 
    668829        { 
    669             trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_TRACK_ID_OFFSET; 
     830            trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_SEQUENCE_ID_OFFSET; 
    670831            var delaySamples:int = sequencer.calcSampleDelay(0, delay, quant); 
    671832            for each (var mmlTrack:SiMMLTrack in sequencer.tracks) { 
     
    804965            var queue:SiONDriverJob = _jobQueue.shift(); 
    805966            if (queue.mml) _prepareCompile(queue.mml, queue.data); 
    806             else _prepareRender(queue.data, queue.buffer); 
     967            else _prepareRender(queue.data, queue.buffer, queue.channelCount); 
    807968            return false; 
    808969        } 
     
    8711032    //---------------------------------------- 
    8721033        // prepare for rendering 
    873         private function _prepareRender(data:*, renderBuffer:Vector.<Number>) : void 
     1034        private function _prepareRender(data:*, renderBuffer:Vector.<Number>, renderBufferChannelCount:int) : void 
    8741035        { 
    8751036            _prepareProcess(data); 
    8761037            _renderBuffer = renderBuffer || new Vector.<Number>(); 
     1038            _renderBufferChannelCount = (renderBufferChannelCount==2) ? 2 : 1; 
    8771039            _renderBufferSizeMax = _renderBuffer.length; 
    8781040            _renderBufferIndex = 0; 
     
    8861048        private function _rendering() : Boolean 
    8871049        { 
    888             var i:int, j:int, imax:int,  
     1050            var i:int, j:int, imax:int, extention:int,  
    8891051                output:Vector.<Number> = module.output,  
    8901052                finished:Boolean = false; 
     
    8931055            sequencer.process(); 
    8941056            effector.process(); 
     1057            module.limitLevel(); 
    8951058             
    8961059            // limit rendering length 
    897             imax = _bufferLength<<1; 
    898             if (_renderBufferSizeMax != 0 && _renderBufferSizeMax < _renderBufferIndex+imax) { 
    899                 imax = _renderBufferSizeMax - _renderBufferIndex; 
     1060            imax      = _bufferLength<<1; 
     1061            extention = _bufferLength<<(_renderBufferChannelCount-1); 
     1062            if (_renderBufferSizeMax != 0 && _renderBufferSizeMax < _renderBufferIndex+extention) { 
     1063                extention = _renderBufferSizeMax - _renderBufferIndex; 
    9001064                finished = true; 
    9011065            } 
    9021066             
    9031067            // extend buffer 
    904             if (_renderBuffer.length < _renderBufferIndex+imax) { 
    905                 _renderBuffer.length = _renderBufferIndex+imax
     1068            if (_renderBuffer.length < _renderBufferIndex+extention) { 
     1069                _renderBuffer.length = _renderBufferIndex+extention
    9061070            } 
    9071071             
    9081072            // copy output 
    909             for (i=0, j=_renderBufferIndex; i<imax; i++, j++) { 
    910                 _renderBuffer[j] = output[i]; 
     1073            if (_renderBufferChannelCount==2) { 
     1074                for (i=0, j=_renderBufferIndex; i<imax; i++, j++) { 
     1075                    _renderBuffer[j] = output[i]; 
     1076                } 
     1077            } else { 
     1078                for (i=0, j=_renderBufferIndex; i<imax; i+=2, j++) { 
     1079                    _renderBuffer[j] = output[i]; 
     1080                } 
    9111081            } 
    9121082             
    9131083            // incerement index 
    914             _renderBufferIndex += imax
     1084            _renderBufferIndex += extention
    9151085             
    9161086            return (finished || (_renderBufferSizeMax==0 && sequencer.isFinished)); 
     
    9471117            _frameRate = t - _prevFrameTime; 
    9481118            _prevFrameTime = t; 
     1119             
     1120            // preserve stop 
     1121            if (_preserveStop) stop(); 
    9491122             
    9501123            // frame trigger 
     
    9721145             
    9731146            try { 
     1147                _inStreaming = true; 
    9741148                if (_isPaused) { 
    9751149                    // paused -> 0 filling 
     
    9861160                    sequencer.process(); 
    9871161                    effector.process(); 
     1162                    module.limitLevel(); 
    9881163                    _cannotChangeBPM = false; 
    9891164                     
     
    10121187                        if (event.isDefaultPrevented()) stop();   // canceled 
    10131188                    } 
     1189                     
     1190                    // fading 
     1191                    if (_fader.execute()) { 
     1192                        var eventType:String = (_fader.isIncrement) ? SiONEvent.FADE_IN_COMPLETE : SiONEvent.FADE_OUT_COMPLETE; 
     1193                        dispatchEvent(new SiONEvent(eventType, this, buffer)); 
     1194                        if (_autoStop && !_fader.isIncrement) stop(); 
     1195                    } else { 
     1196                        // auto stop 
     1197                        if (_autoStop && sequencer.isFinished) stop(); 
     1198                    } 
     1199                    _inStreaming = false; 
    10141200                } 
    10151201            } catch (e:Error) { 
     
    10231209         
    10241210         
    1025          
    1026     // error 
     1211    // operations 
     1212    //---------------------------------------- 
     1213        // volume fading 
     1214        private function _fadeVolume(v:Number) : void { 
     1215            _faderVolume = v; 
     1216            _soundTransform.volume = _masterVolume * _faderVolume; 
     1217            if (_soundChannel) _soundChannel.soundTransform = _soundTransform; 
     1218            if (_dispatchFadingEvent) { 
     1219                var event:SiONEvent = new SiONEvent(SiONEvent.FADE_PROGRESS, this, null, true); 
     1220                dispatchEvent(event); 
     1221                if (event.isDefaultPrevented()) _fader.stop();   // canceled 
     1222            } 
     1223        } 
     1224         
     1225         
     1226         
     1227         
     1228    // errors 
    10271229    //---------------------------------------- 
    10281230        private function errorPluralDrivers() : Error { 
    1029             return new Error("SiONDriver error; Only one SiONDriver can be available."); 
     1231            return new Error("SiONDriver error; Cannot create pulral SiONDrivers."); 
    10301232        } 
    10311233         
     
    10441246        private function errorCannotChangeBPM() : Error { 
    10451247            return new Error("SiONDriver error: Cannot change bpm while rendering (SiONTrackEvent.NOTE_*_STREAM)."); 
     1248        } 
     1249         
     1250         
     1251        private function errorNotGoodFMVoice() : Error { 
     1252            return new Error("SiONDriver error; Cannot register the voice."); 
    10461253        } 
    10471254    } 
     
    10581265    public var buffer:Vector.<Number>; 
    10591266    public var data:SiONData; 
     1267    public var channelCount:int; 
    10601268     
    1061     function SiONDriverJob(mml_:String, buffer_:Vector.<Number>, data_:SiONData)  
     1269    function SiONDriverJob(mml_:String, buffer_:Vector.<Number>, data_:SiONData, channelCount_:int)  
    10621270    { 
    10631271        mml = mml_; 
    10641272        buffer = buffer_; 
    10651273        data = data_ || new SiONData(); 
     1274        channelCount = channelCount_; 
    10661275    } 
    10671276} 
  • as3/SiOPM/trunk/src/org/si/sion/SiONVoice.as

    r2625 r2697  
    77package org.si.sion { 
    88    import org.si.sion.utils.Translator; 
    9     import org.si.sion.sequencer.SiMMLTrack; 
    10     import org.si.sion.sequencer.SiMMLEnvelopTable; 
     9    import org.si.sion.sequencer.SiMMLVoice; 
    1110    import org.si.sion.module.SiOPMChannelParam; 
    1211     
     
    1615     *  @see org.si.sion.module.SiOPMOperatorParam 
    1716     */ 
    18     public class SiONVoice 
     17    public class SiONVoice extends SiMMLVoice 
    1918    { 
    2019    // variables 
     
    2221        /** voice name */ 
    2322        public var name:String; 
    24          
    25         /** set volume and panning of channelParam. @default false */ 
    26         public var setVolumes:Boolean; 
    27          
    28         /** module type, 1st argument of '%'. @default 0 */ 
    29         public var moduleType:int; 
    30         /** channel number, 2nd argument of '%'. @default 0 */ 
    31         public var channelNum:int; 
    32         /** tone number, 1st argument of '&#64;'. -1;do nothing. @default -1 */ 
    33         public var toneNum:int; 
    34          
    35         /** parameters for FM sound channel. null;do nothing. @default null */ 
    36         public var channelParam:SiOPMChannelParam; 
    37         /** Attack rate, This parameter is available only when channelParam==null. @default 63 */ 
    38         public var attackRate:int; 
    39         /** Release rate, This parameter is available only when channelParam==null. @default 63 */ 
    40         public var releaseRate:int; 
    41         /** Detune (same as "k" command), This parameter is available only when channelParam==null. @default 0 */ 
    42         public var detune:int; 
    43          
    44         /** portament. @default 0 */ 
    45         public var portament:int; 
    46         /** release sweep. 2nd argument of '&#64;rr' and 's'. @default 0 */ 
    47         public var releaseSweep:int; 
    48          
    49          
    50         /** amplitude modulation depth. 1st argument of 'ma'. @default 0 */ 
    51         public var amDepth:int; 
    52         /** amplitude modulation depth after changing. 2nd argument of 'ma'. @default 0 */ 
    53         public var amDepthEnd:int; 
    54         /** amplitude modulation changing delay. 3rd argument of 'ma'. @default 0 */ 
    55         public var amDelay:int; 
    56         /** amplitude modulation changing term. 4th argument of 'ma'. @default 0 */ 
    57         public var amTerm:int; 
    58         /** pitch modulation depth. 1st argument of 'mp'. @default 0 */ 
    59         public var pmDepth:int; 
    60         /** pitch modulation depth after changing. 2nd argument of 'mp'. @default 0 */ 
    61         public var pmDepthEnd:int; 
    62         /** pitch modulation changing delay. 3rd argument of 'mp'. @default 0 */ 
    63         public var pmDelay:int; 
    64         /** pitch modulation changing term. 4th argument of 'mp'. @default 0 */ 
    65         public var pmTerm:int; 
    66          
    67          
    68         /** note on tone envelop table. 1st argument of '&#64;&#64;' @default null */ 
    69         public var noteOnToneEnvelop:SiMMLEnvelopTable; 
    70         /** note on amplitude envelop table. 1st argument of 'na' @default null */ 
    71         public var noteOnAmplitudeEnvelop:SiMMLEnvelopTable; 
    72         /** note on filter envelop table. 1st argument of 'nf' @default null */ 
    73         public var noteOnFilterEnvelop:SiMMLEnvelopTable; 
    74         /** note on pitch envelop table. 1st argument of 'np' @default null */ 
    75         public var noteOnPitchEnvelop:SiMMLEnvelopTable; 
    76         /** note on note envelop table. 1st argument of 'nt' @default null */ 
    77         public var noteOnNoteEnvelop:SiMMLEnvelopTable; 
    78         /** note off tone envelop table. 1st argument of '_&#64;&#64;' @default null */ 
    79         public var noteOffToneEnvelop:SiMMLEnvelopTable; 
    80         /** note off amplitude envelop table. 1st argument of '_na' @default null */ 
    81         public var noteOffAmplitudeEnvelop:SiMMLEnvelopTable; 
    82         /** note off filter envelop table. 1st argument of '_nf' @default null */ 
    83         public var noteOffFilterEnvelop:SiMMLEnvelopTable; 
    84         /** note off pitch envelop table. 1st argument of '_np' @default null */ 
    85         public var noteOffPitchEnvelop:SiMMLEnvelopTable; 
    86         /** note off note envelop table. 1st argument of '_nt' @default null */ 
    87         public var noteOffNoteEnvelop:SiMMLEnvelopTable; 
    88          
    89          
    90         /** note on tone envelop tablestep. 2nd argument of '&#64;&#64;' @default 1 */ 
    91         public var noteOnToneEnvelopStep:int; 
    92         /** note on amplitude envelop tablestep. 2nd argument of 'na' @default 1 */ 
    93         public var noteOnAmplitudeEnvelopStep:int; 
    94         /** note on filter envelop tablestep. 2nd argument of 'nf' @default 1 */ 
    95         public var noteOnFilterEnvelopStep:int; 
    96         /** note on pitch envelop tablestep. 2nd argument of 'np' @default 1 */ 
    97         public var noteOnPitchEnvelopStep:int; 
    98         /** note on note envelop tablestep. 2nd argument of 'nt' @default 1 */ 
    99         public var noteOnNoteEnvelopStep:int; 
    100         /** note off tone envelop tablestep. 2nd argument of '_&#64;&#64;' @default 1 */ 
    101         public var noteOffToneEnvelopStep:int; 
    102         /** note off amplitude envelop tablestep. 2nd argument of '_na' @default 1 */ 
    103         public var noteOffAmplitudeEnvelopStep:int; 
    104         /** note off filter envelop tablestep. 2nd argument of '_nf' @default 1 */ 
    105         public var noteOffFilterEnvelopStep:int; 
    106         /** note off pitch envelop tablestep. 2nd argument of '_np' @default 1 */ 
    107         public var noteOffPitchEnvelopStep:int; 
    108         /** note off note envelop tablestep. 2nd argument of '_nt' @default 1 */ 
    109         public var noteOffNoteEnvelopStep:int; 
    11023         
    11124         
     
    12336        function SiONVoice(moduleType:int=0, channelNum:int=0, ar:int=63, rr:int=63, dt:int=0) 
    12437        { 
     38            super(); 
     39             
    12540            name = ""; 
    126             setVolumes = false; 
    127              
    12841            this.moduleType = moduleType; 
    12942            this.channelNum = channelNum; 
     
    13144            releaseRate = rr; 
    13245            detune = dt; 
    133             toneNum = -1; 
    134              
    135             channelParam = null; 
    136              
    137             portament = 0; 
    138              
    139             amDepth = 0; 
    140             amDepthEnd = 0; 
    141             amDelay = 0; 
    142             amTerm = 0; 
    143             pmDepth = 0; 
    144             pmDepthEnd = 0; 
    145             pmDelay = 0; 
    146             pmTerm = 0; 
    147  
    148             noteOnToneEnvelop = null; 
    149             noteOnAmplitudeEnvelop = null; 
    150             noteOnFilterEnvelop = null; 
    151             noteOnPitchEnvelop = null; 
    152             noteOnNoteEnvelop = null; 
    153             noteOffToneEnvelop = null; 
    154             noteOffAmplitudeEnvelop = null; 
    155             noteOffFilterEnvelop = null; 
    156             noteOffPitchEnvelop = null; 
    157             noteOffNoteEnvelop = null; 
    158              
    159             noteOnToneEnvelopStep = 1; 
    160             noteOnAmplitudeEnvelopStep = 1; 
    161             noteOnFilterEnvelopStep = 1; 
    162             noteOnPitchEnvelopStep = 1; 
    163             noteOnNoteEnvelopStep = 1; 
    164             noteOffToneEnvelopStep = 1; 
    165             noteOffAmplitudeEnvelopStep = 1; 
    166             noteOffFilterEnvelopStep = 1; 
    167             noteOffPitchEnvelopStep = 1; 
    168             noteOffNoteEnvelopStep = 1; 
    169         } 
    170          
    171          
    172          
    173          
    174     // setting 
    175     //-------------------------------------------------- 
    176         /** set sequencer track */ 
    177         public function setTrackVoice(track:SiMMLTrack) : SiMMLTrack 
    178         { 
    179             if (channelParam) { 
    180                 track.setChannelModuleType(6, 0); 
    181                 track.channel.setSiOPMChannelParam(channelParam, setVolumes); 
    182             } else { 
    183                 track.setChannelModuleType(moduleType, channelNum, toneNum); 
    184                 track.channel.setAllAttackRate(attackRate); 
    185                 track.channel.setAllReleaseRate(releaseRate); 
    186                 track.pitchShift = detune; 
    187             } 
    188             track.setPortament(portament); 
    189             track.setReleaseSweep(releaseSweep); 
    190             track.setModulationEnvelop(false, amDepth, amDepthEnd, amDelay, amTerm); 
    191             track.setModulationEnvelop(true,  pmDepth, pmDepthEnd, pmDelay, pmTerm); 
    192             if (noteOnToneEnvelop != null) track.setToneEnvelop(1, noteOnToneEnvelop, noteOnToneEnvelopStep); 
    193             if (noteOnAmplitudeEnvelop != null) track.setAmplitudeEnvelop(1, noteOnAmplitudeEnvelop, noteOnAmplitudeEnvelopStep); 
    194             if (noteOnFilterEnvelop != null) track.setFilterEnvelop(1, noteOnFilterEnvelop, noteOnFilterEnvelopStep); 
    195             if (noteOnPitchEnvelop != null) track.setPitchEnvelop(1, noteOnPitchEnvelop, noteOnPitchEnvelopStep); 
    196             if (noteOnNoteEnvelop != null) track.setNoteEnvelop(1, noteOnNoteEnvelop, noteOnNoteEnvelopStep); 
    197             if (noteOffToneEnvelop != null) track.setToneEnvelop(0, noteOffToneEnvelop, noteOffToneEnvelopStep); 
    198             if (noteOffAmplitudeEnvelop != null) track.setAmplitudeEnvelop(0, noteOffAmplitudeEnvelop, noteOffAmplitudeEnvelopStep); 
    199             if (noteOffFilterEnvelop != null) track.setFilterEnvelop(0, noteOffFilterEnvelop, noteOffFilterEnvelopStep); 
    200             if (noteOffPitchEnvelop != null) track.setPitchEnvelop(0, noteOffPitchEnvelop, noteOffPitchEnvelopStep); 
    201             if (noteOffNoteEnvelop != null) track.setNoteEnvelop(0, noteOffNoteEnvelop, noteOffNoteEnvelopStep); 
    202             return track; 
    203         } 
    204          
    205          
    206          
    207          
    208     // operation 
    209     //-------------------------------------------------- 
    210         /** copy all parameters */ 
    211         public function copyFrom(src:SiONVoice) : SiONVoice 
    212         { 
    213             moduleType = src.moduleType; 
    214             channelNum = src.channelNum; 
    215             toneNum = src.toneNum; 
    216             if (src.channelParam) { 
    217                 channelParam = new SiOPMChannelParam(); 
    218                 channelParam.copyFrom(src.channelParam); 
    219             } else { 
    220                 channelParam = null; 
    221             } 
    222              
    223             portament = src.portament; 
    224             releaseSweep = src.releaseSweep; 
    225              
    226             amDepth = src.amDepth; 
    227             amDepthEnd = src.amDepthEnd; 
    228             amDelay = src.amDelay; 
    229             amTerm = src.amTerm; 
    230             pmDepth = src.pmDepth; 
    231             pmDepthEnd = src.pmDepthEnd; 
    232             pmDelay = src.pmDelay; 
    233             pmTerm = src.pmTerm; 
    234              
    235             if (src.noteOnToneEnvelop) noteOnToneEnvelop = new SiMMLEnvelopTable(src.noteOnToneEnvelop); 
    236             if (src.noteOnAmplitudeEnvelop) noteOnAmplitudeEnvelop = new SiMMLEnvelopTable(src.noteOnAmplitudeEnvelop); 
    237             if (src.noteOnFilterEnvelop) noteOnFilterEnvelop = new SiMMLEnvelopTable(src.noteOnFilterEnvelop); 
    238             if (src.noteOnPitchEnvelop) noteOnPitchEnvelop = new SiMMLEnvelopTable(src.noteOnPitchEnvelop); 
    239             if (src.noteOnNoteEnvelop) noteOnNoteEnvelop = new SiMMLEnvelopTable(src.noteOnNoteEnvelop); 
    240             if (src.noteOffToneEnvelop) noteOffToneEnvelop = new SiMMLEnvelopTable(src.noteOffToneEnvelop); 
    241             if (src.noteOffAmplitudeEnvelop) noteOffAmplitudeEnvelop = new SiMMLEnvelopTable(src.noteOffAmplitudeEnvelop); 
    242             if (src.noteOffFilterEnvelop) noteOffFilterEnvelop = new SiMMLEnvelopTable(src.noteOffFilterEnvelop); 
    243             if (src.noteOffPitchEnvelop) noteOffPitchEnvelop = new SiMMLEnvelopTable(src.noteOffPitchEnvelop); 
    244             if (src.noteOffNoteEnvelop) noteOffNoteEnvelop = new SiMMLEnvelopTable(src.noteOffNoteEnvelop); 
    245              
    246             noteOnToneEnvelopStep = src.noteOnToneEnvelopStep; 
    247             noteOnAmplitudeEnvelopStep = src.noteOnAmplitudeEnvelopStep; 
    248             noteOnFilterEnvelopStep = src.noteOnFilterEnvelopStep; 
    249             noteOnPitchEnvelopStep = src.noteOnPitchEnvelopStep; 
    250             noteOnNoteEnvelopStep = src.noteOnNoteEnvelopStep; 
    251             noteOffToneEnvelopStep = src.noteOffToneEnvelopStep; 
    252             noteOffAmplitudeEnvelopStep = src.noteOffAmplitudeEnvelopStep; 
    253             noteOffFilterEnvelopStep = src.noteOffFilterEnvelopStep; 
    254             noteOffPitchEnvelopStep = src.noteOffPitchEnvelopStep; 
    255             noteOffNoteEnvelopStep = src.noteOffNoteEnvelopStep; 
    256              
    257             return this; 
    25846        } 
    25947         
  • as3/SiOPM/trunk/src/org/si/sion/effector/SiCtrlFilterBase.as

    r2625 r2697  
    4242         */ 
    4343        public function setParameters(cut:int=255, res:int=255, fps:Number=20) : void { 
     44            _table = SiOPMTable.instance; 
    4445            var simml:SiMMLTable = SiMMLTable.instance; 
    45             _table = SiOPMTable.instance; 
    46             _ptrCut = (cut>=0 && cut<255 && simml.envelopTables[cut]) ? simml.envelopTables[cut].head : null; 
    47             _ptrRes = (res>=0 && res<255 && simml.envelopTables[res]) ? simml.envelopTables[res].head : null; 
     46            _ptrCut = (cut>=0 && cut<255 && simml.getEnvelopTable(cut)) ? simml.getEnvelopTable(cut).head : null; 
     47            _ptrRes = (res>=0 && res<255 && simml.getEnvelopTable(res)) ? simml.getEnvelopTable(res).head : null; 
    4848            _cutIndex = (_ptrCut) ? _ptrCut.i : 128; 
    4949            _res = (_ptrRes) ? (_ptrRes.i*0.007751937984496124) : 0;    // 0.007751937984496124=1/129 
     
    6161            _lfoStep = 2048; 
    6262            _lfoResidueStep = 4096; 
    63             _cutIndex = cutoff*0.0078125;   // 1/128 
     63             
     64            if (cutoff > 1) cutoff=1; 
     65            else if (cutoff<0) cutoff=0; 
     66            _cutIndex = cutoff*128; 
     67             
     68            if (resonance > 1) resonance=1; 
     69            else if (resonance<0) resonance=0; 
    6470            _res = resonance; 
    6571        } 
  • as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectModule.as

    r2633 r2697  
    4242            register("eq",      SiEffectEqualiser); 
    4343            register("delay",   SiEffectStereoDelay); 
     44            register("reverb",  SiEffectStereoReverb); 
    4445            register("chorus",  SiEffectStereoChorus); 
    4546            register("autopan", SiEffectAutoPan); 
  • as3/SiOPM/trunk/src/org/si/sion/events/SiONEvent.as

    r2625 r2697  
    6363         
    6464         
    65         /** Dispatch when streaming. This event is called inside SiONDriver.play() after SiONEvent.STREAM_START, and each streaming timing. 
     65        /** Dispatch while streaming. This event is called inside SiONDriver.play() after SiONEvent.STREAM_START, and each streaming timing. 
    6666         * <p>The properties of the event object have the following values:</p> 
    6767         * <table class=innertable> 
     
    9191         
    9292         
    93         /** Dispatch when stop streaming. This event is called inside SiONDriver.stop(). 
     93        /** Dispatch when stop streaming. This event is dispatched inside SiONDriver.stop(). 
    9494         * <p>The properties of the event object have the following values:</p> 
    9595         * <table class=innertable> 
     
    103103         */ 
    104104        public static const STREAM_STOP:String = 'streamStop'; 
     105         
     106         
     107        /** Dispatch when finish executing all sequences. 
     108         * <p>The properties of the event object have the following values:</p> 
     109         * <table class=innertable> 
     110         * <tr><th>Property</th><th>Value</th></tr> 
     111         * <tr><td>cancelable</td><td>false</td></tr> 
     112         * <tr><td>driver</td><td>SiONDriver instance to stop streaming.</td></tr> 
     113         * <tr><td>data</td><td>SiONData instance to stop streaming. This property is null if you call SiONDriver.play() with null of the 1st argument.</td></tr> 
     114         * <tr><td>streamBuffer</td><td>null</td></tr> 
     115         * </table> 
     116         * @eventType finishSequence 
     117         */ 
     118        public static const FINISH_SEQUENCE:String = 'finishSequence'; 
     119         
     120         
     121        /** Dispatch while fading. This event is dispatched after SiONEvent.STREAM. 
     122         * <p>The properties of the event object have the following values:</p> 
     123         * <table class=innertable> 
     124         * <tr><th>Property</th><th>Value</th></tr> 
     125         * <tr><td>cancelable</td><td>true to cancel fading.</td></tr> 
     126         * <tr><td>driver</td><td>SiONDriver instance to stop streaming.</td></tr> 
     127         * <tr><td>data</td><td>SiONData instance playing now. This property is null if you call SiONDriver.play() with null of the 1st argument.</td></tr> 
     128         * <tr><td>streamBuffer</td><td>null</td></tr> 
     129         * </table> 
     130         * @eventType fadeProgress 
     131         */ 
     132        public static const FADE_PROGRESS:String = 'fadeProgress'; 
     133         
     134         
     135        /** Dispatch when fade in is finished. This event is dispatched after SiONEvent.STREAM. 
     136         * <p>The properties of the event object have the following values:</p> 
     137         * <table class=innertable> 
     138         * <tr><th>Property</th><th>Value</th></tr> 
     139         * <tr><td>cancelable</td><td>false</td></tr> 
     140         * <tr><td>driver</td><td>SiONDriver instance to stop streaming.</td></tr> 
     141         * <tr><td>data</td><td>SiONData instance playing now. This property is null if you call SiONDriver.play() with null of the 1st argument.</td></tr> 
     142         * <tr><td>streamBuffer</td><td>ByteArray instance of this stream. The length is twice of SiONDriver.bufferLength in the unit of float. You can get the renderd wave data by this propertiy.</td></tr> 
     143         * </table> 
     144         * @eventType fadeInComplete 
     145         */ 
     146        public static const FADE_IN_COMPLETE:String = 'fadeInComplete'; 
     147         
     148         
     149        /** Dispatch when fade out is finished. This event is dispatched after SiONEvent.STREAM. 
     150         * <p>The properties of the event object have the following values:</p> 
     151         * <table class=innertable> 
     152         * <tr><th>Property</th><th>Value</th></tr> 
     153         * <tr><td>cancelable</td><td>false</td></tr> 
     154         * <tr><td>driver</td><td>SiONDriver instance to stop streaming.</td></tr> 
     155         * <tr><td>data</td><td>SiONData instance playing now. This property is null if you call SiONDriver.play() with null of the 1st argument.</td></tr> 
     156         * <tr><td>streamBuffer</td><td>ByteArray instance of this stream. The length is twice of SiONDriver.bufferLength in the unit of float. You can get the renderd wave data by this propertiy.</td></tr> 
     157         * </table> 
     158         * @eventType fadeInComplete 
     159         */ 
     160        public static const FADE_OUT_COMPLETE:String = 'fadeOutComplete'; 
    105161         
    106162         
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelBase.as

    r2625 r2697  
    109109        /** Get SiOPMChannelParam. */ 
    110110        public function getSiOPMChannelParam(param:SiOPMChannelParam) : void {} 
     111        /** Set by PCM wave. */ 
     112        public function setPCMData(pcmData:SiOPMPCMData) : void {} 
    111113         
    112114        /** algorism (&#64;al) */ 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelFM.as

    r2625 r2697  
    289289         
    290290         
     291        /** Set PCM data.  
     292         *  @param pcmData PCM data to set. 
     293         */ 
     294        override public function setPCMData(pcmData:SiOPMPCMData) : void 
     295        { 
     296            _updateOperatorCount(1); 
     297            activeOperator.setPCMData(pcmData); 
     298            _funcProcess = _funcProcessList[_lfo_on][4]; 
     299        } 
     300         
     301         
    291302         
    292303         
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelSampler.as

    r2625 r2697  
    2323        /** expression */    protected var _expression:Number; 
    2424         
    25         /** sample data */   protected var _sample:Vector.<int>; 
     25        /** sample data */   protected var _sample:Vector.<Number>; 
    2626        /** sample length */ protected var _sampleLength:int; 
    2727        /** sample index */  protected var _sampleIndex:int; 
    28         /** phase reset */   protected var _samplePhaseReset:Boolean
     28        /** phase reset */   protected var _sampleStartPhase:int
    2929        /** channel count */ protected var _sampleChannelCount:int; 
    3030         
     
    104104        override public function setType(pgType:int, ptType:int) : void  
    105105        { 
    106             _bankNumber = pgType & 1
     106            _bankNumber = pgType & 3
    107107        } 
    108108         
     
    130130        /** phase (&#64;ph) */ 
    131131        override public function set phase(i:int) : void { 
    132             _samplePhaseReset = ((i&255)!=255)
     132            _sampleStartPhase = i
    133133        } 
    134134         
     
    148148            _sampleLength = 0; 
    149149            _sampleIndex = 0; 
    150             _samplePhaseReset = true
     150            _sampleStartPhase = 0
    151151            _sampleChannelCount = 1; 
    152152            _expression = 0.5; 
     
    166166            _sampleLength = 0; 
    167167            _sampleIndex = 0; 
    168             _samplePhaseReset = true
     168            _sampleStartPhase = 0
    169169            _sampleChannelCount = 1; 
    170170            _expression = 0.5; 
     
    178178                _isNoteOn = true; 
    179179                _isIdling = false; 
    180                 var idx:int = _waveNumber + (_bankNumber<<7) + SiOPMTable.PG_SAMPLE, 
    181                     flag:int = _table.waveFixedBits[idx]; 
    182                 _sample = _table.waveTables[idx]; 
    183                 _sampleLength = _sample.length; 
    184                 _sampleChannelCount = (flag & 1) ? 2 : 1; 
    185                 _isOneShot = Boolean(flag >> 1); 
    186                 if (_samplePhaseReset) _sampleIndex = 0; 
     180                var idx:int = _waveNumber + (_bankNumber<<7), 
     181                    data:SiOPMSamplerData = _table.getSamplerData(idx); 
     182                if (data) { 
     183                    _sample = data.waveData; 
     184                    _isOneShot = data.isOneShot; 
     185                    _sampleChannelCount = data.channelCount; 
     186                    _sampleLength = _sample.length >> (_sampleChannelCount-1); 
     187                    if (_sampleStartPhase!=255) _sampleIndex = _sampleLength * _sampleStartPhase * 0.00390625; // 1/256 
     188                } 
    187189            } 
    188190        } 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMModule.as

    r2633 r2697  
    156156         
    157157         
     158        /** Limit output level in the ranged of -1 ~ 1.*/ 
     159        public function limitLevel() : void 
     160        { 
     161            var buf:Vector.<Number> = streamBuffer[0].buffer, 
     162                i:int, imax:int = buf.length, n:Number; 
     163            for (i=0; i<imax; i++) { 
     164                n = buf[i]; 
     165                if (n < -1) buf[i] = -1; 
     166                else if (n > 1) buf[i] = 1; 
     167            } 
     168        } 
     169         
     170         
    158171        /** get pipe buffer */ 
    159172        public function getPipe(pipeNum:int, index:int=0) : SLLint 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperator.as

    r2625 r2697  
    354354        { 
    355355            _pgType = n & SiOPMTable.PG_FILTER; 
    356             _waveTable     = _table.waveTables[_pgType]; 
    357             _waveFixedBits = _table.waveFixedBits[_pgType]; 
     356            var waveTable:SiOPMWaveTable = _table.getWaveTable(_pgType); 
     357            _waveTable     = waveTable.wavelet; 
     358            _waveFixedBits = waveTable.fixedBits; 
    358359        } 
    359360        /** Pitch table type. */ 
     
    376377        public function get fmul()       : int { return _multiple; } 
    377378        public function get keyOnPhase() : int { return (_keyon_phase>=0) ? (_keyon_phase >> (SiOPMTable.PHASE_BITS - 8)) : 255; } 
    378         public function get pgType()     : int { return _pgType & SiOPMTable.PG_FILTER; } 
     379        public function get pgType()     : int { return _pgType; } 
    379380        public function get modLevel()   : int { return (_fmShift>10) ? (_fmShift-10) : 0; } 
    380381         
     
    531532            param.modLevel = (_fmShift>10) ? (_fmShift - 10) : 0; 
    532533            param.erst = _erst; 
     534        } 
     535         
     536         
     537        /** Set PCM Data. */ 
     538        public function setWaveTable(waveTable:SiOPMWaveTable) : void 
     539        { 
     540            _pgType = SiOPMTable.PG_USER_CUSTOM; // -1 
     541            _ptType        = waveTable.defaultPTType; 
     542            _waveTable     = waveTable.wavelet; 
     543            _waveFixedBits = waveTable.fixedBits; 
     544        } 
     545         
     546         
     547        /** Set PCM Data. */ 
     548        public function setPCMData(pcmData:SiOPMPCMData) : void 
     549        { 
     550            _pgType = SiOPMTable.PG_USER_PCM; // -2 
     551            _ptType        = SiOPMTable.PT_PCM; 
     552            _waveTable     = pcmData.wavelet; 
     553            _waveFixedBits = pcmData.pseudoFixedBits; 
    533554        } 
    534555         
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperatorParam.as

    r2625 r2697  
    6868        { 
    6969            pgType = type; 
    70             ptType = SiOPMTable.instance.defaultPTType[type]
     70            ptType = SiOPMTable.instance.getWaveTable(type).defaultPTType
    7171        } 
    7272         
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMStream.as

    r2633 r2697  
    6464         
    6565         
    66         public function writeVectorInt(pointer:Vector.<int>, startPointer:int, startBuffer:int, len:int, vol:Number, pan:int, sampleChannelCount:int) : void 
     66        public function writeVectorInt(pointer:Vector.<Number>, startPointer:int, startBuffer:int, len:int, vol:Number, pan:int, sampleChannelCount:int) : void 
    6767        { 
    68             var i:int, j:int, n:Number, jmax:int = startPointer + len, volL:Number, volR:Number; 
    69             vol *= 0.000030517578125; // 1/32768 
     68            var i:int, j:int, n:Number, jmax:int, volL:Number, volR:Number; 
     69             
    7070            if (channels == 2) { 
    7171                if (sampleChannelCount == 2) { 
    7272                    // stereo data to stereo buffer 
    73                     for (j=startPointer, i=startBuffer<<1; j<jmax; j++) { 
    74                         volL = Number((pointer[j]&65535)-32768) * vol; 
    75                         volR = Number((pointer[j]>>>16) -32768) * vol; 
    76                         buffer[i] += volL;  i++; 
    77                         buffer[i] += volR;  i++; 
     73                    jmax = (startPointer + len)<<1; 
     74                    for (j=startPointer<<1, i=startBuffer<<1; j<jmax; j++, i++) { 
     75                        buffer[i] += pointer[j] * vol; 
    7876                    } 
    7977                } else { 
     
    8179                    volL = _panTable[128-pan] * vol; 
    8280                    volR = _panTable[pan]     * vol; 
     81                    jmax = startPointer + len; 
    8382                    for (j=startPointer, i=startBuffer<<1; j<jmax; j++) { 
    84                         n = Number(pointer[j])
     83                        n = pointer[j]
    8584                        buffer[i] += n * volL;  i++; 
    8685                        buffer[i] += n * volR;  i++; 
     
    8988            } else  
    9089            if (channels == 1) { 
    91                 // monoral 
    92                 for (j=startPointer, i=startBuffer<<1; j<jmax; j++) { 
    93                     n = Number(pointer[j]) * vol; 
    94                     buffer[i] += n; i++; 
    95                     buffer[i] += n; i++; 
     90                if (sampleChannelCount == 2) { 
     91                    // stereo data to monoral buffer 
     92                    jmax = (startPointer + len)<<1; 
     93                    vol  *= 0.6; 
     94                    for (j=startPointer<<1, i=startBuffer<<1; j<jmax;) { 
     95                        n  = pointer[j]; j++; 
     96                        n += pointer[j]; j++; 
     97                        n *= vol; 
     98                        buffer[i] += n; i++; 
     99                        buffer[i] += n; i++; 
     100                    } 
     101                } else { 
     102                    // monoral data to monoral buffer 
     103                    jmax = startPointer + len; 
     104                    for (j=startPointer, i=startBuffer<<1; j<jmax; j++) { 
     105                        n = pointer[j] * vol; 
     106                        buffer[i] += n; i++; 
     107                        buffer[i] += n; i++; 
     108                    } 
    96109                } 
    97110            } 
  • as3/SiOPM/trunk/src/org/si/sion/module/SiOPMTable.as

    r2625 r2697  
    8787        static public const PG_RAMP       :int = 128;   // (128- 191) ramp wave. PG_RAMP+[0,63] 
    8888                                                        // (192- 255) reserved 
    89         static public const PG_CUSTOM     :int = 256;   // (256- 511) custom wave table. PG_CUSTOM+[0,255] 
    90         static public const PG_PCM        :int = 512;   // (512-767)  pcm module.PG_PCM+[0,255] 
    91         static public const PG_SAMPLE     :int = 768;   // (768-1024) samplar module.PG_SAMPLE+[0,255] 
    92         static public const DEFAULT_PG_MAX:int = 1024;  // max value of pgType = 1024 
    93         static public const PG_FILTER     :int = 1023;  // pg number loops between 0 to 1023 
     89        static public const PG_CUSTOM     :int = 256;   // (256- 383) custom wave table. PG_CUSTOM+[0,128] 
     90        static public const PG_PCM        :int = 384;   // (384- 511) pcm data. PG_PCM+[0,128] 
     91        static public const PG_USER_CUSTOM:int = -1;    // -1 user registered custom wave table 
     92        static public const PG_USER_PCM   :int = -2;    // -2 user registered pcm data 
     93 
     94        static public const DEFAULT_PG_MAX:int = 256;   // max value of pgType = 255 
     95        static public const PG_FILTER     :int = 511;   // pg number loops between 0 to 511 
     96         
     97        static public const WAVE_TABLE_MAX:int = 128;   // custom wave table max. 
     98        static public const PCM_DATA_MAX    :int = 128;   // pcm data max. 
     99        static public const SAMPLER_DATA_MAX:int = 128;   // sampler data max. 
     100         
    94101 
    95102        // lfo wave type 
     
    183190        /** PG:MIDI note number to FM key code. */ 
    184191        public var nnToKC:Vector.<int> = null; 
    185         /** PG:Wave tables. */ 
    186         public var waveTables:Vector.<Vector.<int>> = null; 
    187         /** PG:Wave tables shift. */ 
    188         public var waveFixedBits:Vector.<int> = null; 
    189         /** PG:Default ptType for various pgType. */ 
    190         public var defaultPTType:Vector.<int> = null; 
     192        /** PG:Wave tables without any waves. */ 
     193        public var noWaveTable:SiOPMWaveTable; 
     194        /** PG:Wave tables */ 
     195        public var waveTables:Vector.<SiOPMWaveTable> = null; 
     196        /** PG:Custom wave tables */ 
     197        public var customWaveTables:Vector.<SiOPMWaveTable> = null; 
     198        /** PG:Overriding custom wave tables */ 
     199        public var stencilCustomWaveTables:Vector.<SiOPMWaveTable> = null; 
     200        /** PG:PCM data */ 
     201        public var pcmData:Vector.<SiOPMPCMData> = null; 
     202        /** PG:PCM data */ 
     203        public var stencilPCMData:Vector.<SiOPMPCMData> = null; 
     204        /** PG:Wave data for sampler */ 
     205        public var samplerData:Vector.<SiOPMSamplerData> = null; 
     206        /** PG:Overriding wave data for sampler */ 
     207        public var stencilSamplerData:Vector.<SiOPMSamplerData> = null; 
    191208         
    192209        /** Table for dt1 (from fmgen.cpp). */ 
     
    402419             
    403420            // PCM 
    404             // dphase = pitchTablePCM[pitchIndex] >> (table_size (= PHASE_BITS - _waveFixedBits)) 
     421            // dphase = pitchTablePCM[pitchIndex] >> (table_size (= PHASE_BITS - waveTable.fixedBits)) 
    405422            table = new Vector.<int>(PITCH_TABLE_SIZE, true); 
    406423            n = 0.01858136117191752 * PHASE_MAX;     // dphase @ MIDI note number = 0/ o0c=0.01858136117191752 -> o5a=1 
     
    437454        //---------------------------------------- 
    438455            // OPM noise period table. 
    439             // noise_phase_shift = pitchTable[PT_OPM_NOISE][noiseFreq] >> (PHASE_BITS-_waveFixedBits). 
     456            // noise_phase_shift = pitchTable[PT_OPM_NOISE][noiseFreq] >> (PHASE_BITS - waveTable.fixedBits). 
    440457            imax  = 32<<HALF_TONE_BITS; 
    441458            table = new Vector.<int>(imax, true); 
     
    453470            // PSG noise period table. 
    454471            table = new Vector.<int>(imax, true); 
    455             // noise_phase_shift = ((1<<PHASE_BIT)  /  ((nf/(clock/16))[sec]  /  (1/44100)[sec])) >> (PHASE_BIT-_waveFixedBits) 
     472            // noise_phase_shift = ((1<<PHASE_BIT)  /  ((nf/(clock/16))[sec]  /  (1/44100)[sec])) >> (PHASE_BIT - waveTable.fixedBits) 
    456473            n = PHASE_MAX * 111860.78125 / 44100;   // 111860.78125 = 1789772.5/16 
    457474            for (i=0; i<32; i++) { 
     
    468485            imax  = 16<<HALF_TONE_BITS; 
    469486            table = new Vector.<int>(imax, true); 
    470             // noise_phase_shift = ((1<<PHASE_BIT)  /  ((nf/clock)[sec]  /  (1/44100)[sec])) >> (PHASE_BIT-_waveFixedBits) 
     487            // noise_phase_shift = ((1<<PHASE_BIT)  /  ((nf/clock)[sec]  /  (1/44100)[sec])) >> (PHASE_BIT - waveTable.fixedBits) 
    471488            n = PHASE_MAX * 1789772.5 / 44100; 
    472489            for (i=0; i<16; i++) { 
     
    539556 
    540557            // allocate table list 
    541             waveTables = new Vector.<Vector.<int>>(DEFAULT_PG_MAX); 
    542             waveFixedBits = new Vector.<int>(DEFAULT_PG_MAX); 
    543             defaultPTType = new Vector.<int>(DEFAULT_PG_MAX, true); 
     558            noWaveTable = SiOPMWaveTable.alloc(Vector.<int>([calcLogTableIndex(1)]), PT_PCM); 
     559            waveTables = new Vector.<SiOPMWaveTable>(DEFAULT_PG_MAX); 
     560            customWaveTables = new Vector.<SiOPMWaveTable>(WAVE_TABLE_MAX); 
     561            pcmData = new Vector.<SiOPMPCMData>(PCM_DATA_MAX); 
     562            samplerData = new Vector.<SiOPMSamplerData>(SAMPLER_DATA_MAX); 
    544563             
    545564        // clear all tables 
    546565        //------------------------------ 
    547             table1 = new Vector.<int>(1, true)
    548             table1[0] = calcLogTableIndex(1)
    549             for (i=0; i<DEFAULT_PG_MAX; i++) { 
    550                 waveTables[i]    = table1;      // always 1 
    551                 waveFixedBits[i] = PHASE_BITS;  // always 0 == data not available 
    552                 defaultPTType[i] = (i<PG_PCM) ? PT_OPM : PT_PCM
    553             } 
     566            for (i=0; i<DEFAULT_PG_MAX;   i++) waveTables[i] = noWaveTable
     567            for (i=0; i<WAVE_TABLE_MAX;   i++) customWaveTables[i] = null
     568            for (i=0; i<PCM_DATA_MAX;     i++) pcmData[i]          = null; 
     569            for (i=0; i<SAMPLER_DATA_MAX; i++) samplerData[i]      = null; 
     570            stencilCustomWaveTables = null; 
     571            stencilPCMData = null
     572            stencilSamplerData = null; 
    554573             
    555574        // sine wave table 
     
    564583                table1[i+imax] = iv+1; // negative value index 
    565584            } 
    566             waveTables   [PG_SINE] = table1; 
    567             waveFixedBits[PG_SINE] = PHASE_BITS - SAMPLING_TABLE_BITS; 
     585            waveTables[PG_SINE] = SiOPMWaveTable.alloc(table1); 
    568586 
    569587        // saw wave tables 
     
    579597                table2[imax+i]    = iv+1; // negative 
    580598            } 
    581             waveTables   [PG_SAW_UP] = table1; 
    582             waveFixedBits[PG_SAW_UP] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    583             waveTables   [PG_SAW_DOWN] = table2; 
    584             waveFixedBits[PG_SAW_DOWN] = PHASE_BITS - SAMPLING_TABLE_BITS; 
     599            waveTables[PG_SAW_UP]   = SiOPMWaveTable.alloc(table1); 
     600            waveTables[PG_SAW_DOWN] = SiOPMWaveTable.alloc(table2); 
    585601             
    586602        // triangle wave tables 
     
    599615                table1[imax4-i-1] = iv+1; // negative value index 
    600616            } 
    601             waveTables   [PG_TRIANGLE] = table1; 
    602             waveFixedBits[PG_TRIANGLE] = PHASE_BITS - SAMPLING_TABLE_BITS; 
     617            waveTables[PG_TRIANGLE] = SiOPMWaveTable.alloc(table1); 
    603618             
    604619            // fc triangle wave 
     
    615630            table1[23] = 3; 
    616631            table1[24] = 3; 
    617             waveTables   [PG_TRIANGLE_FC] = table1; 
    618             waveFixedBits[PG_TRIANGLE_FC] = PHASE_BITS - 5; 
    619              
     632            waveTables[PG_TRIANGLE_FC] = SiOPMWaveTable.alloc(table1); 
    620633             
    621634        // square wave tables 
     
    623636            // 50% square wave 
    624637            iv = calcLogTableIndex(SQUARE_WAVE_OUTPUT); 
    625             waveTables[PG_SQUARE] = Vector.<int>([iv, iv+1]); 
    626             waveFixedBits[PG_SQUARE] = PHASE_BITS - 1; 
     638            waveTables[PG_SQUARE] = SiOPMWaveTable.alloc(Vector.<int>([iv, iv+1])); 
    627639             
    628640             
     
    631643            // pulse wave 
    632644            // NOTE: The resolution of duty ratio is twice than pAPU. [pAPU pulse wave table] = waveTables[PG_PULSE+duty*2]. 
    633             table2 = waveTables[PG_SQUARE]
     645            table2 = waveTables[PG_SQUARE].wavelet
    634646            for (j=0; j<16; j++) { 
    635647                table1 = new Vector.<int>(16, true); 
     
    637649                    table1[i] = (i<j) ? table2[0] : table2[1]; 
    638650                } 
    639                 waveTables[PG_PULSE+j]    = table1; 
    640                 waveFixedBits[PG_PULSE+j] = PHASE_BITS - 4; 
     651                waveTables[PG_PULSE+j] = SiOPMWaveTable.alloc(table1); 
    641652            } 
    642653             
     
    652663                    table1[i] = iv; 
    653664                } 
    654                 waveTables[PG_PULSE_SPIKE+j]    = table1; 
    655                 waveFixedBits[PG_PULSE_SPIKE+j] = PHASE_BITS - 5; 
    656             } 
    657              
    658              
    659         // knm bs mm wave 
     665                waveTables[PG_PULSE_SPIKE+j] = SiOPMWaveTable.alloc(table1); 
     666            } 
     667             
     668             
     669        // wave from konami bubble system 
    660670        //---------------------------- 
    661671            var wav:Array = [-80,-112,-16,96,64,16,64,96,32,-16,64,112,80,0,32,48,-16,-96,0,80,16,-64,-48,-16,-96,-128,-80,0,-48,-112,-80,-32]; 
     
    664674                table1[i] = calcLogTableIndex(wav[i]/128); 
    665675            } 
    666             waveTables   [PG_KNMBSMM] = table1; 
    667             waveFixedBits[PG_KNMBSMM] = PHASE_BITS - 5; 
     676            waveTables[PG_KNMBSMM] = SiOPMWaveTable.alloc(table1); 
    668677             
    669678             
     
    679688                table2[i] = iv;     // positive 
    680689            } 
    681             waveTables   [PG_SYNC_LOW]  = table1; 
    682             waveFixedBits[PG_SYNC_LOW]  = PHASE_BITS - SAMPLING_TABLE_BITS; 
    683             waveTables   [PG_SYNC_HIGH] = table2; 
    684             waveFixedBits[PG_SYNC_HIGH] = PHASE_BITS - SAMPLING_TABLE_BITS; 
     690            waveTables[PG_SYNC_LOW]  = SiOPMWaveTable.alloc(table1); 
     691            waveTables[PG_SYNC_HIGH] = SiOPMWaveTable.alloc(table2); 
    685692             
    686693             
     
    693700                table1[i] = calcLogTableIndex((Math.random()*2-1)*NOISE_WAVE_OUTPUT); 
    694701            } 
    695             waveTables   [PG_NOISE_WHITE] = table1; 
    696             waveFixedBits[PG_NOISE_WHITE] = PHASE_BITS - NOISE_TABLE_BITS; 
    697             defaultPTType[PG_NOISE_WHITE] = PT_PCM; 
    698             waveTables   [PG_NOISE] = waveTables   [PG_NOISE_WHITE]; 
    699             waveFixedBits[PG_NOISE] = waveFixedBits[PG_NOISE_WHITE]; 
    700             defaultPTType[PG_NOISE] = defaultPTType[PG_NOISE_WHITE]; 
     702            waveTables[PG_NOISE_WHITE] = SiOPMWaveTable.alloc(table1, PT_PCM); 
     703            waveTables[PG_NOISE] = waveTables[PG_NOISE_WHITE]; 
    701704             
    702705            // pulse noise. NOTE: This is dishonest impelementation. Details are shown in MAME or VirtuaNes source. 
     
    707710                table1[i] = (Math.random()>0.5) ? iv : (iv+1); 
    708711            } 
    709             waveTables   [PG_NOISE_PULSE] = table1; 
    710             waveFixedBits[PG_NOISE_PULSE] = PHASE_BITS - NOISE_TABLE_BITS; 
    711             defaultPTType[PG_NOISE_PULSE] = PT_PCM; 
     712            waveTables[PG_NOISE_PULSE] = SiOPMWaveTable.alloc(table1, PT_PCM); 
    712713             
    713714            // fc short noise. NOTE: This is dishonest 93*11=1023 aprox.-> 1024. 
     
    720721                table1[i] = (j&1) ? iv : (iv+1); 
    721722            } 
    722             waveTables   [PG_NOISE_SHORT] = table1; 
    723             waveFixedBits[PG_NOISE_SHORT] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    724             defaultPTType[PG_NOISE_SHORT] = PT_PCM; 
     723            waveTables[PG_NOISE_SHORT] = SiOPMWaveTable.alloc(table1, PT_PCM); 
    725724 
    726725            // high passed white noise 
    727726            table1 = new Vector.<int>(NOISE_TABLE_SIZE, true); 
    728             table2 = waveTables[PG_NOISE_WHITE]
     727            table2 = waveTables[PG_NOISE_WHITE].wavelet
    729728            imax = NOISE_TABLE_SIZE; 
    730729            n = 8/Number(1<<LOG_VOLUME_BITS); 
     
    736735                table1[i] = calcLogTableIndex(v*n); 
    737736            } 
    738             waveTables   [PG_NOISE_HIPAS] = table1; 
    739             waveFixedBits[PG_NOISE_HIPAS] = PHASE_BITS - NOISE_TABLE_BITS; 
    740             defaultPTType[PG_NOISE_HIPAS] = PT_PCM; 
     737            waveTables[PG_NOISE_SHORT] = SiOPMWaveTable.alloc(table1, PT_PCM); 
    741738             
    742739            // periodic noise 
     
    746743                table1[i] = LOG_TABLE_BOTTOM; 
    747744            } 
    748             waveTables   [PG_PC_NZ_16BIT] = table1; 
    749             waveFixedBits[PG_PC_NZ_16BIT] = PHASE_BITS - 4; 
     745            waveTables[PG_PC_NZ_16BIT] = SiOPMWaveTable.alloc(table1); 
    750746             
    751747            // pitch controlable noise 
    752             table1 = waveTables[PG_NOISE_SHORT]
     748            table1 = waveTables[PG_NOISE_SHORT].wavelet
    753749            table2 = new Vector.<int>(SAMPLING_TABLE_SIZE, true); 
    754750            for (j=0; j<SAMPLING_TABLE_SIZE; j++) { 
     
    757753                for (; i<imax; i++) { table2[i] = table1[j]; } 
    758754            } 
    759             waveTables   [PG_PC_NZ_SHORT] = table2; 
    760             waveFixedBits[PG_PC_NZ_SHORT] = PHASE_BITS - SAMPLING_TABLE_BITS; 
     755            waveTables[PG_PC_NZ_SHORT] = SiOPMWaveTable.alloc(table2); 
    761756             
    762757             
     
    771766                iv -= (iv * (j&7))>>4; 
    772767                if (prev == iv) { 
    773                     waveTables   [PG_RAMP+64-j] = waveTables   [PG_RAMP+65-j]; 
    774                     waveFixedBits[PG_RAMP+64-j] = waveFixedBits[PG_RAMP+65-j]; 
    775                     waveTables   [PG_RAMP+64+j] = waveTables   [PG_RAMP+63+j]; 
    776                     waveFixedBits[PG_RAMP+64+j] = waveFixedBits[PG_RAMP+63+j]; 
     768                    waveTables[PG_RAMP+64-j] = waveTables[PG_RAMP+65-j]; 
     769                    waveTables[PG_RAMP+64+j] = waveTables[PG_RAMP+63+j]; 
    777770                    continue; 
    778771                } 
     
    798791                    table2[imax2-i-1] = iv;   // positive value 
    799792                } 
    800                 waveTables   [PG_RAMP+64-j] = table1; 
    801                 waveFixedBits[PG_RAMP+64-j] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    802                 waveTables   [PG_RAMP+64+j] = table2; 
    803                 waveFixedBits[PG_RAMP+64+j] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    804             } 
    805             for (j=0; j<5; j++) { 
    806                 waveTables   [PG_RAMP+j] = waveTables   [PG_SAW_UP]; 
    807                 waveFixedBits[PG_RAMP+j] = waveFixedBits[PG_SAW_UP]; 
    808             } 
    809             for (j=124; j<128; j++) { 
    810                 waveTables   [PG_RAMP+j] = waveTables   [PG_SAW_DOWN]; 
    811                 waveFixedBits[PG_RAMP+j] = waveFixedBits[PG_SAW_DOWN]; 
    812             } 
    813             waveTables   [PG_RAMP+64] = waveTables   [PG_TRIANGLE]; 
    814             waveFixedBits[PG_RAMP+64] = waveFixedBits[PG_TRIANGLE]; 
     793                waveTables[PG_RAMP+64-j] = SiOPMWaveTable.alloc(table1); 
     794                waveTables[PG_RAMP+64+j] = SiOPMWaveTable.alloc(table2); 
     795            } 
     796            for (j=0;   j<5;   j++) waveTables[PG_RAMP+j] = waveTables[PG_SAW_UP]; 
     797            for (j=124; j<128; j++) waveTables[PG_RAMP+j] = waveTables[PG_SAW_DOWN]; 
     798            waveTables[PG_RAMP+64] = waveTables[PG_TRIANGLE]; 
    815799             
    816800             
     
    819803            // waveform 0-5 = sine wave 
    820804            waveTables[PG_MA3_WAVE] = waveTables[PG_SINE]; 
    821             waveFixedBits[PG_MA3_WAVE] = waveFixedBits[PG_SINE]; 
    822805            __exp_ma3_waves(0); 
    823806            // waveform 8-13 = bi-triangle modulated sine ? 
    824             table2 = waveTables[PG_SINE]
     807            table2 = waveTables[PG_SINE].wavelet
    825808            table1 = new Vector.<int>(SAMPLING_TABLE_SIZE, true); 
    826809            j = 0; 
     
    829812                j += 1-(((i>>(SAMPLING_TABLE_BITS-3))+1)&2); // triangle wave 
    830813            } 
    831             waveTables[PG_MA3_WAVE+8] = table1; 
    832             waveFixedBits[PG_MA3_WAVE+8] = PHASE_BITS - SAMPLING_TABLE_BITS; 
     814            waveTables[PG_MA3_WAVE+8] = SiOPMWaveTable.alloc(table1); 
    833815            __exp_ma3_waves(8); 
    834816            // waveform 16-21 = triangle wave 
    835817            waveTables[PG_MA3_WAVE+16] = waveTables[PG_TRIANGLE]; 
    836             waveFixedBits[PG_MA3_WAVE+16] = waveFixedBits[PG_TRIANGLE]; 
    837818            __exp_ma3_waves(16); 
    838819            // waveform 24-29 = saw wave 
    839820            waveTables[PG_MA3_WAVE+24] = waveTables[PG_SAW_UP]; 
    840             waveFixedBits[PG_MA3_WAVE+24] = waveFixedBits[PG_SAW_UP]; 
    841821            __exp_ma3_waves(24); 
    842822            // waveform 6 = square 
    843             waveFixedBits[PG_MA3_WAVE+6] = waveFixedBits[PG_SQUARE]; 
    844823            waveTables[PG_MA3_WAVE+6] = waveTables[PG_SQUARE]; 
    845824            // waveform 14 = half square 
    846825            iv = calcLogTableIndex(1); 
    847             waveTables[PG_MA3_WAVE+14] = Vector.<int>([iv, LOG_TABLE_BOTTOM]); 
    848             waveFixedBits[PG_MA3_WAVE+14] = PHASE_BITS - 1; 
     826            waveTables[PG_MA3_WAVE+14] = SiOPMWaveTable.alloc(Vector.<int>([iv, LOG_TABLE_BOTTOM])); 
    849827            // waveform 22 = twice of half square  
    850             waveTables[PG_MA3_WAVE+22] = Vector.<int>([iv, LOG_TABLE_BOTTOM, iv, LOG_TABLE_BOTTOM]); 
    851             waveFixedBits[PG_MA3_WAVE+22] = PHASE_BITS - 2; 
     828            waveTables[PG_MA3_WAVE+22] = SiOPMWaveTable.alloc(Vector.<int>([iv, LOG_TABLE_BOTTOM, iv, LOG_TABLE_BOTTOM])); 
    852829            // waveform 30 = quarter square 
    853             waveTables[PG_MA3_WAVE+30] = Vector.<int>([iv, LOG_TABLE_BOTTOM, LOG_TABLE_BOTTOM, LOG_TABLE_BOTTOM]); 
    854             waveFixedBits[PG_MA3_WAVE+30] = PHASE_BITS - 2; 
     830            waveTables[PG_MA3_WAVE+30] = SiOPMWaveTable.alloc(Vector.<int>([iv, LOG_TABLE_BOTTOM, LOG_TABLE_BOTTOM, LOG_TABLE_BOTTOM])); 
    855831             
    856832            // waveform 7 ??? 
     
    867843                table1[imax4-i-1]  = iv+1; // negative value index 
    868844            } 
    869             waveFixedBits[PG_MA3_WAVE+7] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    870             waveTables[PG_MA3_WAVE+7] = table1; 
     845            waveTables[PG_MA3_WAVE+7] = SiOPMWaveTable.alloc(table1); 
    871846            // waveform 15,23,31 = custom waveform 0-2 (not available) 
    872             waveTables[PG_MA3_WAVE+15] = waveTables[PG_SQUARE]; 
    873             waveFixedBits[PG_MA3_WAVE+15] = PHASE_BITS; 
    874             waveTables[PG_MA3_WAVE+23] = waveTables[PG_SQUARE]; 
    875             waveFixedBits[PG_MA3_WAVE+23] = PHASE_BITS; 
    876             waveTables[PG_MA3_WAVE+31] = waveTables[PG_SQUARE]; 
    877             waveFixedBits[PG_MA3_WAVE+31] = PHASE_BITS; 
     847            waveTables[PG_MA3_WAVE+15] = noWaveTable; 
     848            waveTables[PG_MA3_WAVE+23] = noWaveTable; 
     849            waveTables[PG_MA3_WAVE+31] = noWaveTable; 
    878850        } 
    879851         
     
    886858             
    887859            // basic waveform 
    888             table2 = waveTables[PG_MA3_WAVE+index]
     860            table2 = waveTables[PG_MA3_WAVE+index].wavelet
    889861             
    890862            // waveform 1 
     
    895867                table1[i+imax] = LOG_TABLE_BOTTOM; 
    896868            } 
    897             waveFixedBits[PG_MA3_WAVE+index+1] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    898             waveTables[PG_MA3_WAVE+index+1] = table1; 
     869            waveTables[PG_MA3_WAVE+index+1] = SiOPMWaveTable.alloc(table1); 
    899870             
    900871            // waveform 2 
     
    905876                table1[i+imax] = table2[i]; 
    906877            } 
    907             waveFixedBits[PG_MA3_WAVE+index+2] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    908             waveTables[PG_MA3_WAVE+index+2] = table1; 
     878            waveTables[PG_MA3_WAVE+index+2] = SiOPMWaveTable.alloc(table1); 
    909879             
    910880            // waveform 3 
     
    917887                table1[i+imax*3] = LOG_TABLE_BOTTOM; 
    918888            } 
    919             waveFixedBits[PG_MA3_WAVE+index+3] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    920             waveTables[PG_MA3_WAVE+index+3] = table1; 
     889            waveTables[PG_MA3_WAVE+index+3] = SiOPMWaveTable.alloc(table1); 
    921890             
    922891            // waveform 4 
     
    927896                table1[i+imax] = LOG_TABLE_BOTTOM; 
    928897            } 
    929             waveFixedBits[PG_MA3_WAVE+index+4] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    930             waveTables[PG_MA3_WAVE+index+4] = table1; 
     898            waveTables[PG_MA3_WAVE+index+4] = SiOPMWaveTable.alloc(table1); 
    931899             
    932900            // waveform 5 
     
    939907                table1[i+imax*3] = LOG_TABLE_BOTTOM; 
    940908            } 
    941             waveFixedBits[PG_MA3_WAVE+index+5] = PHASE_BITS - SAMPLING_TABLE_BITS; 
    942             waveTables[PG_MA3_WAVE+index+5] = table1; 
     909            waveTables[PG_MA3_WAVE+index+5] = SiOPMWaveTable.alloc(table1); 
    943910        } 
    944911         
     
    10481015    // wave tables 
    10491016    //-------------------------------------------------- 
    1050         // free list 
    1051         static private var _freeWaveTable:Array = []; 
    1052          
    1053          
    10541017        /** Reset all user tables */ 
    10551018        static public function resetAllUserTables() : void 
     
    10591022             
    10601023            // Reset wave tables 
    1061             for (i=0; i<256; i++) { 
    1062                 instance.waveTables   [PG_CUSTOM+i] = instance.waveTables[PG_SQUARE]; 
    1063                 instance.waveFixedBits[PG_CUSTOM+i] = PHASE_BITS;   // always 0 
    1064                 instance.waveTables   [PG_PCM+i]    = instance.waveTables[PG_SQUARE]; 
    1065                 instance.waveFixedBits[PG_PCM+i]    = PHASE_BITS;   // always 0 
    1066                 instance.waveTables   [PG_SAMPLE+i] = instance.waveTables[PG_SQUARE]; 
    1067                 instance.waveFixedBits[PG_SAMPLE+i] = PHASE_BITS;   // always 0 
    1068             } 
     1024            for (i=0; i<WAVE_TABLE_MAX; i++) {  
     1025                if (instance.customWaveTables[i]) {  
     1026                    instance.customWaveTables[i].free();  
     1027                    instance.customWaveTables[i] = null; 
     1028                } 
     1029            } 
     1030            for (i=0; i<PCM_DATA_MAX; i++) {  
     1031                if (instance.pcmData[i]) {  
     1032                    instance.pcmData[i].free(); 
     1033                    instance.pcmData[i] = null; 
     1034                } 
     1035            } 
     1036            for (i=0; i<SAMPLER_DATA_MAX; i++) { 
     1037                if (instance.samplerData[i]) { 
     1038                    instance.samplerData[i].free(); 
     1039                    instance.samplerData[i] = null; 
     1040                } 
     1041            } 
     1042            instance.stencilCustomWaveTables = null; 
     1043            instance.stencilPCMData = null; 
     1044            instance.stencilSamplerData = null; 
    10691045        } 
    10701046         
    10711047         
    10721048        /** Register wave table. */ 
    1073         static public function registerWaveTable(index:int, table:Vector.<int>, fixedBits:int) : void 
    1074         { 
    1075             // offset index 
    1076             var table_index:int = index + PG_CUSTOM; 
    1077  
     1049        static public function registerWaveTable(index:int, table:Vector.<int>) : void 
     1050        { 
    10781051            // register wave table 
    1079             instance.waveTables[table_index]    = table; 
    1080             instance.waveFixedBits[table_index] = fixedBits; 
    1081  
     1052            var newWaveTable:SiOPMWaveTable = SiOPMWaveTable.alloc(table); 
     1053            index &= WAVE_TABLE_MAX-1; 
     1054            instance.customWaveTables[index] = newWaveTable; 
     1055             
    10821056            // update PG_MA3_WAVE waveform 15,23,31. 
    10831057            if (index < 3) { 
    1084                 // index=0,1,2 are PG_MA3 waveform 15,23,31. 
    1085                 table_index = 15 + index * 8 + PG_MA3_WAVE; 
    1086                 instance.waveTables[table_index]    = table; 
    1087                 instance.waveFixedBits[table_index] = fixedBits; 
     1058                // index=0,1,2 are same as PG_MA3 waveform 15,23,31. 
     1059                instance.waveTables[15 + index * 8 + PG_MA3_WAVE] = newWaveTable; 
    10881060            } 
    10891061        } 
     
    10931065        static public function registerPCMData(index:int, table:Vector.<int>, samplingOctave:int) : void 
    10941066        { 
    1095             // offset index 
    1096             var table_index:int = index + PG_PCM; 
    1097  
    1098             // register wave table 
    1099             instance.waveTables[table_index]    = table; 
    1100             instance.waveFixedBits[table_index] = 14 + (samplingOctave-5); 
     1067            // register PCM data 
     1068            index &= PCM_DATA_MAX-1; 
     1069            instance.pcmData[index] = SiOPMPCMData.alloc(table, samplingOctave); 
    11011070        } 
    11021071         
    11031072         
    11041073        /** Register Sampler data. */ 
    1105         static public function registerSample(index:int, table:Vector.<int>, flag:int) : void 
    1106         { 
    1107             // offset index 
    1108             var table_index:int = index + PG_SAMPLE; 
    1109  
    1110             // register wave table 
    1111             instance.waveTables[table_index]    = table; 
    1112             instance.waveFixedBits[table_index] = flag; 
     1074        static public function registerSamplerData(index:int, table:Vector.<Number>, isOneShot:Boolean, channelCount:int) : void 
     1075        { 
     1076            // register sample 
     1077            index &= SAMPLER_DATA_MAX-1; 
     1078            instance.samplerData[index] = SiOPMSamplerData.alloc(table, isOneShot, channelCount); 
     1079        } 
     1080         
     1081         
     1082        /** get wave table */ 
     1083        public function getWaveTable(index:int) : SiOPMWaveTable 
     1084        { 
     1085            if (index < PG_CUSTOM) return waveTables[index]; 
     1086            if (index < PG_PCM) { 
     1087                index -= PG_CUSTOM; 
     1088                if (stencilCustomWaveTables && stencilCustomWaveTables[index]) return stencilCustomWaveTables[index]; 
     1089                return customWaveTables[index] || noWaveTable; 
     1090            } 
     1091            return noWaveTable; 
     1092        } 
     1093         
     1094         
     1095        /** get registerd PCM data */ 
     1096        public function getPCMData(index:int) : SiOPMPCMData 
     1097        { 
     1098            index &= PCM_DATA_MAX-1; 
     1099            if (stencilPCMData && stencilPCMData[index]) return stencilPCMData[index]; 
     1100            return pcmData[index]; 
     1101        } 
     1102         
     1103         
     1104        /** get registerd sampler data */ 
     1105        public function getSamplerData(index:int) : SiOPMSamplerData 
     1106        { 
     1107            index &= SAMPLER_DATA_MAX-1; 
     1108            if (stencilSamplerData && stencilSamplerData[index]) return stencilSamplerData[index]; 
     1109            return samplerData[index]; 
    11131110        } 
    11141111    } 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as

    r2625 r2697  
    4848            for (i=0, idx=offset; i<length; i++, idx+=step) { 
    4949                _pgTypeList[i] = idx; 
    50                 _ptTypeList[i] = SiOPMTable.instance.defaultPTType[idx]
     50                _ptTypeList[i] = SiOPMTable.instance.getWaveTable(idx).defaultPTType
    5151            } 
    5252            _channelTone = new Vector.<int>(channelCount, true); 
     
    8484            track.channel.setAlgorism(1, 0); 
    8585            track.channel.setType(_pgTypeList[channelTone], _ptTypeList[channelTone]); 
    86             return channelTone; 
     86            return (chNum == -1) ? -1 : channelTone; 
    8787        } 
    8888         
    8989         
    9090        /** select tone by tone number. */ 
    91         public function selectTone(track:SiMMLTrack, toneIndex:int) : MMLSequence 
     91        public function selectTone(track:SiMMLTrack, voiceIndex:int) : MMLSequence 
    9292        { 
    93             var param:SiOPMChannelParam; 
     93            if (voiceIndex == -1) return null; 
     94             
     95            var voice:SiMMLVoice, param:SiOPMChannelParam=null; 
    9496             
    9597            switch (_selectToneType) { 
    9698            case SELECT_TONE_NORMAL: 
    97                 if (toneIndex <0 || toneIndex >=_pgTypeList.length) toneIndex = _initIndex; 
    98                 track.channel.setType(_pgTypeList[toneIndex], _ptTypeList[toneIndex]); 
     99                if (voiceIndex <0 || voiceIndex >=_pgTypeList.length) voiceIndex = _initIndex; 
     100                track.channel.setType(_pgTypeList[voiceIndex], _ptTypeList[voiceIndex]); 
    99101                break; 
    100102            case SELECT_TONE_FM: 
    101                 toneIndex += track.channelNumber << 8; 
    102                 if (toneIndex<0 || toneIndex>=SiMMLTable.FM_PARAM_MAX) toneIndex=0; 
    103                 param = SiMMLTable.getSiOPMChannelParam(toneIndex); 
    104                 if (param) track.channel.setSiOPMChannelParam(param, false); 
    105                 return (param.initSequence.isEmpty()) ? null : param.initSequence; 
     103                voiceIndex += track.channelNumber << 8; 
     104                if (voiceIndex<0 || voiceIndex>=SiMMLTable.VOICE_MAX) voiceIndex=0; 
     105                voice = SiMMLTable.instance.getSiMMLVoice(voiceIndex); 
     106                if (voice) { 
     107                    param = voice.channelParam; 
     108                    if (param) { 
     109                        track.channel.setSiOPMChannelParam(param, false); 
     110                    } else { // set module type and channel number 
     111                        track.setChannelModuleType(voice.moduleType, voice.channelNum, voice.toneNum); 
     112                        track.channel.setAllAttackRate(voice.attackRate); 
     113                        track.channel.setAllReleaseRate(voice.releaseRate); 
     114                        track.pitchShift = voice.detune; 
     115                    } 
     116                    /* // comment out not to set these parameters 
     117                    track.setPortament(voice.portament); 
     118                    track.setReleaseSweep(voice.releaseSweep); 
     119                    track.setModulationEnvelop(false, voice.amDepth, voice.amDepthEnd, voice.amDelay, voice.amTerm); 
     120                    track.setModulationEnvelop(true,  voice.pmDepth, voice.pmDepthEnd, voice.pmDelay, voice.pmTerm); 
     121                    */ 
     122                } 
     123                return (param==null || param.initSequence.isEmpty()) ? null : param.initSequence; 
    106124            default: 
    107125                break; 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLData.as

    r2625 r2697  
    1212     
    1313     
    14     /** SiMML data class. 
    15      */ 
     14    /** SiMML data class. */ 
    1615    public class SiMMLData extends MMLData 
    1716    { 
     
    1918    //---------------------------------------- 
    2019        /** envelop tables */ 
    21         public var envelopTables:Vector.<SiMMLDataEnvelopTable>; 
    22         /** FM channel paramters */ 
    23         public var fmParameters:Vector.<SiMMLDataChannelParam>; 
     20        protected var _envelops:Vector.<SiMMLEnvelopTable>; 
     21        /** voice data */ 
     22        protected var _voices:Vector.<SiMMLVoice>; 
    2423         
    2524         
     
    2726    // constructor 
    2827    //---------------------------------------- 
     28        /** constructor. */ 
    2929        function SiMMLData() 
    3030        { 
    31             envelopTables = new Vector.<SiMMLDataEnvelopTable>(); 
    32             fmParameters  = new Vector.<SiMMLDataChannelParam>(); 
     31            _envelops = new Vector.<SiMMLEnvelopTable>(SiMMLTable.ENV_TABLE_MAX); 
     32            _voices   = new Vector.<SiMMLVoice>(SiMMLTable.VOICE_MAX); 
    3333        } 
    3434         
     
    4242        { 
    4343            super.clear(); 
    44             for each (var env:SiMMLDataEnvelopTable in envelopTables) { SiMMLDataEnvelopTable.free(env); } 
    45             for each (var prm:SiMMLDataChannelParam in fmParameters)  { SiMMLDataChannelParam.free(prm); } 
    46             envelopTables.length = 0; 
    47             fmParameters.length = 0; 
     44            var i:int, imax:int; 
     45            imax = _envelops.length; 
     46            for (i=0; i<imax; i++) _envelops[i] = null; 
     47            imax = _voices.length; 
     48            for (i=0; i<imax; i++) _voices[i] = null; 
    4849        } 
    4950         
    5051         
    5152        /** Register all tables before processing audio. */ 
    52         override public function regiterAllTables() : void 
     53        override public function regiter() : void 
    5354        { 
    54             super.regiterAllTables(); 
    55             for each (var env:SiMMLDataEnvelopTable in envelopTables) { env.register(); } 
    56             for each (var prm:SiMMLDataChannelParam in fmParameters)  { prm.register(); } 
     55            super.regiter(); 
     56            SiMMLTable.instance.stencilEnvelops = _envelops; 
     57            SiMMLTable.instance.stencilVoices   = _voices; 
     58        } 
     59         
     60         
     61        /** Set envelop table data refered by @@,na,np,nt,nf,_@@,_na,_np,_nt and _nf. 
     62         *  @param index envelop table number. 
     63         *  @param envelop envelop table. 
     64         */ 
     65        public function setEnvelopTable(index:int, envelop:SiMMLEnvelopTable) : void 
     66        { 
     67            if (index >= 0 && index < SiMMLTable.ENV_TABLE_MAX) _envelops[index] = envelop; 
     68        } 
     69         
     70         
     71        /** Set wave table data refered by %6. 
     72         *  @param index wave table number. 
     73         *  @param voice voice to register. 
     74         */ 
     75        public function setVoice(index:int, voice:SiMMLVoice) : void 
     76        { 
     77            if (index >= 0 && index < SiMMLTable.VOICE_MAX) { 
     78                if (!voice._isSuitableForFMVoice) throw errorNotGoodFMVoice(); 
     79                 _voices[index] = voice; 
     80            } 
    5781        } 
    5882         
     
    6185        internal function _setEnvelopTable(index:int, head:SLLint, tail:SLLint) : void 
    6286        { 
    63             envelopTables.push(SiMMLDataEnvelopTable.alloc(index, head, tail)); 
     87            var t:SiMMLEnvelopTable = new SiMMLEnvelopTable(); 
     88            t._initialize(head, tail); 
     89            _envelops[index] = t; 
    6490        } 
    6591         
     
    6894        internal function _getSiOPMChannelParam(index:int) : SiOPMChannelParam 
    6995        { 
    70             var e:SiMMLDataChannelParam = SiMMLDataChannelParam.alloc(index); 
    71             fmParameters.push(e); 
    72             return e.param; 
     96            var v:SiMMLVoice = new SiMMLVoice(); 
     97            v.channelParam = new SiOPMChannelParam(); 
     98            _voices[index] = v; 
     99            return v.channelParam; 
     100        } 
     101         
     102         
     103         
     104         
     105    // error 
     106    //---------------------------------------- 
     107        private function errorNotGoodFMVoice() : Error { 
     108            return new Error("SiONDriver error; Cannot register the voice."); 
    73109        } 
    74110    } 
    75111} 
    76112 
    77  
    78  
    79  
    80 import org.si.sion.module.SiOPMChannelParam; 
    81 import org.si.sion.sequencer.SiMMLTable; 
    82 import org.si.sion.sequencer.SiMMLEnvelopTable; 
    83 import org.si.utils.SLLint; 
    84  
    85  
    86 class SiMMLDataEnvelopTable 
    87 { 
    88     public var index:int; 
    89     public var table:SiMMLEnvelopTable; 
    90     static private var _freeList:Array = []; 
    91      
    92      
    93     function SiMMLDataEnvelopTable() 
    94     { 
    95         index = -1; 
    96         table = new SiMMLEnvelopTable(); 
    97     } 
    98      
    99      
    100     public function register() : void 
    101     { 
    102         SiMMLTable.registerEnvelopTable(index, table); 
    103     } 
    104      
    105      
    106     static public function free(e:SiMMLDataEnvelopTable) : void 
    107     { 
    108         e.index = -1; 
    109         e.table.free(); 
    110         _freeList.push(e); 
    111     } 
    112  
    113      
    114     static public function alloc(index:int, head:SLLint, tail:SLLint) : SiMMLDataEnvelopTable 
    115     {  
    116         var i:int, imax:int; 
    117          
    118         // new element 
    119         var e:SiMMLDataEnvelopTable = _freeList.pop() || new SiMMLDataEnvelopTable(); 
    120  
    121         // initialize 
    122         e.index = index; 
    123         e.table._initialize(head, tail); 
    124         return e; 
    125     }     
    126 } 
    127  
    128  
    129  
    130  
    131 class SiMMLDataChannelParam 
    132 { 
    133     public var index:int; 
    134     public var param:SiOPMChannelParam; 
    135     static private var _freeList:Array = []; 
    136      
    137      
    138     function SiMMLDataChannelParam() 
    139     { 
    140         index = -1; 
    141         param = new SiOPMChannelParam(); 
    142     } 
    143      
    144      
    145     public function register() : void 
    146     { 
    147         SiMMLTable.registerChannelParam(index, param); 
    148     } 
    149      
    150      
    151     static public function free(e:SiMMLDataChannelParam) : void 
    152     { 
    153         e.index = -1; 
    154         _freeList.push(e); 
    155     } 
    156  
    157      
    158     static public function alloc(index:int) : SiMMLDataChannelParam 
    159     {  
    160         var i:int, imax:int; 
    161          
    162         // new element 
    163         var e:SiMMLDataChannelParam = _freeList.pop() || new SiMMLDataChannelParam(); 
    164  
    165         // initialize 
    166         e.index = index; 
    167         e.param.initialize(); 
    168         return e; 
    169     }     
    170 } 
    171  
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as

    r2633 r2697  
    5454        private var _p:Vector.<int> = new Vector.<int>(PARAM_MAX);  // temporary area to get plural parameters 
    5555        private var _internalTableIndex:int = 0                     // internal table index 
    56         private var _freeTracks:Vector.<SiMMLTrack>;       // SiMMLTracks free list 
     56        private var _freeTracks:Vector.<SiMMLTrack>;                // SiMMLTracks free list 
     57        private var _isSequenceFinished:Boolean;                    // flag sequence finished 
    5758         
    5859        private var _title:String;                      // Title of the song. 
     
    7374        public function get processedSampleCount() : int { return _processedSampleCount; } 
    7475         
    75         /** Is finish to buffering ? */ 
     76        /** Is finish buffering ? */ 
    7677        public function get isFinished() : Boolean { 
    77             for each (var trk:SiMMLTrack in tracks) { 
    78                 if (!trk.isFinished) return false; 
    79             } 
     78            for each (var trk:SiMMLTrack in tracks) { if (!trk.isFinished) return false; } 
    8079            return true; 
    8180        } 
     81 
     82        /** Is finish executing sequence ? */ 
     83        public function get isSequenceFinished() : Boolean { return _isSequenceFinished; } 
    8284         
    8385        /** Current working track */ 
     
    233235            } 
    234236            _processedSampleCount = 0; 
     237            _isSequenceFinished = (tracks.length == 0); 
    235238        } 
    236239         
     
    240243    // operation for controlable tracks 
    241244    //-------------------------------------------------- 
    242         /** Find track by trackID. 
     245        /** Find active track by trackID. 
    243246         *  @param trackID trackID to find. 
     247         *  @param delay delay value to find the track sounds at same timing. -1 ignores this value. 
    244248         *  @return found track instance. Returns null when didnt find. 
    245249         */ 
    246         public function findTrack(trackID:int) : SiMMLTrack 
    247         { 
     250        public function findActiveTrack(trackID:int, delay:int=-1) : SiMMLTrack 
     251        { 
     252            var result:Array = []; 
    248253            for each (var trk:SiMMLTrack in tracks) { 
    249                 if (trk.trackID == trackID) return trk; 
     254                if (trk.trackID == trackID && trk.isActive) { 
     255                    if (delay == -1) return trk; 
     256                    var diff:int = trk.trackStartDelay - delay; 
     257                    if (-8<diff && diff<8) return trk; 
     258                } 
    250259            } 
    251260            return null; 
     
    375384             
    376385            // buffering 
     386            _isSequenceFinished = true; 
    377387            startGlobalSequence(); 
    378388            do { 
     
    381391                    _currentTrack = trk; 
    382392                    len = trk.prepareBuffer(bufferingTick); 
    383                     processMMLExecutor(trk.executor, len)
     393                    _isSequenceFinished = processMMLExecutor(trk.executor, len) && _isSequenceFinished
    384394                } 
    385395            } while (!isEndGlobalSequence()); 
     
    718728                case '#WAV': { 
    719729                    if (num < 0 || num > 255) throw _errorParameterNotValid("#WAV", String(num)); 
    720                     mmlData.setWaveTable(num, _parseWavMacro(dat, pfx), 5); 
     730                    mmlData.setWaveTable(num, _parseWavMacro(dat, pfx)); 
    721731                    return true; 
    722732                } 
    723733                case '#WAVB': { 
    724734                    if (num < 0 || num > 255) throw _errorParameterNotValid("#WAVB", String(num)); 
    725                     mmlData.setWaveTable(num, _parseWavbMacro((noData) ? pfx : dat), 5); 
     735                    mmlData.setWaveTable(num, _parseWavbMacro((noData) ? pfx : dat)); 
    726736                    return true; 
    727737                } 
     
    793803        static private var _tempNumberList    :SLLint = SLLint.alloc(0); 
    794804        static private var _tempNumberListLast:SLLint = null; 
    795         static private var _tempWaveTable     :Vector.<Number> = new Vector.<Number>(1024, false); 
     805        static private var _tempWaveTable10:Vector.<Number> = new Vector.<Number>(1024, false); 
     806        static private var _tempWaveTable5:Vector.<Number> = new Vector.<Number>(32, false); 
    796807 
    797808         
     
    811822            for (i=0; i<32 && num!=null; i++) { 
    812823                v = (num.i + 0.5) * 0.0078125; 
    813                 _tempWaveTable[j++] = (v>1) ? 1 : (v<-1) ? -1 : v; 
     824                _tempWaveTable5[j++] = (v>1) ? 1 : (v<-1) ? -1 : v; 
    814825                num = num.next; 
    815826            } 
    816             while (i<32) { _tempWaveTable[i++] = 0; } 
    817              
    818             return _tempWaveTable
     827            while (i<32) { _tempWaveTable5[i++] = 0; } 
     828             
     829            return _tempWaveTable5
    819830        } 
    820831         
     
    828839            for (i=0; i<32; i++) { 
    829840                ub = (i*2+1 < dat.length) ? int("0x" + dat.substr(i*2,2)) : 0; 
    830                 _tempWaveTable[j++] = (ub<128) ? (ub * 0.0078125) : ((ub-256) * 0.0078125); 
    831             } 
    832              
    833             return _tempWaveTable
     841                _tempWaveTable5[j++] = (ub<128) ? (ub * 0.0078125) : ((ub-256) * 0.0078125); 
     842            } 
     843             
     844            return _tempWaveTable5
    834845        } 
    835846         
     
    11251136            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    11261137            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1127             _currentTrack.setToneEnvelop(1, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1138            _currentTrack.setToneEnvelop(1, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    11281139            return e.next; 
    11291140        } 
     
    11361147            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    11371148            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1138             _currentTrack.setAmplitudeEnvelop(1, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1149            _currentTrack.setAmplitudeEnvelop(1, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    11391150            return e.next; 
    11401151        } 
     
    11471158            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    11481159            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1149             _currentTrack.setAmplitudeEnvelop(1, SiMMLTable.instance.envelopTables[idx], _p[1], true); 
     1160            _currentTrack.setAmplitudeEnvelop(1, SiMMLTable.instance.getEnvelopTable(idx), _p[1], true); 
    11501161            return e.next; 
    11511162        } 
     
    11581169            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    11591170            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1160             _currentTrack.setPitchEnvelop(1, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1171            _currentTrack.setPitchEnvelop(1, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    11611172            return e.next; 
    11621173        } 
     
    11691180            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    11701181            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1171             _currentTrack.setNoteEnvelop(1, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1182            _currentTrack.setNoteEnvelop(1, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    11721183            return e.next; 
    11731184        } 
     
    11801191            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    11811192            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1182             _currentTrack.setFilterEnvelop(1, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1193            _currentTrack.setFilterEnvelop(1, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    11831194            return e.next; 
    11841195        } 
     
    11911202            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    11921203            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1193             _currentTrack.setToneEnvelop(0, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1204            _currentTrack.setToneEnvelop(0, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    11941205            return e.next; 
    11951206        } 
     
    12021213            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    12031214            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1204             _currentTrack.setAmplitudeEnvelop(0, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1215            _currentTrack.setAmplitudeEnvelop(0, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    12051216            return e.next; 
    12061217        } 
     
    12131224            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    12141225            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1215             _currentTrack.setPitchEnvelop(0, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1226            _currentTrack.setPitchEnvelop(0, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    12161227            return e.next; 
    12171228        } 
     
    12241235            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    12251236            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1226             _currentTrack.setNoteEnvelop(0, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1237            _currentTrack.setNoteEnvelop(0, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    12271238            return e.next; 
    12281239        } 
     
    12351246            if (_p[1] == int.MIN_VALUE) _p[1] = 1; 
    12361247            var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255; 
    1237             _currentTrack.setFilterEnvelop(0, SiMMLTable.instance.envelopTables[idx], _p[1]); 
     1248            _currentTrack.setFilterEnvelop(0, SiMMLTable.instance.getEnvelopTable(idx), _p[1]); 
    12381249            return e.next; 
    12391250        } 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTable.as

    r2625 r2697  
    3434         
    3535        static public const ENV_TABLE_MAX:int = 512; 
    36         static public const FM_PARAM_MAX:int = 256; 
     36        static public const VOICE_MAX:int = 256; 
    3737         
    3838         
     
    4040    // valiables 
    4141    //-------------------------------------------------- 
    42         /** Envelop tables */ 
    43         public var envelopTables:Array = null; 
    44         /** FM parameter settings */ 
    45         public var fmParameters:Array = null; 
    46  
    4742        /** module setting table */ 
    4843        public var channelModuleSetting:Array = null; 
     
    8479        public var alg_init:Array = [0,1,5,7]; 
    8580 
     81        /** @private [internal use] Master data */ 
     82        private var _masterEnvelops:Vector.<SiMMLEnvelopTable> = null; 
     83        /** @private [internal use] Master data */ 
     84        private var _masterVoices:Vector.<SiMMLVoice> = null; 
     85        /** @private [internal use] Stencil data */ 
     86        internal var stencilEnvelops:Vector.<SiMMLEnvelopTable> = null; 
     87        /** @private [internal use] Stencil data */ 
     88        internal var stencilVoices:Vector.<SiMMLVoice> = null; 
     89         
    8690         
    8791         
     
    122126            channelModuleSetting[MT_PULSE]  = new SiMMLChannelSetting(MT_PULSE,  SiOPMTable.PG_PULSE,       32,  1, 32);  // pulse 
    123127            channelModuleSetting[MT_RAMP]   = new SiMMLChannelSetting(MT_RAMP,   SiOPMTable.PG_RAMP,        128, 1, 128); // ramp 
    124             channelModuleSetting[MT_SAMPLE] = new SiMMLChannelSetting(MT_SAMPLE, 0,                         2,   1, 2);   // sampler. this is based on SiOPMChannelSampler 
     128            channelModuleSetting[MT_SAMPLE] = new SiMMLChannelSetting(MT_SAMPLE, 0,                         1,   1, 1);   // sampler. this is based on SiOPMChannelSampler 
    125129             
    126130            // PSG setting 
     
    155159            channelModuleSetting[MT_SAMPLE]._selectToneType = SiMMLChannelSetting.SELECT_TONE_NOP; 
    156160            channelModuleSetting[MT_SAMPLE]._channelType    = SiOPMChannelManager.CT_CHANNEL_SAMPLER; 
    157             
     161             
     162            // tables 
     163            _masterEnvelops = new Vector.<SiMMLEnvelopTable>(ENV_TABLE_MAX); 
     164            for (i=0; i<ENV_TABLE_MAX; i++) _masterEnvelops[i] = null; 
     165            _masterVoices = new Vector.<SiMMLVoice>(VOICE_MAX); 
     166            for (i=0; i<VOICE_MAX; i++) _masterVoices[i] = null; 
    158167             
    159168            // These tables are just depended on my ear ... ('A`) 
     
    182191                return vector; 
    183192            } 
    184              
    185             // envelop table 
    186             envelopTables = new Array(ENV_TABLE_MAX); 
    187             for (i=0; i<ENV_TABLE_MAX; i++) { envelopTables[i] = null; } 
    188             // FM parameter settings 
    189             fmParameters = new Array(FM_PARAM_MAX); 
    190             for (i=0; i<FM_PARAM_MAX; i++) { fmParameters[i] = null; } 
    191193        } 
    192194         
     
    196198    // operations 
    197199    //-------------------------------------------------- 
    198         /** Reset all user tables */ 
    199         static public function resetAllUserTables() : void 
    200         { 
    201             var i:int, imax:int; 
    202              
    203             // Reset all envelop tables 
    204             imax = instance.envelopTables.length; 
    205             for (i=0; i<imax; i++) { instance.envelopTables[i] = null } 
    206              
    207             // Reset all FM parameter settings 
    208             imax = instance.fmParameters.length; 
    209             for (i=0; i<imax; i++) { instance.fmParameters[i] = null; } 
    210         } 
    211          
    212          
    213         /** Register envelop table */ 
    214         static public function registerEnvelopTable(index:int, table:SiMMLEnvelopTable) : void 
    215         { 
    216             if ((index<0 && index>=ENV_TABLE_MAX) || index == 255) return; 
    217             instance.envelopTables[index] = table; 
    218         } 
    219          
    220          
    221         /** Register SiOPMChannelParam */ 
    222         static public function registerChannelParam(index:int, param:SiOPMChannelParam) : void 
    223         { 
    224             if (index<0 && index>=FM_PARAM_MAX) return; 
    225             instance.fmParameters[index] = param; 
    226         } 
    227          
    228          
    229         /** Get SiOPMChannelParam */ 
    230         static public function getSiOPMChannelParam(index:int) : SiOPMChannelParam 
    231         { 
    232             if (index<0 && index>=FM_PARAM_MAX) return null; 
    233             return instance.fmParameters[index]; 
     200        /** Register envelop table. 
     201         *  @param index table number refered by @@,na,np,nt,nf,_@@,_na,_np,_nt and _nf. 
     202         *  @param table envelop table. 
     203         */ 
     204        static public function registerMasterEnvelopTable(index:int, table:SiMMLEnvelopTable) : void 
     205        { 
     206            if (index>=0 && index<ENV_TABLE_MAX) instance._masterEnvelops[index] = table; 
     207        } 
     208         
     209         
     210        /** Register voice data. 
     211         *  @param index voice parameter number refered by %6. 
     212         *  @param voice voice. 
     213         */ 
     214        static public function registerMasterVoice(index:int, voice:SiMMLVoice) : void 
     215        { 
     216            if (index>=0 && index<VOICE_MAX) instance._masterVoices[index] = voice; 
     217        } 
     218         
     219         
     220        /** Get Envelop table. 
     221         *  @param index table number. 
     222         */ 
     223        public function getEnvelopTable(index:int) : SiMMLEnvelopTable 
     224        { 
     225            if (index<0 || index>=ENV_TABLE_MAX) return null; 
     226            if (stencilEnvelops && stencilEnvelops[index]) return stencilEnvelops[index]; 
     227            return _masterEnvelops[index]; 
     228        } 
     229         
     230         
     231        /** Get voice data. 
     232         *  @param index voice parameter number. 
     233         */ 
     234        public function getSiMMLVoice(index:int) : SiMMLVoice 
     235        { 
     236            if (index<0 || index>=VOICE_MAX) return null; 
     237            if (stencilVoices && stencilVoices[index]) return stencilVoices[index]; 
     238            return _masterVoices[index]; 
    234239        } 
    235240    } 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as

    r2633 r2697  
    3838        static public const MIDI_TRACK_ID_OFFSET:int = 0x20000; 
    3939        /** driver track id offset */ 
    40         static public const DRIVER_TRACK_ID_OFFSET:int = 0x30000; 
     40        static public const DRIVER_NOTE_ID_OFFSET:int = 0x30000; 
     41        /** driver track id offset */ 
     42        static public const DRIVER_SEQUENCE_ID_OFFSET:int = 0x30000; 
    4143         
    4244        // _processMode 
     
    180182        public function get isControlable() : Boolean { return ((_trackID & TRACK_TYPE_FILTER) != MML_TRACK_ID_OFFSET); } 
    181183         
    182         /** Is activate ? In the sequence track, this function always returns true. */ 
     184        /** Is activate ? This function always returns true from the MML sequence track. */ 
    183185        public function get isActive() : Boolean { return (!isControlable || !channel.isIdling || _keyOnCounter>0 || _trackStartDelay>0); } 
    184186         
     
    394396            return this; 
    395397        } 
    396                  
     398         
    397399         
    398400        /** Slur without next notes key on. This have to be called just after keyOn(). */ 
     
    430432             
    431433            _processMode = ENVELOP; 
     434        } 
     435         
     436         
     437        /** Limit key on length.  
     438         *  @param stopDelay delay to key-off. 
     439         */ 
     440        public function limitLength(stopDelay:int) : void 
     441        { 
     442            var length:int = stopDelay - _trackStartDelay; 
     443            if (length < _keyOnCounter) { 
     444                _keyOnLength = stopDelay - _trackStartDelay; 
     445                _keyOnCounter = _keyOnLength; 
     446            } 
    432447        } 
    433448         
     
    938953            var ret:MMLSequence = null; 
    939954            if (param[0] != int.MIN_VALUE) { 
     955                ret = channelModuleSetting.selectTone(this, param[0]); 
    940956                _tone = param[0]; 
    941                 ret = channelModuleSetting.selectTone(this, _tone); 
    942957            } 
    943958            channel.setParameters(param); 
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as

    r2625 r2697  
    66 
    77package org.si.sion.sequencer.base { 
     8    import org.si.sion.module.SiOPMWaveTable; 
     9    import org.si.sion.module.SiOPMPCMData; 
     10    import org.si.sion.module.SiOPMSamplerData; 
     11    import org.si.sion.module.SiOPMTable; 
     12     
     13     
    814    /** MML data class. MMLData > MMLSequenceGroup > MMLSequence > MMLEvent (">" meanse "has a"). */ 
    915    public class MMLData 
     
    2632         
    2733        /** wave tables */ 
    28         public var waveTables:Vector.<MMLDataWaveTable>; 
    29         /** pcm data (serialized) */ 
    30         public var pcmData:Vector.<MMLDataWaveTable>; 
    31         /** wave data (raw wave) */ 
    32         public var waveData:Vector.<MMLDataWaveTable>; 
     34        public var waveTables:Vector.<SiOPMWaveTable>; 
     35        /** pcm data (log-transformed) */ 
     36        public var pcmData:Vector.<SiOPMPCMData>; 
     37        /** wave data */ 
     38        public var samplerData:Vector.<SiOPMSamplerData>; 
    3339         
    3440        /** system commands can not be parsed. Examples are for mml string "#ABC5{def}ghi;".<br/> 
     
    4046         */ 
    4147        public var systemCommands:Array; 
     48         
    4249         
    4350         
     
    6168            author = ""; 
    6269             
    63             waveTables = new Vector.<MMLDataWaveTable>(); 
    64             pcmData    = new Vector.<MMLDataWaveTable>(); 
    65             waveData   = new Vector.<MMLDataWaveTable>(); 
     70            waveTables = new Vector.<SiOPMWaveTable>(SiOPMTable.WAVE_TABLE_MAX); 
     71            pcmData    = new Vector.<SiOPMPCMData>(SiOPMTable.PCM_DATA_MAX); 
     72            samplerData = new Vector.<SiOPMSamplerData>(SiOPMTable.SAMPLER_DATA_MAX); 
    6673            systemCommands = []; 
    6774        } 
     
    7582        public function clear() : void 
    7683        { 
     84            var i:int, imax:int; 
     85             
    7786            sequenceGroup.free(); 
    7887            globalSequence.free(); 
     
    8392            author = ""; 
    8493             
    85             var table:MMLDataWaveTable; 
    86             for each (table in waveTables) { MMLDataWaveTable.free(table); } 
    87             for each (table in pcmData)    { MMLDataWaveTable.free(table); } 
    88             for each (table in waveData)   { MMLDataWaveTable.free(table); } 
    89             waveTables.length = 0; 
    90             pcmData.length = 0; 
    91             waveData.length = 0; 
     94            for (i=0; i<SiOPMTable.WAVE_TABLE_MAX; i++)   { if (waveTables[i])  { waveTables[i].free();  waveTables[i] = null; } } 
     95            for (i=0; i<SiOPMTable.PCM_DATA_MAX; i++)     { if (pcmData[i])     { pcmData[i].free();     pcmData[i] = null; } } 
     96            for (i=0; i<SiOPMTable.SAMPLER_DATA_MAX; i++) { if (samplerData[i]) { samplerData[i].free(); samplerData[i] = null; } } 
    9297            systemCommands.length = 0; 
    9398        } 
     
    95100         
    96101        /** Register all tables before processing audio. */ 
    97         public function regiterAllTables() : void 
     102        public function regiter() : void 
    98103        { 
    99             var table:MMLDataWaveTable; 
    100             for each (table in waveTables) { table.register(); } 
    101             for each (table in pcmData)    { table.register(); } 
    102             for each (table in waveData)   { table.register(); } 
     104            SiOPMTable.instance.stencilCustomWaveTables = waveTables; 
     105            SiOPMTable.instance.stencilPCMData          = pcmData; 
     106            SiOPMTable.instance.stencilSamplerData      = samplerData; 
    103107        } 
    104108         
    105109         
    106         /** Set wave table data */ 
    107         public function setWaveTable(index:int, table:Vector.<Number>, bits:int) : void 
     110        /** Set wave table data refered by %4. 
     111         *  @param index wave table number. 
     112         *  @param data Vector.<Number> wave shape data ranged from -1 to 1. 
     113         */ 
     114        public function setWaveTable(index:int, data:Vector.<Number>) : void 
    108115        { 
    109             waveTables.push(MMLDataWaveTable.allocWabeTable(index, table, bits)); 
     116            index &= SiOPMTable.WAVE_TABLE_MAX-1; 
     117            var i:int, imax:int=data.length; 
     118            var table:Vector.<int> = new Vector.<int>(imax); 
     119            for (i=0; i<imax; i++) table[i] = SiOPMTable.calcLogTableIndex(data[i]); 
     120            waveTables[index] = SiOPMWaveTable.alloc(table); 
    110121        } 
    111122         
    112123         
    113         /** Set PCM data */ 
    114         public function setPCMData(index:int, serialized:Vector.<int>, samplingOctave:int=5) : void 
     124        /** Set PCM data rederd from %7. 
     125         *  @param index PCM data number. 
     126         *  @param data Vector.<Number> wave data. This type ussualy comes from render(). 
     127         *  @param isDataStereo Flag that the wave data is stereo or monoral. 
     128         *  @param samplingOctave Sampling frequency. The value of 5 means that "o5a" is original frequency. 
     129         *  @see #org.si.sion.SiONDriver.render() 
     130         */ 
     131        public function setPCMData(index:int, data:Vector.<Number>, isDataStereo:Boolean=true, samplingOctave:int=5) : void 
    115132        { 
    116             pcmData.push(MMLDataWaveTable.allocPCMData(index, serialized, samplingOctave)); 
     133            index &= SiOPMTable.PCM_DATA_MAX-1; 
     134             
     135            var i:int, j:int, imax:int; 
     136            var pcm:Vector.<int>; 
     137            if (isDataStereo) { 
     138                imax = data.length>>1; 
     139                pcm = new Vector.<int>(imax); 
     140                for (i=0; i<imax; i++) { 
     141                    j = i<<1; 
     142                    pcm[i] = SiOPMTable.calcLogTableIndex(data[j]); 
     143                } 
     144            } else { 
     145                imax = data.length; 
     146                pcm = new Vector.<int>(imax); 
     147                for (i=0; i<imax; i++) { 
     148                    pcm[i] = SiOPMTable.calcLogTableIndex(data[i]); 
     149                } 
     150            } 
     151            pcmData[index] = SiOPMPCMData.alloc(pcm, samplingOctave); 
    117152        } 
    118153         
    119154         
    120         /** Set wave data */ 
    121         public function setWaveData(index:int, rawData:Vector.<int>, isOneShot:Boolean=true, isStereo:Boolean=false) : void 
     155        /** Set sampler data refered by %10. 
     156         *  @param index note number. 0-127 for bank0, 128-255 for bank1. 
     157         *  @param data Vector.<Number> wave data. This type ussualy comes from SiONDriver.render(). 
     158         *  @param isOneShot True to set "one shot" sound. The "one shot" sound ignores note off. 
     159         *  @param channelCount 1 for monoral, 2 for stereo. 
     160         *  @see #org.si.sion.SiONDriver.render() 
     161         */ 
     162        public function setSamplerData(index:int, data:Vector.<Number>, isOneShot:Boolean=true, channelCount:int=2) : void 
    122163        { 
    123             waveData.push(MMLDataWaveTable.allocWaveData(index, rawData, isOneShot, isStereo)); 
     164            index &= SiOPMTable.SAMPLER_DATA_MAX-1; 
     165            samplerData[index] = new SiOPMSamplerData(data, isOneShot, channelCount); 
    124166        } 
    125167    } 
     
    127169 
    128170 
    129  
    130  
    131 import flash.utils.ByteArray; 
    132 import org.si.sion.module.SiOPMTable; 
    133  
    134 // wave table class 
    135 class MMLDataWaveTable 
    136 { 
    137     public var index:int; 
    138     public var type:int; 
    139     public var waveFixedBits:int; 
    140     public var waveTable:Vector.<int>; 
    141     static private var _freeTableList:Vector.<MMLDataWaveTable> = new Vector.<MMLDataWaveTable>(); 
    142     static private var _freePCMList:Vector.<MMLDataWaveTable> = new Vector.<MMLDataWaveTable>(); 
    143     
    144      
    145     function MMLDataWaveTable() 
    146     { 
    147         index = -1; 
    148         waveFixedBits = 0; 
    149         type = 0; 
    150         waveTable = new Vector.<int>(); 
    151     } 
    152      
    153      
    154     public function register() : void 
    155     { 
    156         switch (type) { 
    157         case 0: SiOPMTable.registerWaveTable(index, waveTable, waveFixedBits);  break; 
    158         case 1: SiOPMTable.registerPCMData  (index, waveTable, waveFixedBits);  break; 
    159         case 2: SiOPMTable.registerSample   (index, waveTable, waveFixedBits);  break; 
    160         } 
    161     } 
    162      
    163      
    164     static public function free(e:MMLDataWaveTable) : void 
    165     { 
    166         e.index = -1; 
    167         if (e.type == 0) _freeTableList.push(e); 
    168         else _freePCMList.push(e);  
    169     } 
    170  
    171      
    172     static public function allocWabeTable(index:int, table:Vector.<Number>, bits:int) : MMLDataWaveTable 
    173     {  
    174         var e:MMLDataWaveTable = _freeTableList.pop() || new MMLDataWaveTable(); 
    175         e.type  = 0; 
    176         e.index = index; 
    177         e.waveFixedBits = SiOPMTable.PHASE_BITS - bits; 
    178          
    179         // copy wave table 
    180         var i:int, imax:int = 1<<bits; 
    181         e.waveTable = e.waveTable || new Vector.<int>(); 
    182         e.waveTable.length = imax; 
    183         for (i=0; i<imax; i++) { 
    184             e.waveTable[i] = SiOPMTable.calcLogTableIndex(table[i]); 
    185         } 
    186         return e; 
    187     } 
    188  
    189      
    190     static public function allocPCMData(index:int, serialized:Vector.<int>, samplingOctave:int) : MMLDataWaveTable 
    191     {  
    192         var e:MMLDataWaveTable = _freePCMList.pop() || new MMLDataWaveTable(); 
    193         e.type  = 1; 
    194         e.index = index; 
    195         e.waveFixedBits = samplingOctave; 
    196         e.waveTable = serialized; 
    197         return e; 
    198     } 
    199  
    200      
    201     static public function allocWaveData(index:int, rawData:Vector.<int>, isOneShot:Boolean, isStereo:Boolean) : MMLDataWaveTable 
    202     {  
    203         var e:MMLDataWaveTable = _freePCMList.pop() || new MMLDataWaveTable(); 
    204         e.type  = 2; 
    205         e.index = index; 
    206         e.waveFixedBits = ((isOneShot) ? 2 : 0) + ((isStereo) ? 1 : 0); 
    207         e.waveTable = rawData; 
    208         return e; 
    209     } 
    210 } 
    211  
  • as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as

    r2633 r2697  
    219219                bpm = mmlData.defaultBPM; 
    220220                globalExecutor.initialize(mmlData.globalSequence); 
    221                 mmlData.regiterAllTables(); 
     221                mmlData.regiter(); 
    222222            } 
    223223            globalBeat16 = 0; 
     
    269269         *  @param  exe MMLExecutor to process. 
    270270         *  @param  bufferSampleCount Buffering length of processing samples at once. 
    271          */ 
    272         protected function processMMLExecutor(exe:MMLExecutor, bufferSampleCount:int) : void 
     271         *  @return Returns true if the sequence already finished. 
     272         */ 
     273        protected function processMMLExecutor(exe:MMLExecutor, bufferSampleCount:int) : Boolean 
    273274        { 
    274275            currentExecutor = exe; 
     
    280281                if (event == null) { 
    281282                    _eventHandlers[MMLEvent.NOP](MMLEvent.nopEvent); 
    282                     return
     283                    return true
    283284                } else { 
    284285                    // update _processSampleCount in some _eventHandler()s 
     
    287288                } 
    288289            } 
     290            return false; 
    289291        } 
    290292         
  • as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as

    r2625 r2697  
    1414    /** Utilities for SiON */ 
    1515    public class SiONUtil { 
    16          
    17     // PCM data serialization (for PCM Data) 
     16    // PCM data transformation (for PCM Data %7) 
    1817    //-------------------------------------------------- 
    19         /** Serialize Sound wave */ 
    20         static public function serialize(data:Sound, sampleMax:int=1048576) : Vector.<int> 
     18        /** logarithmical transformation of Sound data. The transformed datas type is Vector.<int>. This data is used for PCM sound module (%7). 
     19         *  @param src The Sound data transforming from.  
     20         *  @param dst The Vector.<int> instance to put result. You can pass null to create new Vector.<int> inside. 
     21         *  @param sampleMax The maximum sample count to transforme. The length of transformed data is limited by this value. 
     22         *  @return logarithmical transformed data. 
     23         */ 
     24        static public function logTrans(data:Sound, dst:Vector.<int>=null, sampleMax:int=1048576) : Vector.<int> 
    2125        { 
    2226            var wave:ByteArray = new ByteArray(); 
    2327            var samples:int = data.extract(wave, sampleMax); 
    24             return serializeByteArrayPCM(wave, new Vector.<int>); 
     28            return logTransByteArray(wave, dst); 
    2529        } 
    2630         
    2731         
    28         /** Serialize Vector.<Number> wave */ 
    29         static public function serializeVectorPCM(src:Vector.<Number>, dst:Vector.<int>) : Vector.<int> 
     32        /** logarithmical transformation of Vector.<Number> wave data. The transformed datas type is Vector.<int>. This data is used for PCM sound module (%7). 
     33         *  @param src The Vector.<Number> wave data transforming from. This ussualy comes from SiONDriver.render(). 
     34         *  @param isDataStereo Flag that the wave data is stereo or monoral. 
     35         *  @param dst The Vector.<int> instance to put result. You can pass null to create new Vector.<int> inside. 
     36         *  @return logarithmical transformed data. 
     37         */ 
     38        static public function logTransVector(src:Vector.<Number>, isDataStereo:Boolean=true, dst:Vector.<int>=null) : Vector.<int> 
    3039        { 
    31             var i:int, j:int, imax:int=src.length>>1; 
    32             dst.length = imax; 
    33             for (i=0; i<imax; i++) { 
    34                 j = i<<1; 
    35                 dst[i] = SiOPMTable.calcLogTableIndex(src[j]); 
     40            var i:int, j:int, imax:int; 
     41            if (dst == null) dst = new Vector.<int>(); 
     42            if (isDataStereo) { 
     43                imax=src.length>>1; 
     44                dst.length = imax; 
     45                for (i=0; i<imax; i++) { 
     46                    j = i<<1; 
     47                    dst[i] = SiOPMTable.calcLogTableIndex(src[j]); 
     48                } 
     49            } else { 
     50                imax=src.length; 
     51                dst.length = imax; 
     52                for (i=0; i<imax; i++) { 
     53                    dst[i] = SiOPMTable.calcLogTableIndex(src[i]); 
     54                } 
    3655            } 
    3756            return dst; 
     
    3958         
    4059         
    41         /** Serialize ByteArray wave */ 
    42         static public function serializeByteArrayPCM(src:ByteArray, dst:Vector.<int>) : Vector.<int> 
     60        /** logarithmical transformation of ByteArray wave data. The transformed datas type is Vector.<int>. This data is used for PCM sound module (%7). 
     61         *  @param src The ByteArray wave data transforming from. This is ussualy from Sound.extract(). 
     62         *  @param dst The Vector.<int> instance to put result. You can pass null to create new Vector.<int> inside. 
     63         *  @return logarithmical transformed data. 
     64         */ 
     65        static public function logTransByteArray(src:ByteArray, dst:Vector.<int>=null) : Vector.<int> 
    4366        { 
    4467            var i:int, imax:int=src.length>>3; 
    4568            src.position = 0; 
     69            if (dst == null) dst = new Vector.<int>(); 
    4670            dst.length = imax; 
    4771            for (i=0; i<imax; i++) { 
     
    5579         
    5680         
    57     // raw wave data (for Sampler Data) 
     81    // wave data 
    5882    //-------------------------------------------------- 
    59         /** get raw data from Sound */ 
    60         static public function getRawData(data:Sound, channels:int=1, sampleMax:int=1048576) : Vector.<int> 
     83        /** put Sound.extract() result into Vector.<Number>. This data is used for sampler module (%10). 
     84         *  @param src The Sound data extracting from.  
     85         *  @param dst The Vector.<Number> instance to put result. You can pass null to create new Vector.<Number> inside. 
     86         *  @param channelCount channel count of extracted data. 1 for monoral, 2 for stereo. 
     87         *  @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 
     88         *  @return extracted data. 
     89         */ 
     90        static public function extract(src:Sound, dst:Vector.<Number>=null, channelCount:int=1, sampleMax:int=1048576) : Vector.<Number> 
    6191        { 
    62             var wave:ByteArray = new ByteArray(); 
    63             var samples:int = data.extract(wave, sampleMax); 
    64             return getRawDataByteArrayPCM(wave, new Vector.<int>, channels); 
    65         } 
    66          
    67          
    68         /** get raw data from Vector.<Number> wave */ 
    69         static public function getRawDataVectorPCM(src:Vector.<Number>, dst:Vector.<int>, channels:int=1) : Vector.<int> 
    70         { 
    71             var i:int, j0:int, j1:int, imax:int=src.length>>1; 
    72             dst.length = imax; 
    73             if (channels == 2) { 
     92            var wave:ByteArray = new ByteArray(), i:int, imax:int; 
     93            src.extract(wave, sampleMax); 
     94            if (dst == null) dst = new Vector.<Number>(); 
     95            wave.position = 0; 
     96            if (channelCount == 2) { 
     97                // stereo 
     98                imax = wave.length >> 2; 
     99                dst.length = imax; 
    74100                for (i=0; i<imax; i++) { 
    75                     j0 = i<<1; 
    76                     j1 = j0 + 1; 
    77                     dst[i] = int((src[j0]+1)*32767) + ((int((src[j1]+1)*32767))<<16); 
     101                    dst[i] = wave.readFloat(); 
    78102                } 
    79103            } else { 
     104                // monoral 
     105                imax = wave.length >> 3; 
     106                dst.length = imax; 
    80107                for (i=0; i<imax; i++) { 
    81                     j0 = i<<1; 
    82                     dst[i] = int(src[j0]*32767); 
    83                 } 
    84             } 
    85             return dst; 
    86         } 
    87          
    88          
    89         /** get raw data from ByteArray wave */ 
    90         static public function getRawDataByteArrayPCM(src:ByteArray, dst:Vector.<int>, channels:int=1) : Vector.<int> 
    91         { 
    92             var i:int, imax:int=src.length>>3; 
    93             src.position = 0; 
    94             dst.length = imax; 
    95             if (channels == 2) { 
    96                 for (i=0; i<imax; i++) { 
    97                     dst[i] = int((src.readFloat()+1)*32767) + ((int((src.readFloat()+1)*32767))<<16); 
    98                 } 
    99             } else { 
    100                 for (i=0; i<imax; i++) { 
    101                     dst[i] = int(src.readFloat()*32767); 
    102                     src.readFloat(); 
     108                    dst[i] = (wave.readFloat() + wave.readFloat()) * 0.6; 
    103109                } 
    104110            } 
  • as3/SiOPM/trunk/src/org/si/sion/utils/SoundClass.as

    r2625 r2697  
    3535         
    3636         
     37        /** create Sound class. 
     38         *  @param samples The Vector.<Number> wave data creating from. The LRLR type stereo data. 
     39         *  @param onComplete callback function when finished to create.  
     40         */ 
    3741        static public function create(samples:Vector.<Number>, onComplete:Function) : void { 
    3842            var size:int = samples.length * 2; // *2(16bit) 
  • as3/SiOPM/trunk/src/org/si/sound/SoundObject.as

    r2633 r2697  
    1919        public name:String; 
    2020         
     21        /** Sound length uint in 16th beat, 0 sets inifinity length. @default 0. */ 
     22        public length:Number; 
     23         
    2124        /** Sound delay uint in 16th beat. @default 0. */ 
    2225        public delay:Number; 
     
    2528        public quantize:Number; 
    2629         
    27         /** SiONDriver instance to access directly. */ 
     30        /** @private [internal uses] parent container */ 
     31        internal var _parent:SoundObjectContainer; 
     32         
     33        /** driver instance to access directly */ 
    2834        protected var _driver:SiONDriver; 
    2935         
    30         /** @private [internal uses] parent container */ 
    31         internal var _parent:SoundObjectContainer; 
     36        /** total volume of all ancestors */ 
     37        protected var _totalVolume:Number; 
     38        /** volume of this sound object */ 
     39        protected var _thisVolume:Number 
     40        /** total panning of all ancestors */ 
     41        protected var _totalPan:Number; 
     42        /** panning of this sound object */ 
     43        protected var _thisPan:Number 
     44        /** total mute flag of all ancestors */ 
     45        protected var _totalMute:Boolean; 
     46        /** mute flag of this sound object */ 
     47        protected var _thisMute:Boolean; 
     48         
     49        // next track id 
     50        static private var _nextTrackID:int=0; 
    3251         
    3352         
     
    3958        public function get driver() : SiONDriver { return _driver; } 
    4059         
    41         /** SoundStage object. */ 
    42         public function get stage() : SoundStage { return SoundStage.mutex; } 
    43          
    44          
    4560        /** Mute. */ 
    46         public function get mute() : Boolean { return false; } 
    47         public function set mute(m:Boolean) : void { } 
     61        public function get mute() : Boolean { return _thisMute; } 
     62        public function set mute(m:Boolean) : void {  
     63            _thisMute = m; 
     64            _updateMute(); 
     65        } 
    4866         
    4967        /** Volume (0:Minimum - 1:Maximum). */ 
    50         public function get volume() : Number { return 0; } 
    51         public function set volume(v:Number) : void { } 
     68        public function get volume() : Number { return _thisVolume; } 
     69        public function set volume(v:Number) : void { 
     70            _thisVolume = v; 
     71            _updateVolume(); 
     72            _limitVolume(); 
     73        } 
    5274         
    5375        /** Panning (-1:Left - 0:Center - +1:Right). */ 
    54         public function get pan() : Number { return 0; } 
    55         public function set pan(p:Number) : void { } 
     76        public function get pan() : Number { return _thisPan; } 
     77        public function set pan(p:Number) : void { 
     78            _thisPan = p; 
     79            _updatePan(); 
     80            _limitPan(); 
     81        } 
    5682         
    5783        /** parent container. */ 
    5884        public function get parent() : SoundObjectContainer { return _parent; } 
    5985         
     86        /** next track id to use */ 
     87        static protected function get nextTrackID() : int { 
     88            return (_nextTrackID++); 
     89        } 
    6090         
    6191         
     
    94124        { 
    95125        } 
     126         
     127         
     128         
     129         
     130    // oprate ancestor 
     131    //---------------------------------------- 
     132        /** @private [internal use] */ 
     133        internal function _setParent(parent:SoundObject) : void 
     134        { 
     135            if (_parent != null) _parent.removeChild(this); 
     136            _parent = parent; 
     137            _updateMute(); 
     138            _updateVolume(); 
     139            _limitVolume(); 
     140            _updatePan(); 
     141            _limitPan(); 
     142        } 
     143         
     144         
     145        /** @private [internal use] */ 
     146        internal function _updateMute() : void 
     147        { 
     148            if (_parent) _totalMute = _parent._totalMute || _thisMute; 
     149            else _totalMute = _thisMute; 
     150        } 
     151         
     152         
     153        /** @private [internal use] */ 
     154        internal function _updateVolume() : void 
     155        { 
     156            if (_parent) _totalVolume = _parent._totalVolume * _thisVolume; 
     157            else _totalVolume = _thisVolume; 
     158        } 
     159         
     160         
     161        /** @private [internal use] */ 
     162        internal function _limitVolume() : void 
     163        { 
     164            if (_totalVolume < 0) _totalVolume = 0; 
     165            else if (_totalVolume > 1) _totalVolume = 1; 
     166        } 
     167         
     168         
     169        /** @private [internal use] */ 
     170        internal function _updatePan() : void 
     171        { 
     172            if (_parent) _totalPan = (_parent._totalPan + _thisPan) * 0.5; 
     173            else _totalPan = _thisPan; 
     174        } 
     175         
     176         
     177        /** @private [internal use] */ 
     178        internal function _limitPan() : void 
     179        { 
     180            if (_totalPan < -1) _totalPan = -1; 
     181            else if (_totalPan > 1) _totalPan = 1; 
     182        } 
    96183    } 
    97184} 
  • as3/SiOPM/trunk/src/org/si/sound/SoundObjectContainer.as

    r2633 r2697  
    11//---------------------------------------------------------------------------------------------------- 
    2 // Sound object 
     2// Sound object container 
    33//  Copyright (c) 2009 keim All rights reserved. 
    44//  Distributed under BSD-style license (see org.si.license.txt). 
     
    2121    // properties 
    2222    //---------------------------------------- 
    23         /** Mute. */ 
    24         override public function get mute() : Boolean { return false; } 
    25         override public function set mute(m:Boolean) : void { } 
    26          
    27         /** Volume (0:Minimum - 1:Maximum). */ 
    28         override public function get volume() : Number { return 0; } 
    29         override public function set volume(v:Number) : void { } 
    30          
    31         /** Panning (-1:Left - 0:Center - +1:Right). */ 
    32         override public function get pan() : Number { return 0; } 
    33         override public function set pan(p:Number) : void { }         
    34          
    35          
    3623        /** Returns the number of children of this object. */ 
    3724        public function get numChildren() : int { return _soundList.length; } 
     25         
    3826         
    3927         
     
    8573        public function addChild(sound:SoundObject) : SoundObject 
    8674        { 
    87             if (sound._parent != null) sound._parent.removeChild(sound); 
    88             sound._parent = this; 
     75            sound._setParent(this); 
    8976            _soundList.push(sound); 
    9077            return sound; 
     
    10087        public function addChildAt(sound:SoundObject, index:int) : SoundObject 
    10188        { 
    102             sound._parent = this
     89            sound._setParent(this)
    10390            if (index < _soundList.length) _soundList.splice(index, 0, sound); 
    10491            else _soundList.push(sound); 
     
    117104            var index:int = _soundList.indexOf(sound); 
    118105            if (index == -1) throw Error("SoundObjectContainer Error; Specifyed children is not in the children list."); 
    119             sound._parent = null
     106            sound._setParent(null)
    120107            _soundList.splice(index, 1); 
    121108            return sound; 
     
    132119        { 
    133120            if (index >= _soundList.length) throw Error("SoundObjectContainer Error; Specifyed index is not in the children list."); 
    134             return _soundList.splice(index, 1)[0]; 
     121            var sound:SoundObject = _soundList.splice(index, 1)[0]; 
     122            sound._setParent(null); 
     123            return sound; 
    135124        } 
    136125         
     
    180169            return addChildAt(removeChild(child), index); 
    181170        } 
     171         
     172         
     173         
     174         
     175    // oprate ancestor 
     176    //---------------------------------------- 
     177        /** @private [internal use] */ 
     178        override internal function _updateMute() : void 
     179        { 
     180            super._updateMute(); 
     181            for each (var sound:SoundObject in _soundList) sound._updateMute(); 
     182        } 
     183         
     184         
     185        /** @private [internal use] */ 
     186        override internal function _updateVolume() : void 
     187        { 
     188            super._updateVolume(); 
     189            for each (var sound:SoundObject in _soundList) sound._updateVolume(); 
     190        } 
     191         
     192         
     193        /** @private [internal use] */ 
     194        override internal function _limitVolume() : void 
     195        { 
     196            super._limitVolume(); 
     197            for each (var sound:SoundObject in _soundList) sound._limitVolume(); 
     198        } 
     199         
     200         
     201        /** @private [internal use] */ 
     202        override internal function _updatePan() : void 
     203        { 
     204            super._updatePan(); 
     205            for each (var sound:SoundObject in _soundList) sound._updatePan(); 
     206        } 
     207         
     208         
     209        /** @private [internal use] */ 
     210        override internal function _limitPan() : void 
     211        { 
     212            super._limitPan(); 
     213            for each (var sound:SoundObject in _soundList) sound._limitPan(); 
     214        } 
    182215    } 
    183216} 
  • as3/SiOPM/trunk/src/org/si/sound/SoundStage.as

    r2633 r2697  
    11//---------------------------------------------------------------------------------------------------- 
    2 // Sound object 
     2// Sound stage 
    33//  Copyright (c) 2009 keim All rights reserved. 
    44//  Distributed under BSD-style license (see org.si.license.txt). 
     
    77 
    88package org.si.sound { 
    9     /** The SoundStage is to operate SiONDriver directly. 
    10      */ 
    11     public class SoundStage extends SoundObjectContainer 
    12     { 
    13     // valiables 
    14     //---------------------------------------- 
     9    import org.si.sion.SiONDriver; 
     10     
     11    public class soundStage { 
     12        static private var _driver:SiONDriver = new SiONDriver(); 
    1513         
    1614         
    17          
    18          
    19     // properties 
    20     //---------------------------------------- 
    21         /** Mute. */ 
    22         override public function get mute() : Boolean { return false; } 
    23         override public function set mute(m:Boolean) : void {  
    24              
    25         } 
    26          
    27         /** Volume (0:Minimum - 1:Maximum). */ 
    28         override public function get volume() : Number { return _driver.volume; } 
    29         override public function set volume(v:Number) : void { _driver.volume = v; } 
    30          
    31         /** Panning (-1:Left - 0:Center - +1:Right). */ 
    32         override public function get pan() : Number { return _driver.pan; } 
    33         override public function set pan(p:Number) : void { _driver.pan = p; } 
    34          
    35          
    36          
    37          
    38     // constructor 
    39     //---------------------------------------- 
    40         /** constructor. */ 
    41         function SoundStage() 
    42         { 
    43         } 
    44          
    45          
    46          
    47          
    48     // operations 
    49     //---------------------------------------- 
    50         /** Play sound. */ 
    51         override public function play() : void 
    52         { 
    53         } 
    54          
    55          
    56         /** Stop sound. */ 
    57         override public function stop() : void 
    58         { 
    59         } 
    60          
    61          
    62         /** Puase sound, resume by play() method. */ 
    63         override public function pause() : void 
     15        static public function play() : void  
    6416        { 
    6517        } 
     
    6719} 
    6820 
    69