チェンジセット 2697
- コミット日時:
- 2009/05/22 23:00:42 (3 年前)
- ファイル:
-
- as3/SiOPM/trunk/doc/mml_reference/siopm_mml_ref_05.html (更新) (3 diffs)
- as3/SiOPM/trunk/doc/mml_reference/siopm_mml_ref_05_e.html (更新) (4 diffs)
- as3/SiOPM/trunk/samples/SiOPMJavaScriptBridge/SiOPMJavaScriptBridge.as (更新) (5 diffs)
- as3/SiOPM/trunk/samples/SiOPMJavaScriptBridge/siopm.js (更新) (4 diffs)
- as3/SiOPM/trunk/samples/SiOPMJavaScriptBridge/siopm.swf (更新) (変更前)
- as3/SiOPM/trunk/samples/SiOPMKeyboard/app.swf (更新) (変更前)
- as3/SiOPM/trunk/samples/Tutorials/CustomFader.as (追加)
- as3/SiOPM/trunk/samples/Tutorials/EventTrigger.as (更新) (1 diff)
- as3/SiOPM/trunk/samples/Tutorials/EventTrigger2.as (追加)
- as3/SiOPM/trunk/samples/Tutorials/FadeInOut.as (追加)
- as3/SiOPM/trunk/samples/Tutorials/NoteOnException.as (追加)
- as3/SiOPM/trunk/samples/Tutorials/RenderWave.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as (更新) (39 diffs)
- as3/SiOPM/trunk/src/org/si/sion/SiONVoice.as (更新) (5 diffs)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiCtrlFilterBase.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectConnector.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectModule.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectStereoReverb.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/events/SiONEvent.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelBase.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelFM.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelSampler.as (更新) (6 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMModule.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperator.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperatorParam.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMPCMData.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMSamplerData.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMStream.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMTable.as (更新) (37 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMWaveTable.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLData.as (更新) (6 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as (更新) (21 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTable.as (更新) (7 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as (更新) (5 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLVoice.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as (更新) (8 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as (更新) (4 diffs)
- as3/SiOPM/trunk/src/org/si/sion/utils/Fader.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sion/utils/SoundClass.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sound/SoundObject.as (更新) (4 diffs)
- as3/SiOPM/trunk/src/org/si/sound/SoundObjectContainer.as (更新) (7 diffs)
- as3/SiOPM/trunk/src/org/si/sound/SoundStage.as (更新) (3 diffs)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/SiOPM/trunk/doc/mml_reference/siopm_mml_ref_05.html
r2625 r2697 2 2 <head> 3 3 <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> 5 5 <script type='text/javascript' src='jquery.js'></script> 6 6 <script type='text/javascript' src='siopm.js'></script> … … 139 139 </head> 140 140 <body> 141 <h1>SiOPM MML reference (version 0.5. 2)</h1>141 <h1>SiOPM MML reference (version 0.5.3)</h1> 142 142 <div class='copyright'>(c) keim +Si+ 2009</div> 143 143 … … 563 563 <td class='range'>time;Delay time[ms](200)<br/>fb;Feedback[%](25)<br/>cross;Stereo channel crossing(0)</td> 564 564 <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> 565 570 </tr> 566 571 <tr> as3/SiOPM/trunk/doc/mml_reference/siopm_mml_ref_05_e.html
r2625 r2697 2 2 <head> 3 3 <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> 5 5 <script type='text/javascript' src='jquery.js'></script> 6 6 <script type='text/javascript' src='siopm.js'></script> … … 139 139 </head> 140 140 <body> 141 <h1>SiOPM MML reference (version 0.5. 2)</h1>141 <h1>SiOPM MML reference (version 0.5.3)</h1> 142 142 <div class='copyright'>(c) keim +Si+ 2009</div> 143 143 … … 563 563 <td class='range'>time;Delay time[ms](200)<br/>fb;Feedback[%](25)<br/>cross;Stereo channel crossing(0)</td> 564 564 <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> 565 570 </tr> 566 571 <tr> … … 1478 1483 <td class='state'>@lfo<i>n1</i>,<i>n2</i></td> 1479 1484 <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 LFOand 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"). 1481 1486 <pre class='example'> 1482 1487 @lfo30 mp32c1 @lfo10 mp32c1 as3/SiOPM/trunk/samples/SiOPMJavaScriptBridge/SiOPMJavaScriptBridge.as
r2625 r2697 29 29 driver = new SiONDriver(); 30 30 data = new SiONData(); 31 addChild(driver);31 driver.autoStop = true; 32 32 33 33 //new pcmExample(driver); … … 50 50 driver.addEventListener(SiONEvent.STREAM_START, _onStreamStart); 51 51 driver.addEventListener(SiONEvent.STREAM_STOP, _onStreamStop); 52 driver.addEventListener(SiONEvent.FADE_IN_COMPLETE, _onFadeInComplete); 53 driver.addEventListener(SiONEvent.FADE_OUT_COMPLETE, _onFadeOutComplete); 52 54 53 55 // callback onLoad … … 66 68 private function _onStreamStop(e:SiONEvent) : void { ExternalInterface.call('SIOPM._internal_onStreamStop'); } 67 69 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'); } 68 72 69 73 … … 117 121 return driver.position; 118 122 } 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 } 119 145 } 120 146 } … … 141 167 function pcmExample(driver:SiONDriver) 142 168 { 143 driver.setPCM Data(0, new hit_mp3());144 driver.set WaveData(60, new kick_mp3()); //o5c145 driver.set WaveData(62, new sdw_mp3()); //o5d146 driver.set WaveData(64, new sds_mp3()); //o5e147 driver.set WaveData(65, new toml_mp3()); //o5f148 driver.set WaveData(67, new tomh_mp3()); //o5g149 driver.set WaveData(48, new hatc_mp3()); //o4c150 driver.set WaveData(50, new hath_mp3()); //o4d151 driver.set WaveData(52, new hato_mp3()); //o4e152 driver.set WaveData(53, new crash_mp3()); //o4f153 driver.set WaveData(55, new bell_mp3()); //o4g169 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 154 180 } 155 181 } as3/SiOPM/trunk/samples/SiOPMJavaScriptBridge/siopm.js
r2526 r2697 20 20 // version informations 21 21 //------------------------------ 22 SIOPM.VERSION = '0. 3.0';22 SIOPM.VERSION = '0.4.0'; 23 23 SIOPM.SWF_VERSION = 'SWF has not loaded.'; 24 24 SIOPM.toString = function() { return 'SIOPM_VERSION: ' + SIOPM.VERSION + '/ SWF_VERSION: ' + SIOPM.SWF_VERSION; }; … … 79 79 SIOPM.onStreamStop = function() {}; 80 80 81 // call back after fading in. 82 SIOPM.onFadeInComplete = function() {}; 83 84 // call back after fading out. 85 SIOPM.onFadeOutComplete = function() {}; 86 81 87 // call back when error appears. 82 88 SIOPM.onError = function() {}; … … 111 117 // control/refer position by Number (unit in milli-second), you can refer the position to call this without any arguments. 112 118 SIOPM.position = function() { return SIOPM.mmlPlayer._position(arguments[0]); } 119 120 // fade in time (unit in second). 121 SIOPM.fadeIn = function() { return SIOPM.mmlPlayer._fadeIn(arguments[0]); } 122 123 // fade out time (unit in second). 124 SIOPM.fadeOut = function() { return SIOPM.mmlPlayer._fadeOut(arguments[0]); } 113 125 114 126 // initialize. call this first of all. ussualy call this in body.onLoad(). this calls back onLoad() when the SiOPM is initialized successfully. … … 203 215 SIOPM.onStreamStop(); 204 216 } 205 206 217 SIOPM._internal_onFadeInComplete = function () { 218 SIOPM.onFadeInComplete(); 219 } 220 SIOPM._internal_onFadeOutComplete = function () { 221 SIOPM.onFadeOutComplete(); 222 } 223 224 as3/SiOPM/trunk/samples/Tutorials/EventTrigger.as
r2625 r2697 18 18 function EventTrigger() { 19 19 // 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"); 21 21 22 22 // listen triggers as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as
r2633 r2697 26 26 import org.si.sion.effector.SiEffectModule; 27 27 import org.si.sion.utils.SiONUtil; 28 import org.si.sion.utils.Fader; 28 29 29 30 … … 49 50 //---------------------------------------- 50 51 /** 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; 52 65 53 66 … … 82 95 private var _soundChannel:SoundChannel; // sound channel instance 83 96 private var _soundTransform:SoundTransform; // sound transform 97 private var _fader:Fader; // sound fader 84 98 85 99 private var _backgroundSound:Sound; // background Sound … … 93 107 private var _debugMode:Boolean; // true; throw Error, false; throw ErrorEvent 94 108 private var _dispatchStreamEvent:Boolean; // dispatch steam event 109 private var _dispatchFadingEvent:Boolean; // dispatch fading event 95 110 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 96 113 97 114 private var _queueInterval:int; // interupting interval to execute queued jobs … … 100 117 private var _currentJob:int; // current job 0=no job, 1=compile, 2=render 101 118 102 119 private var _autoStop:Boolean; // auto stop when the sequence finished 120 private var _noteOnExceptionMode:int; // track id exception mode 103 121 private var _isPaused:Boolean; // flag to pause 104 122 private var _position:Number; // start position [ms] 123 private var _masterVolume:Number; // master volume 124 private var _faderVolume:Number; // fader volume 105 125 106 126 private var _triggerEventQueue:Vector.<SiONTrackEvent>; 107 127 108 128 private var _renderBuffer:Vector.<Number>; // rendering buffer 129 private var _renderBufferChannelCount:int; // rendering buffer channel count 109 130 private var _renderBufferIndex:int; // rendering buffer writing index 110 131 private var _renderBufferSizeMax:int; // maximum value of rendering buffer size … … 147 168 public function get sound() : Sound { return _sound; } 148 169 149 /** Sound channel . This property is only available during playing sound. */170 /** Sound channel, this property is only available during playing sound. */ 150 171 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; } 151 175 152 176 … … 159 183 160 184 /** Sound volume. */ 161 public function get volume() : Number { return _ soundTransform.volume; }185 public function get volume() : Number { return _masterVolume; } 162 186 public function set volume(v:Number) : void { 163 _soundTransform.volume = v; 187 _masterVolume = v; 188 _soundTransform.volume = _masterVolume * _faderVolume; 164 189 if (_soundChannel) _soundChannel.soundTransform = _soundTransform; 165 190 } … … 208 233 209 234 // operation 210 /** Buffering position[ms] on mml data. */235 /** Buffering position[ms] on mml data. @default 0 */ 211 236 public function get position() : Number { 212 237 return sequencer.processedSampleCount * 1000 / _sampleRate; … … 220 245 } 221 246 222 /** Beat par minute. */247 /** Beat par minute. @default 120 */ 223 248 public function get bpm() : Number { 224 249 return (sequencer.isReadyToProcess) ? sequencer.bpm : sequencer.setting.defaultBPM; … … 233 258 } 234 259 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 */ 236 265 public function get debugMode() : Boolean { return _debugMode; } 237 266 public function set debugMode(mode:Boolean) : void { _debugMode = mode; } 238 267 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 239 278 240 279 … … 242 281 // constructor 243 282 //---------------------------------------- 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. 245 284 * @param bufferLength Buffer size of sound stream. 8192, 4096 or 2048 is available, but no check. 246 285 * @param channel Channel count. 1 or 2 is available. … … 261 300 _sound = new Sound(); 262 301 _soundTransform = new SoundTransform(); 302 _fader = new Fader(); 263 303 264 304 // initialize … … 270 310 _listenEvent = NO_LISTEN; 271 311 _dispatchStreamEvent = false; 312 _dispatchFadingEvent = false; 272 313 _cannotChangeBPM = false; 314 _preserveStop = false; 315 _inStreaming = false; 316 _autoStop = false; 317 _noteOnExceptionMode = NEM_IGNORE; 273 318 _debugMode = false; 274 319 … … 277 322 _backgroundBuffer = null; 278 323 279 _soundTransform.volume = 1; 324 _position = 0; 325 _masterVolume = 1; 326 _faderVolume = 1; 280 327 _soundTransform.pan = 0; 281 _ position = 0;328 _soundTransform.volume = _masterVolume * _faderVolume; 282 329 283 330 _eventListenerPrior = 1; … … 350 397 { 351 398 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)); 353 400 } 354 401 … … 361 408 * @param data SiONData or mml String to play. 362 409 * @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. 363 411 * @param resetEffector reset all effectors before play data. 364 412 * @return rendered data. 365 413 */ 366 public function render(data:*, renderBuffer:Vector.<Number>=null, re setEffector:Boolean=true) : Vector.<Number>414 public function render(data:*, renderBuffer:Vector.<Number>=null, renderBufferChannelCount:int=2, resetEffector:Boolean=true) : Vector.<Number> 367 415 { 368 416 try { … … 373 421 var t:int = getTimer(); 374 422 if (resetEffector) effector.initialize(); 375 _prepareRender(data, renderBuffer );423 _prepareRender(data, renderBuffer, renderBufferChannelCount); 376 424 while(true) { if (_rendering()) break; } 377 425 _timeRender = getTimer() - t; … … 390 438 * @param data SiONData or mml String to render. 391 439 * @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. 392 441 * @return Queue length. 393 442 * @see #startQueue() 394 443 */ 395 public function renderQueue(data:*, renderBuffer:Vector.<Number> ) : int444 public function renderQueue(data:*, renderBuffer:Vector.<Number>, renderBufferChannelCount:int=2) : int 396 445 { 397 446 if (data == null || renderBuffer == null) return _jobQueue.length; … … 399 448 if (data is String) { 400 449 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)); 403 452 } else 404 453 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)); 406 455 } 407 456 … … 497 546 public function stop() : void 498 547 { 499 _removeAllEventListners();500 548 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 } 507 563 } 508 564 } … … 538 594 539 595 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 543 619 //---------------------------------------- 544 620 /** Set wave table data refered by %4. … … 551 627 for (len=table.length; len>0; len>>=1) bits++; 552 628 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); 556 632 } 557 633 558 634 559 635 /** 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. 560 650 * @param index PCM data number. 561 651 * @param sound Sound instance to set. 562 652 * @param samplingOctave Sampling frequency. The value of 5 means that "o5a" is original frequency. 563 653 */ 564 public function setPCM Data(index:int, sound:Sound, samplingOctave:int=5) : void565 { 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); 567 657 SiOPMTable.registerPCMData(index, data, samplingOctave); 568 658 } 569 659 570 660 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. 573 676 * @param sound Sound instance to set. 574 677 * @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); 581 719 } 582 720 … … 586 724 // Interface for intaractivity 587 725 //---------------------------------------- 726 /** Play sound registered in sampler table (registered by setSamplerData()). */ 727 public function playSound() : SiMMLTrack 728 { 729 return null; 730 } 731 732 588 733 /** Note on. This function only is available after play(). The NOTE_ON_STREAM event is dispatched inside. 589 734 * @param note note number [0-127]. … … 602 747 eventTriggerID:int=0, noteOnTrigger:int=0, noteOffTrigger:int=0) : SiMMLTrack 603 748 { 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); 607 768 if (mmlTrack) { 608 769 if (voice) voice.setTrackVoice(mmlTrack); … … 615 776 616 777 /** 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. 618 779 * @param trackID track id to note off. 619 780 * @param delay note off delay units in 16th beat. … … 623 784 public function noteOff(note:int, trackID:int=0, delay:Number=0, quant:Number=0) : SiMMLTrack 624 785 { 625 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_ TRACK_ID_OFFSET;786 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_NOTE_ID_OFFSET; 626 787 var mmlTrack:SiMMLTrack = sequencer.findControlableTrack(trackID, note), 627 788 delaySamples:int = sequencer.calcSampleDelay(0, delay, quant); … … 643 804 length:Number=0, delay:Number=0, quant:Number=1, trackID:int=0) : int 644 805 { 645 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_ TRACK_ID_OFFSET;806 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_SEQUENCE_ID_OFFSET; 646 807 // create new sequence tracks 647 808 var mmlTrack:SiMMLTrack, … … 667 828 public function sequenceOff(trackID:int, delay:Number=0, quant:Number=1) : int 668 829 { 669 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_ TRACK_ID_OFFSET;830 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_SEQUENCE_ID_OFFSET; 670 831 var delaySamples:int = sequencer.calcSampleDelay(0, delay, quant); 671 832 for each (var mmlTrack:SiMMLTrack in sequencer.tracks) { … … 804 965 var queue:SiONDriverJob = _jobQueue.shift(); 805 966 if (queue.mml) _prepareCompile(queue.mml, queue.data); 806 else _prepareRender(queue.data, queue.buffer );967 else _prepareRender(queue.data, queue.buffer, queue.channelCount); 807 968 return false; 808 969 } … … 871 1032 //---------------------------------------- 872 1033 // prepare for rendering 873 private function _prepareRender(data:*, renderBuffer:Vector.<Number> ) : void1034 private function _prepareRender(data:*, renderBuffer:Vector.<Number>, renderBufferChannelCount:int) : void 874 1035 { 875 1036 _prepareProcess(data); 876 1037 _renderBuffer = renderBuffer || new Vector.<Number>(); 1038 _renderBufferChannelCount = (renderBufferChannelCount==2) ? 2 : 1; 877 1039 _renderBufferSizeMax = _renderBuffer.length; 878 1040 _renderBufferIndex = 0; … … 886 1048 private function _rendering() : Boolean 887 1049 { 888 var i:int, j:int, imax:int, 1050 var i:int, j:int, imax:int, extention:int, 889 1051 output:Vector.<Number> = module.output, 890 1052 finished:Boolean = false; … … 893 1055 sequencer.process(); 894 1056 effector.process(); 1057 module.limitLevel(); 895 1058 896 1059 // 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; 900 1064 finished = true; 901 1065 } 902 1066 903 1067 // extend buffer 904 if (_renderBuffer.length < _renderBufferIndex+ imax) {905 _renderBuffer.length = _renderBufferIndex+ imax;1068 if (_renderBuffer.length < _renderBufferIndex+extention) { 1069 _renderBuffer.length = _renderBufferIndex+extention; 906 1070 } 907 1071 908 1072 // 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 } 911 1081 } 912 1082 913 1083 // incerement index 914 _renderBufferIndex += imax;1084 _renderBufferIndex += extention; 915 1085 916 1086 return (finished || (_renderBufferSizeMax==0 && sequencer.isFinished)); … … 947 1117 _frameRate = t - _prevFrameTime; 948 1118 _prevFrameTime = t; 1119 1120 // preserve stop 1121 if (_preserveStop) stop(); 949 1122 950 1123 // frame trigger … … 972 1145 973 1146 try { 1147 _inStreaming = true; 974 1148 if (_isPaused) { 975 1149 // paused -> 0 filling … … 986 1160 sequencer.process(); 987 1161 effector.process(); 1162 module.limitLevel(); 988 1163 _cannotChangeBPM = false; 989 1164 … … 1012 1187 if (event.isDefaultPrevented()) stop(); // canceled 1013 1188 } 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; 1014 1200 } 1015 1201 } catch (e:Error) { … … 1023 1209 1024 1210 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 1027 1229 //---------------------------------------- 1028 1230 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."); 1030 1232 } 1031 1233 … … 1044 1246 private function errorCannotChangeBPM() : Error { 1045 1247 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."); 1046 1253 } 1047 1254 } … … 1058 1265 public var buffer:Vector.<Number>; 1059 1266 public var data:SiONData; 1267 public var channelCount:int; 1060 1268 1061 function SiONDriverJob(mml_:String, buffer_:Vector.<Number>, data_:SiONData )1269 function SiONDriverJob(mml_:String, buffer_:Vector.<Number>, data_:SiONData, channelCount_:int) 1062 1270 { 1063 1271 mml = mml_; 1064 1272 buffer = buffer_; 1065 1273 data = data_ || new SiONData(); 1274 channelCount = channelCount_; 1066 1275 } 1067 1276 } as3/SiOPM/trunk/src/org/si/sion/SiONVoice.as
r2625 r2697 7 7 package org.si.sion { 8 8 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; 11 10 import org.si.sion.module.SiOPMChannelParam; 12 11 … … 16 15 * @see org.si.sion.module.SiOPMOperatorParam 17 16 */ 18 public class SiONVoice 17 public class SiONVoice extends SiMMLVoice 19 18 { 20 19 // variables … … 22 21 /** voice name */ 23 22 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 '@'. -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 '@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 '@@' @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 '_@@' @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 '@@' @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 '_@@' @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;110 23 111 24 … … 123 36 function SiONVoice(moduleType:int=0, channelNum:int=0, ar:int=63, rr:int=63, dt:int=0) 124 37 { 38 super(); 39 125 40 name = ""; 126 setVolumes = false;127 128 41 this.moduleType = moduleType; 129 42 this.channelNum = channelNum; … … 131 44 releaseRate = rr; 132 45 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 // setting175 //--------------------------------------------------176 /** set sequencer track */177 public function setTrackVoice(track:SiMMLTrack) : SiMMLTrack178 {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 // operation209 //--------------------------------------------------210 /** copy all parameters */211 public function copyFrom(src:SiONVoice) : SiONVoice212 {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;258 46 } 259 47 as3/SiOPM/trunk/src/org/si/sion/effector/SiCtrlFilterBase.as
r2625 r2697 42 42 */ 43 43 public function setParameters(cut:int=255, res:int=255, fps:Number=20) : void { 44 _table = SiOPMTable.instance; 44 45 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; 48 48 _cutIndex = (_ptrCut) ? _ptrCut.i : 128; 49 49 _res = (_ptrRes) ? (_ptrRes.i*0.007751937984496124) : 0; // 0.007751937984496124=1/129 … … 61 61 _lfoStep = 2048; 62 62 _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; 64 70 _res = resonance; 65 71 } as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectModule.as
r2633 r2697 42 42 register("eq", SiEffectEqualiser); 43 43 register("delay", SiEffectStereoDelay); 44 register("reverb", SiEffectStereoReverb); 44 45 register("chorus", SiEffectStereoChorus); 45 46 register("autopan", SiEffectAutoPan); as3/SiOPM/trunk/src/org/si/sion/events/SiONEvent.as
r2625 r2697 63 63 64 64 65 /** Dispatch wh enstreaming. 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. 66 66 * <p>The properties of the event object have the following values:</p> 67 67 * <table class=innertable> … … 91 91 92 92 93 /** Dispatch when stop streaming. This event is called inside SiONDriver.stop().93 /** Dispatch when stop streaming. This event is dispatched inside SiONDriver.stop(). 94 94 * <p>The properties of the event object have the following values:</p> 95 95 * <table class=innertable> … … 103 103 */ 104 104 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'; 105 161 106 162 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelBase.as
r2625 r2697 109 109 /** Get SiOPMChannelParam. */ 110 110 public function getSiOPMChannelParam(param:SiOPMChannelParam) : void {} 111 /** Set by PCM wave. */ 112 public function setPCMData(pcmData:SiOPMPCMData) : void {} 111 113 112 114 /** algorism (@al) */ as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelFM.as
r2625 r2697 289 289 290 290 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 291 302 292 303 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelSampler.as
r2625 r2697 23 23 /** expression */ protected var _expression:Number; 24 24 25 /** sample data */ protected var _sample:Vector.< int>;25 /** sample data */ protected var _sample:Vector.<Number>; 26 26 /** sample length */ protected var _sampleLength:int; 27 27 /** sample index */ protected var _sampleIndex:int; 28 /** phase reset */ protected var _sample PhaseReset:Boolean;28 /** phase reset */ protected var _sampleStartPhase:int; 29 29 /** channel count */ protected var _sampleChannelCount:int; 30 30 … … 104 104 override public function setType(pgType:int, ptType:int) : void 105 105 { 106 _bankNumber = pgType & 1;106 _bankNumber = pgType & 3; 107 107 } 108 108 … … 130 130 /** phase (@ph) */ 131 131 override public function set phase(i:int) : void { 132 _sample PhaseReset = ((i&255)!=255);132 _sampleStartPhase = i; 133 133 } 134 134 … … 148 148 _sampleLength = 0; 149 149 _sampleIndex = 0; 150 _sample PhaseReset = true;150 _sampleStartPhase = 0; 151 151 _sampleChannelCount = 1; 152 152 _expression = 0.5; … … 166 166 _sampleLength = 0; 167 167 _sampleIndex = 0; 168 _sample PhaseReset = true;168 _sampleStartPhase = 0; 169 169 _sampleChannelCount = 1; 170 170 _expression = 0.5; … … 178 178 _isNoteOn = true; 179 179 _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 } 187 189 } 188 190 } as3/SiOPM/trunk/src/org/si/sion/module/SiOPMModule.as
r2633 r2697 156 156 157 157 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 158 171 /** get pipe buffer */ 159 172 public function getPipe(pipeNum:int, index:int=0) : SLLint as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperator.as
r2625 r2697 354 354 { 355 355 _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; 358 359 } 359 360 /** Pitch table type. */ … … 376 377 public function get fmul() : int { return _multiple; } 377 378 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; } 379 380 public function get modLevel() : int { return (_fmShift>10) ? (_fmShift-10) : 0; } 380 381 … … 531 532 param.modLevel = (_fmShift>10) ? (_fmShift - 10) : 0; 532 533 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; 533 554 } 534 555 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperatorParam.as
r2625 r2697 68 68 { 69 69 pgType = type; 70 ptType = SiOPMTable.instance. defaultPTType[type];70 ptType = SiOPMTable.instance.getWaveTable(type).defaultPTType; 71 71 } 72 72 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMStream.as
r2633 r2697 64 64 65 65 66 public function writeVectorInt(pointer:Vector.< int>, startPointer:int, startBuffer:int, len:int, vol:Number, pan:int, sampleChannelCount:int) : void66 public function writeVectorInt(pointer:Vector.<Number>, startPointer:int, startBuffer:int, len:int, vol:Number, pan:int, sampleChannelCount:int) : void 67 67 { 68 var i:int, j:int, n:Number, jmax:int = startPointer + len, volL:Number, volR:Number;69 vol *= 0.000030517578125; // 1/3276868 var i:int, j:int, n:Number, jmax:int, volL:Number, volR:Number; 69 70 70 if (channels == 2) { 71 71 if (sampleChannelCount == 2) { 72 72 // 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; 78 76 } 79 77 } else { … … 81 79 volL = _panTable[128-pan] * vol; 82 80 volR = _panTable[pan] * vol; 81 jmax = startPointer + len; 83 82 for (j=startPointer, i=startBuffer<<1; j<jmax; j++) { 84 n = Number(pointer[j]);83 n = pointer[j]; 85 84 buffer[i] += n * volL; i++; 86 85 buffer[i] += n * volR; i++; … … 89 88 } else 90 89 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 } 96 109 } 97 110 } as3/SiOPM/trunk/src/org/si/sion/module/SiOPMTable.as
r2625 r2697 87 87 static public const PG_RAMP :int = 128; // (128- 191) ramp wave. PG_RAMP+[0,63] 88 88 // (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 94 101 95 102 // lfo wave type … … 183 190 /** PG:MIDI note number to FM key code. */ 184 191 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; 191 208 192 209 /** Table for dt1 (from fmgen.cpp). */ … … 402 419 403 420 // PCM 404 // dphase = pitchTablePCM[pitchIndex] >> (table_size (= PHASE_BITS - _waveFixedBits))421 // dphase = pitchTablePCM[pitchIndex] >> (table_size (= PHASE_BITS - waveTable.fixedBits)) 405 422 table = new Vector.<int>(PITCH_TABLE_SIZE, true); 406 423 n = 0.01858136117191752 * PHASE_MAX; // dphase @ MIDI note number = 0/ o0c=0.01858136117191752 -> o5a=1 … … 437 454 //---------------------------------------- 438 455 // 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). 440 457 imax = 32<<HALF_TONE_BITS; 441 458 table = new Vector.<int>(imax, true); … … 453 470 // PSG noise period table. 454 471 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) 456 473 n = PHASE_MAX * 111860.78125 / 44100; // 111860.78125 = 1789772.5/16 457 474 for (i=0; i<32; i++) { … … 468 485 imax = 16<<HALF_TONE_BITS; 469 486 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) 471 488 n = PHASE_MAX * 1789772.5 / 44100; 472 489 for (i=0; i<16; i++) { … … 539 556 540 557 // 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); 544 563 545 564 // clear all tables 546 565 //------------------------------ 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 1551 waveFixedBits[i] = PHASE_BITS; // always 0 == data not available552 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; 554 573 555 574 // sine wave table … … 564 583 table1[i+imax] = iv+1; // negative value index 565 584 } 566 waveTables [PG_SINE] = table1; 567 waveFixedBits[PG_SINE] = PHASE_BITS - SAMPLING_TABLE_BITS; 585 waveTables[PG_SINE] = SiOPMWaveTable.alloc(table1); 568 586 569 587 // saw wave tables … … 579 597 table2[imax+i] = iv+1; // negative 580 598 } 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); 585 601 586 602 // triangle wave tables … … 599 615 table1[imax4-i-1] = iv+1; // negative value index 600 616 } 601 waveTables [PG_TRIANGLE] = table1; 602 waveFixedBits[PG_TRIANGLE] = PHASE_BITS - SAMPLING_TABLE_BITS; 617 waveTables[PG_TRIANGLE] = SiOPMWaveTable.alloc(table1); 603 618 604 619 // fc triangle wave … … 615 630 table1[23] = 3; 616 631 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); 620 633 621 634 // square wave tables … … 623 636 // 50% square wave 624 637 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])); 627 639 628 640 … … 631 643 // pulse wave 632 644 // 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; 634 646 for (j=0; j<16; j++) { 635 647 table1 = new Vector.<int>(16, true); … … 637 649 table1[i] = (i<j) ? table2[0] : table2[1]; 638 650 } 639 waveTables[PG_PULSE+j] = table1; 640 waveFixedBits[PG_PULSE+j] = PHASE_BITS - 4; 651 waveTables[PG_PULSE+j] = SiOPMWaveTable.alloc(table1); 641 652 } 642 653 … … 652 663 table1[i] = iv; 653 664 } 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 660 670 //---------------------------- 661 671 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]; … … 664 674 table1[i] = calcLogTableIndex(wav[i]/128); 665 675 } 666 waveTables [PG_KNMBSMM] = table1; 667 waveFixedBits[PG_KNMBSMM] = PHASE_BITS - 5; 676 waveTables[PG_KNMBSMM] = SiOPMWaveTable.alloc(table1); 668 677 669 678 … … 679 688 table2[i] = iv; // positive 680 689 } 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); 685 692 686 693 … … 693 700 table1[i] = calcLogTableIndex((Math.random()*2-1)*NOISE_WAVE_OUTPUT); 694 701 } 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]; 701 704 702 705 // pulse noise. NOTE: This is dishonest impelementation. Details are shown in MAME or VirtuaNes source. … … 707 710 table1[i] = (Math.random()>0.5) ? iv : (iv+1); 708 711 } 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); 712 713 713 714 // fc short noise. NOTE: This is dishonest 93*11=1023 aprox.-> 1024. … … 720 721 table1[i] = (j&1) ? iv : (iv+1); 721 722 } 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); 725 724 726 725 // high passed white noise 727 726 table1 = new Vector.<int>(NOISE_TABLE_SIZE, true); 728 table2 = waveTables[PG_NOISE_WHITE] ;727 table2 = waveTables[PG_NOISE_WHITE].wavelet; 729 728 imax = NOISE_TABLE_SIZE; 730 729 n = 8/Number(1<<LOG_VOLUME_BITS); … … 736 735 table1[i] = calcLogTableIndex(v*n); 737 736 } 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); 741 738 742 739 // periodic noise … … 746 743 table1[i] = LOG_TABLE_BOTTOM; 747 744 } 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); 750 746 751 747 // pitch controlable noise 752 table1 = waveTables[PG_NOISE_SHORT] ;748 table1 = waveTables[PG_NOISE_SHORT].wavelet; 753 749 table2 = new Vector.<int>(SAMPLING_TABLE_SIZE, true); 754 750 for (j=0; j<SAMPLING_TABLE_SIZE; j++) { … … 757 753 for (; i<imax; i++) { table2[i] = table1[j]; } 758 754 } 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); 761 756 762 757 … … 771 766 iv -= (iv * (j&7))>>4; 772 767 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]; 777 770 continue; 778 771 } … … 798 791 table2[imax2-i-1] = iv; // positive value 799 792 } 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]; 815 799 816 800 … … 819 803 // waveform 0-5 = sine wave 820 804 waveTables[PG_MA3_WAVE] = waveTables[PG_SINE]; 821 waveFixedBits[PG_MA3_WAVE] = waveFixedBits[PG_SINE];822 805 __exp_ma3_waves(0); 823 806 // waveform 8-13 = bi-triangle modulated sine ? 824 table2 = waveTables[PG_SINE] ;807 table2 = waveTables[PG_SINE].wavelet; 825 808 table1 = new Vector.<int>(SAMPLING_TABLE_SIZE, true); 826 809 j = 0; … … 829 812 j += 1-(((i>>(SAMPLING_TABLE_BITS-3))+1)&2); // triangle wave 830 813 } 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); 833 815 __exp_ma3_waves(8); 834 816 // waveform 16-21 = triangle wave 835 817 waveTables[PG_MA3_WAVE+16] = waveTables[PG_TRIANGLE]; 836 waveFixedBits[PG_MA3_WAVE+16] = waveFixedBits[PG_TRIANGLE];837 818 __exp_ma3_waves(16); 838 819 // waveform 24-29 = saw wave 839 820 waveTables[PG_MA3_WAVE+24] = waveTables[PG_SAW_UP]; 840 waveFixedBits[PG_MA3_WAVE+24] = waveFixedBits[PG_SAW_UP];841 821 __exp_ma3_waves(24); 842 822 // waveform 6 = square 843 waveFixedBits[PG_MA3_WAVE+6] = waveFixedBits[PG_SQUARE];844 823 waveTables[PG_MA3_WAVE+6] = waveTables[PG_SQUARE]; 845 824 // waveform 14 = half square 846 825 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])); 849 827 // 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])); 852 829 // 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])); 855 831 856 832 // waveform 7 ??? … … 867 843 table1[imax4-i-1] = iv+1; // negative value index 868 844 } 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); 871 846 // 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; 878 850 } 879 851 … … 886 858 887 859 // basic waveform 888 table2 = waveTables[PG_MA3_WAVE+index] ;860 table2 = waveTables[PG_MA3_WAVE+index].wavelet; 889 861 890 862 // waveform 1 … … 895 867 table1[i+imax] = LOG_TABLE_BOTTOM; 896 868 } 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); 899 870 900 871 // waveform 2 … … 905 876 table1[i+imax] = table2[i]; 906 877 } 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); 909 879 910 880 // waveform 3 … … 917 887 table1[i+imax*3] = LOG_TABLE_BOTTOM; 918 888 } 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); 921 890 922 891 // waveform 4 … … 927 896 table1[i+imax] = LOG_TABLE_BOTTOM; 928 897 } 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); 931 899 932 900 // waveform 5 … … 939 907 table1[i+imax*3] = LOG_TABLE_BOTTOM; 940 908 } 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); 943 910 } 944 911 … … 1048 1015 // wave tables 1049 1016 //-------------------------------------------------- 1050 // free list1051 static private var _freeWaveTable:Array = [];1052 1053 1054 1017 /** Reset all user tables */ 1055 1018 static public function resetAllUserTables() : void … … 1059 1022 1060 1023 // 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; 1069 1045 } 1070 1046 1071 1047 1072 1048 /** 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 { 1078 1051 // 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 1082 1056 // update PG_MA3_WAVE waveform 15,23,31. 1083 1057 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; 1088 1060 } 1089 1061 } … … 1093 1065 static public function registerPCMData(index:int, table:Vector.<int>, samplingOctave:int) : void 1094 1066 { 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); 1101 1070 } 1102 1071 1103 1072 1104 1073 /** 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]; 1113 1110 } 1114 1111 } as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as
r2625 r2697 48 48 for (i=0, idx=offset; i<length; i++, idx+=step) { 49 49 _pgTypeList[i] = idx; 50 _ptTypeList[i] = SiOPMTable.instance. defaultPTType[idx];50 _ptTypeList[i] = SiOPMTable.instance.getWaveTable(idx).defaultPTType; 51 51 } 52 52 _channelTone = new Vector.<int>(channelCount, true); … … 84 84 track.channel.setAlgorism(1, 0); 85 85 track.channel.setType(_pgTypeList[channelTone], _ptTypeList[channelTone]); 86 return channelTone;86 return (chNum == -1) ? -1 : channelTone; 87 87 } 88 88 89 89 90 90 /** select tone by tone number. */ 91 public function selectTone(track:SiMMLTrack, toneIndex:int) : MMLSequence91 public function selectTone(track:SiMMLTrack, voiceIndex:int) : MMLSequence 92 92 { 93 var param:SiOPMChannelParam; 93 if (voiceIndex == -1) return null; 94 95 var voice:SiMMLVoice, param:SiOPMChannelParam=null; 94 96 95 97 switch (_selectToneType) { 96 98 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]); 99 101 break; 100 102 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; 106 124 default: 107 125 break; as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLData.as
r2625 r2697 12 12 13 13 14 /** SiMML data class. 15 */ 14 /** SiMML data class. */ 16 15 public class SiMMLData extends MMLData 17 16 { … … 19 18 //---------------------------------------- 20 19 /** envelop tables */ 21 p ublic var envelopTables:Vector.<SiMMLDataEnvelopTable>;22 /** FM channel paramters*/23 p ublic var fmParameters:Vector.<SiMMLDataChannelParam>;20 protected var _envelops:Vector.<SiMMLEnvelopTable>; 21 /** voice data */ 22 protected var _voices:Vector.<SiMMLVoice>; 24 23 25 24 … … 27 26 // constructor 28 27 //---------------------------------------- 28 /** constructor. */ 29 29 function SiMMLData() 30 30 { 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); 33 33 } 34 34 … … 42 42 { 43 43 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; 48 49 } 49 50 50 51 51 52 /** Register all tables before processing audio. */ 52 override public function regiter AllTables() : void53 override public function regiter() : void 53 54 { 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 } 57 81 } 58 82 … … 61 85 internal function _setEnvelopTable(index:int, head:SLLint, tail:SLLint) : void 62 86 { 63 envelopTables.push(SiMMLDataEnvelopTable.alloc(index, head, tail)); 87 var t:SiMMLEnvelopTable = new SiMMLEnvelopTable(); 88 t._initialize(head, tail); 89 _envelops[index] = t; 64 90 } 65 91 … … 68 94 internal function _getSiOPMChannelParam(index:int) : SiOPMChannelParam 69 95 { 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."); 73 109 } 74 110 } 75 111 } 76 112 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 SiMMLDataEnvelopTable87 {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() : void101 {102 SiMMLTable.registerEnvelopTable(index, table);103 }104 105 106 static public function free(e:SiMMLDataEnvelopTable) : void107 {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) : SiMMLDataEnvelopTable115 {116 var i:int, imax:int;117 118 // new element119 var e:SiMMLDataEnvelopTable = _freeList.pop() || new SiMMLDataEnvelopTable();120 121 // initialize122 e.index = index;123 e.table._initialize(head, tail);124 return e;125 }126 }127 128 129 130 131 class SiMMLDataChannelParam132 {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() : void146 {147 SiMMLTable.registerChannelParam(index, param);148 }149 150 151 static public function free(e:SiMMLDataChannelParam) : void152 {153 e.index = -1;154 _freeList.push(e);155 }156 157 158 static public function alloc(index:int) : SiMMLDataChannelParam159 {160 var i:int, imax:int;161 162 // new element163 var e:SiMMLDataChannelParam = _freeList.pop() || new SiMMLDataChannelParam();164 165 // initialize166 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 54 54 private var _p:Vector.<int> = new Vector.<int>(PARAM_MAX); // temporary area to get plural parameters 55 55 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 57 58 58 59 private var _title:String; // Title of the song. … … 73 74 public function get processedSampleCount() : int { return _processedSampleCount; } 74 75 75 /** Is finish tobuffering ? */76 /** Is finish buffering ? */ 76 77 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; } 80 79 return true; 81 80 } 81 82 /** Is finish executing sequence ? */ 83 public function get isSequenceFinished() : Boolean { return _isSequenceFinished; } 82 84 83 85 /** Current working track */ … … 233 235 } 234 236 _processedSampleCount = 0; 237 _isSequenceFinished = (tracks.length == 0); 235 238 } 236 239 … … 240 243 // operation for controlable tracks 241 244 //-------------------------------------------------- 242 /** Find track by trackID.245 /** Find active track by trackID. 243 246 * @param trackID trackID to find. 247 * @param delay delay value to find the track sounds at same timing. -1 ignores this value. 244 248 * @return found track instance. Returns null when didnt find. 245 249 */ 246 public function findTrack(trackID:int) : SiMMLTrack 247 { 250 public function findActiveTrack(trackID:int, delay:int=-1) : SiMMLTrack 251 { 252 var result:Array = []; 248 253 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 } 250 259 } 251 260 return null; … … 375 384 376 385 // buffering 386 _isSequenceFinished = true; 377 387 startGlobalSequence(); 378 388 do { … … 381 391 _currentTrack = trk; 382 392 len = trk.prepareBuffer(bufferingTick); 383 processMMLExecutor(trk.executor, len);393 _isSequenceFinished = processMMLExecutor(trk.executor, len) && _isSequenceFinished; 384 394 } 385 395 } while (!isEndGlobalSequence()); … … 718 728 case '#WAV': { 719 729 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)); 721 731 return true; 722 732 } 723 733 case '#WAVB': { 724 734 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)); 726 736 return true; 727 737 } … … 793 803 static private var _tempNumberList :SLLint = SLLint.alloc(0); 794 804 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); 796 807 797 808 … … 811 822 for (i=0; i<32 && num!=null; i++) { 812 823 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; 814 825 num = num.next; 815 826 } 816 while (i<32) { _tempWaveTable [i++] = 0; }817 818 return _tempWaveTable ;827 while (i<32) { _tempWaveTable5[i++] = 0; } 828 829 return _tempWaveTable5; 819 830 } 820 831 … … 828 839 for (i=0; i<32; i++) { 829 840 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; 834 845 } 835 846 … … 1125 1136 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1126 1137 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]); 1128 1139 return e.next; 1129 1140 } … … 1136 1147 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1137 1148 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]); 1139 1150 return e.next; 1140 1151 } … … 1147 1158 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1148 1159 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); 1150 1161 return e.next; 1151 1162 } … … 1158 1169 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1159 1170 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]); 1161 1172 return e.next; 1162 1173 } … … 1169 1180 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1170 1181 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]); 1172 1183 return e.next; 1173 1184 } … … 1180 1191 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1181 1192 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]); 1183 1194 return e.next; 1184 1195 } … … 1191 1202 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1192 1203 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]); 1194 1205 return e.next; 1195 1206 } … … 1202 1213 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1203 1214 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]); 1205 1216 return e.next; 1206 1217 } … … 1213 1224 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1214 1225 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]); 1216 1227 return e.next; 1217 1228 } … … 1224 1235 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1225 1236 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]); 1227 1238 return e.next; 1228 1239 } … … 1235 1246 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1236 1247 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]); 1238 1249 return e.next; 1239 1250 } as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTable.as
r2625 r2697 34 34 35 35 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; 37 37 38 38 … … 40 40 // valiables 41 41 //-------------------------------------------------- 42 /** Envelop tables */43 public var envelopTables:Array = null;44 /** FM parameter settings */45 public var fmParameters:Array = null;46 47 42 /** module setting table */ 48 43 public var channelModuleSetting:Array = null; … … 84 79 public var alg_init:Array = [0,1,5,7]; 85 80 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 86 90 87 91 … … 122 126 channelModuleSetting[MT_PULSE] = new SiMMLChannelSetting(MT_PULSE, SiOPMTable.PG_PULSE, 32, 1, 32); // pulse 123 127 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 SiOPMChannelSampler128 channelModuleSetting[MT_SAMPLE] = new SiMMLChannelSetting(MT_SAMPLE, 0, 1, 1, 1); // sampler. this is based on SiOPMChannelSampler 125 129 126 130 // PSG setting … … 155 159 channelModuleSetting[MT_SAMPLE]._selectToneType = SiMMLChannelSetting.SELECT_TONE_NOP; 156 160 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; 158 167 159 168 // These tables are just depended on my ear ... ('A`) … … 182 191 return vector; 183 192 } 184 185 // envelop table186 envelopTables = new Array(ENV_TABLE_MAX);187 for (i=0; i<ENV_TABLE_MAX; i++) { envelopTables[i] = null; }188 // FM parameter settings189 fmParameters = new Array(FM_PARAM_MAX);190 for (i=0; i<FM_PARAM_MAX; i++) { fmParameters[i] = null; }191 193 } 192 194 … … 196 198 // operations 197 199 //-------------------------------------------------- 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]; 234 239 } 235 240 } as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as
r2633 r2697 38 38 static public const MIDI_TRACK_ID_OFFSET:int = 0x20000; 39 39 /** 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; 41 43 42 44 // _processMode … … 180 182 public function get isControlable() : Boolean { return ((_trackID & TRACK_TYPE_FILTER) != MML_TRACK_ID_OFFSET); } 181 183 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. */ 183 185 public function get isActive() : Boolean { return (!isControlable || !channel.isIdling || _keyOnCounter>0 || _trackStartDelay>0); } 184 186 … … 394 396 return this; 395 397 } 396 398 397 399 398 400 /** Slur without next notes key on. This have to be called just after keyOn(). */ … … 430 432 431 433 _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 } 432 447 } 433 448 … … 938 953 var ret:MMLSequence = null; 939 954 if (param[0] != int.MIN_VALUE) { 955 ret = channelModuleSetting.selectTone(this, param[0]); 940 956 _tone = param[0]; 941 ret = channelModuleSetting.selectTone(this, _tone);942 957 } 943 958 channel.setParameters(param); as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as
r2625 r2697 6 6 7 7 package 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 8 14 /** MML data class. MMLData > MMLSequenceGroup > MMLSequence > MMLEvent (">" meanse "has a"). */ 9 15 public class MMLData … … 26 32 27 33 /** 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>; 33 39 34 40 /** system commands can not be parsed. Examples are for mml string "#ABC5{def}ghi;".<br/> … … 40 46 */ 41 47 public var systemCommands:Array; 48 42 49 43 50 … … 61 68 author = ""; 62 69 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); 66 73 systemCommands = []; 67 74 } … … 75 82 public function clear() : void 76 83 { 84 var i:int, imax:int; 85 77 86 sequenceGroup.free(); 78 87 globalSequence.free(); … … 83 92 author = ""; 84 93 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; } } 92 97 systemCommands.length = 0; 93 98 } … … 95 100 96 101 /** Register all tables before processing audio. */ 97 public function regiter AllTables() : void102 public function regiter() : void 98 103 { 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; 103 107 } 104 108 105 109 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 108 115 { 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); 110 121 } 111 122 112 123 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 115 132 { 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); 117 152 } 118 153 119 154 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 122 163 { 123 waveData.push(MMLDataWaveTable.allocWaveData(index, rawData, isOneShot, isStereo)); 164 index &= SiOPMTable.SAMPLER_DATA_MAX-1; 165 samplerData[index] = new SiOPMSamplerData(data, isOneShot, channelCount); 124 166 } 125 167 } … … 127 169 128 170 129 130 131 import flash.utils.ByteArray;132 import org.si.sion.module.SiOPMTable;133 134 // wave table class135 class MMLDataWaveTable136 {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() : void155 {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) : void165 {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) : MMLDataWaveTable173 {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 table180 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) : MMLDataWaveTable191 {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) : MMLDataWaveTable202 {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 219 219 bpm = mmlData.defaultBPM; 220 220 globalExecutor.initialize(mmlData.globalSequence); 221 mmlData.regiter AllTables();221 mmlData.regiter(); 222 222 } 223 223 globalBeat16 = 0; … … 269 269 * @param exe MMLExecutor to process. 270 270 * @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 273 274 { 274 275 currentExecutor = exe; … … 280 281 if (event == null) { 281 282 _eventHandlers[MMLEvent.NOP](MMLEvent.nopEvent); 282 return ;283 return true; 283 284 } else { 284 285 // update _processSampleCount in some _eventHandler()s … … 287 288 } 288 289 } 290 return false; 289 291 } 290 292 as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as
r2625 r2697 14 14 /** Utilities for SiON */ 15 15 public class SiONUtil { 16 17 // PCM data serialization (for PCM Data) 16 // PCM data transformation (for PCM Data %7) 18 17 //-------------------------------------------------- 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> 21 25 { 22 26 var wave:ByteArray = new ByteArray(); 23 27 var samples:int = data.extract(wave, sampleMax); 24 return serializeByteArrayPCM(wave, new Vector.<int>);28 return logTransByteArray(wave, dst); 25 29 } 26 30 27 31 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> 30 39 { 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 } 36 55 } 37 56 return dst; … … 39 58 40 59 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> 43 66 { 44 67 var i:int, imax:int=src.length>>3; 45 68 src.position = 0; 69 if (dst == null) dst = new Vector.<int>(); 46 70 dst.length = imax; 47 71 for (i=0; i<imax; i++) { … … 55 79 56 80 57 // raw wave data (for Sampler Data)81 // wave data 58 82 //-------------------------------------------------- 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> 61 91 { 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; 74 100 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(); 78 102 } 79 103 } else { 104 // monoral 105 imax = wave.length >> 3; 106 dst.length = imax; 80 107 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; 103 109 } 104 110 } as3/SiOPM/trunk/src/org/si/sion/utils/SoundClass.as
r2625 r2697 35 35 36 36 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 */ 37 41 static public function create(samples:Vector.<Number>, onComplete:Function) : void { 38 42 var size:int = samples.length * 2; // *2(16bit) as3/SiOPM/trunk/src/org/si/sound/SoundObject.as
r2633 r2697 19 19 public name:String; 20 20 21 /** Sound length uint in 16th beat, 0 sets inifinity length. @default 0. */ 22 public length:Number; 23 21 24 /** Sound delay uint in 16th beat. @default 0. */ 22 25 public delay:Number; … … 25 28 public quantize:Number; 26 29 27 /** SiONDriver instance to access directly. */ 30 /** @private [internal uses] parent container */ 31 internal var _parent:SoundObjectContainer; 32 33 /** driver instance to access directly */ 28 34 protected var _driver:SiONDriver; 29 35 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; 32 51 33 52 … … 39 58 public function get driver() : SiONDriver { return _driver; } 40 59 41 /** SoundStage object. */42 public function get stage() : SoundStage { return SoundStage.mutex; }43 44 45 60 /** 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 } 48 66 49 67 /** 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 } 52 74 53 75 /** 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 } 56 82 57 83 /** parent container. */ 58 84 public function get parent() : SoundObjectContainer { return _parent; } 59 85 86 /** next track id to use */ 87 static protected function get nextTrackID() : int { 88 return (_nextTrackID++); 89 } 60 90 61 91 … … 94 124 { 95 125 } 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 } 96 183 } 97 184 } as3/SiOPM/trunk/src/org/si/sound/SoundObjectContainer.as
r2633 r2697 1 1 //---------------------------------------------------------------------------------------------------- 2 // Sound object 2 // Sound object container 3 3 // Copyright (c) 2009 keim All rights reserved. 4 4 // Distributed under BSD-style license (see org.si.license.txt). … … 21 21 // properties 22 22 //---------------------------------------- 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 36 23 /** Returns the number of children of this object. */ 37 24 public function get numChildren() : int { return _soundList.length; } 25 38 26 39 27 … … 85 73 public function addChild(sound:SoundObject) : SoundObject 86 74 { 87 if (sound._parent != null) sound._parent.removeChild(sound); 88 sound._parent = this; 75 sound._setParent(this); 89 76 _soundList.push(sound); 90 77 return sound; … … 100 87 public function addChildAt(sound:SoundObject, index:int) : SoundObject 101 88 { 102 sound._ parent = this;89 sound._setParent(this); 103 90 if (index < _soundList.length) _soundList.splice(index, 0, sound); 104 91 else _soundList.push(sound); … … 117 104 var index:int = _soundList.indexOf(sound); 118 105 if (index == -1) throw Error("SoundObjectContainer Error; Specifyed children is not in the children list."); 119 sound._ parent = null;106 sound._setParent(null); 120 107 _soundList.splice(index, 1); 121 108 return sound; … … 132 119 { 133 120 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; 135 124 } 136 125 … … 180 169 return addChildAt(removeChild(child), index); 181 170 } 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 } 182 215 } 183 216 } as3/SiOPM/trunk/src/org/si/sound/SoundStage.as
r2633 r2697 1 1 //---------------------------------------------------------------------------------------------------- 2 // Sound object2 // Sound stage 3 3 // Copyright (c) 2009 keim All rights reserved. 4 4 // Distributed under BSD-style license (see org.si.license.txt). … … 7 7 8 8 package 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(); 15 13 16 14 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 64 16 { 65 17 } … … 67 19 } 68 20 69

