- コミット日時:
- 2010/03/17 02:45:00 (3 年前)
- ファイル:
-
- as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as (更新) (6 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMModule.as (更新) (4 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMStream.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/utils/Fader.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sound/base/SoundObject.as (更新) (7 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXData.as (更新) (9 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXEvent.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXExecutor.as (追加)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXTrack.as (更新) (10 diffs)
- as3/SiOPM/trunk/src/org/si/sound/synthesizer/SynthesizerBase.as (更新) (2 diffs)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as
r3480 r3564 150 150 //----- SiOPM module related 151 151 private var _channelCount:int; // module output channels (1 or 2) 152 private var _sampleRate: int;// module output frequency ratio (44100 or 22050)153 private var _bitRate:int; // module output bitrate (0 or 8 or 16)152 private var _sampleRate:Number; // module output frequency ratio (44100 or 22050) 153 private var _bitRate:int; // module output bitrate 154 154 private var _bufferLength:int; // module and streaming buffer size (8192, 4096 or 2048) 155 155 private var _debugMode:Boolean; // true; throw Error, false; throw ErrorEvent … … 237 237 /** Streaming buffer length. */ 238 238 public function get bufferLength() : int { return _bufferLength; } 239 /** Sample rate (44100 is only available in current version). */ 240 public function get sampleRate() : Number { return _sampleRate; } 241 /** bit rate, 0 means float value[-1 - +1]. */ 242 public function get bitRate() : Number { return _bitRate; } 239 243 240 244 /** Sound volume. */ … … 348 352 * @param bufferLength Buffer size of sound stream. 8192, 4096 or 2048 is available, but no check. 349 353 * @param channel Channel count. 1(monoral) or 2(stereo) is available. 350 * @param sampleRate Sampling ratio of wave. 22050 or 44100 is available.351 * @param bitRate Bit ratio of wave. 0 , 8 or 16 is available. 0means float value [-1 to 1].354 * @param sampleRate Sampling ratio of wave. 44100 is only available in current version. 355 * @param bitRate Bit ratio of wave. 0 means float value [-1 to 1]. 352 356 */ 353 357 function SiONDriver(bufferLength:int=2048, channelCount:int=2, sampleRate:int=44100, bitRate:int=0) … … 369 373 _tempData = null; 370 374 _channelCount = channelCount; 371 _sampleRate = 44100; // sampleRate; 44100 is only available now.375 _sampleRate = 44100; // sampleRate; 44100 is only in current version. 372 376 _bitRate = bitRate; 373 377 _bufferLength = bufferLength; … … 711 715 } 712 716 717 718 /** Force dispatch stream event. The SiONEvent.STREAM is dispatched only when the event listener is set BEFORE calling play(). You can let SiONDriver to dispatch SiONEvent.STREAM event by this function. 719 * @param dispatch Set true to force dispatching. Or set false to not dispatching if there are no listeners. 720 */ 721 _sion_internal function forceDispatchStreamEvent(dispatch:Boolean=true) : void 722 { 723 _dispatchStreamEvent = dispatch || (hasEventListener(SiONEvent.STREAM)); 724 } 713 725 714 726 … … 1312 1324 1313 1325 // THESE FUNCTIONS ORDER IS VERY IMPORTANT !! 1314 module.initialize(_channelCount, _b ufferLength);1326 module.initialize(_channelCount, _bitRate, _bufferLength); 1315 1327 module.reset(); // reset channels 1316 1328 sequencer._prepareProcess(_data, _sampleRate, _bufferLength); // set track channels (this must be called after module.reset()). as3/SiOPM/trunk/src/org/si/sion/module/SiOPMModule.as
r3480 r3564 36 36 public var streamSlot:Vector.<SiOPMStream>; 37 37 38 // buffer length39 private var _b ufferLength:int;38 private var _bufferLength:int; // buffer length 39 private var _bitRate:int; // bit rate 40 40 41 41 // pipes … … 50 50 /** Buffer channel count */ 51 51 public function get channelCount() : int { return outputStream.channels; } 52 /** Bit rate */ 53 public function get bitRate() : int { return _bitRate; } 52 54 /** Buffer length */ 53 55 public function get bufferLength() : int { return _bufferLength; } … … 92 94 /** Initialize module and all tone generators. 93 95 * @param channelCount ChannelCount 96 * @param bitRate bit rate 94 97 * @param bufferLength Maximum buffer size processing at once. 95 98 */ 96 public function initialize(channelCount:int, b ufferLength:int) : void99 public function initialize(channelCount:int, bitRate:int, bufferLength:int) : void 97 100 { 101 _bitRate = bitRate; 102 98 103 var i:int, stream:SiOPMStream; 99 104 … … 137 142 { 138 143 outputStream.limit(); 144 if (_bitRate != 0) outputStream.quantize(_bitRate); 139 145 } 140 146 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMStream.as
r3480 r3564 58 58 if (n < -1) buffer[i] = -1; 59 59 else if (n > 1) buffer[i] = 1; 60 } 61 } 62 63 64 /** Quantize buffer by bit rate. */ 65 public function quantize(bitRate:int) : void 66 { 67 var i:int, imax:int = buffer.length, 68 r:Number = 1<<bitRate, ir:Number = 2/r; 69 for (i=0; i<imax; i++) { 70 buffer[i] = ((buffer[i] * r) >> 1) * ir; 60 71 } 61 72 } as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as
r3450 r3564 133 133 sampleTable._siopm_module_internal::_free(); 134 134 _systemCommands.length = 0; 135 136 globalSequence.initialize(); 135 137 } 136 138 as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as
r3480 r3564 507 507 seq = mmlData.globalSequence; 508 508 509 seq.initialize();510 509 list = list.sortOn(length, Array.NUMERIC); 511 510 pos = 0; as3/SiOPM/trunk/src/org/si/sion/utils/Fader.as
r2989 r3564 47 47 function Fader(callback:Function=null, valueFrom:Number=0, valueTo:Number=1, term:int=60) 48 48 { 49 if (callback != null)setFade(callback, valueFrom, valueTo, term);49 setFade(callback, valueFrom, valueTo, term); 50 50 } 51 51 … … 63 63 public function setFade(callback:Function, valueFrom:Number=0, valueTo:Number=1, term:int=60) : Fader 64 64 { 65 _value = valueFrom; 65 66 if (term == 0 || callback == null) { 66 67 _counter = 0; … … 68 69 } 69 70 _callback = callback; 70 _value = valueFrom;71 71 _end = valueTo; 72 72 _step = (valueTo - valueFrom) / term; as3/SiOPM/trunk/src/org/si/sound/base/SoundObject.as
r3504 r3564 9 9 import org.si.sion.*; 10 10 import org.si.sion.utils.Translator; 11 import org.si.sion.utils.Fader; 12 import org.si.sion.namespaces._sion_internal; 13 import org.si.sion.events.SiONEvent; 11 14 import org.si.sion.module.SiOPMModule; 12 15 import org.si.sion.effector.SiEffectBase; … … 44 47 /** tracks for sequenceOn() */ 45 48 protected var _tracks:Vector.<SiMMLTrack>; 49 /** Auto-fader to fade in/out. */ 50 protected var _fader:Fader; 51 /** Fader volume. */ 52 protected var _faderVolume:Number; 46 53 47 54 /** Sound length uint in 16th beat, 0 sets inifinity length. @default 0. */ … … 273 280 _track = null; 274 281 _tracks = null; 282 _fader = new Fader(null, 1); 275 283 _volumes = new Vector.<int>(SiOPMModule.STREAM_SEND_SIZE); 284 _faderVolume = 1; 276 285 277 286 _note = 60; … … 317 326 _quantize = 1; 318 327 328 _fader.setFade(null, 1); 319 329 _effectChain = null; 320 330 _volumes[0] = 64; 321 331 for (var i:int=1; i<SiOPMModule.STREAM_SEND_SIZE; i++) _volumes[i] = 0; 332 _faderVolume = 1; 322 333 _pan = 0; 323 334 _mute = false; … … 359 370 { 360 371 _volumes[slot] = (volume<0) ? 0 : (volume>1) ? 128 : (volume * 128); 372 } 373 374 375 /** Set fading in. 376 * @param time fading time[sec]. 377 */ 378 public function fadeIn(time:Number) : void 379 { 380 var drv:SiONDriver = driver; 381 if (drv) { 382 if (!_fader.isActive) { 383 drv.addEventListener(SiONEvent.STREAM, _onStream); 384 drv._sion_internal::forceDispatchStreamEvent(); 385 } 386 _fader.setFade(_fadeVolume, 0, 1, time * drv.sampleRate / drv.bufferLength); 387 } 388 } 389 390 391 /** Set fading out. 392 * @param time fading time[sec]. 393 */ 394 public function fadeOut(time:Number) : void 395 { 396 var drv:SiONDriver = driver; 397 if (drv) { 398 if (!_fader.isActive) { 399 drv.addEventListener(SiONEvent.STREAM, _onStream); 400 drv._sion_internal::forceDispatchStreamEvent(); 401 } 402 _fader.setFade(_fadeVolume, 1, 0, time * drv.sampleRate / drv.bufferLength); 403 } 361 404 } 362 405 … … 511 554 internal function _updateVolume() : void 512 555 { 513 if (_parent) _volumes[0] = _parent._volumes[0] * _thisVolume ;514 else _volumes[0] = _thisVolume * 128;556 if (_parent) _volumes[0] = _parent._volumes[0] * _thisVolume * _faderVolume; 557 else _volumes[0] = _thisVolume * _faderVolume * 128; 515 558 } 516 559 … … 537 580 if (_pan < -1) _pan = -1; 538 581 else if (_pan > 1) _pan = 1; 582 } 583 584 585 /** Handler for SiONEvent.STREAM */ 586 protected function _onStream(e:SiONEvent) : void 587 { 588 if (!_fader.execute()) { 589 driver.removeEventListener(SiONEvent.STREAM, _onStream); 590 driver._sion_internal::forceDispatchStreamEvent(false); 591 } 592 } 593 594 595 /** call from fader */ 596 protected function _fadeVolume(v:Number) : void 597 { 598 _faderVolume = v; 599 _updateVolume(); 539 600 } 540 601 } as3/SiOPM/trunk/src/org/si/sound/mdx/MDXData.as
r3530 r3564 7 7 8 8 package org.si.sound.mdx { 9 import org.si.sion. SiONData;10 import org.si.sion. SiONVoice;9 import org.si.sion.*; 10 import org.si.sion.module.SiOPMTable; 11 11 import org.si.sion.module.SiOPMChannelParam; 12 12 import org.si.sion.module.SiOPMOperatorParam; … … 24 24 public var title:String = null; 25 25 public var pdxFileName:String = null; 26 public var voices:Vector.<SiONVoice> = new Vector.<SiONVoice>(256, true); 27 public var tracks:Vector.<MDXTrack> = new Vector.<MDXTrack>(16, true); 28 public var globalEvents:Vector.<MDXEvent> = new Vector.<MDXEvent>(); 29 26 public var voices:Vector.<SiONVoice> = new Vector.<SiONVoice>(256, true); 27 public var tracks:Vector.<MDXTrack> = new Vector.<MDXTrack>(16, true); 28 public var executors:Vector.<MDXExecutor> = new Vector.<MDXExecutor>(16, true); 29 public var currentBPM:Number; 30 private var _noiseVoice:SiONVoice; 31 private var _noiseVoiceNumber:int; 30 32 31 33 … … 51 53 function MDXData() 52 54 { 53 55 for (var i:int=0; i<16; i++) executors[i] = new MDXExecutor(); 56 _noiseVoice = new SiONVoice(2, 1); 57 _noiseVoice.channelParam.operatorParam[0].ptType = SiOPMTable.PT_OPM_NOISE; 54 58 } 55 59 … … 67 71 title = null; 68 72 pdxFileName = null; 69 globalEvents.length = 0;70 73 for (i=0; i<16; i++) tracks[i] = null; 71 74 for (i=0; i<256; i++) voices[i] = null; 75 _noiseVoiceNumber = -1; 72 76 return this; 73 77 } … … 80 84 public function convertToSiONData(data:SiONData=null, pdxData:PDXData=null) : SiONData 81 85 { 82 var i:int, imax:int, prevClock:uint, currentClock:uint; 86 if (SiONDriver.mutex == null) throw new Error("MDXData.convertToSiONData() : This function can be called after creating SiONDriver."); 87 88 var i:int, imax:int; 83 89 84 90 if (data == null) data = new SiONData(); 85 91 data.clear(); 86 87 92 data.bpm = bpm; 88 data.globalSequence.initialize(); 89 imax = globalEvents.length; 90 currentClock = prevClock = 0; 91 for (i=0; i<imax; i++) { 92 switch(globalEvents[i].type) { 93 case MDXEvent.TIMERB: 94 currentClock = globalEvents[i].clock; 95 if (prevClock < currentClock) data.globalSequence.appendNewEvent(MMLEvent.WAIT, (currentClock-prevClock)*10); 96 data.globalSequence.appendNewEvent(MMLEvent.TEMPO, 4883/(256-globalEvents[i].data)); 97 prevClock = currentClock; 98 break; 99 } 100 } 101 102 imax = (isPCM8) ? 16 : 9; 103 for (i=0; i<imax; i++) { 104 tracks[i]._constructMMLSequence(data.appendNewSequence()); 105 } 106 93 94 // set voice data 107 95 imax = voices.length; 108 for (i=0; i<imax; i++) { 109 data.voices[i] = voices[i] 110 } 111 96 for (i=0; i<imax; i++) data.voices[i] = voices[i]; 97 98 // set adpcm data 112 99 if (pdxData) { 113 100 imax = 96; 114 101 for (i=0; i<imax; i++) data.setPCMData(i, pdxData.pcmData[i]); 102 } 103 104 // construct mml sequences 105 imax = (isPCM8) ? 16 : 9; 106 for (i=0; i<imax; i++) { 107 executors[i].initialize(data.appendNewSequence().initialize(), tracks[i], _noiseVoiceNumber); 108 } 109 110 var totalClock:uint=0, nextClock:uint, c:uint; 111 currentBPM = bpm; 112 while (totalClock != uint.MAX_VALUE) { 113 // sync 114 for (i=0; i<imax; i++) executors[i].globalExec(totalClock, this); 115 // exec 116 nextClock = uint.MAX_VALUE; 117 for (i=0; i<imax; i++) { 118 c = executors[i].exec(totalClock, currentBPM); 119 if (c < nextClock) nextClock = c; 120 } 121 totalClock = nextClock; 115 122 } 116 123 … … 146 153 dataPointer = bytes.position; 147 154 voiceOffset = bytes.readUnsignedShort(); // tone data 148 for (i=0; i<16; i++) mmlOffsets[i] = dataPointer + bytes.readUnsignedShort();155 for (i=0; i<16; i++) trace(mmlOffsets[i] = dataPointer + bytes.readUnsignedShort()); 149 156 // check pcm8 150 157 bytes.position = mmlOffsets[0]; … … 189 196 v = (reg[0] >> (opi<<3)) & 255; 190 197 opp.dt1 = (v >> 4) & 7; 191 opp. fmul = (v & 7) << 7;198 opp.mul = v & 15; 192 199 opp.tl = (reg[1] >> (opi<<3)) & 127; 193 200 v = (reg[2] >> (opi<<3)) & 255; … … 204 211 opp.rr = (v & 15) << 2; 205 212 } 213 214 trace(voice.getMML(voiceNumber)); 215 } 216 217 _noiseVoiceNumber = -1; 218 for (i=255; i>=0; --i) { 219 if (voices[i] == null) { 220 _noiseVoiceNumber = i; 221 voices[i] = _noiseVoice; 222 } 206 223 } 207 224 } … … 213 230 var i:int, imax:int = (isPCM8) ? 16 : 9; 214 231 // load tracks 232 bpm = 0; 215 233 for (i=0; i<imax; i++) { 216 234 bytes.position = mmlOffsets[i]; 217 235 tracks[i] = new MDXTrack(this, i); 218 236 tracks[i].loadBytes(bytes); 219 } 220 221 // sort all global events 222 globalEvents = globalEvents.sort(function(a:MDXEvent, b:MDXEvent) : Number { return (a.clock - b.clock); }); 223 224 // load bpm 225 bpm = 87.19642857142857; // 4883/(256-200) 226 imax = globalEvents.length; 227 for (i=0; i<imax; i++) { 228 if (globalEvents[i].clock > 0) break; 229 if (globalEvents[i].type == MDXEvent.TIMERB) { 230 bpm = 4883/(256-globalEvents[i].data);//4370.285//4883 231 break; 232 } 233 } 237 if (tracks[i].timerB != -1 && bpm == 0) { 238 bpm = 4883/(256-tracks[i].timerB); 239 } 240 } 241 if (bpm == 0) bpm = 87.19642857142857; // 4883/(256-200) 242 } 243 244 245 /** @private [internal] call from MDXExecutor.sync() */ 246 internal function onSyncSend(channelNumber:int, syncClock:uint) : void 247 { 248 executors[channelNumber & 15].sync(syncClock); 249 } 250 251 252 /** @private [internal] call from MDXExecutor.sync() */ 253 internal function onTimerB(timerB:int) : void 254 { 255 currentBPM = 4883/(256-timerB); 234 256 } 235 257 } 236 258 } 237 259 238 as3/SiOPM/trunk/src/org/si/sound/mdx/MDXEvent.as
r3530 r3564 54 54 public var data:int = 0; 55 55 public var data2:int = 0; 56 public var clock:uint = 0;57 56 public var deltaClock:uint = 0; 58 57 … … 65 64 public function toString() : String 66 65 { 67 66 var i:int; 67 switch (type) { 68 case REST: return "r ;"+String(deltaClock); 69 case NOTE: 70 i = (data+15)%12; 71 return "o"+String(((data+15)/12)>>0)+_noteText[i]+";"+String(deltaClock); 72 case REPEAT_BEGIN: return "["+String(data); 73 case REPEAT_BREAK: return "|"; 74 case REPEAT_END: return "]"; 75 case PORTAMENT: return "po"; 76 case SLUR: return "&"; 77 case VOICE: return "@"+String(data); 78 case PAN: return "p"+String(data); 79 case VOLUME: return (data<16) ? "v"+String(data) : "@v"+String(data&127); 80 default: return "#"+ type.toString(16) + "; " + String(data); 81 } 68 82 return ""; 69 83 } … … 74 88 // constructor 75 89 //-------------------------------------------------------------------------------- 76 function MDXEvent(type:int, data:int, data2:int, clock:int,deltaClock:int)90 function MDXEvent(type:int, data:int, data2:int, deltaClock:int) 77 91 { 78 92 this.type = type; 79 93 this.data = data; 80 94 this.data2 = data2; 81 this.clock = clock;82 95 this.deltaClock = deltaClock; 83 96 } as3/SiOPM/trunk/src/org/si/sound/mdx/MDXTrack.as
r3530 r3564 8 8 package org.si.sound.mdx { 9 9 import flash.utils.ByteArray; 10 import org.si.sion.SiONDriver;11 import org.si.sion.sequencer.SiMMLSequencer;12 import org.si.sion.sequencer.base.MMLSequence;13 import org.si.sion.sequencer.base.MMLEvent;14 10 15 11 … … 23 19 /** Return pointer of segno */ 24 20 public var segnoPointer:MDXEvent; 21 /** timer B value to set */ 22 public var timerB:int; 23 24 /** owner MDXData */ 25 public var owner:MDXData; 25 26 /** channel number */ 26 27 public var channelNumber:int; 27 /** owner MDXData */28 public var owner:MDXData;29 28 30 29 … … 35 34 public function toString():String 36 35 { 37 var text:String = ""; 36 var text:String = "", i:int, imax:int = sequence.length; 37 for (i=0; i<imax; i++) text += sequence[i] +"\n"; 38 38 return text; 39 39 } … … 62 62 sequence.length = 0; 63 63 segnoPointer = null; 64 timerB = -1; 64 65 return this; 65 66 } … … 71 72 clear(); 72 73 73 var code:int, v:int, clock:uint, pos:int, mem:Array=[], exitLoop:Boolean = false; 74 clock = 0; 74 var code:int, v:int, pos:int, mem:Array=[], exitLoop:Boolean = false; 75 75 76 76 while (!exitLoop && bytes.bytesAvailable>0) { … … 79 79 if (code<0x80) { // rest 80 80 newEvent(MDXEvent.REST, 0, 0, code+1); 81 clock += code+1;82 81 } else 83 82 if (code<0xe0) { // note 84 83 v = bytes.readUnsignedByte() + 1; 85 84 newEvent(MDXEvent.NOTE, code - 0x80, 0, v); 86 clock += v;87 85 } else { 88 86 switch(code) { … … 100 98 case MDXEvent.FREQUENCY: 101 99 case MDXEvent.LFO_DELAY: 100 case MDXEvent.SYNC_SEND: 102 101 newEvent(code, bytes.readUnsignedByte()); 103 102 break; … … 107 106 case MDXEvent.SLUR: 108 107 case MDXEvent.SET_PCM8: 108 case MDXEvent.SYNC_WAIT: 109 109 newEvent(code); 110 110 break; … … 119 119 break; 120 120 case MDXEvent.REPEAT_END: 121 v = pos+(bytes.readShort()); // REPEAT_BEGIN 122 newEvent(code, v); 121 newEvent(code, pos+bytes.readShort()); // position of REPEAT_BEGIN 123 122 break; 124 123 case MDXEvent.REPEAT_BREAK: 125 v = pos+(bytes.readShort()+2); // REPEAT_END 126 newEvent(code, v); 124 newEvent(code, pos+bytes.readShort()+2); // position of REPEAT_END 127 125 break; 128 126 //----- others 129 127 case MDXEvent.TIMERB: 130 case MDXEvent.SYNC_SEND:131 128 v = bytes.readUnsignedByte(); 132 owner.globalEvents.push(newEvent(code, v)); 133 break; 134 case MDXEvent.SYNC_WAIT: 135 owner.globalEvents.push(newEvent(code)); 129 if (timerB == -1) timerB = v; 130 newEvent(code, v); 136 131 break; 137 132 case MDXEvent.PITCH_LFO: 138 133 case MDXEvent.VOLUME_LFO: 139 134 v = bytes.readUnsignedByte(); 140 if (v == 0x80 || v == 0x81) newEvent(code, v <<24);141 else newEvent(code, (v<<16) | bytes.readUnsignedShort(), bytes.readUnsignedShort());135 if (v == 0x80 || v == 0x81) newEvent(code, v); 136 else newEvent(code, v | (bytes.readUnsignedShort()<<8), bytes.readUnsignedShort()); 142 137 break; 143 138 case MDXEvent.OPM_LFO: 144 139 v = bytes.readUnsignedByte(); 145 if (v == 0x80 || v == 0x81) newEvent(code, v<< 24);140 if (v == 0x80 || v == 0x81) newEvent(code, v<<16); 146 141 else { 147 142 v = (v<<16) | (bytes.readUnsignedByte()<<8) | bytes.readUnsignedByte(); … … 165 160 166 161 function newEvent(type:int, data:int=0, data2:int=0, deltaClock:int=0) : MDXEvent { 167 var inst:MDXEvent = new MDXEvent(type, data, data2, clock,deltaClock);162 var inst:MDXEvent = new MDXEvent(type, data, data2, deltaClock); 168 163 sequence.push(inst); 169 164 mem[pos] = inst; 170 165 return inst; 171 166 } 172 167 168 trace("------------------- ch", channelNumber, "-------------------"); 169 trace(String(this)); 173 170 return this; 174 }175 176 177 /** @private [internal] construct MMLSequence */178 internal function _constructMMLSequence(mmlseq:MMLSequence) : void179 {180 if (SiONDriver.mutex == null) return;181 182 var i:int, v:int, imax:int, e:MDXEvent, me:MMLEvent, sequencer:SiMMLSequencer = SiONDriver.mutex.sequencer,183 panTable:Array = [4,0,8,4], freqTable:Array = [18,23,30,35,42], adpcmFreq:int = 4, adpcmID:int = -1,184 repeatStac:Array = [], lastNoteMDX:MDXEvent, lastNoteMML:MMLEvent,185 lfoDelay:int=0, lfofq:int=0, lfows:int=2, mp:int=0, ma:int=0,186 eventIDFadeOut:int = sequencer.getEventID("@fadeout"),187 eventIDPan:int = sequencer.getEventID("p"),188 eventIDPShift:int = sequencer.getEventID("k"),189 eventIDLFO:int = sequencer.getEventID("@lfo"),190 eventIDAMod:int = sequencer.getEventID("ma"),191 eventIDPMod:int = sequencer.getEventID("mp"),192 eventIDIndex:int = sequencer.getEventID("i");193 194 195 mmlseq.initialize();196 if (channelNumber < 8) mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 6); // use FM voice197 else mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 7); // use PCM voice198 199 imax = sequence.length;200 for (i=0; i<imax; i++) {201 e = sequence[i];202 if (segnoPointer === e) mmlseq.appendNewEvent(MMLEvent.REPEAT_ALL, 0);203 if (e.type < 0x80) {204 mmlseq.appendNewEvent(MMLEvent.REST, 0, e.deltaClock*10);205 } else if (e.type < 0xe0) {206 lastNoteMDX = e;207 if (channelNumber < 8) {208 lastNoteMML = mmlseq.appendNewEvent(MMLEvent.NOTE, e.data+12, e.deltaClock*10); // use FM voice209 } else {210 // use PCM voice211 if (adpcmID != e.data) {212 adpcmID = e.data;213 mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, adpcmID);214 }215 lastNoteMML = mmlseq.appendNewEvent(MMLEvent.NOTE, freqTable[adpcmFreq], e.deltaClock*10);216 }217 } else {218 switch(e.type) {219 case MDXEvent.REGISTER:220 mmlseq.appendNewEvent(MMLEvent.REGISTER, (e.data << 8) | e.data2);221 break;222 case MDXEvent.FADEOUT:223 mmlseq.appendNewEvent(eventIDFadeOut, e.data2);224 break;225 case MDXEvent.VOICE:226 mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, e.data);227 break;228 case MDXEvent.PAN:229 if (e.data == 0) mmlseq.appendNewEvent(MMLEvent.VOLUME, 0);230 else {231 mmlseq.appendNewEvent(MMLEvent.VOLUME, 16);232 mmlseq.appendNewEvent(eventIDPan, panTable[e.data]);233 }234 break;235 case MDXEvent.VOLUME:236 if (e.data < 16) mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, e.data<<3);237 else mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, e.data & 127);238 break;239 case MDXEvent.GATE:240 if (e.data < 9) {241 mmlseq.appendNewEvent(MMLEvent.QUANT_RATIO, e.data);242 mmlseq.appendNewEvent(MMLEvent.QUANT_COUNT, 0);243 } else {244 mmlseq.appendNewEvent(MMLEvent.QUANT_RATIO, 8);245 mmlseq.appendNewEvent(MMLEvent.QUANT_COUNT, (256-e.data)*10);246 }247 break;248 case MDXEvent.KEY_ON_DELAY:249 mmlseq.appendNewEvent(MMLEvent.KEY_ON_DELAY, e.data*10);250 break;251 case MDXEvent.VOLUME_DEC:252 mmlseq.appendNewEvent(MMLEvent.VOLUME_SHIFT, -1);253 break;254 case MDXEvent.VOLUME_INC:255 mmlseq.appendNewEvent(MMLEvent.VOLUME_SHIFT, 1);256 break;257 case MDXEvent.SLUR:258 if (lastNoteMML) {259 mmlseq.appendNewEvent(MMLEvent.SLUR_WEAK, 0, lastNoteMML.length);260 lastNoteMML.length = 0;261 }262 break;263 case MDXEvent.REPEAT_BEGIN:264 repeatStac.unshift(mmlseq.appendNewEvent(MMLEvent.REPEAT_BEGIN, e.data));265 break;266 case MDXEvent.REPEAT_BREAK:267 me = mmlseq.appendNewEvent(MMLEvent.REPEAT_BREAK, 0);268 me.jump = repeatStac[0];269 break;270 case MDXEvent.REPEAT_END:271 me = mmlseq.appendNewEvent(MMLEvent.REPEAT_END, 0);272 me.jump = repeatStac.shift();273 me.jump.jump = me;274 break;275 case MDXEvent.DETUNE:276 mmlseq.appendNewEvent(eventIDPShift, e.data);277 break;278 case MDXEvent.PORTAMENT:279 if (lastNoteMML) {280 v = lastNoteMML.data + (e.data * (e.clock - lastNoteMDX.clock) + 8192)/16384;281 if (v<0) v=0;282 else if (v>127) v=127;283 mmlseq.appendNewEvent(MMLEvent.PITCHBEND, 0, lastNoteMML.length);284 lastNoteMML.length = 0;285 mmlseq.appendNewEvent(MMLEvent.NOTE, v, 0);286 }287 break;288 case MDXEvent.LFO_DELAY:289 lfoDelay = e.data*75/owner.bpm;290 break;291 case MDXEvent.PITCH_LFO:292 if (e.data>>24) {293 if ((e.data>>24) == 0x80) mmlseq.appendNewEvent(eventIDPMod, 0);294 else _mod(eventIDPMod, mp);295 } else {296 lfows = (e.data>>16)&3;297 lfofq = (e.data&0xffff)*75/owner.bpm * ((lfows)?2:1);298 mp = e.data2>>((e.data&0x40000)?0:8);299 _mod(eventIDPMod, mp);300 }301 break;302 case MDXEvent.VOLUME_LFO:303 if (e.data>>24) {304 if ((e.data>>24) == 0x80) mmlseq.appendNewEvent(eventIDAMod, 0);305 else _mod(eventIDPMod, ma);306 } else {307 lfows = (e.data>>16)&3;308 lfofq = (e.data&0xffff)*75/owner.bpm * ((lfows)?2:1);309 ma = e.data2>>8;310 _mod(eventIDAMod, ma);311 }312 break;313 case MDXEvent.FREQUENCY:314 if (channelNumber == 7) {315 /**/316 } else317 if (channelNumber >= 8) {318 adpcmFreq = e.data;319 }320 break;321 case MDXEvent.DATA_END:322 case MDXEvent.SET_PCM8:323 case MDXEvent.TIMERB:324 break;325 case MDXEvent.SYNC_SEND:326 case MDXEvent.SYNC_WAIT:327 case MDXEvent.OPM_LFO:328 default:329 // not supported330 break;331 }332 }333 }334 335 336 function _mod(eventID:int, data:int) : void {337 mmlseq.appendNewEvent(eventID, lfofq);338 mmlseq.appendNewEvent(MMLEvent.PARAMETER, lfows);339 if (lfoDelay) {340 mmlseq.appendNewEvent(eventID, 0);341 mmlseq.appendNewEvent(MMLEvent.PARAMETER, data);342 mmlseq.appendNewEvent(MMLEvent.PARAMETER, lfoDelay);343 } else {344 mmlseq.appendNewEvent(eventID, data);345 }346 }347 171 } 348 172 } as3/SiOPM/trunk/src/org/si/sound/synthesizer/SynthesizerBase.as
r3480 r3564 36 36 37 37 38 // valiables38 // properties 39 39 //---------------------------------------- 40 40 /** voice setting */ … … 70 70 71 71 /** request voice update */ 72 public function requestUpdate Voice() : void72 public function requestUpdate() : void 73 73 { 74 74 _requireVoiceUpdate = true;

