チェンジセット 3638
- コミット日時:
- 2010/03/29 02:28:00 (2 年前)
- ファイル:
-
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelParam.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelFM.as (更新) (7 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/utils/Translator.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXData.as (更新) (8 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXExecutor.as (更新) (8 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/mdxplayer.as.txt (更新) (1 diff)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelParam.as
r3504 r3638 205 205 switch(addr) { 206 206 case 15: // NOIZE:7 FREQ:4-0 for channel#7 207 if (channel == 7 && data & 128) { 208 operatorParam[3].setPGType(SiOPMTable.PG_NOISE_PULSE); 207 if (channel == 7 && (data & 128)) { 208 operatorParam[3].pgType = SiOPMTable.PG_NOISE_PULSE; 209 operatorParam[3].ptType = SiOPMTable.PT_OPM_NOISE; 209 210 operatorParam[3].fixedPitch = ((data & 31) << 6) + 2048; 210 211 } … … 246 247 } else { 247 248 // Operator parameter 248 opp = operatorParam[[ 0,2,1,3][(addr >> 3) & 3]];249 opp = operatorParam[[3,1,2,0][(addr >> 3) & 3]]; // [0,2,1,3]? 249 250 switch((addr-0x40) >> 5) { 250 251 case 0: // DT1:6-4 MUL:3-0 as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelFM.as
r3608 r3638 81 81 /** register map type */ 82 82 _sion_internal var registerMapType:int; 83 _sion_internal var registerMapChannel:int; 83 84 84 85 … … 318 319 if (waveData is SiOPMWavePCMTable) pcmData = (waveData as SiOPMWavePCMTable).getSample(0); 319 320 320 if (pcmData ) {321 if (pcmData && pcmData.wavelet) { 321 322 _updateOperatorCount(1); 322 323 _funcProcessType = PROC_PCM; … … 325 326 } else 326 327 if (waveData is SiOPMWaveTable) { 327 _updateOperatorCount(1); 328 activeOperator.setWaveTable(waveData as SiOPMWaveTable); 328 var waveTable:SiOPMWaveTable = waveData as SiOPMWaveTable; 329 if (waveTable.wavelet) { 330 _updateOperatorCount(1); 331 activeOperator.setWaveTable(waveTable); 332 } 329 333 } 330 334 } … … 335 339 { 336 340 switch(_sion_internal::registerMapType) { 341 case 0: 342 _setByOPMRegister(addr, data); 343 break; 337 344 case 1: 338 _setByOPMRegister(addr, data);339 break;340 case 0:341 345 default: 342 346 _setBy2A03Register(addr, data); … … 353 357 354 358 // OPM register value 359 private var _pmd:int=0, _amd:int=0; 355 360 private function _setByOPMRegister(addr:int, data:int) : void 356 361 { 362 var i:int, v:int, pms:int, ams:int, op:SiOPMOperator, 363 channel:int = _sion_internal::registerMapChannel; 364 365 if (addr < 0x20) { // Module parameter 366 switch(addr) { 367 case 15: // NOIZE:7 FREQ:4-0 for channel#7 368 if (channel == 7 && _operatorCount==4 && (data & 128) != 0) { 369 operator[3].pgType = SiOPMTable.PG_NOISE_PULSE; 370 operator[3].ptType = SiOPMTable.PT_OPM_NOISE; 371 operator[3].pitchIndex = ((data & 31) << 6) + 2048; 372 } 373 break; 374 case 24: // LFO FREQ:7-0 for all 8 channels 375 v = SiOPMTable.instance.lfo_timerSteps[data]; 376 _lfo_timer = (v>0) ? 1 : 0; 377 _lfo_timer_step = v; 378 break; 379 case 25: // A(0)/P(1):7 DEPTH:6-0 for all 8 channels 380 if (data & 128) _amd = data & 127; 381 else _pmd = data & 127; 382 break; 383 case 27: // LFO WS:10 for all 8 channels 384 initializeLFO(data & 3); 385 break; 386 } 387 } else { 388 if (channel == (addr&7)) { 389 if (addr < 0x40) { 390 // Channel parameter 391 switch((addr-0x20) >> 3) { 392 case 0: // L:7 R:6 FB:5-3 ALG:2-0 393 v = data >> 6; 394 setAlgorism(4, data & 7); 395 setFeedBack((data >> 3) & 7, 0); 396 _volumes[0] = (v) ? 0.5 : 0; 397 _pan = (v==1) ? 128 : (v==2) ? 0 : 64; 398 break; 399 case 1: // KC:6-0 400 for (i=0; i<4; i++) operator[i].kc = data & 127; 401 break; 402 case 2: // KF:6-0 403 for (i=0; i<4; i++) operator[i].kf = data & 127; 404 break; 405 case 3: // PMS:6-4 AMS:10 406 pms = (data >> 4) & 7; 407 ams = (data ) & 3; 408 if (data & 128) setPitchModulation((pms<6) ? (_pmd >> (6-pms)) : (_pmd << (pms-5))); 409 else setAmplitudeModulation((ams>0) ? (_amd << (ams-1)) : 0); 410 break; 411 } 412 } else { 413 // Operator parameter 414 op = operator[[3,1,2,0][(addr >> 3) & 3]]; // [0,2,1,3] 415 switch((addr-0x40) >> 5) { 416 case 0: // DT1:6-4 MUL:3-0 417 op.dt1 = (data >> 4) & 7; 418 op.mul = (data ) & 15; 419 break; 420 case 1: // TL:6-0 421 op.tl = data & 127; 422 break; 423 case 2: // KS:76 AR:4-0 424 op.ks = (data >> 6) & 3; 425 op.ar = (data & 31) << 1; 426 break; 427 case 3: // AMS:7 DR:4-0 428 op.ams = ((data >> 7) & 1)<<1; 429 op.dr = (data & 31) << 1; 430 break; 431 case 4: // DT2:76 SR:4-0 432 op.detune = [0, 384, 500, 608][(data >> 6) & 3]; 433 op.sr = (data & 31) << 1; 434 break; 435 case 5: // SL:7-4 RR:3-0 436 op.sl = (data >> 4) & 15; 437 op.rr = (data & 15) << 2; 438 break; 439 } 440 } 441 } 442 } 357 443 } 358 444 … … 523 609 operator[0].initialize(); 524 610 _isNoteOn = false; 525 _sion_internal::registerMapType = 0; 611 _sion_internal::registerMapType = 0 612 _sion_internal::registerMapChannel = 0; 526 613 527 614 // initialize sound channel … … 1132 1219 phase_filter:int = SiOPMTable.PHASE_FILTER; 1133 1220 1134 1135 1221 // buffering 1136 1222 var ip:SLLint = _inPipe, as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as
r3530 r3638 1594 1594 private function _onRegisterUpdate(e:MMLEvent) : MMLEvent 1595 1595 { 1596 var addr:int = e.data>>8, data:int = e.data & 0xff;1597 _currentTrack._callbackUpdateRegister( addr, data);1596 e = e.getParameters(_p, 2); 1597 _currentTrack._callbackUpdateRegister(_p[0], _p[1]); 1598 1598 return e.next; 1599 1599 } as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as
r3631 r3638 123 123 static public function extractYM2151ADPCM(src:ByteArray, dst:Vector.<Number>=null, dstChannelCount:int=1) : Vector.<Number> 124 124 { 125 126 125 var data:int, r:int, i:int, imax:int, pcm:int=0, sample:Number, 127 126 InpPcm:int=0, InpPcm_prev:int=0, scale:int=0, output:int=0; as3/SiOPM/trunk/src/org/si/sion/utils/Translator.as
r3530 r3638 7 7 package org.si.sion.utils { 8 8 import org.si.sion.module.*; 9 import org.si.sion.sequencer.SiMMLData; 9 10 import org.si.sion.sequencer.SiMMLTable; 10 11 import org.si.sion.effector.SiEffectModule; … … 797 798 798 799 800 801 799 802 // reconstruct MML string from channel parameters 800 803 //-------------------------------------------------- … … 1016 1019 1017 1020 1021 // reconstruct MML string from SiMMLData 1022 //-------------------------------------------------- 1023 /** reconstruct MML string from SiMMLData */ 1024 public function reconstructMML(data:SiMMLData) : String 1025 { 1026 var mml:String = ""; 1027 1028 1029 1030 return mml; 1031 } 1032 1033 1034 1035 1036 1018 1037 // internal functions 1019 1038 //-------------------------------------------------- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXData.as
r3565 r3638 12 12 import org.si.sion.module.SiOPMOperatorParam; 13 13 import org.si.sion.sequencer.base.MMLEvent; 14 import org.si.sion.sequencer.base.MMLSequence; 14 15 import flash.utils.ByteArray; 15 16 … … 27 28 public var tracks:Vector.<MDXTrack> = new Vector.<MDXTrack>(16, true); 28 29 public var executors:Vector.<MDXExecutor> = new Vector.<MDXExecutor>(16, true); 29 public var currentBPM:Number;30 30 private var _noiseVoice:SiONVoice; 31 31 private var _noiseVoiceNumber:int; 32 private var _currentBPM:Number; 33 private var _globalSequence:MMLSequence; 34 private var _globalPrevClock:uint; 32 35 33 36 … … 91 94 data.clear(); 92 95 data.bpm = bpm; 96 _globalSequence = data.globalSequence; 93 97 94 98 // set voice data … … 100 104 imax = 96; 101 105 for (i=0; i<imax; i++) { 102 data.setPCMData(i, pdxData.pcmData[i]);106 if (pdxData.pcmData[i]) data.setPCMData(i, pdxData.pcmData[i]); 103 107 } 104 108 } … … 107 111 imax = (isPCM8) ? 16 : 9; 108 112 for (i=0; i<imax; i++) { 109 if (tracks[i].hasNoData) executors[i].initialize(null, tracks[i], _noiseVoiceNumber );110 else executors[i].initialize(data.appendNewSequence().initialize(), tracks[i], _noiseVoiceNumber );113 if (tracks[i].hasNoData) executors[i].initialize(null, tracks[i], _noiseVoiceNumber, isPCM8); 114 else executors[i].initialize(data.appendNewSequence().initialize(), tracks[i], _noiseVoiceNumber, isPCM8); 111 115 } 112 116 113 117 var totalClock:uint=0, nextClock:uint, c:uint; 114 currentBPM = bpm; 118 _currentBPM = bpm; 119 _globalPrevClock = 0; 115 120 while (totalClock != uint.MAX_VALUE) { 116 121 // sync 117 for (i=0; i<imax; i++) executors[i].globalExec(totalClock, this); 122 for (i=0; i<imax; i++) { 123 executors[i].globalExec(totalClock, this); 124 } 118 125 // exec 119 126 nextClock = uint.MAX_VALUE; 120 127 for (i=0; i<imax; i++) { 121 c = executors[i].exec(totalClock, currentBPM);128 c = executors[i].exec(totalClock, _currentBPM); 122 129 if (c < nextClock) nextClock = c; 123 130 } … … 153 160 pdxLength = bytes.position - titleLength - 4; 154 161 bytes.position = titleLength + 3; 155 if (pdxLength != 0) pdxFileName = bytes.readMultiByte(pdxLength, "shift_jis"); //us-ascii 162 if (pdxLength != 0) { 163 pdxFileName = bytes.readMultiByte(pdxLength, "shift_jis").toUpperCase(); //us-ascii 164 if (pdxFileName.substr(-4,4) != ".PDX") pdxFileName += ".PDX"; 165 } 156 166 bytes.position = titleLength + pdxLength + 4; 157 167 … … 182 192 opp:SiOPMOperatorParam, reg:Array = [], opia:Array = [3,1,2,0], dt2Table:Array = [0, 384, 500, 608]; 183 193 184 for (i=0; i<voiceLength; i+=27) { 194 voiceLength /= 27; 195 for (i=0; i<voiceLength; i++) { 185 196 voiceNumber = bytes.readUnsignedByte(); 186 197 fbalg = bytes.readUnsignedByte(); … … 257 268 258 269 /** @private [internal] call from MDXExecutor.sync() */ 259 internal function onTimerB(timerB:int) : void 260 { 261 currentBPM = 4883/(256-timerB); 270 internal function onTimerB(timerB:int, syncClock:uint) : void 271 { 272 if (syncClock == 0) return; 273 if (syncClock > _globalPrevClock) _globalSequence.appendNewEvent(MMLEvent.WAIT, 0, (syncClock - _globalPrevClock)*10); 274 _globalPrevClock = syncClock; 275 _currentBPM = 4883/(256-timerB); 276 _globalSequence.appendNewEvent(MMLEvent.TEMPO, _currentBPM); 262 277 } 263 278 } as3/SiOPM/trunk/src/org/si/sound/mdx/MDXExecutor.as
r3631 r3638 31 31 internal var volume:int; 32 32 internal var fineVolumeFlag:Boolean; 33 33 internal var isPCM8:Boolean; 34 34 35 35 static private var _panTable:Array = [4,0,8,4]; 36 static private var _freqTable:Array = [26, 31,38,43,50];//[18,23,30,35,42];36 static private var _freqTable:Array = [26, 31, 38, 43, 50]; 37 37 static private var _volTable:Array = [85, 87, 90, 93, 95, 98, 101, 103, 106, 109, 111, 114, 117, 119, 122, 125]; 38 38 static private var _volTablePCM8:Array = [2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 64, 80]; … … 54 54 for (i=0; i<128; i++) _tlTable[127-i] = ((1<<(i>>3))*(8+(i&7)))>>12; 55 55 for (i=0; i<16; i++) _volTable[i] = _tlTable[127-_volTable[i]]; 56 for (i=0; i<16; i++) _volTablePCM8[i] = _tlTable[127-_volTablePCM8[i]]; 57 } 58 } 59 60 61 internal function initialize(mmlseq:MMLSequence, mdxtrack:MDXTrack, noiseVoiceNumber:int) : void 56 } 57 } 58 59 60 internal function initialize(mmlseq:MMLSequence, mdxtrack:MDXTrack, noiseVoiceNumber:int, isPCM8:Boolean) : void 62 61 { 63 62 this.mmlseq = mmlseq; 64 63 this.mdxtrack = mdxtrack; 65 64 this.noiseVoiceNumber = noiseVoiceNumber; 65 this.isPCM8 = isPCM8; 66 66 clock = 0; 67 67 pointer = 0; … … 84 84 85 85 if (mmlseq) { 86 if (mdxtrack.channelNumber < 8) {87 mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 6); // use FM voice88 mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, 32);89 } else {90 mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 7); // use PCM voice91 mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, 128);92 mmlseq.appendNewEvent(MMLEvent.VOLUME, 24);93 }94 95 86 var sequencer:SiMMLSequencer = SiONDriver.mutex.sequencer; 96 87 eventIDFadeOut = sequencer.getEventID("@fadeout"); … … 102 93 eventIDPMod = sequencer.getEventID("mp"); 103 94 eventIDIndex = sequencer.getEventID("i"); 95 96 if (mdxtrack.channelNumber < 8) { 97 mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 6); // use FM voice 98 mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, 32); 99 mmlseq.appendNewEvent(MMLEvent.QUANT_RATIO, 8); 100 } else { 101 mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 7); // use PCM voice 102 mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, 128); 103 mmlseq.appendNewEvent(MMLEvent.VOLUME, 22); 104 mmlseq.appendNewEvent(MMLEvent.QUANT_RATIO, 8); 105 mmlseq.appendNewEvent(eventIDPShift, 40); 106 } 104 107 } 105 108 } … … 149 152 lastNoteMML = mmlseq.appendNewEvent(MMLEvent.NOTE, e.data+15 + (v*e.deltaClock+8192)/16384, 0); 150 153 break; 151 case MDXEvent.REGISTER: { mmlseq.appendNewEvent(MMLEvent.REGISTER, (e.data << 8) | e.data2); }break; 154 case MDXEvent.REGISTER: 155 mmlseq.appendNewEvent(MMLEvent.REGISTER, e.data); 156 mmlseq.appendNewEvent(MMLEvent.PARAMETER, e.data2); 157 break; 152 158 case MDXEvent.FADEOUT: { mmlseq.appendNewEvent(eventIDFadeOut, e.data2); }break; 153 159 case MDXEvent.VOICE: … … 252 258 mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, noiseVoiceNumber); 253 259 anFreq = e.data & 31; 260 //trace("noiz!!"); 254 261 } 255 262 } else { … … 288 295 function _vol() : void { 289 296 if (mdxtrack.channelNumber < 8) mmlseq.appendNewEvent(eventIDExp, (fineVolumeFlag) ? _tlTable[volume] : _volTable[volume]); 290 else { 291 mmlseq.appendNewEvent(eventIDExp, (fineVolumeFlag) ? _tlTable[volume] : _volTable[volume]); 292 } 297 else mmlseq.appendNewEvent(eventIDExp, (fineVolumeFlag) ? (127-volume) : _volTable[volume]); 293 298 } 294 299 … … 323 328 break; 324 329 case MDXEvent.TIMERB: 325 data.onTimerB(e.data );330 data.onTimerB(e.data, syncClock); 326 331 break; 327 332 case MDXEvent.SYNC_WAIT: as3/SiOPM/trunk/src/org/si/sound/mdx/mdxplayer.as.txt
r3565 r3638 52 52 private function _onPDXLoad(name:String, bytes:ByteArray) : void { 53 53 pdxData.loadBytes(bytes); 54 pdxData.fileName = name; 55 _onComplete(); 54 pdxData.fileName = name.toUpperCase(); 55 if (pdxData.fileName != mdxData.pdxFileName) title.text = mdxData.pdxFileName + "; Wrong PDX file ?"; 56 else _onComplete(); 56 57 } 57 58 58 59 private function _onComplete() : void { 60 driver.stop(); 59 61 sionData = mdxData.convertToSiONData(sionData, pdxData); 60 62 title.text = sionData.title;

