チェンジセット 3059
- コミット日時:
- 2009/09/02 22:11:32 (3 年前)
- ファイル:
-
- as3/SiOPM/trunk/archive/sion056.swc (追加)
- as3/SiOPM/trunk/archive/sion056.zip (削除)
- as3/SiOPM/trunk/archive/sion056_asdoc.zip (追加)
- as3/SiOPM/trunk/archive/sion057.swc (追加)
- as3/SiOPM/trunk/archive/sion057_asdoc.zip (追加)
- as3/SiOPM/trunk/samples/SiONKeyboard (追加)
- as3/SiOPM/trunk/samples/SiONKeyboard/keyboard.mxml (追加)
- as3/SiOPM/trunk/samples/SiONKeyboard/keyboard.swf (追加)
- as3/SiOPM/trunk/samples/SiONTenorion/Tenorion.as (更新) (7 diffs)
- as3/SiOPM/trunk/samples/SiOPMKeyboard (削除)
- as3/SiOPM/trunk/samples/Tutorials/TheABCSong2.as (追加)
- as3/SiOPM/trunk/src/org/si/midi/SiMIDIModule.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as (更新) (19 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/SiOPMChannelKS.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperator.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLData.as (更新) (8 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as (更新) (13 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as (更新) (8 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrackGroup.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/BeatPerMinutes.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as (更新) (6 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as (更新) (14 diffs)
- as3/SiOPM/trunk/src/org/si/sound/Arpeggiator.as (更新) (4 diffs)
- as3/SiOPM/trunk/src/org/si/sound/base/SingleTrackObject.as (更新) (1 diff)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/SiOPM/trunk/samples/SiONTenorion/Tenorion.as
r3015 r3059 6 6 import org.si.sion.*; 7 7 import org.si.sion.events.*; 8 import org.si.sion.sequencer.SiMMLTrack;9 8 import org.si.sion.utils.SiONPresetVoice; 10 9 … … 18 17 19 18 // voices, notes and tracks 20 public var tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(16);21 public var voices:Vector.<int>;22 public var notes:Vector.<int>;19 public var voices:Vector.<SiONVoice> = new Vector.<SiONVoice>(16); 20 public var notes :Vector.<int> = Vector.<int>([36,48,60,72, 43,48,55,60, 65,67,70,72, 77,79,82,84]); 21 public var length:Vector.<int> = Vector.<int>([ 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4]); 23 22 24 23 // beat counter … … 30 29 // constructor 31 30 function Tenorion() { 32 // set voices of "%6@0-4" from preset 31 var i:int; 32 33 // set voices from preset 33 34 var percusVoices:Array = presetVoice["valsound.percus"]; 34 driver.setVoice(0, percusVoices[0]); // bass drum35 driver.setVoice(1, percusVoices[27]); // snare drum36 driver.setVoice(2, percusVoices[16]); // close hihat37 driver.setVoice(3, percusVoices[21]); // open hihat38 driver.setVoice(4, presetVoice["valsound.bass18"]); // bass35 voices[0] = percusVoices[0]; // bass drum 36 voices[1] = percusVoices[27]; // snare drum 37 voices[2] = percusVoices[16]; // close hihat 38 voices[3] = percusVoices[22]; // open hihat 39 for (i=4; i<8; i++) voices[i] = presetVoice["valsound.bass18"]; // others 39 40 40 // notes and voices 41 notes = Vector.<int>([36,48,60,72, 43,48,55,60, 65,67,70,72, 77,79,82,84]); 42 voices = Vector.<int>([ 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]); 43 44 // listen click 45 driver.setTimerInterruption(1, _onTimerInterruption); 41 // listen 46 42 driver.setBeatCallbackInterval(1); 47 43 driver.addEventListener(SiONTrackEvent.BEAT, _onBeat); 48 driver. addEventListener(SiONEvent.STREAM_START, _onStreamStart);44 driver.setTimerInterruption(1, _onTimerInterruption); 49 45 50 46 // control pad … … 53 49 54 50 // start streaming 51 beatCounter = 0; 55 52 driver.play(); 56 }57 58 59 // _onStreamStart (SiONEvent.STREAM_START) is called back first of all after SiONDriver.play().60 private function _onStreamStart(e:SiONEvent) : void61 {62 // create new controlable tracks and set voice63 for (var i:int=0; i<16; i++) {64 tracks[i] = driver.sequencer.newControlableTrack();65 tracks[i].setChannelModuleType(6, 0, voices[i]);66 }67 beatCounter = 0;68 53 } 69 54 … … 81 66 var beatIndex:int = beatCounter & 15; 82 67 for (var i:int=0; i<16; i++) { 83 if (matrixPad.sequences[i] & (1<<beatIndex)) tracks[i].keyOn(notes[i]);68 if (matrixPad.sequences[i] & (1<<beatIndex)) driver.noteOn(notes[i], voices[i], length[i]); 84 69 } 85 70 beatCounter++; … … 106 91 function MatrixPad(stage:Stage) { 107 92 super(new BitmapData(320, 320, false, 0)); 108 for (var i:int=0; i<256; i++) { 93 var i:int; 94 for (i=0; i<256; i++) { 109 95 pt.x = (i&15)*20; 110 96 pt.y = (i&240)*1.25; 111 97 buffer.copyPixels(padOff, padOff.rect, pt); 112 98 bitmapData.copyPixels(padOff, padOff.rect, pt); 113 sequences[i] = 0;114 99 } 115 100 for (i=0; i<16; i++) sequences[i] = 0; 116 101 addEventListener("enterFrame", _onEnterFrame); 117 102 stage.addEventListener("click", _onClick); … … 138 123 private function _onClick(e:Event) : void { 139 124 if (mouseX>=0 && mouseX<320 && mouseY>=0 && mouseY<320) { 140 var track:int = 15-int(mouseY*0.05), 141 beat :int = int(mouseX*0.05); 125 var track:int = 15-int(mouseY*0.05), beat:int = int(mouseX*0.05); 142 126 sequences[track] ^= 1<<beat; 143 127 pt.x = beat*20; as3/SiOPM/trunk/src/org/si/midi/SiMIDIModule.as
r2990 r3059 89 89 public function noteOff(trackNumber:int, note:int) : SiMMLTrack 90 90 { 91 var trackID:int = (trackNumber & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.MIDI_TRACK_ID_OFFSET, 92 midiTrack:SiMIDITrack = tracks[trackNumber], 93 seqTrack:SiMMLTrack = _sequencer.findControlableTrack(trackID, note); 94 if (seqTrack) seqTrack.keyOff(); 95 return seqTrack; 91 var trackID:int = (trackNumber & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.MIDI_TRACK_ID_OFFSET; 92 for each (var mmlTrack:SiMMLTrack in _sequencer.tracks) { 93 if (mmlTrack.trackID == trackID) { 94 if (note == -1 || (note == mmlTrack.note && mmlTrack.channel.isNoteOn())) { 95 mmlTrack.keyOff(0); 96 return mmlTrack; 97 } 98 } 99 } 100 return null; 96 101 } 97 102 as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as
r3028 r3059 54 54 //---------------------------------------- 55 55 /** version number */ 56 static public const VERSION:String = "0.5. 6";56 static public const VERSION:String = "0.5.7"; 57 57 58 58 … … 93 93 94 94 // private: 95 private var _data:SiONData; // data to compile or process 96 private var _tempData:SiONData; // temporary data 97 private var _mmlString:String; // mml string of previous compiling 98 private var _sound:Sound; // sound stream instance 95 //----- general 96 private var _data:SiONData; // data to compile or process 97 private var _tempData:SiONData; // temporary data 98 private var _mmlString:String; // mml string of previous compiling 99 //----- sound related 100 private var _sound:Sound; // sound stream instance 99 101 private var _soundChannel:SoundChannel; // sound channel instance 100 102 private var _soundTransform:SoundTransform; // sound transform 101 103 private var _fader:Fader; // sound fader 102 103 private var _backgroundSound:Sound; // background Sound 104 private var _backgroundLevel:Number; // background Sound mixing level 105 private var _backgroundBuffer:ByteArray; // buffer for background Sound 106 104 //----- SiOPM module related 107 105 private var _channelCount:int; // module output channels (1 or 2) 108 106 private var _sampleRate:int; // module output frequency ratio (44100 or 22050) … … 112 110 private var _dispatchStreamEvent:Boolean; // dispatch steam event 113 111 private var _dispatchFadingEvent:Boolean; // dispatch fading event 114 private var _cannotChangeBPM:Boolean; // internal flag not to change bpm115 112 private var _inStreaming:Boolean; // in streaming 116 113 private var _preserveStop:Boolean; // preserve stop after streaming 117 114 private var _isFinishSeqDispatched:Boolean; // FINISH_SEQUENCE event already dispacthed 118 115 //----- operation related 116 private var _autoStop:Boolean; // auto stop when the sequence finished 117 private var _noteOnExceptionMode:int; // track id exception mode 118 private var _isPaused:Boolean; // flag to pause 119 private var _position:Number; // start position [ms] 120 private var _masterVolume:Number; // master volume 121 private var _faderVolume:Number; // fader volume 122 //----- background sound 123 private var _backgroundSound:Sound; // background Sound 124 private var _backgroundLevel:Number; // background Sound mixing level 125 private var _backgroundBuffer:ByteArray; // buffer for background Sound 126 //----- queue 119 127 private var _queueInterval:int; // interupting interval to execute queued jobs 120 128 private var _queueLength:int; // queue length to execute 121 129 private var _jobProgress:Number; // progression of current job 122 130 private var _currentJob:int; // current job 0=no job, 1=compile, 2=render 123 124 private var _autoStop:Boolean; // auto stop when the sequence finished 125 private var _noteOnExceptionMode:int; // track id exception mode 126 private var _isPaused:Boolean; // flag to pause 127 private var _position:Number; // start position [ms] 128 private var _masterVolume:Number; // master volume 129 private var _faderVolume:Number; // fader volume 130 131 private var _trackEventQueue:Vector.<SiONTrackEvent>; 132 private var _timerSequence:MMLSequence; 133 private var _timerIntervalEvent:MMLEvent; 134 private var _timerCallback:Function; 135 131 private var _jobQueue:Vector.<SiONDriverJob> = null; // compiling/rendering jobs queue 132 private var _trackEventQueue:Vector.<SiONTrackEvent>; // SiONTrackEvents queue 133 //----- timer interruption 134 private var _timerSequence:MMLSequence; // global sequence 135 private var _timerIntervalEvent:MMLEvent; // MMLEvent.WAIT event 136 private var _timerCallback:Function; // callback function 137 //----- rendering 136 138 private var _renderBuffer:Vector.<Number>; // rendering buffer 137 139 private var _renderBufferChannelCount:int; // rendering buffer channel count 138 140 private var _renderBufferIndex:int; // rendering buffer writing index 139 141 private var _renderBufferSizeMax:int; // maximum value of rendering buffer size 140 142 //----- timers 141 143 private var _timeCompile:int; // previous compiling time. 142 144 private var _timeRender:int; // previous rendering time. … … 149 151 private var _prevFrameTime:int; // previous frame time 150 152 private var _frameRate:int; // frame rate 151 153 //----- listeners management 152 154 private var _eventListenerPrior:int; // event listeners priority 153 155 private var _listenEvent:int; // current lintening event 154 156 155 private var _jobQueue:Vector.<SiONDriverJob> = null; // compiling/rendering jobs queue 156 157 // mutex instance 157 158 static private var _mutex:SiONDriver = null; // unique instance 158 159 … … 262 263 public function set bpm(t:Number) : void { 263 264 if (sequencer.isReadyToProcess) { 264 if ( _cannotChangeBPM) throw errorCannotChangeBPM();265 if (sequencer.isEnableChangeBPM) throw errorCannotChangeBPM(); 265 266 sequencer.bpm = t; 266 267 } else { … … 322 323 _dispatchStreamEvent = false; 323 324 _dispatchFadingEvent = false; 324 _cannotChangeBPM = false;325 325 _preserveStop = false; 326 326 _inStreaming = false; … … 495 495 public function startQueue(interval:int=500) : int 496 496 { 497 stop(); 498 _queueLength = _jobQueue.length; 499 if (_jobQueue.length > 0) { 500 _queueInterval = interval; 501 _executeNextJob(); 502 _queue_addAllEventListners(); 497 try { 498 stop(); 499 _queueLength = _jobQueue.length; 500 if (_jobQueue.length > 0) { 501 _queueInterval = interval; 502 _executeNextJob(); 503 _queue_addAllEventListners(); 504 } 505 } catch (e:Error) { 506 // error 507 _removeAllEventListners(); 508 _cancelAllJobs(); 509 if (_debugMode) throw e; 510 else dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, e.message)); 503 511 } 504 512 return _queueLength; … … 677 685 678 686 679 /** Set PCM data rederd from%7.687 /** Set PCM data rederd by %7. 680 688 * @param index PCM data number. 681 689 * @param data Vector.<Number> wave data. This type ussualy comes from render(). … … 691 699 692 700 693 /** Set PCM sound rederd from%7.701 /** Set PCM sound rederd by %7. 694 702 * @param index PCM data number. 695 703 * @param sound Sound instance to set. … … 819 827 /** Note on. This function only is available after play(). The NOTE_ON_STREAM event is dispatched inside. 820 828 * @param note note number [0-127]. 821 * @param voice SiONVoice to play note. You can sp qcify null, but it sets only a default square wave.829 * @param voice SiONVoice to play note. You can specify null, but it sets only a default square wave. 822 830 * @param length note length in 16th beat. 0 sets no note off, this means you should call noteOff(). 823 831 * @param delay note on delay units in 16th beat. … … 827 835 * @param noteOnTrigger note on trigger type. 828 836 * @param noteOffTrigger note off trigger type. 829 * @return SiMMLTrack to play the note. 837 * @return SiMMLTrack to play the note. Returns null when tracks are overflowed. 830 838 */ 831 839 public function noteOn(note:int, … … 872 880 * @param delay note off delay units in 16th beat. 873 881 * @param quant quantize in 16th beat. 0 sets no quantization. 4 sets quantization by 4th beat. 874 * @return The SiMMLTrack switched key off. Returns null when tracks are overflowed.875 */ 876 public function noteOff(note:int, trackID:int=0, delay:Number=0, quant:Number=0) : SiMMLTrack882 * @return All SiMMLTracks switched key off. 883 */ 884 public function noteOff(note:int, trackID:int=0, delay:Number=0, quant:Number=0) : Vector.<SiMMLTrack> 877 885 { 878 886 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_NOTE_ID_OFFSET; 879 var mmlTrack:SiMMLTrack = sequencer.findControlableTrack(trackID, note), 880 delaySamples:int = sequencer.calcSampleDelay(0, delay, quant); 881 if (mmlTrack) mmlTrack.keyOff(delaySamples); 882 return mmlTrack; 887 var delaySamples:int = sequencer.calcSampleDelay(0, delay, quant), 888 tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(); 889 for each (var mmlTrack:SiMMLTrack in sequencer.tracks) { 890 if (mmlTrack.trackID == trackID) { 891 if (note == -1 || (note == mmlTrack.note && mmlTrack.channel.isNoteOn())) { 892 mmlTrack.keyOff(delaySamples); 893 tracks.push(mmlTrack); 894 } 895 } 896 } 897 return tracks; 883 898 } 884 899 … … 891 906 * @param quant quantize in 16th beat. 0 sets no quantization. 4 sets quantization by 4th beat. 892 907 * @param trackID new tracks id. 893 * @return SiMMLTrack of the last sequence channel.908 * @return list of SiMMLTracks to play sequence. 894 909 */ 895 910 public function sequenceOn(data:SiONData, … … 898 913 delay:Number = 0, 899 914 quant:Number = 1, 900 trackID:int = 0) : SiMMLTrack915 trackID:int = 0) : Vector.<SiMMLTrack> 901 916 { 902 917 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_SEQUENCE_ID_OFFSET; 903 918 // create new sequence tracks 904 var mmlTrack:SiMMLTrack, 919 var mmlTrack:SiMMLTrack, tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(), 905 920 seq:MMLSequence = data.sequenceGroup.headSequence, 906 921 delaySamples:int = sequencer.calcSampleDelay(0, delay, quant), … … 910 925 mmlTrack.sequenceOn(seq, delaySamples, lengthSamples); 911 926 if (voice) voice.setTrackVoice(mmlTrack); 927 tracks.push(mmlTrack); 912 928 seq = seq.nextSequence; 913 929 } 914 return mmlTrack;930 return tracks; 915 931 } 916 932 … … 920 936 * @param delay sequence off delay units in 16th beat. 921 937 * @param quant quantize in 16th beat. 0 sets no quantization. 4 sets quantization by 4th beat. 922 * @return SiMMLTrack of the last stopped channel.923 */ 924 public function sequenceOff(trackID:int, delay:Number=0, quant:Number=1) : SiMMLTrack938 * @return list of SiMMLTracks stopped to play sequence. 939 */ 940 public function sequenceOff(trackID:int, delay:Number=0, quant:Number=1) : Vector.<SiMMLTrack> 925 941 { 926 942 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.DRIVER_SEQUENCE_ID_OFFSET; 927 var delaySamples:int = sequencer.calcSampleDelay(0, delay, quant), stoppedTrack:SiMMLTrack = null; 943 var delaySamples:int = sequencer.calcSampleDelay(0, delay, quant), stoppedTrack:SiMMLTrack = null, 944 tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(); 928 945 for each (var mmlTrack:SiMMLTrack in sequencer.tracks) { 929 946 if (mmlTrack.trackID == trackID) { 930 947 mmlTrack.sequenceOff(delaySamples); 931 stoppedTrack = mmlTrack;948 tracks.push(mmlTrack); 932 949 } 933 950 } 934 return stoppedTrack; 951 return tracks; 952 } 953 954 955 /** Create new user controlable track. 956 * @param new tracks id. 957 */ 958 public function newUserControlableTrack(trackID:int=0) : SiMMLTrack 959 { 960 trackID = (trackID & SiMMLTrack.TRACK_ID_FILTER) | SiMMLTrack.USER_CONTROLLED_ID_OFFSET; 961 return sequencer.getFreeControlableTrack(trackID) || sequencer.newControlableTrack(trackID); 935 962 } 936 963 … … 1126 1153 } catch (e:Error) { 1127 1154 // error 1155 _removeAllEventListners(); 1128 1156 _cancelAllJobs(); 1129 1157 if (_debugMode) throw e; … … 1139 1167 private function _prepareCompile(mml:String, data:SiONData) : void 1140 1168 { 1141 try { 1142 _data = data || new SiONData(); 1143 _mmlString = mml; 1144 sequencer.prepareCompile(_data, _mmlString); 1145 _jobProgress = 0.01; 1146 _timeCompile = 0; 1147 _currentJob = 1; 1148 } catch (e:Error) { 1149 // error 1150 _cancelAllJobs(); 1151 if (_debugMode) throw e; 1152 else dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, e.message)); 1153 } 1169 _data = data || new SiONData(); 1170 _mmlString = mml; 1171 sequencer.prepareCompile(_data, _mmlString); 1172 _jobProgress = 0.01; 1173 _timeCompile = 0; 1174 _currentJob = 1; 1154 1175 } 1155 1176 … … 1292 1313 var t:int = getTimer(); 1293 1314 // processing 1294 _cannotChangeBPM = true;1295 1315 sequencer.process(); 1296 1316 effector.process(); 1297 1317 module.limitLevel(); 1298 _cannotChangeBPM = false;1299 1318 1300 1319 // calculate the average of processing time as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelBase.as
r2989 r3059 474 474 // processing 475 475 //-------------------------------------------------- 476 /** Prepare buffering*/477 public function prepareBuffer() : void476 /** reset channel buffering status */ 477 public function resetChannelBufferStatus() : void 478 478 { 479 479 _bufferIndex = 0; as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelFM.as
r2989 r3059 520 520 521 521 /** Prepare buffering */ 522 override public function prepareBuffer() : void522 override public function resetChannelBufferStatus() : void 523 523 { 524 524 _bufferIndex = 0; as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelKS.as
r3027 r3059 277 277 278 278 /** Prepare buffering */ 279 override public function prepareBuffer() : void279 override public function resetChannelBufferStatus() : void 280 280 { 281 281 _bufferIndex = 0; as3/SiOPM/trunk/src/org/si/sion/module/SiOPMOperator.as
r2989 r3059 693 693 _eg_incTable = _table.eg_incTables[_table.eg_tableSelector[r]]; 694 694 _eg_timer_step = _table.eg_timerSteps[r]; 695 696 695 break; 697 696 } as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLData.as
r2989 r3059 18 18 //---------------------------------------- 19 19 /** envelop tables */ 20 p rotected var _envelops:Vector.<SiMMLEnvelopTable>;20 public var envelops:Vector.<SiMMLEnvelopTable>; 21 21 /** voice data */ 22 p rotected var _voices:Vector.<SiMMLVoice>;22 public var voices:Vector.<SiMMLVoice>; 23 23 24 24 … … 30 30 function SiMMLData() 31 31 { 32 _envelops = new Vector.<SiMMLEnvelopTable>(SiMMLTable.ENV_TABLE_MAX);33 _voices = new Vector.<SiMMLVoice>(SiMMLTable.VOICE_MAX);32 envelops = new Vector.<SiMMLEnvelopTable>(SiMMLTable.ENV_TABLE_MAX); 33 voices = new Vector.<SiMMLVoice>(SiMMLTable.VOICE_MAX); 34 34 } 35 35 … … 44 44 super.clear(); 45 45 var i:int, imax:int; 46 imax = _envelops.length;47 for (i=0; i<imax; i++) _envelops[i] = null;48 imax = _voices.length;49 for (i=0; i<imax; i++) _voices[i] = null;46 imax = envelops.length; 47 for (i=0; i<imax; i++) envelops[i] = null; 48 imax = voices.length; 49 for (i=0; i<imax; i++) voices[i] = null; 50 50 } 51 51 … … 57 57 public function setEnvelopTable(index:int, envelop:SiMMLEnvelopTable) : void 58 58 { 59 if (index >= 0 && index < SiMMLTable.ENV_TABLE_MAX) _envelops[index] = envelop;59 if (index >= 0 && index < SiMMLTable.ENV_TABLE_MAX) envelops[index] = envelop; 60 60 } 61 61 … … 69 69 if (index >= 0 && index < SiMMLTable.VOICE_MAX) { 70 70 if (!voice._isSuitableForFMVoice) throw errorNotGoodFMVoice(); 71 _voices[index] = voice;71 voices[index] = voice; 72 72 } 73 73 } … … 78 78 // internal function 79 79 //-------------------------------------------------- 80 /** @private [internal use] Register all tables before processing audio. */81 override public function _regiterTables() : void82 {83 super._regiterTables();84 SiMMLTable.instance.stencilEnvelops = _envelops;85 SiMMLTable.instance.stencilVoices = _voices;86 }87 88 89 80 /** @private [internal use] Set envelop table data */ 90 81 internal function _setEnvelopTable(index:int, head:SLLint, tail:SLLint) : void … … 92 83 var t:SiMMLEnvelopTable = new SiMMLEnvelopTable(); 93 84 t._initialize(head, tail); 94 _envelops[index] = t;85 envelops[index] = t; 95 86 } 96 87 … … 101 92 var v:SiMMLVoice = new SiMMLVoice(); 102 93 v.channelParam = new SiOPMChannelParam(); 103 _voices[index] = v;94 voices[index] = v; 104 95 return v.channelParam; 105 96 } as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as
r2989 r3059 52 52 private var _module:SiOPMModule; // Module instance 53 53 private var _connector:MMLExecutorConnector; // MMLExecutorConnector 54 private var _currentTrack:SiMMLTrack; // Current processing track54 private var _currentTrack:SiMMLTrack; // Current processing track 55 55 private var _macroStrings:Vector.<String>; // Macro strings 56 56 private var _flagMacroExpanded:uint; // Expanded macro flag to avoid circular reference 57 57 private var _envelopEventID:int; // Event id of first envelop 58 58 private var _macroExpandDynamic:Boolean; // Macro expantion mode 59 private var _enableChangeBPM:Boolean; // internal flag enable to change bpm 59 60 60 61 private var _p:Vector.<int> = new Vector.<int>(PARAM_MAX); // temporary area to get plural parameters … … 89 90 /** Is finish executing sequence ? */ 90 91 public function get isSequenceFinished() : Boolean { return _isSequenceFinished; } 92 93 /** Is enable to change BPM ? */ 94 public function get isEnableChangeBPM() : Boolean { return _enableChangeBPM; } 95 91 96 92 97 /** Current working track */ … … 273 278 274 279 275 /** Find track except for mml sequencer track by trackID and note.276 * @param trackID Search Tracks ID.277 * @param trackID Search note number. The value of -1 hits all tracks.278 * @return found track instance. Returns null when didnt find.279 */280 public function findControlableTrack(trackID:int, note:int=-1) : SiMMLTrack281 {282 var i:int, trk:SiMMLTrack;283 for (i=tracks.length-1; i>=0; i--) {284 trk = tracks[i];285 if (trk.trackID == trackID && (note == -1 || (note == trk.note && trk.channel.isNoteOn()))) return trk;286 }287 return null;288 }289 290 291 280 /** Get free controlable track. 292 281 * @param trackID New Tracks ID. … … 320 309 { 321 310 track._initialize(null, 60, (trackID>=0) ? trackID : 0, _eventTriggerOn, _eventTriggerOff); 322 track.reset( 0);311 track.reset(globalBufferIndex); 323 312 324 313 track.velocity = setting.defaultVolume<<3; … … 360 349 freeAllTracks(); 361 350 _processedSampleCount = 0; 351 _enableChangeBPM = true; 362 352 363 353 // call super function (set mmlData/grobalSequence/defaultBPM inside) … … 386 376 override public function process() : void 387 377 { 388 var i:int, bufferingTick:int, len:int, trk:SiMMLTrack ;378 var i:int, bufferingTick:int, len:int, trk:SiMMLTrack, data:SiMMLData; 389 379 390 380 // prepare buffering 391 for each (trk in tracks) trk.channel. prepareBuffer();381 for each (trk in tracks) trk.channel.resetChannelBufferStatus(); 392 382 393 383 // clear all buffers 394 384 _module.clearAllBuffers(); 395 385 396 386 // buffering 397 387 _isSequenceFinished = true; … … 399 389 do { 400 390 bufferingTick = executeGlobalSequence(); 391 _enableChangeBPM = false; 401 392 for each (trk in tracks) { 402 393 _currentTrack = trk; 403 394 len = trk.prepareBuffer(bufferingTick); 395 _bpm = trk._bpmSetting || _changableBPM; 404 396 _isSequenceFinished = processMMLExecutor(trk.executor, len) && _isSequenceFinished; 405 397 } 398 _enableChangeBPM = true; 406 399 } while (!isEndGlobalSequence()); 407 400 _currentTrack = null; … … 416 409 public function dummyProcess(sampleCount:int) : void 417 410 { 418 var i:int, bufferingTick:int, len:int, count:int, trk:SiMMLTrack, 411 var i:int, bufferingTick:int, len:int, count:int, trk:SiMMLTrack, data:SiMMLData, 419 412 bufCount:int = sampleCount / _module.bufferLength; 420 413 … … 426 419 for (count=0; count<bufCount; count++) { 427 420 // prepare buffering 428 for each (trk in tracks) trk.channel. prepareBuffer();421 for each (trk in tracks) trk.channel.resetChannelBufferStatus(); 429 422 430 423 // buffering … … 435 428 _currentTrack = trk; 436 429 len = trk.prepareBuffer(bufferingTick); 430 _bpm = trk._bpmSetting || _changableBPM; 437 431 processMMLExecutor(trk.executor, len); 438 432 } … … 454 448 */ 455 449 public function calcSampleLength(beat16:Number) : Number { 456 return beat16 * sampleParBeat16;450 return beat16 * _bpm.sampleParBeat16; 457 451 } 458 452 … … 464 458 */ 465 459 public function calcSampleDelay(sampleOffset:int=0, beat16Offset:Number=0, quant:Number=0) : Number { 466 if (quant == 0) return sampleOffset + beat16Offset * sampleParBeat16;467 var iBeats:int = int(sampleOffset * beat16ParSample + globalBeat16 + beat16Offset + 0.9999847412109375); //=65535/65536460 if (quant == 0) return sampleOffset + beat16Offset * _bpm.sampleParBeat16; 461 var iBeats:int = int(sampleOffset * _bpm.beat16ParSample + globalBeat16 + beat16Offset + 0.9999847412109375); //=65535/65536 468 462 if (quant != 1) iBeats = (int((iBeats+quant-1) / quant)) * quant; 469 return (iBeats - globalBeat16) * sampleParBeat16;463 return (iBeats - globalBeat16) * _bpm.sampleParBeat16; 470 464 } 471 465 … … 612 606 { 613 607 for each (var trk:SiMMLTrack in tracks) { 614 trk.executor._onTempoChanged(changingRatio);608 if (trk._bpmSetting == null) trk.executor._onTempoChanged(changingRatio); 615 609 } 616 610 if (_callbackTempoChanged != null) _callbackTempoChanged(globalBufferIndex); as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as
r3027 r3059 13 13 import org.si.sion.sequencer.base.MMLSequence; 14 14 import org.si.sion.sequencer.base.MMLExecutor; 15 15 import org.si.sion.sequencer.base.BeatPerMinutes; 16 16 17 17 /** Track for SiMMLSequencer. <br/> … … 33 33 static public const TRACK_ID_FILTER:int = 0xffff; 34 34 /** track type filter */ 35 static public const TRACK_TYPE_FILTER:int = 0xff0000; 35 static public const TRACK_TYPE_FILTER:int = 0x1ff0000; 36 /** flag to activate always */ 37 static public const FLAG_ACTIVE:int = 0x1000000; 36 38 /** MML track id offset */ 37 static public const MML_TRACK_ID_OFFSET:int = 0x10 000;39 static public const MML_TRACK_ID_OFFSET:int = 0x1010000; 38 40 /** MIDI track id offset */ 39 41 static public const MIDI_TRACK_ID_OFFSET:int = 0x20000; 40 /** driver track id offset */42 /** driver track id offset for noteOn() */ 41 43 static public const DRIVER_NOTE_ID_OFFSET:int = 0x30000; 42 /** driver track id offset */ 43 static public const DRIVER_SEQUENCE_ID_OFFSET:int = 0x30000; 44 /** driver track id offset for sequenceOn() */ 45 static public const DRIVER_SEQUENCE_ID_OFFSET:int = 0x40000; 46 /** user controlled id offset */ 47 static public const USER_CONTROLLED_ID_OFFSET:int = 0x1050000; 48 44 49 45 50 // _processMode … … 87 92 private var _eventTriggerTypeOff:int; 88 93 89 private var _trackID:int; // track ID number94 private var _trackID:int; // track ID number 90 95 91 96 // internal use 92 private var _mmlData: MMLData;// mml data97 private var _mmlData:SiMMLData; // mml data 93 98 private var _table:SiMMLTable; // table 94 99 private var _keyOnCounter:int; // key on counter … … 181 186 public function get trackStopDelay() : int { return _trackStopDelay; } 182 187 183 /** Is controlable ? */184 public function get isControlable() : Boolean { return ((_trackID & TRACK_TYPE_FILTER) != MML_TRACK_ID_OFFSET); }185 186 188 /** Is activate ? This function always returns true from the MML sequence track. */ 187 public function get isActive() : Boolean { return ( !isControlable|| !channel.isIdling || _keyOnCounter>0 || _trackStartDelay>0); }189 public function get isActive() : Boolean { return ((Boolean(_trackID & FLAG_ACTIVE)) || !channel.isIdling || _keyOnCounter>0 || _trackStartDelay>0); } 188 190 189 191 /** Is finish to buffering ? */ 190 192 public function get isFinished() : Boolean { return (executor.pointer==null && channel.isIdling && _keyOnCounter==0 && _trackStartDelay==0); } 191 192 193 193 194 /** velocity(0-256). linked to operator's total level. */ … … 213 214 214 215 /** pannning */ 215 public function get pan() : int { 216 return channel.pan; 217 } 216 public function get pan() : int { return channel.pan; } 218 217 219 218 /** program number. this value has no meaning. */ 220 public function get programNumber() : int { 221 return _tone; 219 public function get programNumber() : int { return _tone; } 220 221 /** mml data to play */ 222 public function get mmlData() : SiMMLData { return _mmlData; } 223 224 225 /** @private [internal use] bpm setting */ 226 internal function get _bpmSetting() : BeatPerMinutes { 227 return ((_trackID & TRACK_TYPE_FILTER) != MML_TRACK_ID_OFFSET && _mmlData) ? _mmlData._initialBPM : null; 222 228 } 223 229 … … 267 273 _eventTriggerTypeOn = 0; 268 274 _eventTriggerTypeOff = 0; 269 _mmlData = (seq) ? seq._owner: null;275 _mmlData = (seq) ? (seq._owner as SiMMLData) : null; 270 276 executor.initialize(seq); 271 277 … … 405 411 _trackStartDelay = delay; 406 412 _trackStopDelay = length; 413 _mmlData = (seq) ? (seq._owner as SiMMLData) : null; 407 414 executor.initialize(seq); 408 415 return this; … … 699 706 internal function prepareBuffer(bufferingTick:int) : int 700 707 { 701 // register tables 702 if (_mmlData) _mmlData._regiterTables(); 708 if (_mmlData) { 709 // register tables 710 SiOPMTable.instance.stencilCustomWaveTables = _mmlData.waveTables; 711 SiOPMTable.instance.stencilPCMData = _mmlData.pcmData; 712 SiOPMTable.instance.stencilSamplerData = _mmlData.samplerData; 713 SiMMLTable.instance.stencilEnvelops = _mmlData.envelops; 714 SiMMLTable.instance.stencilVoices = _mmlData.voices; 715 } 703 716 704 717 // almost executing this as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLData.as
r3013 r3059 22 22 public var globalSequence:MMLSequence; 23 23 24 /** default BPM */25 public var defaultBPM:int;26 24 /** default FPS */ 27 25 public var defaultFPS:int; … … 30 28 /** Author */ 31 29 public var author:String; 30 /** @private [internal use] default BPM */ 31 public var _initialBPM:BeatPerMinutes; 32 32 33 33 /** wave tables */ … … 52 52 // properties 53 53 //-------------------------------------------------- 54 54 /** Beat per minutes. Returns 0 when there are no bpm definitions. */ 55 public function get bpm() : Number { 56 return (_initialBPM) ? _initialBPM.bpm : 0; 57 } 55 58 56 59 … … 63 66 globalSequence = new MMLSequence(); 64 67 65 defaultBPM = 120;68 _initialBPM = null; 66 69 defaultFPS = 60; 67 70 title = ""; … … 87 90 globalSequence.free(); 88 91 89 defaultBPM = 120;92 _initialBPM = null; 90 93 defaultFPS = 60; 91 94 title = ""; … … 183 186 return samplerData[index]; 184 187 } 185 186 187 188 189 // internal function190 //--------------------------------------------------191 /** @private [internal use] Register all tables before processing audio. */192 public function _regiterTables() : void193 {194 SiOPMTable.instance.stencilCustomWaveTables = waveTables;195 SiOPMTable.instance.stencilPCMData = pcmData;196 SiOPMTable.instance.stencilSamplerData = samplerData;197 }198 188 } 199 189 } as3/SiOPM/trunk/src/org/si/sion/sequencer/base/MMLSequencer.as
r2989 r3059 23 23 //-------------------------------------------------- 24 24 /** bits for fixed decimal */ 25 protectedconst FIXED_BITS:int = 8;25 internal static const FIXED_BITS:int = 8; 26 26 /** filter for decimal fraction area */ 27 protectedconst FIXED_FILTER:int = (1<<FIXED_BITS)-1;27 internal static const FIXED_FILTER:int = (1<<FIXED_BITS)-1; 28 28 29 29 … … 43 43 /** Current MMLData to compile or process */ 44 44 protected var mmlData:MMLData; 45 /** changable beat per minutes */ 46 protected var _changableBPM:BeatPerMinutes; 47 /** beat per minutes */ 48 protected var _bpm:BeatPerMinutes; 45 49 46 50 /** buffer index for global sequence */ … … 48 52 /** beat counter in 16th */ 49 53 protected var globalBeat16:Number; 50 /** 16th beat par sample */51 protected var beat16ParSample:Number;52 /** sample par 16th beat */53 protected var sampleParBeat16:Number;54 54 /** filter for onBeat() callback. 0=16th beat, 1=8th beat, 3=4th beat, 7=2dn beat, 15=whole tone ...*/ 55 55 protected var _onBeatCallbackFilter:int; … … 65 65 private var _globalExecuteSampleCount:int; // executing buffer length in global sequence 66 66 67 private var _bpm:Number; // beat per minute68 private var _samplePerTick:int; // samples per tick << FIXED_BITS69 67 private var _bufferLength:int; // buffering length 70 68 … … 74 72 //-------------------------------------------------- 75 73 /** beat per minute. */ 76 public function set bpm(b:Number) : void 77 { 78 if (b<1) b=1; 79 else if (b>511) b=511; 80 _samplePerTick = int((sampleRate * 240 / (setting.resolution * b)) * (1<<FIXED_BITS)); 81 beat16ParSample = b / (sampleRate * 15); // 60/4 82 sampleParBeat16 = 1 / beat16ParSample; 83 onTempoChanged(_bpm/b); 84 _bpm = b; 85 } 86 public function get bpm() : Number { return _bpm; } 74 public function get bpm() : Number { 75 return _changableBPM.bpm; 76 } 77 public function set bpm(newValue:Number) : void { 78 var oldValue:Number=_changableBPM.bpm; 79 if (_changableBPM.update(newValue, sampleRate)) { 80 onTempoChanged(oldValue/newValue); 81 } 82 } 87 83 88 84 … … 110 106 _newUserDefinedEventID = MMLEvent.USER_DEFINE; 111 107 108 _changableBPM = new BeatPerMinutes(120, 44100); 109 _bpm = _changableBPM; 112 110 globalExecutor = new MMLExecutor(); 113 111 … … 235 233 _bufferLength = bufferLength; 236 234 if (mmlData == null) { 237 bpm = setting.defaultBPM;235 _changableBPM.update(setting.defaultBPM, sampleRate); 238 236 globalExecutor.initialize(null); 239 237 } else { 240 bpm = mmlData.defaultBPM;238 _changableBPM.update(mmlData._initialBPM.bpm, sampleRate); 241 239 globalExecutor.initialize(mmlData.globalSequence); 242 mmlData._regiterTables(); 243 } 240 //mmlData._regiterTables(); /**/ 241 } 242 _bpm = _changableBPM; 244 243 globalBufferIndex = 0; 245 244 globalBeat16 = 0; … … 295 294 floorPrevBeat:int = int(prevBeat); 296 295 globalBufferIndex += _globalExecuteSampleCount; 297 globalBeat16 += _globalExecuteSampleCount * beat16ParSample;296 globalBeat16 += _globalExecuteSampleCount * _bpm.beat16ParSample; 298 297 var floorCurrBeat:int = int(globalBeat16); 299 298 while (floorPrevBeat < floorCurrBeat) { 300 299 floorPrevBeat++; 301 300 if ((floorPrevBeat & _onBeatCallbackFilter) == 0) { 302 onBeat((floorPrevBeat - prevBeat) * sampleParBeat16, floorPrevBeat);301 onBeat((floorPrevBeat - prevBeat) * _bpm.sampleParBeat16, floorPrevBeat); 303 302 } 304 303 } 305 return (_globalBufferSampleCount == 0); 304 if (_globalBufferSampleCount == 0) { 305 globalBufferIndex = 0; 306 return true; 307 } 308 return false; 306 309 } 307 310 … … 340 343 protected function calcSampleCount(len:int) : int 341 344 { 342 return (len * _ samplePerTick) >> FIXED_BITS;345 return (len * _bpm._samplePerTick) >> FIXED_BITS; 343 346 } 344 347 … … 489 492 list = list.sortOn(length, Array.NUMERIC); 490 493 pos = 0; 491 defaultBPM = setting.defaultBPM;494 defaultBPM = 0; 492 495 for each (e in list) { 493 496 if (e.length == 0 && e.id == MMLEvent.TEMPO) { 494 // first tempo command is default BPM.497 // first tempo command is default bpm. 495 498 defaultBPM = e.data; 496 499 } else { … … 505 508 506 509 // set default bpm in mmlData 507 mmlData.defaultBPM = defaultBPM; 510 if (defaultBPM > 0) { 511 mmlData._initialBPM = new BeatPerMinutes(defaultBPM, 44100, setting.resolution); 512 } 508 513 } 509 514 … … 534 539 // set processing length 535 540 if (exec._residueSampleCount == 0) { 536 var sampleCountFixed:int = e.length * _ samplePerTick + exec._decimalFractionSampleCount;541 var sampleCountFixed:int = e.length * _bpm._samplePerTick + exec._decimalFractionSampleCount; 537 542 exec._residueSampleCount = sampleCountFixed >> FIXED_BITS; 538 543 exec._decimalFractionSampleCount = sampleCountFixed & FIXED_FILTER; … … 563 568 // set processing length 564 569 if (exec._residueSampleCount == 0) { 565 var sampleCountFixed:int = e.length * _ samplePerTick + exec._decimalFractionSampleCount;570 var sampleCountFixed:int = e.length * _bpm._samplePerTick + exec._decimalFractionSampleCount; 566 571 exec._residueSampleCount = sampleCountFixed >> FIXED_BITS; 567 572 exec._decimalFractionSampleCount = sampleCountFixed & FIXED_FILTER; … … 592 597 // set processing length 593 598 if (exec._residueSampleCount == 0) { 594 var sampleCountFixed:int = e.length * _ samplePerTick + exec._decimalFractionSampleCount;599 var sampleCountFixed:int = e.length * _bpm._samplePerTick + exec._decimalFractionSampleCount; 595 600 exec._residueSampleCount = sampleCountFixed >> FIXED_BITS; 596 601 exec._decimalFractionSampleCount = sampleCountFixed & FIXED_FILTER; as3/SiOPM/trunk/src/org/si/sound/Arpeggiator.as
r3013 r3059 27 27 /** Note events in the sequence with portament */ 28 28 protected var _noteEventsPort:Vector.<MMLEvent>; 29 /** Slur events in the sequence with portament */ 30 protected var _slurEventsPort:Vector.<MMLEvent>; 29 31 /** Note length */ 30 32 protected var _step:int; … … 82 84 for (i=0; i<imax; i++) { 83 85 _noteEventsNormal[i].length = _step; 84 _ noteEventsPort[i].length = _step;86 _slurEventsPort[i].length = _step; 85 87 } 86 88 } … … 90 92 public function set pattern(pat:Array) : void 91 93 { 92 if ( track) {94 if (!track) { 93 95 _dataNormal.clear(); 94 96 _dataPort.clear(); 95 97 if (pat) { 96 98 _arpeggio = Vector.<int>(pat); 97 var i:int, imax:int = pat.length, note:int ,99 var i:int, imax:int = pat.length, note:int = 60, 98 100 seqNormal:MMLSequence = _dataNormal.appendNewSequence(), 99 101 seqPort:MMLSequence = _dataPort.appendNewSequence(); 100 102 _noteEventsNormal.length = imax; 101 103 _noteEventsPort.length = imax; 104 _slurEventsPort.length = imax; 102 105 seqNormal.alloc().appendNewEvent(MMLEvent.REPEAT_ALL, 0); 103 106 seqPort.alloc().appendNewEvent(MMLEvent.REPEAT_ALL, 0); 104 107 for (i=0; i<imax; i++) { 105 note = scale.getNote(pat[i]); 106 if (note>=0 && note<128) { 108 var newNote:int = scale.getNote(pat[i]); 109 if (newNote>=0 && newNote<128) { 110 note = newNote; 107 111 _noteEventsNormal[i] = seqNormal.appendNewEvent(MMLEvent.NOTE, note, _step); 108 112 _noteEventsPort[i] = seqPort.appendNewEvent(MMLEvent.NOTE, note, 0); 109 seqPort.appendNewEvent(MMLEvent.SLUR, 0, _step);113 _slurEventsPort[i] = seqPort.appendNewEvent(MMLEvent.SLUR, 0, _step); 110 114 } else { 111 115 _noteEventsNormal[i] = seqNormal.appendNewEvent(MMLEvent.REST, 0, _step); 112 _noteEventsPort[i] = seqPort.appendNewEvent(MMLEvent.REST, 0, _step); 116 _noteEventsPort[i] = seqPort.appendNewEvent(MMLEvent.NOTE, note, 0); 117 _slurEventsPort[i] = seqPort.appendNewEvent(MMLEvent.SLUR, 0, _step); 113 118 } 114 119 } … … 135 140 _noteEventsNormal = new Vector.<MMLEvent>(); 136 141 _noteEventsPort = new Vector.<MMLEvent>(); 142 _slurEventsPort = new Vector.<MMLEvent>(); 137 143 this.noteLength = noteLength; 138 144 this.pattern = pattern; as3/SiOPM/trunk/src/org/si/sound/base/SingleTrackObject.as
r3013 r3059 143 143 { 144 144 var oldTrack:SiMMLTrack = track; 145 _track = driver.sequenceOn(_data, voice, _length, _delay, _quantize, _trackID); 146 if (_track) { 147 if (oldTrack) oldTrack.sequenceOff(_track.trackStartDelay-8); 145 var tracks:Vector.<SiMMLTrack> = driver.sequenceOn(_data, voice, _length, _delay, _quantize, _trackID); 146 if (tracks.length > 0) { 147 _track = tracks[0]; 148 if (oldTrack) oldTrack.sequenceOff(_track.trackStartDelay-1); 148 149 _track.channel.pan = _totalPan; 149 150 _track.channel.masterVolume = (_totalMute) ? 0 : _totalVolume*128; 150 151 _track.quantRatio = _noteQuantize * 0.125; 151 152 _track.setEventTrigger(_eventTriggerID, _noteOnTrigger, _noteOffTrigger); 153 } else { 154 _track = null; 155 if (oldTrack) oldTrack.sequenceOff(0); 152 156 } 153 157 }

