チェンジセット 2806
- コミット日時:
- 2009/06/10 07:29:00 (3 年前)
- ファイル:
-
- as3/SiOPM/trunk/src/org/si/sion/SiONData.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as (更新) (18 diffs)
- as3/SiOPM/trunk/src/org/si/sion/SiONVoice.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectAutoPan.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectDownSampler.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectEqualiser.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectModule.as (更新) (4 diffs)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectSpeakerSimulator.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectWaveShaper.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/effector/SiFilterBase.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/events/SiONEvent.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/events/SiONTrackEvent.as (更新) (4 diffs)
- as3/SiOPM/trunk/src/org/si/sion/midi (削除)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMModule.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperator.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMTable.as (更新) (6 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMWaveTable.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as (更新) (4 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLData.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as (更新) (5 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTable.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as (更新) (4 diffs)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/SiOPM/trunk/src/org/si/sion/SiONData.as
r2625 r2806 7 7 8 8 package org.si.sion { 9 import flash.media.Sound; 9 10 import org.si.sion.sequencer.SiMMLData; 11 import org.si.sion.utils.SiONUtil; 12 import org.si.sion.module.SiOPMPCMData; 10 13 11 14 … … 25 28 { 26 29 } 30 31 32 33 34 // setter 35 //---------------------------------------- 36 /** Set PCM sound rederd from %7. 37 * @param index PCM data number. 38 * @param sound Sound instance to set. 39 * @param samplingOctave Sampling frequency. The value of 5 means that "o5a" is original frequency. 40 * @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 41 */ 42 public function setPCMSound(index:int, sound:Sound, samplingOctave:int=5, sampleMax:int=1048576) : void 43 { 44 var pcm:Vector.<int> = SiONUtil.logTrans(sound, null, sampleMax); 45 pcmData[index] = SiOPMPCMData.alloc(pcm, samplingOctave); 46 } 47 48 49 /** Set sampler sound refered by %10. 50 * @param index note number. 0-127 for bank0, 128-255 for bank1. 51 * @param sound Sound instance to set. 52 * @param isOneShot True to set "one shot" sound. The "one shot" sound ignores note off. 53 * @param channelCount 1 for monoral, 2 for stereo. 54 * @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 55 */ 56 public function setSamplerSound(index:int, sound:Sound, isOneShot:Boolean=true, channelCount:int=2, sampleMax:int=1048576) : void 57 { 58 var data:Vector.<Number> = SiONUtil.extract(sound, null, channelCount, sampleMax); 59 setSamplerData(index, data, isOneShot, channelCount); 60 } 27 61 } 28 62 } as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as
r2697 r2806 35 35 * @see org.si.sion.events.SiONTrackEvent 36 36 * @see org.si.sion.module.SiOPMModule 37 * @see org.si.sion. mml.SiMMLSequencer38 * @see org.si.sion.effect .SiEffectModule37 * @see org.si.sion.sequencer.SiMMLSequencer 38 * @see org.si.sion.effector.SiEffectModule 39 39 @example 1) The simplest sample. Create new instance and call play with MML string.<br/> 40 40 <listing version="3.0"> … … 50 50 //---------------------------------------- 51 51 /** version number */ 52 static public const VERSION:String = "0.5. 3";52 static public const VERSION:String = "0.5.4"; 53 53 54 54 … … 111 111 private var _inStreaming:Boolean; // in streaming 112 112 private var _preserveStop:Boolean; // preserve stop after streaming 113 private var _isFinishSeqDispatched:Boolean; // FINISH_SEQUENCE event already dispacthed 113 114 114 115 private var _queueInterval:int; // interupting interval to execute queued jobs … … 124 125 private var _faderVolume:Number; // fader volume 125 126 126 private var _tr iggerEventQueue:Vector.<SiONTrackEvent>;127 private var _trackEventQueue:Vector.<SiONTrackEvent>; 127 128 128 129 private var _renderBuffer:Vector.<Number>; // rendering buffer … … 231 232 public function get isPlaying() : Boolean { return (_soundChannel != null); } 232 233 234 /** Is paused ? */ 235 public function get isPaused() : Boolean { return _isPaused; } 236 233 237 234 238 // operation … … 297 301 module = new SiOPMModule(); 298 302 effector = new SiEffectModule(module); 299 sequencer = new SiMMLSequencer(module, _callbackEventTriggerOn, _callbackEventTriggerOff );303 sequencer = new SiMMLSequencer(module, _callbackEventTriggerOn, _callbackEventTriggerOff, _callbackTempoChanged); 300 304 _sound = new Sound(); 301 305 _soundTransform = new SoundTransform(); … … 317 321 _noteOnExceptionMode = NEM_IGNORE; 318 322 _debugMode = false; 323 _isFinishSeqDispatched = false; 319 324 320 325 _backgroundSound = null; … … 329 334 330 335 _eventListenerPrior = 1; 331 _tr iggerEventQueue = new Vector.<SiONTrackEvent>();336 _trackEventQueue = new Vector.<SiONTrackEvent>(); 332 337 333 338 _queueInterval = 500; … … 532 537 } 533 538 _isPaused = false; 539 _isFinishSeqDispatched = (data == null); 534 540 } 535 541 } catch(e:Error) { … … 651 657 * @param sound Sound instance to set. 652 658 * @param samplingOctave Sampling frequency. The value of 5 means that "o5a" is original frequency. 653 */ 654 public function setPCMSound(index:int, sound:Sound, samplingOctave:int=5) : void 655 { 656 var data:Vector.<int> = SiONUtil.logTrans(sound); 659 * @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 660 */ 661 public function setPCMSound(index:int, sound:Sound, samplingOctave:int=5, sampleMax:int=1048576) : void 662 { 663 var data:Vector.<int> = SiONUtil.logTrans(sound, null, sampleMax); 657 664 SiOPMTable.registerPCMData(index, data, samplingOctave); 658 665 } … … 686 693 687 694 688 /** Set envelop table data refered by @@,na,np,nt,nf,_@@,_na,_np,_nt and _nf.695 /** Set envelop table data refered by @@,na,np,nt,nf,_@@,_na,_np,_nt and _nf. 689 696 * @param index envelop table number. 690 697 * @param table envelop table vector. … … 724 731 // Interface for intaractivity 725 732 //---------------------------------------- 726 /** Play sound registered in sampler table (registered by setSamplerData()). */ 727 public function playSound() : SiMMLTrack 728 { 729 return null; 730 } 731 732 733 /** Note on. This function only is available after play(). The NOTE_ON_STREAM event is dispatched inside. 733 /** Play sound registered in sampler table (registered by setSamplerData()), same as noteOn(note, new SiONVoice(10), ...). 734 734 * @param note note number [0-127]. 735 * @param voice SiONVoice to play note. You can spqcify null, but it sets only a default square wave...736 735 * @param length note length in 16th beat. 0 sets no note off, this means you should call noteOff(). 737 736 * @param delay note on delay units in 16th beat. … … 743 742 * @return SiMMLTrack to play the note. 744 743 */ 745 public function noteOn(note:int, voice:SiONVoice, 746 length:Number=0, delay:Number=0, quant:Number=0, trackID:int=0, 747 eventTriggerID:int=0, noteOnTrigger:int=0, noteOffTrigger:int=0) : SiMMLTrack 744 public function playSound(note:int, length:Number=0, delay:Number=0, quant:Number=0, trackID:int=0, 745 eventTriggerID:int=0, noteOnTrigger:int=0, noteOffTrigger:int=0) : SiMMLTrack 748 746 { 749 747 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_NOTE_ID_OFFSET; … … 767 765 mmlTrack = mmlTrack || sequencer.getFreeControlableTrack(trackID) || sequencer.newControlableTrack(trackID); 768 766 if (mmlTrack) { 767 mmlTrack.setChannelModuleType(10, 0); 768 mmlTrack.setEventTrigger(eventTriggerID, noteOnTrigger, noteOffTrigger); 769 mmlTrack.keyOn(note, sequencer.calcSampleLength(length), delaySamples); 770 } 771 return mmlTrack; 772 } 773 774 775 /** Note on. This function only is available after play(). The NOTE_ON_STREAM event is dispatched inside. 776 * @param note note number [0-127]. 777 * @param voice SiONVoice to play note. You can spqcify null, but it sets only a default square wave... 778 * @param length note length in 16th beat. 0 sets no note off, this means you should call noteOff(). 779 * @param delay note on delay units in 16th beat. 780 * @param quant quantize in 16th beat. 0 sets no quantization. 4 sets quantization by 4th beat. 781 * @param trackID new tracks id. 782 * @param eventTriggerID Event trigger id. 783 * @param noteOnTrigger note on trigger type. 784 * @param noteOffTrigger note off trigger type. 785 * @return SiMMLTrack to play the note. 786 */ 787 public function noteOn(note:int, voice:SiONVoice, 788 length:Number=0, delay:Number=0, quant:Number=0, trackID:int=0, 789 eventTriggerID:int=0, noteOnTrigger:int=0, noteOffTrigger:int=0) : SiMMLTrack 790 { 791 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_NOTE_ID_OFFSET; 792 var mmlTrack:SiMMLTrack = null, 793 delaySamples:Number = sequencer.calcSampleDelay(0, delay, quant); 794 795 // check track id exception 796 if (_noteOnExceptionMode != NEM_IGNORE) { 797 // find a track sounds at same timing 798 mmlTrack = sequencer.findActiveTrack(trackID, delaySamples); 799 if (_noteOnExceptionMode == NEM_REJECT && mmlTrack != null) return null; // reject 800 else if (_noteOnExceptionMode == NEM_SHIFT) { // shift timing 801 var step:int = sequencer.calcSampleLength(quant); 802 while (mmlTrack) { 803 delaySamples += step; 804 mmlTrack = sequencer.findActiveTrack(trackID, delaySamples); 805 } 806 } 807 } 808 809 mmlTrack = mmlTrack || sequencer.getFreeControlableTrack(trackID) || sequencer.newControlableTrack(trackID); 810 if (mmlTrack) { 769 811 if (voice) voice.setTrackVoice(mmlTrack); 770 812 mmlTrack.setEventTrigger(eventTriggerID, noteOnTrigger, noteOffTrigger); … … 864 906 if (type & 1) { // frame event. dispatch later 865 907 event = new SiONTrackEvent(frameEvent, this, track); 866 _tr iggerEventQueue.push(event);908 _trackEventQueue.push(event); 867 909 } 868 910 if (type & 2) { // sound event. dispatch immediately … … 872 914 } 873 915 return true; 916 } 917 918 // call back when tempo changed 919 private function _callbackTempoChanged(bufferIndex:int) : void 920 { 921 var event:SiONTrackEvent = new SiONTrackEvent(SiONTrackEvent.CHANGE_BPM, this, null, bufferIndex); 922 _trackEventQueue.push(event); 874 923 } 875 924 … … 1122 1171 1123 1172 // frame trigger 1124 if (_tr iggerEventQueue.length > 0) {1125 _tr iggerEventQueue = _triggerEventQueue.filter(function(e:SiONTrackEvent, i:int, v:Vector.<SiONTrackEvent>) : Boolean {1173 if (_trackEventQueue.length > 0) { 1174 _trackEventQueue = _trackEventQueue.filter(function(e:SiONTrackEvent, i:int, v:Vector.<SiONTrackEvent>) : Boolean { 1126 1175 if (e._decrementTimer(_frameRate)) { 1127 1176 dispatchEvent(e); … … 1188 1237 } 1189 1238 1239 // dispatch finishSequence event 1240 if (!_isFinishSeqDispatched) { 1241 if (sequencer.isSequenceFinished) { 1242 dispatchEvent(new SiONEvent(SiONEvent.FINISH_SEQUENCE, this)); 1243 _isFinishSeqDispatched = true; 1244 } 1245 } 1246 1190 1247 // fading 1191 1248 if (_fader.execute()) { as3/SiOPM/trunk/src/org/si/sion/SiONVoice.as
r2697 r2806 27 27 // constrctor 28 28 //-------------------------------------------------- 29 /** c onstructor.29 /** create new SiONVoice instance with '%' parameters, attack rate, release rate and detune. 30 30 * @param moduleType Module type. 1st argument of '%'. 31 31 * @param channelNum Channel number. 2nd argument of '%'. … … 51 51 // parameter setting 52 52 //-------------------------------------------------- 53 /** Set by # @parameters Array */53 /** Set by #@ parameters Array */ 54 54 public function set param(args:Array) : void { channelParam = Translator.setParam(new SiOPMChannelParam(), args); } 55 55 56 /** Set by #OPL @parameters Array */56 /** Set by #OPL@ parameters Array */ 57 57 public function set paramOPL(args:Array) : void { channelParam = Translator.setOPLParam(new SiOPMChannelParam(), args); } 58 58 59 /** Set by #OPM @parameters Array */59 /** Set by #OPM@ parameters Array */ 60 60 public function set paramOPM(args:Array) : void { channelParam = Translator.setOPMParam(new SiOPMChannelParam(), args); } 61 61 62 /** Set by #OPN @parameters Array */62 /** Set by #OPN@ parameters Array */ 63 63 public function set paramOPN(args:Array) : void { channelParam = Translator.setOPNParam(new SiOPMChannelParam(), args); } 64 64 65 /** Set by #OPX @parameters Array */65 /** Set by #OPX@ parameters Array */ 66 66 public function set paramOPX(args:Array) : void { channelParam = Translator.setOPXParam(new SiOPMChannelParam(), args); } 67 67 68 /** Set by #MA @parameters Array */68 /** Set by #MA@ parameters Array */ 69 69 public function set paramMA3(args:Array) : void { channelParam = Translator.setMA3Param(new SiOPMChannelParam(), args); } 70 70 } as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectAutoPan.as
r2625 r2806 28 28 29 29 30 /** constructor30 /** set parameter 31 31 * @param frequency rotation frequency(Hz). 32 32 * @param width stereo width(0-1). 0 means stereo auto pan. as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectEqualiser.as
r2625 r2806 89 89 startIndex <<= 1; 90 90 length <<= 1; 91 var i:int, n:Number, l:Number, m:Number, h:Number ;92 for (i=startIndex; i< length;) {91 var i:int, n:Number, l:Number, m:Number, h:Number, imax:int=startIndex+length; 92 for (i=startIndex; i<imax;) { 93 93 n = buffer[i]; 94 94 f1p0L += (lf * (n - f1p0L)) + 2.3283064370807974e-10; as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectModule.as
r2697 r2806 45 45 register("chorus", SiEffectStereoChorus); 46 46 register("autopan", SiEffectAutoPan); 47 register("ds", SiEffectDownSampler); 48 register("speaker", SiEffectSpeakerSimulator); 47 49 //register("comp", SiEffectCompressor); // bugful!! 48 50 … … 63 65 // operations 64 66 //-------------------------------------------------------------------------------- 65 /** @p arivate [internal use] initialize all effectors. */67 /** @private [internal use] initialize all effectors. */ 66 68 public function initialize() : void 67 69 { … … 72 74 73 75 74 /** @p arivate [internal use] prepare for processing. */76 /** @private [internal use] prepare for processing. */ 75 77 public function prepareProcess() : void 76 78 { … … 91 93 92 94 93 /** @p arivate [internal use] processing. */95 /** @private [internal use] processing. */ 94 96 public function process() : void 95 97 { as3/SiOPM/trunk/src/org/si/sion/effector/SiEffectWaveShaper.as
r2625 r2806 64 64 startIndex <<= 1; 65 65 length <<= 1; 66 var i:int, n:Number, c1:Number=1 + _coefficient ;67 for (i=startIndex; i< length; i++) {66 var i:int, n:Number, c1:Number=1 + _coefficient, imax:int=startIndex+length; 67 for (i=startIndex; i<imax; i++) { 68 68 n = buffer[i]; 69 69 buffer[i] = c1 * n / (1 + _coefficient * ((n<0) ? -n : n)); as3/SiOPM/trunk/src/org/si/sion/effector/SiFilterBase.as
r2625 r2806 51 51 startIndex <<= 1; 52 52 length <<= 1; 53 var i:int, input:Number, output:Number ;54 for (i=startIndex; i< length;) {53 var i:int, input:Number, output:Number, imax:int=startIndex+length; 54 for (i=startIndex; i<imax;) { 55 55 input = buffer[i]; 56 56 output = _b0*input + _b1*_in1L + _b2*_in2L - _a1*_out1L - _a2*_out2L; as3/SiOPM/trunk/src/org/si/sion/events/SiONEvent.as
r2697 r2806 110 110 * <tr><th>Property</th><th>Value</th></tr> 111 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>112 * <tr><td>driver</td><td>SiONDriver instance playing now.</td></tr> 113 * <tr><td>data</td><td>SiONData instance playing now.</td></tr> 114 114 * <tr><td>streamBuffer</td><td>null</td></tr> 115 115 * </table> as3/SiOPM/trunk/src/org/si/sion/events/SiONTrackEvent.as
r2625 r2806 89 89 */ 90 90 public static const NOTE_OFF_FRAME:String = 'noteOffFrame'; 91 91 92 93 /** Dispatch when the bpm changes. 94 * <p>The properties of the event object have the following values:</p> 95 * <table class=innertable> 96 * <tr><th>Property</th><th>Value</th></tr> 97 * <tr><td>cancelable</td><td>false</td></tr> 98 * <tr><td>driver</td><td>SiONDriver instance.</td></tr> 99 * <tr><td>data</td><td>SiONData instance. This property is null if you call SiONDriver.play() with null of the 1st argument.</td></tr> 100 * <tr><td>streamBuffer</td><td>null</td></tr> 101 * <tr><td>track</td><td>null</td></tr> 102 * <tr><td>eventTriggerID</td><td>null</td></tr> 103 * <tr><td>note</td><td>null</td></tr> 104 * <tr><td>bufferIndex</td><td>Buffering index</td></tr> 105 * </table> 106 * @eventType changeBPM 107 */ 108 public static const CHANGE_BPM:String = 'changeBPM'; 92 109 93 110 … … 122 139 // properties 123 140 //---------------------------------------- 124 /** Sequencer track . */141 /** Sequencer track instance. */ 125 142 public function get track() : SiMMLTrack { return _track; } 126 143 … … 134 151 public function get bufferIndex() : int { return _bufferIndex; } 135 152 136 /** Frame trigger delay [ms]*/153 /** Delay time to dispatch frame trigger event [ms]. */ 137 154 public function get frameTriggerDelay() : Number { return _frameTriggerDelay; } 138 155 … … 143 160 //---------------------------------------- 144 161 /** This event can be created only in the callback function inside. @private */ 145 public function SiONTrackEvent(type:String, driver:SiONDriver, track:SiMMLTrack )162 public function SiONTrackEvent(type:String, driver:SiONDriver, track:SiMMLTrack, bufferIndex:int=0) 146 163 { 147 164 super(type, driver, null, true); 148 165 _track = track; 149 _note = track.note; 150 _eventTriggerID = track.eventTriggerID; 151 _bufferIndex = track.channel.bufferIndex; 152 _frameTriggerDelay = track.channel.bufferIndex / driver.sequencer.sampleRate + driver.latency; 153 _frameTriggerTimer = _frameTriggerDelay; 166 if (track) { 167 _note = track.note; 168 _eventTriggerID = track.eventTriggerID; 169 _bufferIndex = track.channel.bufferIndex; 170 _frameTriggerDelay = track.channel.bufferIndex / driver.sequencer.sampleRate + driver.latency; 171 _frameTriggerTimer = _frameTriggerDelay; 172 } else { 173 _note = 0; 174 _eventTriggerID = 0; 175 _bufferIndex = bufferIndex; 176 _frameTriggerDelay = bufferIndex / driver.sequencer.sampleRate + driver.latency; 177 _frameTriggerTimer = _frameTriggerDelay; 178 } 154 179 } 155 180 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMModule.as
r2697 r2806 51 51 52 52 /** stream buffer count */ 53 public function set streamCount(count:int) : void 54 { 53 public function set streamCount(count:int) : void { 55 54 var i:int; 56 55 … … 67 66 } 68 67 } 68 } 69 public function get streamCount() : int { 70 return streamBuffer.length; 69 71 } 70 72 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperator.as
r2697 r2806 535 535 536 536 537 /** Set PCM Data. */537 /** Set Wave table data. */ 538 538 public function setWaveTable(waveTable:SiOPMWaveTable) : void 539 539 { 540 540 _pgType = SiOPMTable.PG_USER_CUSTOM; // -1 541 _ptType = waveTable.defaultPTType;542 541 _waveTable = waveTable.wavelet; 543 542 _waveFixedBits = waveTable.fixedBits; 544 } 545 546 547 /** Set PCM Data. */ 543 ptType = waveTable.defaultPTType; 544 } 545 546 547 /** Set PCM data. */ 548 548 public function setPCMData(pcmData:SiOPMPCMData) : void 549 549 { 550 550 _pgType = SiOPMTable.PG_USER_PCM; // -2 551 _ptType = SiOPMTable.PT_PCM;552 551 _waveTable = pcmData.wavelet; 553 552 _waveFixedBits = pcmData.pseudoFixedBits; 553 ptType = SiOPMTable.PT_PCM; 554 554 } 555 555 … … 743 743 var n:int = (_pitchIndex + _pitchIndexShift + _pitchIndexShift2) & _pitchTableFilter; 744 744 _updatePhaseStep(_pitchTable[n] >> _wavePhaseStepShift); 745 trace(_pitchTable[n], _wavePhaseStepShift); 745 746 } 746 747 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMTable.as
r2697 r2806 192 192 /** PG:Wave tables without any waves. */ 193 193 public var noWaveTable:SiOPMWaveTable; 194 public var noWaveTableOPM:SiOPMWaveTable; 194 195 /** PG:Wave tables */ 195 196 public var waveTables:Vector.<SiOPMWaveTable> = null; … … 557 558 // allocate table list 558 559 noWaveTable = SiOPMWaveTable.alloc(Vector.<int>([calcLogTableIndex(1)]), PT_PCM); 560 noWaveTableOPM = SiOPMWaveTable.alloc(Vector.<int>([calcLogTableIndex(1)]), PT_OPM); 559 561 waveTables = new Vector.<SiOPMWaveTable>(DEFAULT_PG_MAX); 560 562 customWaveTables = new Vector.<SiOPMWaveTable>(WAVE_TABLE_MAX); … … 703 705 waveTables[PG_NOISE] = waveTables[PG_NOISE_WHITE]; 704 706 705 // pulse noise. NOTE: This is dishonest impelementation. Details are shown in MAME or VirtuaNes source.707 // pulse noise. NOTE: Dishonest impelementation. Details are shown in MAME or VirtuaNes source. 706 708 table1 = new Vector.<int>(NOISE_TABLE_SIZE, true); 707 709 imax = NOISE_TABLE_SIZE; … … 712 714 waveTables[PG_NOISE_PULSE] = SiOPMWaveTable.alloc(table1, PT_PCM); 713 715 714 // fc short noise. NOTE: This is dishonest93*11=1023 aprox.-> 1024.716 // fc short noise. NOTE: Dishonest impelementation. 93*11=1023 aprox.-> 1024. 715 717 table1 = new Vector.<int>(SAMPLING_TABLE_SIZE, true); 716 718 imax = SAMPLING_TABLE_SIZE; … … 735 737 table1[i] = calcLogTableIndex(v*n); 736 738 } 737 waveTables[PG_NOISE_ SHORT] = SiOPMWaveTable.alloc(table1, PT_PCM);739 waveTables[PG_NOISE_HIPAS] = SiOPMWaveTable.alloc(table1, PT_PCM); 738 740 739 741 // periodic noise … … 1087 1089 index -= PG_CUSTOM; 1088 1090 if (stencilCustomWaveTables && stencilCustomWaveTables[index]) return stencilCustomWaveTables[index]; 1089 return customWaveTables[index] || noWaveTable ;1091 return customWaveTables[index] || noWaveTableOPM; 1090 1092 } 1091 1093 return noWaveTable; as3/SiOPM/trunk/src/org/si/sion/module/SiOPMWaveTable.as
r2697 r2806 18 18 this.wavelet = null; 19 19 this.fixedBits = 0; 20 this.defaultPTType = defaultPTType;20 this.defaultPTType = 0; 21 21 } 22 22 as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as
r2697 r2806 8 8 import org.si.sion.sequencer.base.MMLSequence; 9 9 import org.si.sion.module.SiOPMModule; 10 import org.si.sion.module.SiOPMPCMData; 10 11 import org.si.sion.module.SiOPMTable; 11 12 import org.si.sion.module.SiOPMChannelBase; … … 22 23 static public const SELECT_TONE_NORMAL:int = 1; 23 24 static public const SELECT_TONE_FM :int = 2; 24 25 static public const SELECT_TONE_PCM :int = 3; 26 25 27 26 28 … … 93 95 if (voiceIndex == -1) return null; 94 96 95 var voice:SiMMLVoice, param:SiOPMChannelParam=null ;97 var voice:SiMMLVoice, param:SiOPMChannelParam=null, pcm:SiOPMPCMData; 96 98 97 99 switch (_selectToneType) { … … 122 124 } 123 125 return (param==null || param.initSequence.isEmpty()) ? null : param.initSequence; 126 case SELECT_TONE_PCM: 127 if (voiceIndex>=0 && voiceIndex<SiOPMTable.PCM_DATA_MAX) { 128 pcm = SiOPMTable.instance.getPCMData(voiceIndex); 129 if (pcm) track.channel.setPCMData(pcm); 130 } 131 break; 124 132 default: 125 133 break; as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLData.as
r2697 r2806 59 59 60 60 61 /** Set envelop table data refered by @@,na,np,nt,nf,_@@,_na,_np,_nt and _nf.61 /** Set envelop table data refered by @@,na,np,nt,nf,_@@,_na,_np,_nt and _nf. 62 62 * @param index envelop table number. 63 63 * @param envelop envelop table. as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as
r2697 r2806 43 43 /** @private [internal use] callback event trigger */ 44 44 public var _eventTriggerOff:Function = null; 45 /** @private [internal use] callback tempo changed */ 46 public var _callbackTempoChanged:Function = null; 45 47 46 48 private var _module:SiOPMModule; // Module instance … … 76 78 /** Is finish buffering ? */ 77 79 public function get isFinished() : Boolean { 80 if (!_isSequenceFinished) return false; 78 81 for each (var trk:SiMMLTrack in tracks) { if (!trk.isFinished) return false; } 79 82 return true; … … 92 95 //-------------------------------------------------- 93 96 /** Create new sequencer. */ 94 function SiMMLSequencer(module:SiOPMModule, eventTriggerOn:Function, eventTriggerOff:Function )97 function SiMMLSequencer(module:SiOPMModule, eventTriggerOn:Function, eventTriggerOff:Function, tempoChanged:Function) 95 98 { 96 99 super(); … … 107 110 _eventTriggerOn = eventTriggerOn; 108 111 _eventTriggerOff = eventTriggerOff; 112 _callbackTempoChanged = tempoChanged; 109 113 _currentTrack = null; 110 114 … … 603 607 trk.executor._onTempoChanged(changingRatio); 604 608 } 609 if (_callbackTempoChanged != null) _callbackTempoChanged(globalBufferIndex); 605 610 } 606 611 as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTable.as
r2697 r2806 156 156 // FM setting 157 157 channelModuleSetting[MT_FM]._selectToneType = SiMMLChannelSetting.SELECT_TONE_FM; 158 // PCM setting 159 channelModuleSetting[MT_PCM]._selectToneType = SiMMLChannelSetting.SELECT_TONE_PCM; 158 160 // Sampler 159 161 channelModuleSetting[MT_SAMPLE]._selectToneType = SiMMLChannelSetting.SELECT_TONE_NOP; as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as
r2697 r2806 201 201 _expression = (x<0) ? 0 : (x>128) ? 128 : x; 202 202 channel.offsetVolume(_expression, _velocity); 203 } 204 205 /** output level = @v * v * x. */ 206 public function get outputLevel() : Number { 207 return channel.masterVolume * _velocity * _expression * 4.76837158203125e-7; // 1/(128^3) 208 } 209 210 /** pannning */ 211 public function get pan() : int { 212 return channel.pan; 213 } 214 215 /** program number. this value has no meaning. */ 216 public function get programNumber() : int { 217 return _tone; 203 218 } 204 219 as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as
r2697 r2806 44 44 protected var mmlData:MMLData; 45 45 46 /** buffer index for global sequence */ 47 protected var globalBufferIndex:int; 46 48 /** beat counter in 16th */ 47 49 protected var globalBeat16:Number; … … 221 223 mmlData.regiter(); 222 224 } 225 globalBufferIndex = 0; 223 226 globalBeat16 = 0; 224 227 } … … 240 243 _globalBufferSampleCount = _bufferLength; 241 244 _globalExecuteSampleCount = 0; 245 globalBufferIndex = 0; 242 246 } 243 247 protected function executeGlobalSequence() : int … … 261 265 protected function isEndGlobalSequence() : Boolean 262 266 { 267 globalBufferIndex += _globalExecuteSampleCount; 263 268 globalBeat16 += _globalExecuteSampleCount * beat16ParSample; 264 269 return (_globalBufferSampleCount == 0);

