チェンジセット 4540
- コミット日時:
- 2011/05/19 02:05:13 (1 年前)
- ファイル:
-
- as3/SiOPM/trunk/src/org/si/sion/SiONData.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as (更新) (17 diffs)
- as3/SiOPM/trunk/src/org/si/sion/SiONVoice.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelParam.as (更新) (4 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMTable.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/SiOPMWavePCMData.as (更新) (2 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelBase.as (更新) (8 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelFM.as (更新) (5 diffs)
- as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelKS.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as (更新) (18 diffs)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTable.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sion/utils/PCMSample.as (追加)
- as3/SiOPM/trunk/src/org/si/sion/utils/SiONPresetVoice.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as (更新) (10 diffs)
- as3/SiOPM/trunk/src/org/si/sion/utils/SoundClass.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sion/utils/SoundLoader.as (追加)
- as3/SiOPM/trunk/src/org/si/sound/synthesizers/BasicSynth.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sound/synthesizers/DrumMachinePresetVoice.as (更新) (1 diff)
- as3/SiOPM/trunk/src/org/si/sound/synthesizers/PCMSynth.as (更新) (3 diffs)
- as3/SiOPM/trunk/src/org/si/sound/synthesizers/PMGuitarSynth.as (更新) (6 diffs)
- as3/SiOPM/trunk/src/org/si/utils/ByteArrayExt.as (追加)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/SiOPM/trunk/src/org/si/sion/SiONData.as
r4264 r4540 46 46 * @param keyRangeFrom Assigning key range starts from 47 47 * @param keyRangeTo Assigning key range ends at 48 * @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 48 49 * @see #render() 49 50 */ 50 public function setPCMData(index:int, wavelet:Vector.<Number>, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127 ) : SiOPMWavePCMData51 public function setPCMData(index:int, wavelet:Vector.<Number>, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127, isStereoSample:Boolean=false) : SiOPMWavePCMData 51 52 { 52 53 index &= (SiOPMTable.PCM_DATA_MAX-1); 53 54 if (!pcmData[index]) pcmData[index] = new SiOPMWavePCMTable(); 54 return pcmData[index].setSample(new SiOPMWavePCMData(wavelet, samplingOctave ), keyRangeFrom, keyRangeTo);55 return pcmData[index].setSample(new SiOPMWavePCMData(wavelet, samplingOctave, isStereoSample), keyRangeFrom, keyRangeTo); 55 56 } 56 57 … … 75 76 * @param data Vector.<Number> wave data. This type ussualy comes from SiONDriver.render(). 76 77 * @param ignoreNoteOff True to set ignoring note off. 77 * @param channelCount 1 for monoral, 2 for stereo.78 * @param channelCount of this data, 1 for monoral, 2 for stereo. 78 79 * @return created data instance 79 80 * @see #org.si.sion.SiONDriver.render() … … 89 90 * @param sound Sound instance to set. 90 91 * @param ignoreNoteOff True to set ignoring note off. 91 * @param channelCount 1 for monoral, 2 for stereo.92 * @param channelCount of extracted data, 1 for monoral, 2 for stereo. 92 93 * @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 93 94 * @return created instance as3/SiOPM/trunk/src/org/si/sion/SiONDriver.as
r4451 r4540 101 101 //---------------------------------------- 102 102 /** version number */ 103 static public const VERSION:String = "0.6. 2";103 static public const VERSION:String = "0.6.3"; 104 104 105 105 … … 159 159 private var _inStreaming:Boolean; // in streaming 160 160 private var _preserveStop:Boolean; // preserve stop after streaming 161 private var _isFirstStreaming:Boolean; // first streaming 161 private var _suspendStreaming:Boolean; // suspend streaming 162 private var _suspendWhileLoading:Boolean; // suspend starting steam while loading 163 private var _loadingSoundList:Array; // loading sound list 164 private var _completeSoundList:Array; // complete sound list 165 private var _errorSoundList:Array; // errored sound list 162 166 private var _isFinishSeqDispatched:Boolean; // FINISH_SEQUENCE event already dispacthed 163 167 //----- operation related … … 330 334 public function set autoStop(mode:Boolean) : void { _autoStop = mode; } 331 335 336 /** pause while loading sound @default true */ 337 public function get pauseWhileLoading() : Boolean { return _suspendWhileLoading; } 338 public function set pauseWhileLoading(b:Boolean) : void { _suspendWhileLoading = b; } 339 332 340 /** Debug mode, true; throw Error / false; throw ErrorEvent when error appears inside. @default false */ 333 341 public function get debugMode() : Boolean { return _debugMode; } … … 366 374 // initialize tables 367 375 var dummy:*; 368 dummy = SiOPMTable.instance; //initialize(3580000, 1789772.5, 44100) sampleRate );376 dummy = SiOPMTable.instance; //initialize(3580000, 1789772.5, 44100) sampleRate; 369 377 dummy = SiMMLTable.instance; //initialize(); 370 378 … … 378 386 _fader = new Fader(); 379 387 _timerSequence = new MMLSequence(); 388 _loadingSoundList = []; 389 _completeSoundList = []; 390 _errorSoundList = []; 380 391 381 392 // initialize … … 390 401 _preserveStop = false; 391 402 _inStreaming = false; 392 _isFirstStreaming = false; 403 _suspendStreaming = false; 404 _suspendWhileLoading = true; 393 405 _autoStop = false; 394 406 _noteOnExceptionMode = NEM_IGNORE; … … 578 590 return _queueLength; 579 591 } 592 593 594 /** Listen loading status of flash.media.Sound instance. 595 * When SiONDriver.pauseWhileLoading is true, SiONDriver starts streaming after all Sound instances passed by this function are loaded. 596 * @param sound Sound instance to listern 597 * @see #pauseWhileLoading() 598 * @see #clearLoadingSoundList() 599 */ 600 public function listenSoundLoadingStatus(sound:Sound) : void 601 { 602 if (_loadingSoundList.indexOf(sound) != -1) return; 603 if (_completeSoundList.indexOf(sound) != -1) return; 604 if (_errorSoundList.indexOf(sound) != -1) return; 605 if (sound.bytesLoaded == sound.bytesTotal) { 606 _completeSoundList.push(sound); 607 } else { 608 _loadingSoundList.push(sound); 609 sound.addEventListener(Event.COMPLETE, _onSoundEvent); 610 sound.addEventListener(IOErrorEvent.IO_ERROR, _onSoundEvent); 611 } 612 } 613 614 615 /** Clear all listening sound list registerd by SiONDriver.listenLoadingStatus(). 616 */ 617 public function clearSoundLoadingList() : void 618 { 619 _loadingSoundList.length = 0; 620 _completeSoundList.length = 0; 621 _errorSoundList.length = 0; 622 } 580 623 581 624 … … 612 655 613 656 // start streaming 614 _ isFirstStreaming = true;657 _suspendStreaming = true; 615 658 _soundChannel = _sound.play(); 616 659 _soundChannel.soundTransform = _soundTransform; … … 767 810 * @param keyRangeFrom Assigning key range starts from 768 811 * @param keyRangeTo Assigning key range ends at 812 * @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 769 813 * @see #render() 770 814 */ 771 public function setPCMData(index:int, wavelet:Vector.<Number>, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127 ) : SiOPMWavePCMData772 { 773 return SiOPMTable._instance.getPCMWaveTable(index).setSample(new SiOPMWavePCMData(wavelet, samplingOctave ), keyRangeFrom, keyRangeTo);815 public function setPCMData(index:int, wavelet:Vector.<Number>, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127, isStereoSample:Boolean=false) : SiOPMWavePCMData 816 { 817 return SiOPMTable._instance.getPCMWaveTable(index).setSample(new SiOPMWavePCMData(wavelet, samplingOctave, isStereoSample), keyRangeFrom, keyRangeTo); 774 818 } 775 819 … … 794 838 * @param data Vector.<Number> wave data. This type ussualy comes from render(). 795 839 * @param ignoreNoteOff True to set "one shot" sound. The "one shot" sound ignores note off. 796 * @param channelCount 1 for monoral, 2 for stereo.840 * @param channelCount of this data, 1 for monoral, 2 for stereo. 797 841 * @see #render() 798 842 */ … … 807 851 * @param sound Sound instance to set. 808 852 * @param ignoreNoteOff True to set "one shot" sound. The "one shot" sound ignores note off. 809 * @param channelCount 1 for monoral, 2 for stereo.853 * @param channelCount of extracted data, 1 for monoral, 2 for stereo. 810 854 * @param sampleMax The maximum sample count to extract. The length of returning vector is limited by this value. 811 855 */ … … 1041 1085 1042 1086 1043 /** Create new user controlable track. 1087 /** Create new user controlable track. This function only is available after play(). 1044 1088 * @trackID new user controlable track's ID. 1045 1089 * @return new user controlable track. This track is NOT disposable. … … 1142 1186 } 1143 1187 _listenEvent = NO_LISTEN; 1188 } 1189 1190 1191 // handler for Sound COMPLETE/IO_ERROR Event 1192 private function _onSoundEvent(e:Event) : void 1193 { 1194 var sound:Sound = e.target as Sound; 1195 sound.removeEventListener(Event.COMPLETE, _onSoundEvent); 1196 sound.removeEventListener(IOErrorEvent.IO_ERROR, _onSoundEvent); 1197 1198 var i:int = _loadingSoundList.indexOf(sound); 1199 if (i != -1) _loadingSoundList.splice(i, 1); 1200 1201 if (e.type == Event.COMPLETE) _completeSoundList.push(sound); 1202 else _errorSoundList.push(sound); 1144 1203 } 1145 1204 … … 1385 1444 1386 1445 // first streaming 1387 if (_ isFirstStreaming) {1388 _on FirstFrameAfterStartingStream();1446 if (_suspendStreaming) { 1447 _onSuspendStream(); 1389 1448 } else { 1390 1449 // preserve stop … … 1409 1468 1410 1469 1411 // first frame after starting stream 1412 private function _onFirstFrameAfterStartingStream() : void { 1413 _isFirstStreaming = false; 1414 1470 // suspend starting stream 1471 private function _onSuspendStream() : void { 1472 // reset suspending 1473 _suspendStreaming = _suspendWhileLoading && (_loadingSoundList.length > 0); 1474 1415 1475 // dispatch streaming start event 1416 1476 var event:SiONEvent = new SiONEvent(SiONEvent.STREAM_START, this, null, true); … … 1419 1479 } 1420 1480 1421 1481 1422 1482 // on sampleData 1423 1483 private function _streaming(e:SampleDataEvent) : void … … 1436 1496 _inStreaming = true; 1437 1497 1438 if (_isPaused || _ isFirstStreaming) {1498 if (_isPaused || _suspendStreaming) { 1439 1499 // fill silence 1440 1500 _fillzero(e.data); as3/SiOPM/trunk/src/org/si/sion/SiONVoice.as
r4421 r4540 321 321 322 322 323 /** Set low pass filter envelop parameters. 323 /** Set filter envelop parameters. 324 * @param filterType filter type (0:Low-pass, 1:Band-pass, 2:High-pass) 325 * @param cutoff filter cutoff (0-128) 326 * @param resonance filter resonance (0-9) 327 * @param far filter attack rate (0-63) 328 * @param fdr1 filter decay rate 1 (0-63) 329 * @param fdr2 filter decay rate 2 (0-63) 330 * @param frr filter release rate (0-63) 331 * @param fdc1 filter decay cutoff 1 (0-128) 332 * @param fdc2 filter decay cutoff 2 (0-128) 333 * @param fsc filter sustain cutoff (0-128) 334 * @param frc filter release cutoff (0-128) 335 * @return this SiONVoice instance 336 */ 337 public function setFilterEnvelop(filterType:int=0, cutoff:int=128, resonance:int=0, far:int=0, fdr1:int=0, fdr2:int=0, frr:int=0, fdc1:int=128, fdc2:int=64, fsc:int=32, frc:int=128) : SiONVoice 338 { 339 channelParam.filterType = filterType; 340 channelParam.cutoff = cutoff; 341 channelParam.resonance = resonance; 342 channelParam.far = far; 343 channelParam.fdr1 = fdr1; 344 channelParam.fdr2 = fdr2; 345 channelParam.frr = frr; 346 channelParam.fdc1 = fdc1; 347 channelParam.fdc2 = fdc2; 348 channelParam.fsc = fsc; 349 channelParam.frc = frc; 350 return this; 351 } 352 353 354 /** [Pleas use setFilterEnvelop() instead of this function]. Set low pass filter envelop parameters. This function is for compatibility of old versions. 324 355 * @param cutoff LP filter cutoff (0-128) 325 356 * @param resonance LP filter resonance (0-9) … … 333 364 * @param frc LP filter release cutoff (0-128) 334 365 * @return this SiONVoice instance 366 * @see setFilterEnvelop() 335 367 */ 336 368 public function setLPFEnvelop(cutoff:int=128, resonance:int=0, far:int=0, fdr1:int=0, fdr2:int=0, frr:int=0, fdc1:int=128, fdc2:int=64, fsc:int=32, frc:int=128) : SiONVoice 337 369 { 338 channelParam.cutoff = cutoff; 339 channelParam.resonance = resonance; 340 channelParam.far = far; 341 channelParam.fdr1 = fdr1; 342 channelParam.fdr2 = fdr2; 343 channelParam.frr = frr; 344 channelParam.fdc1 = fdc1; 345 channelParam.fdc2 = fdc2; 346 channelParam.fsc = fsc; 347 channelParam.frc = frc; 348 return this; 370 return setFilterEnvelop(0, cutoff, resonance, far, fdr1, fdr2, frr, fdc1, fdc2, fsc, frc); 349 371 } 350 372 as3/SiOPM/trunk/src/org/si/sion/module/SiOPMChannelParam.as
r3638 r4540 44 44 public var pan:int; 45 45 46 /** LP filter cutoff */ 46 /** filter type */ 47 public var filterType:int; 48 /** filter cutoff */ 47 49 public var cutoff:int; 48 /** LPfilter resonance */50 /** filter resonance */ 49 51 public var resonance:int; 50 /** LPfilter attack rate */52 /** filter attack rate */ 51 53 public var far:int; 52 /** LPfilter decay rate 1 */54 /** filter decay rate 1 */ 53 55 public var fdr1:int; 54 /** LPfilter decay rate 2 */56 /** filter decay rate 2 */ 55 57 public var fdr2:int; 56 /** LPfilter release rate */58 /** filter release rate */ 57 59 public var frr:int; 58 /** LPfilter decay offset 1 */60 /** filter decay offset 1 */ 59 61 public var fdc1:int; 60 /** LPfilter decay offset 2 */62 /** filter decay offset 2 */ 61 63 public var fdc2:int; 62 /** LPfilter sustain offset */64 /** filter sustain offset */ 63 65 public var fsc:int; 64 /** LPfilter release offset */66 /** filter release offset */ 65 67 public var frc:int; 66 68 … … 114 116 pan = 64; 115 117 118 filterType = 0; 116 119 cutoff = 128; 117 120 resonance = 0; … … 151 154 pan = org.pan; 152 155 156 filterType = org.filterType; 153 157 cutoff = org.cutoff; 154 158 resonance = org.resonance; … … 181 185 $2("amd", amd, "pmd", pmd); 182 186 $2("vol", volumes[0], "pan", pan-64); 187 $("filter type", filterType); 183 188 $2("co", cutoff, "res", resonance); 184 189 str += "fenv=" + String(far) + "/" + String(fdr1) + "/"+ String(fdr2) + "/"+ String(frr) + "\n"; as3/SiOPM/trunk/src/org/si/sion/module/SiOPMTable.as
r4451 r4540 66 66 static public const PT_PSG_NOISE:int = 4; 67 67 static public const PT_APU_NOISE:int = 5; 68 static public const PT_MAX:int = 5; 68 // static public const PT_APU_DPCM:int = 6; 69 static public const PT_MAX:int = 6; 69 70 70 71 // pulse generator type (0-511) … … 524 525 phaseStepShiftFilter[PT_PSG] = 0; 525 526 527 /* 528 // APU DPCM period table 529 var fc_df:Array = [428, 380, 340, 320, 286, 254, 226, 214, 190, 160, 142, 128, 106, 85, 72, 54]; 530 imax = 16<<HALF_TONE_BITS; 531 table = new Vector.<int>(imax, true); 532 n = psg_clock/(rate*0.018581361171917529); 533 for (i=0; i<16; i++) { 534 iv = Math.log(n / fc_df[i]) * 1.4426950408889633 * PHASE_MAX / rate; 535 for (j=0; j<HALF_TONE_RESOLUTION; j++) { 536 table[(i<<HALF_TONE_BITS)+j] = iv; 537 } 538 } 539 pitchTable[PT_APU_DPCM] = table; 540 phaseStepShiftFilter[PT_APU_DPCM] = 0xffffffff; 541 */ 542 543 526 544 527 545 // Noise period tables. as3/SiOPM/trunk/src/org/si/sion/module/SiOPMWavePCMData.as
r4339 r4540 55 55 * @param data wave data, Sound, Vector.<Number> or Vector.<int>. The Sound is extracted inside. 56 56 * @param samplingOctave sampling data's octave (octave 5 as 44.1kHz) 57 * @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 57 58 */ 58 function SiOPMWavePCMData(data:*=null, samplingOctave:int=5 )59 function SiOPMWavePCMData(data:*=null, samplingOctave:int=5, isStereoSample:Boolean=false) 59 60 { 60 61 super(SiMMLTable.MT_PCM); … … 70 71 * @param data wave data, Sound, Vector.<Number> or Vector.<int>. The Sound is extracted inside. 71 72 * @param samplingOctave sampling data's octave (specified octave as 44.1kHz) 73 * @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 72 74 * @return this instance. 73 75 */ 74 public function initialize(data:*, samplingOctave:int=5 ) : SiOPMWavePCMData76 public function initialize(data:*, samplingOctave:int=5, isStereoSample:Boolean=false) : SiOPMWavePCMData 75 77 { 76 78 if (data is Sound) wavelet = SiONUtil.logTrans(data as Sound, null, 1048576, 0); 77 else if (data is Vector.<Number>) wavelet = SiONUtil.logTransVector(data as Vector.<Number> );79 else if (data is Vector.<Number>) wavelet = SiONUtil.logTransVector(data as Vector.<Number>, isStereoSample); 78 80 else if (data is Vector.<int>) wavelet = data as Vector.<int>; 79 81 else if (data == null) wavelet = null; as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelBase.as
r4451 r4540 75 75 // LPFilter 76 76 /** filter switch */ protected var _filterOn:Boolean; 77 /** filter mode */ protected var _filterMode:int;77 /** filter type */ protected var _filterType:int; 78 78 /** cutoff frequency */ protected var _cutoff:int; 79 79 /** cutoff frequency */ protected var _cutoff_offset:int; … … 93 93 /** lfo timer */ protected var _lfo_timer:int; 94 94 /** lfo timer step */ protected var _lfo_timer_step:int; 95 /** lfo step buffer */ protected var _lfo_timer_step_:int; 95 96 /** lfo phase */ protected var _lfo_phase:int; 96 97 /** lfo wave table */ protected var _lfo_waveTable:Vector.<int>; … … 201 202 202 203 /** filter mode */ 203 public function get filter Mode() : int { return _filterMode; }204 public function set filter Mode(mode:int) : void205 { 206 _filter Mode = (mode<0 || mode>2) ? 0 : mode;204 public function get filterType() : int { return _filterType; } 205 public function set filterType(mode:int) : void 206 { 207 _filterType = (mode<0 || mode>2) ? 0 : mode; 207 208 } 208 209 … … 290 291 _lfo_waveShape = waveform; 291 292 _lfo_timer = 1; 292 _lfo_timer_step = 0;293 _lfo_timer_step_ = _lfo_timer_step = 0; 293 294 _lfo_phase = 0; 294 295 } … … 300 301 _lfo_timer = 0; 301 302 // 0.17294117647058824 = 44100/(1000*255) 302 _lfo_timer_step = (SiOPMTable.LFO_TIMER_INITIAL/(ms*0.17294117647058824)) << _table.sampleRatePitchShift;303 _lfo_timer_step_ = _lfo_timer_step = (SiOPMTable.LFO_TIMER_INITIAL/(ms*0.17294117647058824)) << _table.sampleRatePitchShift; 303 304 304 305 //set OPM LFO frequency 305 306 //_lfo_timer = 0; 306 //_lfo_timer_step = _table.lfo_timerSteps[freq & 255];307 //_lfo_timer_step_ = _lfo_timer_step = _table.lfo_timerSteps[freq & 255]; 307 308 } 308 309 … … 505 506 _filterVriables[0] = _filterVriables[1] = _filterVriables[2] = 0; 506 507 _cutoff_offset = 0; 507 _filter Mode = FILTER_LP;508 _filterType = FILTER_LP; 508 509 setSVFilter(); 509 510 shiftSVFilterState(EG_OFF); … … 641 642 _filterVriables[1] += _filterVriables[2] * cut; 642 643 _filterVriables[0] += _filterVriables[1] * cut; 643 pointer.i = int(_filterVriables[_filter Mode]);644 pointer.i = int(_filterVriables[_filterType]); 644 645 pointer = pointer.next; 645 646 } … … 664 665 _filterVriables[1] += _filterVriables[2] * cut; 665 666 _filterVriables[0] += _filterVriables[1] * cut; 666 pointer.i = int(_filterVriables[_filter Mode]);667 pointer.i = int(_filterVriables[_filterType]); 667 668 pointer = pointer.next; 668 669 } as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelFM.as
r4451 r4540 76 76 /** pm output level */ protected var _pm_out:int; 77 77 78 78 79 // tone generator setting 79 80 /** ENV_TIMER_INITIAL * freq_ratio */ protected var _eg_timer_initial:int; … … 201 202 protected function _lfoSwitch(sw:Boolean) : void 202 203 { 203 var new_lfo_on:int = int(sw); 204 if (_lfo_on != new_lfo_on) { 205 _lfo_on = new_lfo_on; 206 _funcProcess = _funcProcessList[_lfo_on][_funcProcessType]; 207 } 204 _lfo_on = int(sw); 205 _funcProcess = _funcProcessList[_lfo_on][_funcProcessType]; 206 _lfo_timer_step = (sw) ? _lfo_timer_step_ : 0; 208 207 } 209 208 … … 235 234 initializeLFO(param.lfoWaveShape); 236 235 _lfo_timer = (param.lfoFreqStep>0) ? 1 : 0; 237 _lfo_timer_step = param.lfoFreqStep;236 _lfo_timer_step_ = _lfo_timer_step = param.lfoFreqStep; 238 237 setAmplitudeModulation(param.amd); 239 238 setPitchModulation(param.pmd); 240 239 } 240 filterType = param.filterType; 241 241 setSVFilter(param.cutoff, param.resonance, param.far, param.fdr1, param.fdr2, param.frr, param.fdc1, param.fdc2, param.fsc, param.frc); 242 242 for (i=0; i<_operatorCount; i++) { … … 267 267 } 268 268 param.lfoWaveShape = _lfo_waveShape; 269 param.lfoFreqStep = _lfo_timer_step ;269 param.lfoFreqStep = _lfo_timer_step_; 270 270 param.amd = _am_depth; 271 271 param.pmd = _pm_depth; … … 378 378 v = _table.lfo_timerSteps[data]; 379 379 _lfo_timer = (v>0) ? 1 : 0; 380 _lfo_timer_step = v;380 _lfo_timer_step_ = _lfo_timer_step = v; 381 381 break; 382 382 case 25: // A(0)/P(1):7 DEPTH:6-0 for all 8 channels as3/SiOPM/trunk/src/org/si/sion/module/channels/SiOPMChannelKS.as
r4451 r4540 230 230 _ks_seedType = 0; 231 231 _ks_seedIndex = 0; 232 setSiOPMParameters(48, 48, 0, 63, 15, 0, 0, 0, 1, 0, 0, 0, 0, 0);232 setSiOPMParameters(48, 48, 0, 63, 15, 0, 0, 0, 1, 0, 0, 0, -1, 0); 233 233 activeOperator.pgType = SiOPMTable.PG_NOISE_PINK; 234 234 activeOperator.ptType = SiOPMTable.PT_PCM; as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLChannelSetting.as
r4451 r4540 87 87 track.channel = SiOPMChannelManager.newChannel(_channelType, prev, bufferIndex); 88 88 SiOPMChannelManager.deleteChannel(prev); 89 } else { 90 // initialize channel 91 track.channel.initialize(track.channel, bufferIndex); 92 track._resetVolumeOffset(); 89 93 } 90 94 as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLSequencer.as
r4451 r4540 901 901 static private var _tempNumberList :SLLint = SLLint.alloc(0); 902 902 static private var _tempNumberListLast:SLLint = null; 903 static private var _tempWaveTable10:Vector.<Number> = new Vector.<Number>(1024, false); 904 static private var _tempWaveTable5:Vector.<Number> = new Vector.<Number>(32, false); 903 static private var _tempWaveTable:Vector.<Number> = new Vector.<Number>(); 905 904 906 905 … … 908 907 private function _parseTableMacro(dat:String, pfx:String) : Boolean 909 908 { 910 return (__parseTableNumbers(dat, pfx, 8192)!= null);909 return (__parseTableNumbers(dat, pfx, 65536).pointer != null); 911 910 } 912 911 … … 915 914 private function _parseWavMacro(dat:String, pfx:String) : Vector.<Number> 916 915 { 917 var i:int, j:int, jmax:int, v:Number; 918 919 var num:SLLint = __parseTableNumbers(dat, pfx, 32); 920 for (i=0; i<32 && num!=null; i++) { 916 var i:int, imax:int, v:Number; 917 918 var res:* = __parseTableNumbers(dat, pfx, 1024), 919 num:SLLint = res.pointer; 920 for (imax=2; imax<1024; imax<<=1) { 921 if (imax >= res.length) break; 922 } 923 trace(imax, res.length); 924 _tempWaveTable.length = imax; 925 for (i=0; i<imax && num!=null; i++) { 921 926 v = (num.i + 0.5) * 0.0078125; 922 _tempWaveTable 5[j++] = (v>1) ? 1 : (v<-1) ? -1 : v;927 _tempWaveTable[i] = (v>1) ? 1 : (v<-1) ? -1 : v; 923 928 num = num.next; 924 929 } 925 while (i<32) { _tempWaveTable5[i++] = 0; }926 927 return _tempWaveTable 5;930 for (; i<imax; i++) { _tempWaveTable[i] = 0; } 931 932 return _tempWaveTable; 928 933 } 929 934 … … 932 937 private function _parseWavbMacro(dat:String) : Vector.<Number> 933 938 { 934 var ub:int, i:int, j:int, jmax:int, v:Number;939 var ub:int, i:int, imax:int; 935 940 936 941 dat = dat.replace(/\s+/gm, ''); 937 for (i=0; i<32; i++) { 938 ub = (i*2+1 < dat.length) ? int("0x" + dat.substr(i*2,2)) : 0; 939 _tempWaveTable5[j++] = (ub<128) ? (ub * 0.0078125) : ((ub-256) * 0.0078125); 940 } 941 942 return _tempWaveTable5; 942 imax = dat.length >> 1; 943 _tempWaveTable.length = imax; 944 for (i=0; i<imax; i++) { 945 ub = parseInt(dat.substr(i<<1,2), 16); 946 _tempWaveTable[i] = (ub<128) ? (ub * 0.0078125) : ((ub-256) * 0.0078125); 947 } 948 949 return _tempWaveTable; 943 950 } 944 951 … … 972 979 973 980 // parse table numbers 974 private function __parseTableNumbers(dat:String, pfx:String, maxIndex:int) : SLLint981 private function __parseTableNumbers(dat:String, pfx:String, maxIndex:int) : * 975 982 { 976 983 var index:int = 0, i:int, imax:int, j:int, v:int, ti0:int, ti1:int, tr:Number, … … 1057 1064 _tempNumberListLast = last; 1058 1065 if (rep) last.next = rep.next; 1059 // returns length 1060 return _tempNumberList.next; 1066 return {'pointer':_tempNumberList.next, 'length':index, 'repeated':(rep!=null)}; 1061 1067 } 1062 1068 … … 1222 1228 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1223 1229 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1224 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1230 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1225 1231 _currentTrack.setToneEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 1226 1232 return e.next; … … 1233 1239 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1234 1240 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1235 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1241 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1236 1242 _currentTrack.setAmplitudeEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 1237 1243 return e.next; … … 1244 1250 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1245 1251 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1246 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1252 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1247 1253 _currentTrack.setAmplitudeEnvelop(1, _table.getEnvelopTable(idx), _p[1], true); 1248 1254 return e.next; … … 1255 1261 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1256 1262 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1257 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1263 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1258 1264 _currentTrack.setPitchEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 1259 1265 return e.next; … … 1266 1272 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1267 1273 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1268 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1274 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1269 1275 _currentTrack.setNoteEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 1270 1276 return e.next; … … 1277 1283 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1278 1284 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1279 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1285 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1280 1286 _currentTrack.setFilterEnvelop(1, _table.getEnvelopTable(idx), _p[1]); 1281 1287 return e.next; … … 1288 1294 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1289 1295 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1290 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1296 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1291 1297 _currentTrack.setToneEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 1292 1298 return e.next; … … 1299 1305 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1300 1306 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1301 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1307 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1302 1308 _currentTrack.setAmplitudeEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 1303 1309 return e.next; … … 1310 1316 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1311 1317 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1312 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1318 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1313 1319 _currentTrack.setPitchEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 1314 1320 return e.next; … … 1321 1327 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1322 1328 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1323 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1329 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1324 1330 _currentTrack.setNoteEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 1325 1331 return e.next; … … 1332 1338 if (_currentTrack.eventMask & SiMMLTrack.MASK_ENVELOP) return e.next; // check mask 1333 1339 if (_p[1] == int.MIN_VALUE) _p[1] = 1; 1334 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : 255;1340 var idx:int = (_p[0]>=0 && _p[0]<255) ? _p[0] : -1; 1335 1341 _currentTrack.setFilterEnvelop(0, _table.getEnvelopTable(idx), _p[1]); 1336 1342 return e.next; … … 1361 1367 private function _onFilterMode(e:MMLEvent) : MMLEvent 1362 1368 { 1363 _currentTrack.channel.filter Mode = e.data;1369 _currentTrack.channel.filterType = e.data; 1364 1370 return e.next; 1365 1371 } as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTable.as
r4264 r4540 218 218 // operations 219 219 //-------------------------------------------------- 220 /** @private [internal use] reset all user tables */ 221 _sion_internal function resetAllUserTables() : void 222 { 223 } 224 225 220 226 /** Register envelop table. 221 227 * @param index table number refered by @@,na,np,nt,nf,_@@,_na,_np,_nt and _nf. as3/SiOPM/trunk/src/org/si/sion/sequencer/SiMMLTrack.as
r4451 r4540 803 803 _residue = 0; 804 804 _priority = 0; 805 _env_exp = null; 806 _env_tone = null; 807 _env_note = _env_zero_table; 808 _env_pitch = _env_zero_table; 809 _env_filter = null; 810 _env_ma = null; 811 _env_mp = null; 805 812 806 813 // reset envelop tables … … 854 861 } 855 862 856 // sounding now, almost executing this863 // no delay, usually 857 864 if (_trackStartDelay == 0) { 858 865 return bufferingLength; … … 865 872 } 866 873 867 // start sound ing at this buffering874 // start sound in this frame 868 875 var len:int = bufferingLength - _trackStartDelay; 869 876 channel.nop(_trackStartDelay); as3/SiOPM/trunk/src/org/si/sion/utils/SiONPresetVoice.as
r3793 r4540 633 633 voice.gateTime = 0; 634 634 voice.releaseSweep = sw; 635 voice.set LPFEnvelop(cut, res);635 voice.setFilterEnvelop(0, cut, res); 636 636 voice.name = name; 637 637 _categolyList.push(voice); as3/SiOPM/trunk/src/org/si/sion/utils/SiONUtil.as
r4451 r4540 9 9 import flash.media.*; 10 10 import flash.utils.ByteArray; 11 //import mx.utils.Base64Decoder; 11 12 import org.si.sion.module.SiOPMTable; 12 13 import org.si.sion.module.SiOPMWaveTable; … … 116 117 117 118 119 /** extract 2a03's DPCM data.<br/> 120 * DPCM frequency table = [ 121 * 0=k14o2e, 122 * 1=k18o2f+, 123 * 2=k13o2g+, 124 * 3=k16o2a, 125 * 4=k13o2b, 126 * 5=k16o3c+, 127 * 6=k17o3d+, 128 * 7=k14o3e, 129 * 8=k18o3f+, 130 * 9=k16o3a, 131 * 10=k20o3b, 132 * 11=k7o4c+, 133 * 12=k24o4e, 134 * 13=k13o4g+, 135 * 14=k5o4b, 136 * 15=k4o5e] 137 * @param src The DPCM ByteArray data extracting from. 138 * @param initValue initial value of $4011. 139 * @param dst The Vector.<Number> instance to put result. You can pass null to create new Vector.<Number> inside. 140 * @param dstChannelCount channel count of extracted data. 1 for monoral, 2 for stereo. 141 * @return extracted data. 142 */ 143 static public function extractDPCM(src:ByteArray, initValue:int=0, dst:Vector.<Number>=null, dstChannelCount:int=1) : Vector.<Number> 144 { 145 var data:int, i:int, imax:int, j:int, sample:Number, output:int; 146 147 imax = src.length * dstChannelCount * 8; 148 if (dst == null) dst = new Vector.<Number>(); 149 dst.length = imax; 150 151 output = initValue; 152 src.position = 0; 153 for (i=0; i<imax;) { 154 data = src.readUnsignedByte(); 155 for (j=7; j>=0; --j) { 156 if ((data >> j) & 1) if (output<126) output += 2; 157 else if (output>1) output -= 2; 158 sample = (output - 64) * 0.015625; 159 dst[i] = sample; i++; 160 if (dstChannelCount == 2) { dst[i] = sample; i++; } 161 } 162 } 163 164 return dst; 165 } 166 167 118 168 /** extract ADPCM data (YM2151). this algorism is from x68ksound.dll's source code. 169 * _freqTable:Array = [26, 31, 38, 43, 50]; 119 170 * @param src The ADPCM ByteArray data extracting from. 120 171 * @param dst The Vector.<Number> instance to put result. You can pass null to create new Vector.<Number> inside. … … 135 186 var DCT:Vector.<int> = Vector.<int>([-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8]); 136 187 137 imax = src.length * 4;188 imax = src.length * dstChannelCount * 2; 138 189 if (dst == null) dst = new Vector.<Number>(); 139 190 dst.length = imax; … … 154 205 sample = output * 0.0000019073486328125; 155 206 dst[i] = sample; i++; 156 dst[i] = sample; i++;207 if (dstChannelCount == 2) { dst[i] = sample; i++; } 157 208 158 209 r = (data >> 4) & 0x0f; … … 168 219 sample = output * 0.0000019073486328125; 169 220 dst[i] = sample; i++; 170 dst[i] = sample; i++;221 if (dstChannelCount == 2) { dst[i] = sample; i++; } 171 222 } 172 223 … … 183 234 static public function extractYM2608ADPCM(src:ByteArray, dst:Vector.<Number>=null, dstChannelCount:int=1) : Vector.<Number> 184 235 { 185 var data:int, r0:int, r1:int, i:int, imax:int, 236 var data:int, r0:int, r1:int, i:int, imax:int, sample:Number, 186 237 predRate:int = 127, output:int = 0; 187 238 … … 191 242 var puTable:Vector.<int> = Vector.<int>([57,57,57,57,77,102,128,153,57,57,57,57,77,102,128,153]); 192 243 193 imax = src.length * 2;244 imax = src.length * dstChannelCount * 2; 194 245 if (dst == null) dst = new Vector.<Number>(); 195 246 dst.length = imax; … … 203 254 predRate >>= 3; 204 255 output += predRate; 205 dst[i] = output * 0.000030517578125; 256 sample = output * 0.000030517578125; 257 dst[i] = sample; i++; 258 if (dstChannelCount == 2) { dst[i] = sample; i++; } 206 259 predRate *= puTable[r0] 207 260 predRate >>= 6; … … 213 266 else if (predRate < -24576) predRate = -24576; 214 267 } 215 i++;216 268 217 269 predRate *= crTable[r1]; 218 270 predRate >>= 3; 219 271 output += predRate; 220 dst[i] = output * 0.000030517578125; 272 sample = output * 0.000030517578125; 273 dst[i] = sample; i++; 274 if (dstChannelCount == 2) { dst[i] = sample; i++; } 221 275 predRate *= puTable[r1]; 222 276 predRate >>= 6; … … 228 282 else if (predRate < -24576) predRate = -24576; 229 283 } 230 i++;231 284 } 232 285 as3/SiOPM/trunk/src/org/si/sion/utils/SoundClass.as
r4264 r4540 9 9 import flash.display.Loader; 10 10 import flash.events.Event; 11 import flash.events.IOErrorEvent; 11 12 import flash.utils.ByteArray; 12 13 import flash.media.Sound; … … 31 32 ]); 32 33 static private var _footer:Vector.<uint> = Vector.<uint>([ // little endian 33 0x000f133f, 0x00010000, 0x6f530001, 0x43646e75, 0x7373616c, 0x0f0b4400, 0x40000000 , 0x0000000034 0x000f133f, 0x00010000, 0x6f530001, 0x43646e75, 0x7373616c, 0x0f0b4400, 0x40000000 34 35 ]); 36 37 38 static private const _bitRateList:Vector.<int> = Vector.<int>([ 39 0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0,0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0 40 ]); 41 static private const _frequencyList:Vector.<int> = Vector.<int>([44100,48000,32000,0]); 42 43 /** load Sound class from mp3 data. 44 */ 45 static public function loadMP3FromByteArray(bytes:ByteArray, onComplete:Function) : void { 46 var head:uint, version:int, bitrate:int, frequency:int, padding:int, channels:int, frameLength:int; 47 bytes.position = 0; 48 var id:String; 49 if (bytes.readMultiByte(3,"us-ascii") == "ID3") { 50 bytes.position += 3; // slip version and flag 51 bytes.position += ((bytes.readByte()&127)<<21)|((bytes.readByte()&127)<<14)|((bytes.readByte()&127)<<7)|(bytes.readByte()&127); 52 } else { 53 bytes.position -= 3; 54 } 55 var frameCount:int = 0, byteCount:int = 9, headPosition:uint = bytes.position; 56 while (bytes.bytesAvailable) { 57 head = bytes.readUnsignedInt(); 58 if ((uint(head & 0xffe60000)) != 0xffe20000) throw new Error("frame data broken"); // check frameSync & layerIII 59 version = [2,-1,1,0][(head>>19) & 3]; // 0=v1, 1=v2, 2=v2.5 60 bitrate = _bitRateList[((head>>12) & 15) + ((version == 0) ? 0 : 16)]; 61 frequency = _frequencyList[((head>>10) & 3)] >> version; 62 padding = (head>>9) & 1; 63 channels = (((head>>6) & 3) > 2) ? 1 : 2; 64 frameLength = 144000 * bitrate / frequency + padding - 4; 65 byteCount += frameLength; 66 bytes.position += frameLength; 67 } 68 var src:ByteArray = new ByteArray(); 69 src.writeInt(frameCount*1152); 70 src.writeShort(0); 71 src.writeBytes(bytes, headPosition, byteCount); 72 loadPCMFromByteArray(src, onComplete, true, frequency, 16, channels); 73 } 74 75 /** load Sound class from PCM data. 76 */ 77 static public function loadPCMFromByteArray(src:ByteArray, onComplete:Function, compressed:Boolean=false, sampleRate:int=44100, bitRate:int=16, channels:int=2) : void { 78 var size:int = src.length, typeDef:int, 79 bytes:ByteArray = new ByteArray(); 80 typeDef = (compressed) ? 0x20 : 0x30; 81 typeDef |= (channels==2) ? 0x01: 0x00; 82 switch (sampleRate) { 83 case 44100: typeDef |= 0xc; break; 84 case 22050: typeDef |= 0x8; break; 85 case 11025: typeDef |= 0x4; break; 86 case 5512: break; 87 default: throw new Error("sampleRate not valid."); 88 } 89 switch (bitRate) { 90 case 16: typeDef |= 0x2; break; 91 case 8: break; 92 default: throw new Error("bitRate not valid."); 93 } 94 bytes.endian = "littleEndian"; 95 bytes.length = size + 299; 96 bytes.position = 0; 97 _write(_header); 98 bytes.position = 4; 99 bytes.writeUnsignedInt(size + 299); 100 bytes.position = 257; 101 bytes.writeUnsignedInt(size + 7); 102 bytes.position = 263; 103 bytes.writeByte(typeDef); 104 bytes.writeBytes(src); 105 _write(_footer); 106 bytes.writeByte(0); 107 bytes.writeByte(0); 108 bytes.writeByte(0); 109 bytes.position = 0; 110 111 var loader:Loader = new Loader(); 112 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event) : void { 113 var soundClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("SoundClass") as Class; 114 onComplete((soundClass) ? (new soundClass()) as Sound : null); 115 }); 116 loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event) : void { 117 throw new Error(e.toString()); 118 }); 119 loader.loadBytes(bytes); 120 121 function _write(vu:Vector.<uint>) : void { 122 for (var i:int=0; i<vu.length; i++) bytes.writeUnsignedInt(vu[i]); 123 } 124 125 } 35 126 36 127 … … 55 146 for (i=0; i<imax; i++) { bytes.writeShort(samples[i]*32767); } 56 147 _write(_footer); 148 bytes.writeByte(0); 149 bytes.writeByte(0); 150 bytes.writeByte(0); 151 bytes.position = 0; 57 152 58 153 var loader:Loader = new Loader(); 59 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete); 154 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event) : void { 155 trace(loader.content); 156 var soundClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("SoundClass") as Class; 157 onComplete((soundClass) ? (new soundClass()) as Sound : null); 158 }); 159 loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event) : void { 160 throw new Error(e.toString()); 161 }); 60 162 loader.loadBytes(bytes); 61 163 62 164 function _write(vu:Vector.<uint>) : void { for each (var ui:uint in vu) { bytes.writeUnsignedInt(ui); } } 63 64 function _onComplete(e:Event) : void {65 var soundClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("SoundClass") as Class;66 onComplete((soundClass) ? (new soundClass()) as Sound : null);67 }68 165 } 69 166 } as3/SiOPM/trunk/src/org/si/sound/synthesizers/BasicSynth.as
r4451 r4540 62 62 63 63 64 /** filter type (0:lowpass, 1:bandpass, 2:highpass) */ 65 public function set filterType() : int { return _voice.channelParam.filterType; } 66 public function get filterType(t:int) : void { 67 _voice.channelParam.filterType = t; 68 for (i=0; i<imax; i++) { 69 _tracks[i].channel.filterType = t; 70 } 71 } 72 73 74 64 75 /** modulation (low-frequency oscillator) wave shape, 0=saw, 1=square, 2=triangle, 3=random. */ 65 76 public function get lfoWaveShape() : int { return _voice.channelParam.lfoWaveShape; } … … 161 172 // operations 162 173 //---------------------------------------- 163 /** set low-passfilter envelop (same as '@f' command in MML).174 /** set filter envelop (same as '@f' command in MML). 164 175 * @param cutoff LP filter cutoff (0-1) 165 176 * @param resonance LP filter resonance (0-1) … … 173 184 * @param frc LP filter release cutoff (0-1) 174 185 */ 186 public function setFilterEnvelop(filterType:int=0, cutoff:Number=1, resonance:Number=0, far:int=0, fdr1:int=0, fdr2:int=0, frr:int=0, fdc1:Number=1, fdc2:Number=0.5, fsc:Number=0.25, frc:Number=1) : void 187 { 188 _voice.setFilterEnvelop(filterType, cutoff*128, resonance*9, far, fdr1, fdr2, frr, fdc1*128, fdc2*128, fsc*128, frc*128); 189 _voiceUpdateNumber++; 190 } 191 192 193 /** [Please use setFilterEnvelop instead of this function]. This function is for compatibility of old versions. 194 * @param cutoff LP filter cutoff (0-1) 195 * @param resonance LP filter resonance (0-1) 196 * @param far LP filter attack rate (0-63) 197 * @param fdr1 LP filter decay rate 1 (0-63) 198 * @param fdr2 LP filter decay rate 2 (0-63) 199 * @param frr LP filter release rate (0-63) 200 * @param fdc1 LP filter decay cutoff 1 (0-1) 201 * @param fdc2 LP filter decay cutoff 2 (0-1) 202 * @param fsc LP filter sustain cutoff (0-1) 203 * @param frc LP filter release cutoff (0-1) 204 */ 175 205 public function setLPFEnvelop(cutoff:Number=1, resonance:Number=0, far:int=0, fdr1:int=0, fdr2:int=0, frr:int=0, fdc1:Number=1, fdc2:Number=0.5, fsc:Number=0.25, frc:Number=1) : void 176 206 { 177 _voice.setLPFEnvelop(cutoff*128, resonance*9, far, fdr1, fdr2, frr, fdc1*128, fdc2*128, fsc*128, frc*128); 178 _voiceUpdateNumber++; 207 setFilterEnvelop(0, cutoff, resonance, far, fdr1, fdr2, frr, fdc1, fdc2, fsc, frc); 179 208 } 180 209 as3/SiOPM/trunk/src/org/si/sound/synthesizers/DrumMachinePresetVoice.as
r3793 r4540 130 130 voice.channelParam.operatorParam[0].tl = tl; 131 131 voice.releaseSweep = sw; 132 voice.set LPFEnvelop(cut, res);132 voice.setFilterEnvelop(0, cut, res); 133 133 voice.name = name; 134 134 _categolyList.push(voice); as3/SiOPM/trunk/src/org/si/sound/synthesizers/PCMSynth.as
r4264 r4540 44 44 * @param data wave data, Sound or Vector.<Number> can be set, the Sound is extracted inside. 45 45 * @param samplingOctave sampling data's octave (specified octave is as 44.1kHz) 46 * @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 46 47 */ 47 function PCMSynth(data:*=null, samplingOctave:int=5 )48 function PCMSynth(data:*=null, samplingOctave:int=5, isStereoSample:Boolean=false) 48 49 { 49 _defaultPCMData = new SiOPMWavePCMData(data, samplingOctave );50 _defaultPCMData = new SiOPMWavePCMData(data, samplingOctave, isStereoSample); 50 51 _pcmTable = new SiOPMWavePCMTable(); 51 52 _pcmTable.clear(_defaultPCMData); … … 90 91 * @param keyRangeFrom Assigning key range starts from 91 92 * @param keyRangeTo Assigning key range ends at. -1 to set only at the key of argument "keyRangeFrom". 93 * @param isStereoSample stereo flag of sampling data, this argument is only available when data is Vector.<Number>. 92 94 * @return assigned SiOPMWavePCMData. 93 95 */ 94 public function setSample(data:*, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127 ) : SiOPMWavePCMData96 public function setSample(data:*, samplingOctave:int=5, keyRangeFrom:int=0, keyRangeTo:int=127, isStereoSample:Boolean=false) : SiOPMWavePCMData 95 97 { 96 98 var pcmData:SiOPMWavePCMData; … … 99 101 pcmData = _defaultPCMData; 100 102 } else { 101 pcmData = new SiOPMWavePCMData(data, samplingOctave );103 pcmData = new SiOPMWavePCMData(data, samplingOctave, isStereoSample); 102 104 } 103 105 _voiceUpdateNumber++; as3/SiOPM/trunk/src/org/si/sound/synthesizers/PMGuitarSynth.as
r3825 r4540 11 11 12 12 13 /** Physical Modeling Guitar Synthesizer (NOT IMPLEMENTED)13 /** Physical Modeling Guitar Synthesizer 14 14 */ 15 15 public class PMGuitarSynth extends BasicSynth … … 27 27 protected var _plunkVelocity:Number; 28 28 29 /** @private [protected] tl offset by attack rate. */ 30 protected var _tlOffsetByAR:Number; 29 31 30 32 … … 37 39 _voice.pmsTension = t * 63; 38 40 _voiceUpdateNumber++; 39 /* 40 var i:int, imax:int = _tracks.length, ch:SiOPMChannelFM; 41 var i:int, imax:int = _tracks.length, ch:SiOPMChannelKS; 41 42 for (i=0; i<imax; i++) { 42 43 ch = _tracks[i].channel as SiOPMChannelKS; 43 if (ch != null) { 44 ch.operator[0].setAllReleaseRate(_voice.pmsTension); 45 } 44 if (ch != null) ch.setAllReleaseRate(_voice.pmsTension); 46 45 } 47 */48 }49 50 51 /** strength of left hand mute [0-1]. */52 public function get mute() : Number { return _voice.pmsTension * 0.015873015873015872; }53 public function set mute(t:Number) : void {54 _voice.pmsTension = t * 63;55 _voiceUpdateNumber++;56 /*57 var i:int, imax:int = _tracks.length, ch:SiOPMChannelFM;58 for (i=0; i<imax; i++) {59 ch = _tracks[i].channel as SiOPMChannelKS;60 if (ch != null) {61 ch.operator[0].setAllReleaseRate(_voice.pmsTension);62 }63 }64 */65 46 } 66 47 … … 70 51 public function set plunkVelocity(v:Number) : void { 71 52 _plunkVelocity = (v<0) ? 0 : (v>1) ? 1 : v; 72 _voice.channelParam.operatorParam[0].tl = (_plunkVelocity==0) ? 127 : _plunkVelocity * 64;53 _voice.channelParam.operatorParam[0].tl = (_plunkVelocity==0) ? 127 : (_plunkVelocity * 64 - _tlOffsetByAR); 73 54 _voiceUpdateNumber++; 74 55 } 75 56 57 58 /** wave shape of plunk noise. @default 20 (SiOPMTable.PG_NOISE_PINK) */ 59 public function get seedWaveShape() : int { return _voice.channelParam.operatorParam[0].ws; } 60 public function set seedWaveShape(ws:int) : void { 61 _voice.channelParam.operatorParam[0].ws = ws; 62 _voiceUpdateNumber++; 63 } 64 65 66 /** pitch of plunk noise. @default 68 */ 67 public function get seedPitch() : int { return _voice.channelParam.operatorParam[0].fixedPitch; } 68 public function set seedPitch(p:int) : void { 69 _voice.channelParam.operatorParam[0].fixedPitch = p; 70 _voiceUpdateNumber++; 71 } 72 73 74 /** attack time of plunk noise (0-1). */ 75 override public function get attackTime() : Number { 76 var iar:int = _voice.channelParam.operatorParam[0].ar; 77 return (iar > 48) ? 0 : (1 - (iar - 16)* 0.03125); 78 } 79 override public function set attackTime(n:Number) : void { 80 var iar:int = ((1 - n) * 32) + 16; 81 _tlOffsetByAR = n * 16; 82 _voice.channelParam.operatorParam[0].ar = iar; 83 _voice.channelParam.operatorParam[0].tl = (_plunkVelocity==0) ? 127 : (_plunkVelocity * 64 - _tlOffsetByAR); 84 _voiceUpdateNumber++; 85 } 86 87 88 /** release time of guitar synthesizer is equal to (1-tension). */ 89 override public function get releaseTime() : Number { return tension; } 90 override public function set releaseTime(n:Number) : void { tension = 1-n; } 76 91 77 92 … … 85 100 function PMGuitarSynth(tension:Number=0.125) 86 101 { 102 super(); 103 _voice.setPMSGuitar(48, 48, 0, 68, 20, int(tension*63)); 104 attackTime = 0; 105 plunkVelocity = 1; 87 106 } 88 107 … … 92 111 // operation 93 112 //---------------------------------------- 113 /** Set all parameters of phisical modeling synth guitar voice. 114 * @param ar attack rate of plunk energy 115 * @param dr decay rate of plunk energy 116 * @param tl total level of plunk energy 117 * @param fixedPitch plunk noise pitch 118 * @param ws wave shape of plunk 119 * @param tension sustain rate of the tone 120 */ 121 public function setPMSGuitar(ar:int=48, dr:int=48, tl:int=0, fixedPitch:int=68, ws:int=20, tension:int=8) : PMGuitarSynth 122 { 123 _voice.setPMSGuitar(ar, dr, tl, fixedPitch, ws, tension); 124 _voiceUpdateNumber++; 125 return this; 126 } 94 127 } 95 128 }

