チェンジセット 3565
- コミット日時:
- 2010/03/19 03:06:33 (3 年前)
- ファイル:
-
- as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelBase.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelFM.as (更新) (5 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelSampler.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLVoice.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/utils/SiONPresetVoice.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sound/Note.as (更新) (5 diffs)
- as3/SiOPM/trunk/src/org/si/sound/RhythmBox.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sound/RhythmBoxPresetPattern.as (追加)
- as3/SiOPM/trunk/src/org/si/sound/RhythmBoxPresetVoice.as (追加)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXData.as (更新) (7 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXEvent.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXExecutor.as (更新) (11 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/MDXTrack.as (更新) (7 diffs)
- as3/SiOPM/trunk/src/org/si/sound/mdx/mdxplayer.as.txt (追加)
- as3/SiOPM/trunk/src/org/si/sound/synthesizer/FMSynth.as (追加)
- as3/SiOPM/trunk/src/org/si/sound/synthesizer/FMSynthOperator.as (追加)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelBase.as
r3480 r3565 115 115 //-------------------------------------------------- 116 116 /** Set by SiOPMChannelParam. */ 117 public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean ) : void {}117 public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean, withModulation:Boolean=true) : void {} 118 118 /** Get SiOPMChannelParam. */ 119 119 public function getSiOPMChannelParam(param:SiOPMChannelParam) : void {} as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelFM.as
r3530 r3565 175 175 _am_depth = depth<<2; 176 176 _am_out = (_lfo_waveTable[_lfo_phase] * _am_depth) >> 7 << 3; 177 _lfoSwitch(_pm_depth >0 || _am_depth > 0);177 _lfoSwitch(_pm_depth != 0 || _am_depth > 0); 178 178 } 179 179 … … 186 186 _pm_depth = depth; 187 187 _pm_out = (((_lfo_waveTable[_lfo_phase]<<1)-255) * _pm_depth) >> 8; 188 _lfoSwitch(_pm_depth >0 || _am_depth > 0);188 _lfoSwitch(_pm_depth != 0 || _am_depth > 0); 189 189 if (_pm_depth == 0) { 190 190 if (operator[0]) operator[0].detune2 = 0; … … 214 214 * @param param SiOPMChannelParam. 215 215 * @param withVolume Set volume when its true. 216 * @param withModulation Set modulation when its true. 216 217 */ 217 override public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean ) : void218 override public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean, withModulation:Boolean=true) : void 218 219 { 219 220 var i:int; … … 229 230 setAlgorism(param.opeCount, param.alg); 230 231 setFeedBack(param.fb, param.fbc); 231 initializeLFO(param.lfoWaveShape); 232 _lfo_timer = (param.lfoFreqStep>0) ? 1 : 0; 233 _lfo_timer_step = param.lfoFreqStep; 234 setAmplitudeModulation(param.amd); 235 setPitchModulation(param.pmd); 232 if (withModulation) { 233 trace(param.pmd); 234 initializeLFO(param.lfoWaveShape); 235 _lfo_timer = (param.lfoFreqStep>0) ? 1 : 0; 236 _lfo_timer_step = param.lfoFreqStep; 237 setAmplitudeModulation(param.amd); 238 setPitchModulation(param.pmd); 239 } 236 240 setLPFilter(param.cutoff, param.resonance, param.far, param.fdr1, param.fdr2, param.frr, param.fdc1, param.fdc2, param.fsc, param.frc); 237 241 for (i=0; i<_operatorCount; i++) { … … 635 639 op = op.next; 636 640 } 637 641 638 642 // update pointers 639 643 _inPipe = ip; as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelSampler.as
r3480 r3565 66 66 * @param withVolume Set volume when its true. 67 67 */ 68 override public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean ) : void68 override public function setSiOPMChannelParam(param:SiOPMChannelParam, withVolume:Boolean, withModulation:Boolean=true) : void 69 69 { 70 70 var i:int; as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as
r3450 r3565 117 117 voice = SiMMLTable.instance.getSiMMLVoice(voiceIndex); 118 118 if (voice) { // this module changes only channel params, not track params. 119 track.channel.setSiOPMChannelParam(voice.channelParam, false );119 track.channel.setSiOPMChannelParam(voice.channelParam, false, false); 120 120 return (voice.channelParam.initSequence.isEmpty()) ? null : voice.channelParam.initSequence; 121 121 } as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as
r3450 r3565 604 604 // free previous table 605 605 if (table[1]) SLLint.freeList(table[1]); 606 607 if ( depth < end_depth) {606 607 if ((0<=depth && depth<end_depth) || (depth<0 && depth>end_depth)) { 608 608 // make table and envelop on 609 609 table[1] = _makeModulationTable(depth, end_depth, delay, term); as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLVoice.as
r3480 r3565 31 31 /** tone number, 1st argument of '@'. -1;do nothing. @default -1 */ 32 32 public var toneNum:int; 33 /** preferable note. -1;no preferable note. @default -1 */ 34 public var preferableNote:int 33 35 34 36 /** parameters for FM sound channel. */ … … 225 227 channelNum = 0; 226 228 toneNum = -1; 229 preferableNote = -1; 227 230 228 231 channelParam = new SiOPMChannelParam(); … … 274 277 channelNum = src.channelNum; 275 278 toneNum = src.toneNum; 279 preferableNote = src.preferableNote; 276 280 channelParam.copyFrom(src.channelParam); 277 281 as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as
r3564 r3565 127 127 for (i=0; i<SiOPMTable.PCM_DATA_MAX; i++) { 128 128 if (pcmData[i]) { 129 pcmData[i]. ._siopm_module_internal::_free();129 pcmData[i]._siopm_module_internal::_free(); 130 130 pcmData[i] = null; 131 131 } as3/SiOPM/trunk/src/org/si/sion/utils/SiONPresetVoice.as
r3480 r3565 14 14 15 15 16 /** Preset voice data. 4 57 voices are available now (default:11, valsound:258, GM:128, GMdrum:60).16 /** Preset voice data. 462 voices are available now (default:16, valsound:258, GM:128, GMdrum:60). 17 17 @example Create new instance and access voices by key. 18 18 <listing version="3.0"> … … 80 80 _new("ramp", "Ramp wave sample", new SiONVoice(5,160)); 81 81 82 _percuss("bass drum", "Simplebass drum", 0, 63, 28, -128);83 _percuss("snare", "Simplesnare drum", 17, 63, 32, 0, 64, 1);84 _percuss("closedhh", "Simpleclosed hi-hat", 19, 63, 40, 0);85 _percuss("openedhh", "Simpleopened hi-hat", 19, 63, 28, 0);86 _percuss(" symbal", "Simple symbal",16, 48, 24, 0);82 _percuss("bass", "Simple 1operator bass drum", 0, 63, 28, -128); 83 _percuss("snare", "Simple 1operator snare drum", 17, 63, 32, 0, 64, 1); 84 _percuss("closedhh", "Simple 1operator closed hi-hat", 19, 63, 40, 0); 85 _percuss("openedhh", "Simple 1operator opened hi-hat", 19, 63, 28, 0); 86 _percuss("crash", "Simple 1operator crash symbal", 16, 48, 24, 0); 87 87 88 88 _analog("dualsaw", "Dual saw", 0, 1, 1, 0, 8); as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as
r3516 r3565 137 137 for (i=0; i<imax;) { 138 138 data = src.readUnsignedByte(); 139 r0 = (data >> 4)& 0x0f;140 r1 = data& 0x0f;139 r0 = data & 0x0f; 140 r1 = (data >> 4) & 0x0f; 141 141 142 predRate = (predRate * crTable[r0]) >> 3; 142 predRate *= crTable[r0]; 143 predRate >>= 3; 143 144 output += predRate; 144 145 dst[i] = output * 0.000030517578125; 145 predRate = (predRate * puTable[r0]) >> 6; 146 if (predRate < 127) predRate = 127; 147 else if (predRate > 24576) predRate = 24576; 146 predRate *= puTable[r0] 147 predRate >>= 6; 148 if (predRate>0) { 149 if (predRate < 127) predRate = 127; 150 else if (predRate > 24576) predRate = 24576; 151 } else { 152 if (predRate > -127) predRate = -127; 153 else if (predRate < -24576) predRate = -24576; 154 } 148 155 i++; 149 156 150 predRate = (predRate * crTable[r1]) >> 3; 157 predRate *= crTable[r1]; 158 predRate >>= 3; 151 159 output += predRate; 152 160 dst[i] = output * 0.000030517578125; 153 predRate = (predRate * puTable[r1]) >> 6; 154 if (predRate < 127) predRate = 127; 155 else if (predRate > 24576) predRate = 24576; 161 predRate *= puTable[r1]; 162 predRate >>= 6; 163 if (predRate>0) { 164 if (predRate < 127) predRate = 127; 165 else if (predRate > 24576) predRate = 24576; 166 } else { 167 if (predRate > -127) predRate = -127; 168 else if (predRate < -24576) predRate = -24576; 169 } 156 170 i++; 171 } 172 173 for (i=0; i<imax; i++) { 174 if (dst[i] < -1) dst[i] = -1; 175 else if (dst[i] > 1) dst[i] = 1; 157 176 } 158 177 as3/SiOPM/trunk/src/org/si/sound/Note.as
r3504 r3565 20 20 /** Voice index refering from PatternSequencer.voiceList, -1 (or all negatives) sets no voice changing. @see si.org.sound.PatternSequencer.voiceList */ 21 21 public var voiceIndex:Number = 0; 22 /** Any informations */ 23 public var data:* = null; 22 24 23 25 … … 31 33 * @param length Length in 16th beat [16 for whole tone], Number.NaN sets playing with sequencers default length. 32 34 * @param voiceIndex Voice index refering from PatternSequencer.voiceList, -1 (or all negatives) sets no voice changing. @see si.org.sound.PatternSequencer.voiceList. 35 * @param data Any informations you want. 33 36 */ 34 function Note(note:int=-1, velocity:int=0, length:Number=Number.NaN, voiceIndex:int=-1 )37 function Note(note:int=-1, velocity:int=0, length:Number=Number.NaN, voiceIndex:int=-1, data:*=null) 35 38 { 36 39 this.note = note; … … 38 41 this.length = length; 39 42 this.voiceIndex = voiceIndex; 43 this.data = data; 40 44 } 41 45 … … 50 54 * @param length Length in 16th beat [16 for whole tone], Number.NaN sets playing with sequencers default length. 51 55 * @param voiceIndex Voice index refering from PatternSequencer.voiceList, -1 (or all negatives) sets no voice changing. @see si.org.sound.PatternSequencer.voiceList. 56 * @param data Any informations you want. 52 57 * @return this instance. 53 58 */ 54 public function setNote(note:int=-1, velocity:int=-1, length:Number=Number.NaN, voiceIndex:int=-1 ) : Note59 public function setNote(note:int=-1, velocity:int=-1, length:Number=Number.NaN, voiceIndex:int=-1, data:*=null) : Note 55 60 { 56 61 this.note = note; … … 58 63 this.length = length; 59 64 this.voiceIndex = voiceIndex; 65 this.data = data; 60 66 return this; 61 67 } as3/SiOPM/trunk/src/org/si/sound/RhythmBox.as
r3504 r3565 19 19 // variables 20 20 //---------------------------------------- 21 /** interruption step */22 protected var _interruptStep:int;23 24 21 /** bass drum pattern sequencer */ 25 22 public var bass:PatternSequencer; … … 60 57 { 61 58 super("RhythmBox"); 62 _interruptStep = 120;63 59 addChild(bass = new PatternSequencer(16, 36, 255, 1)); 64 60 addChild(snare = new PatternSequencer(16, 68, 128, 1)); as3/SiOPM/trunk/src/org/si/sound/mdx/MDXData.as
r3564 r3565 99 99 if (pdxData) { 100 100 imax = 96; 101 for (i=0; i<imax; i++) data.setPCMData(i, pdxData.pcmData[i]); 101 for (i=0; i<imax; i++) { 102 data.setPCMData(i, pdxData.pcmData[i]); 103 } 102 104 } 103 105 … … 105 107 imax = (isPCM8) ? 16 : 9; 106 108 for (i=0; i<imax; i++) { 107 executors[i].initialize(data.appendNewSequence().initialize(), tracks[i], _noiseVoiceNumber); 109 if (tracks[i].hasNoData) executors[i].initialize(null, tracks[i], _noiseVoiceNumber); 110 else executors[i].initialize(data.appendNewSequence().initialize(), tracks[i], _noiseVoiceNumber); 108 111 } 109 112 … … 122 125 } 123 126 127 data.title = title; 128 124 129 return data; 125 130 } … … 141 146 titleLength = bytes.position - 3; 142 147 bytes.position = 0; 143 title = bytes.readMultiByte(titleLength, " us-ascii"); //shift_jis148 title = bytes.readMultiByte(titleLength, "shift_jis"); //us-ascii 144 149 bytes.position = titleLength + 3; 145 150 … … 147 152 while (true) { if (bytes.readByte() == 0) break; } 148 153 pdxLength = bytes.position - titleLength - 4; 149 pdxFileName = bytes.readMultiByte(pdxLength, "us-ascii"); 154 bytes.position = titleLength + 3; 155 if (pdxLength != 0) pdxFileName = bytes.readMultiByte(pdxLength, "shift_jis"); //us-ascii 150 156 bytes.position = titleLength + pdxLength + 4; 151 157 … … 153 159 dataPointer = bytes.position; 154 160 voiceOffset = bytes.readUnsignedShort(); // tone data 155 for (i=0; i<16; i++) trace(mmlOffsets[i] = dataPointer + bytes.readUnsignedShort());161 for (i=0; i<16; i++) mmlOffsets[i] = dataPointer + bytes.readUnsignedShort(); 156 162 // check pcm8 157 163 bytes.position = mmlOffsets[0]; … … 212 218 } 213 219 214 trace(voice.getMML(voiceNumber));220 //trace(voice.getMML(voiceNumber)); 215 221 } 216 222 as3/SiOPM/trunk/src/org/si/sound/mdx/MDXEvent.as
r3564 r3565 70 70 i = (data+15)%12; 71 71 return "o"+String(((data+15)/12)>>0)+_noteText[i]+";"+String(deltaClock); 72 case GATE: return "q"+String(data); 73 case DETUNE: return "k"+String(data>>8); 72 74 case REPEAT_BEGIN: return "["+String(data); 73 75 case REPEAT_BREAK: return "|"; … … 78 80 case PAN: return "p"+String(data); 79 81 case VOLUME: return (data<16) ? "v"+String(data) : "@v"+String(data&127); 82 case LFO_DELAY: return "LFO_delay"+String(data); 83 case PITCH_LFO: return "LFO"+(data&255).toString(16)+" mp"+(data>>8)+","+(data2); 84 case VOLUME_LFO: return "LFO"+(data&255).toString(16)+" ma"+(data>>8)+","+(data2); 85 case FREQUENCY: return "FREQ"+String(data); 86 case TIMERB: return "TIMER_B "+String(data); 87 case SET_PCM8: return "PCM8"; 80 88 default: return "#"+ type.toString(16) + "; " + String(data); 81 89 } as3/SiOPM/trunk/src/org/si/sound/mdx/MDXExecutor.as
r3564 r3565 29 29 internal var gateTime:int; 30 30 internal var waitSync:Boolean; 31 internal var volume:int; 32 internal var fineVolumeFlag:Boolean; 33 31 34 32 35 static private var _panTable:Array = [4,0,8,4]; … … 37 40 private var eventIDFadeOut:int; 38 41 private var eventIDPan:int; 42 private var eventIDExp:int; 39 43 private var eventIDPShift:int; 40 44 private var eventIDLFO:int; … … 66 70 voiceID = 0; 67 71 adpcmID = -1; 68 anFreq = (mdxtrack.channelNumber<8) ? -1 : 3;72 anFreq = (mdxtrack.channelNumber<8) ? -1 : 4; 69 73 repeatStac = []; 70 74 lfoDelay = 0; … … 74 78 gateTime = 0; 75 79 waitSync = false; 76 77 if (mdxtrack.channelNumber < 8) mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 6); // use FM voice 78 else mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 7); // use PCM voice 79 80 var sequencer:SiMMLSequencer = SiONDriver.mutex.sequencer; 81 eventIDFadeOut = sequencer.getEventID("@fadeout"); 82 eventIDPan = sequencer.getEventID("p"); 83 eventIDPShift = sequencer.getEventID("k"); 84 eventIDLFO = sequencer.getEventID("@lfo"); 85 eventIDAMod = sequencer.getEventID("ma"); 86 eventIDPMod = sequencer.getEventID("mp"); 87 eventIDIndex = sequencer.getEventID("i"); 80 volume = 8; 81 fineVolumeFlag = false; 82 83 if (mmlseq) { 84 if (mdxtrack.channelNumber < 8) { 85 mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 6); // use FM voice 86 mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, 32); 87 } else { 88 mmlseq.appendNewEvent(MMLEvent.MOD_TYPE, 7); // use PCM voice 89 mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, 128); 90 } 91 92 var sequencer:SiMMLSequencer = SiONDriver.mutex.sequencer; 93 eventIDFadeOut = sequencer.getEventID("@fadeout"); 94 eventIDExp = sequencer.getEventID("x"); 95 eventIDPan = sequencer.getEventID("p"); 96 eventIDPShift = sequencer.getEventID("k"); 97 eventIDLFO = sequencer.getEventID("@lfo"); 98 eventIDAMod = sequencer.getEventID("ma"); 99 eventIDPMod = sequencer.getEventID("mp"); 100 eventIDIndex = sequencer.getEventID("i"); 101 } 88 102 } 89 103 … … 92 106 internal function exec(totalClock:uint, bpm:Number) : uint 93 107 { 108 if (mmlseq == null) return uint.MAX_VALUE; 109 94 110 var e:MDXEvent = null, me:MMLEvent, v:int, l:int; 95 111 … … 110 126 mmlseq.appendNewEvent(MMLEvent.NOTE, anFreq, e.deltaClock*10); 111 127 } else { // ADPCM 112 if (adpcmID != e.data) mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, (adpcmID = e.data)); 128 if (adpcmID != e.data) { 129 adpcmID = e.data; 130 mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, adpcmID); 131 } 113 132 mmlseq.appendNewEvent(MMLEvent.NOTE, _freqTable[anFreq], e.deltaClock*10); 114 133 } … … 130 149 case MDXEvent.FADEOUT: { mmlseq.appendNewEvent(eventIDFadeOut, e.data2); }break; 131 150 case MDXEvent.VOICE: 132 voiceID = e.data; 133 mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, voiceID); 151 if (mdxtrack.channelNumber < 8) { // ...? 152 voiceID = e.data; 153 mmlseq.appendNewEvent(MMLEvent.MOD_PARAM, voiceID); 154 } 134 155 break; 135 156 case MDXEvent.PAN: 136 157 if (e.data == 0) { 137 mmlseq.appendNewEvent( MMLEvent.VOLUME, 0);138 } else { 139 mmlseq.appendNewEvent(MMLEvent.VOLUME, 16);158 mmlseq.appendNewEvent(eventIDExp, 0); 159 } else { 160 _vol(); 140 161 mmlseq.appendNewEvent(eventIDPan, _panTable[e.data]); 141 162 } 142 163 break; 143 164 case MDXEvent.VOLUME: 144 if (e.data < 16) mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, _volTable[e.data]); 145 else mmlseq.appendNewEvent(MMLEvent.FINE_VOLUME, _tlTable[e.data & 127]); 165 if (mdxtrack.channelNumber < 8) { 166 if (e.data < 16) { 167 volume = e.data; 168 fineVolumeFlag = false; 169 } else { 170 volume = e.data & 127; 171 fineVolumeFlag = true; 172 } 173 _vol(); 174 } else { 175 mmlseq.appendNewEvent(eventIDExp, 127); 176 } 146 177 break; 147 178 case MDXEvent.VOLUME_DEC: 148 mmlseq.appendNewEvent(MMLEvent.VOLUME_SHIFT, -1); 179 if (--volume == 0) volume=0; 180 _vol(); 149 181 break; 150 182 case MDXEvent.VOLUME_INC: 151 mmlseq.appendNewEvent(MMLEvent.VOLUME_SHIFT, 1); 183 l = (fineVolumeFlag) ? 127 : 15; 184 if (++volume == l) volume = l; 185 _vol(); 152 186 break; 153 187 case MDXEvent.GATE: … … 168 202 e = mdxtrack.sequence[pointer]; 169 203 mmlseq.appendNewEvent(MMLEvent.NOTE, e.data+15, 0); 170 mmlseq.appendNewEvent(MMLEvent.SLUR _WEAK, 0, e.deltaClock*10);204 mmlseq.appendNewEvent(MMLEvent.SLUR, 0, e.deltaClock*10); 171 205 } 172 206 break; … … 188 222 case MDXEvent.LFO_DELAY: 189 223 lfoDelay = e.data*75/bpm; 224 if (mp>0) _mod(eventIDPMod, mp, lfows, lfofq); 225 if (ma>0) _mod(eventIDAMod, ma, lfows, lfofq); 190 226 break; 191 227 case MDXEvent.PITCH_LFO: 192 if ( e.data & 0x80) {228 if ((e.data & 0x80) != 0) { 193 229 if ((e.data & 0xff) == 0x80) mmlseq.appendNewEvent(eventIDPMod, 0); 194 else _mod(eventIDPMod, mp); 195 } else { 196 lfows = e.data&3; 197 lfofq = (e.data>>8)*75/bpm * ((lfows)?2:1); 198 mp = e.data2>>((e.data&0x40000)?0:8); 199 _mod(eventIDPMod, mp); 230 else _mod(eventIDPMod, mp, lfows, lfofq); 231 } else { 232 l = e.data>>8; 233 mp = ((e.data2>>(((e.data&4)==0)?8:0)) * l) >> 1; 234 _mod(eventIDPMod, mp, e.data&3, l*75/bpm * ((lfows)?2:1)); 200 235 } 201 236 break; 202 237 case MDXEvent.VOLUME_LFO: 203 if (e.data & 0x80) { 238 /* ... 239 if ((e.data & 0x80) != 0) { 204 240 if ((e.data & 0xff) == 0x80) mmlseq.appendNewEvent(eventIDAMod, 0); 205 else _mod(eventIDAMod, ma );206 } else { 207 l fows = e.data&3;208 lfofq = (e.data>>8)*75/bpm * ((lfows)?2:1);209 ma = e.data2>>8;210 _mod(eventIDAMod, ma);211 }241 else _mod(eventIDAMod, ma, lfows, lfofq); 242 } else { 243 l = e.data>>8; 244 ma = (e.data2 * l) >> 1; 245 _mod(eventIDAMod, ma, e.data&3, l*75/bpm * ((lfows)?2:1)); 246 } 247 */ 212 248 break; 213 249 case MDXEvent.FREQUENCY: … … 250 286 251 287 return (pointer >= pointerMax || waitSync) ? uint.MAX_VALUE : clock; 252 253 function _mod(eventID:int, data:int) : void { 254 mmlseq.appendNewEvent(eventID, lfofq); 255 mmlseq.appendNewEvent(MMLEvent.PARAMETER, lfows); 256 if (lfoDelay) { 288 289 function _vol() : void { 290 mmlseq.appendNewEvent(eventIDExp, (fineVolumeFlag) ? _tlTable[volume] : _volTable[volume]); 291 } 292 293 function _mod(eventID:int, data:int, ws:int, fq:int) : void { 294 if (lfows != ws || lfofq != fq) { 295 lfofq = fq; 296 lfows = ws; 297 mmlseq.appendNewEvent(eventIDLFO, lfofq); 298 mmlseq.appendNewEvent(MMLEvent.PARAMETER, lfows); 299 } 300 if (lfoDelay>0) { 257 301 mmlseq.appendNewEvent(eventID, 0); 258 302 mmlseq.appendNewEvent(MMLEvent.PARAMETER, data); … … 290 334 291 335 internal function sync(currentClock:uint) : void { 336 trace(currentClock, clock); 292 337 if (currentClock > clock) { 293 338 mmlseq.appendNewEvent(MMLEvent.REST, 0, (currentClock - clock)*10); as3/SiOPM/trunk/src/org/si/sound/mdx/MDXTrack.as
r3564 r3565 31 31 // properties 32 32 //-------------------------------------------------------------------------------- 33 /** has no data. */ 34 public function get hasNoData() : Boolean { 35 return (sequence.length <= 1); 36 } 37 33 38 /** to string. */ 34 39 public function toString():String … … 72 77 clear(); 73 78 74 var c ode:int, v:int, pos:int, mem:Array=[], exitLoop:Boolean = false;79 var clock:int, code:int, v:int, pos:int, mem:Array=[], exitLoop:Boolean = false; 75 80 76 81 while (!exitLoop && bytes.bytesAvailable>0) { … … 79 84 if (code<0x80) { // rest 80 85 newEvent(MDXEvent.REST, 0, 0, code+1); 86 clock += code+1; 81 87 } else 82 88 if (code<0xe0) { // note 83 89 v = bytes.readUnsignedByte() + 1; 84 90 newEvent(MDXEvent.NOTE, code - 0x80, 0, v); 91 clock += v; 85 92 } else { 86 93 switch(code) { … … 127 134 case MDXEvent.TIMERB: 128 135 v = bytes.readUnsignedByte(); 129 if ( timerB == -1) timerB = v;136 if (clock == 0) timerB = v; 130 137 newEvent(code, v); 131 138 break; … … 134 141 v = bytes.readUnsignedByte(); 135 142 if (v == 0x80 || v == 0x81) newEvent(code, v); 136 else newEvent(code, v | (bytes.readUnsignedShort()<<8), bytes.read UnsignedShort());143 else newEvent(code, v | (bytes.readUnsignedShort()<<8), bytes.readShort()); 137 144 break; 138 145 case MDXEvent.OPM_LFO: … … 141 148 else { 142 149 v = (v<<16) | (bytes.readUnsignedByte()<<8) | bytes.readUnsignedByte(); 143 newEvent(code, v, bytes.read UnsignedShort());150 newEvent(code, v, bytes.readShort()); 144 151 } 145 152 break; 146 153 case MDXEvent.DATA_END: // ...? 147 v = bytes.readUnsignedShort(); 148 newEvent(code, bytes.readUnsignedShort()); 149 if (v!=0) segnoPointer = mem[v]; 154 v = bytes.readShort(); 155 newEvent(code, v); 156 if (v>0 && pos-v+3>=0) segnoPointer = mem[pos-v+3]; 157 else if (v<0 && pos+v+3>=0) segnoPointer = mem[pos+v+3]; 150 158 exitLoop = true; 151 159 break; … … 166 174 } 167 175 168 trace("------------------- ch", channelNumber, "-------------------");169 trace(String(this));176 //trace("------------------- ch", channelNumber, "-------------------"); 177 //trace(String(this)); 170 178 return this; 171 179 }

