Changeset 38797
- Timestamp:
- 01/17/11 00:17:49 (2 years ago)
- Location:
- lang/actionscript/flmml/trunk/src
- Files:
-
- 2 added
- 17 modified
-
com/txt_nifty/sketch/flmml/FlMML.as (modified) (1 diff)
-
com/txt_nifty/sketch/flmml/IChannel.as (added)
-
com/txt_nifty/sketch/flmml/MChannel.as (modified) (11 diffs)
-
com/txt_nifty/sketch/flmml/MEnvelope.as (modified) (3 diffs)
-
com/txt_nifty/sketch/flmml/MEvent.as (modified) (3 diffs)
-
com/txt_nifty/sketch/flmml/MML.as (modified) (10 diffs)
-
com/txt_nifty/sketch/flmml/MOscFcDpcm.as (modified) (1 diff)
-
com/txt_nifty/sketch/flmml/MOscFcTri.as (modified) (5 diffs)
-
com/txt_nifty/sketch/flmml/MOscGbWave.as (modified) (1 diff)
-
com/txt_nifty/sketch/flmml/MOscMod.as (modified) (1 diff)
-
com/txt_nifty/sketch/flmml/MOscSaw.as (modified) (7 diffs)
-
com/txt_nifty/sketch/flmml/MOscSine.as (modified) (1 diff)
-
com/txt_nifty/sketch/flmml/MOscTriangle.as (modified) (7 diffs)
-
com/txt_nifty/sketch/flmml/MOscWave.as (modified) (1 diff)
-
com/txt_nifty/sketch/flmml/MPolyChannel.as (added)
-
com/txt_nifty/sketch/flmml/MStatus.as (modified) (1 diff)
-
com/txt_nifty/sketch/flmml/MTrack.as (modified) (17 diffs)
-
flmml.mxml (modified) (6 diffs)
-
flmml.swf (modified) (previous)
Legend:
- Unmodified
- Added
- Removed
-
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/FlMML.as
r31399 r38797 59 59 return m_mml.getNowTimeStr(); 60 60 } 61 public function getVoiceCount():int { 62 return m_mml.getVoiceCount(); 63 } 64 public function getMetaTitle():String { 65 return m_mml.getMetaTitle(); 66 } 67 public function getMetaComment():String { 68 return m_mml.getMetaComment(); 69 } 70 public function getMetaArtist():String { 71 return m_mml.getMetaArtist(); 72 } 73 public function getMetaCoding():String { 74 return m_mml.getMetaCoding(); 75 } 61 76 } 62 77 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MChannel.as
r38696 r38797 2 2 import __AS3__.vec.Vector; 3 3 4 public class MChannel {4 public class MChannel implements IChannel { 5 5 private static const LFO_TARGET_PITCH:int = 0; 6 6 private static const LFO_TARGET_AMPLITUDE:int = 1; … … 52 52 private var m_portRate:Number; 53 53 private var m_lastFreqNo:int; 54 55 private var m_slaveVoice:Boolean; // 従属ボイスか? 56 private var m_voiceid:Number; // ボイスID 57 54 58 55 59 public static var PITCH_RESOLUTION:int = 100; … … 101 105 m_portamento = 0; 102 106 m_portRate = 0; 107 m_voiceid = 0; 108 m_slaveVoice = false; 103 109 } 104 110 public static function boot(numSamples:int):void { … … 107 113 s_frequencyLen = s_frequencyMap.length; 108 114 for(i = 0; i < s_frequencyLen; i++) { 109 s_frequencyMap[i] = 440.0 * Math.pow(2.0, (i-69*PITCH_RESOLUTION)/(12 *PITCH_RESOLUTION));115 s_frequencyMap[i] = 440.0 * Math.pow(2.0, (i-69*PITCH_RESOLUTION)/(12.0*PITCH_RESOLUTION)); 110 116 } 111 117 s_volumeLen = s_volumeMap.length; … … 171 177 m_oscMod1.setFrequency(getFrequency(m_freqNo)); 172 178 } 179 public function getNoteNo():int { 180 return m_noteNo; 181 } 182 public function isPlaying():Boolean { 183 return m_envelope1.isPlaying(); 184 } 185 public function getId():Number { 186 return m_voiceid; 187 } 188 public function getVoiceCount():int { 189 return isPlaying() ? 1 : 0; 190 } 191 public function setSlaveVoice(f:Boolean):void { 192 m_slaveVoice = f; 193 } 194 public function noteOnWidthId(noteNo:int, velocity:int, id:Number):void { 195 m_voiceid = id; 196 noteOn(noteNo, velocity); 197 } 173 198 public function noteOn(noteNo:int, velocity:int):void { 174 199 setNoteNo(noteNo, false); … … 195 220 196 221 } 197 public function noteOff():void { 198 m_envelope1.releaseEnvelope(); 199 m_envelope2.releaseEnvelope(); 200 } 222 public function noteOff(noteNo:int):void { 223 if (noteNo < 0 || noteNo == m_noteNo) { 224 m_envelope1.releaseEnvelope(); 225 m_envelope2.releaseEnvelope(); 226 } 227 } 228 public function setSoundOff():void { 229 m_envelope1.soundOff(); 230 m_envelope2.soundOff(); 231 } 201 232 public function close():void { 202 noteOff( );233 noteOff(m_noteNo); 203 234 m_filter.setSwitch(0); 204 235 } … … 209 240 public function setForm(form:int, subform:int):void { 210 241 m_oscMod1 = m_oscSet1.setForm(form); 211 if (form == MOscillator.GB_WAVE) (MOscGbWave)(m_oscSet1.getMod(MOscillator.GB_WAVE)).setWaveNo(subform); 212 //2009.05.10 OffGao ADD 1L addDPCM 213 if (form == MOscillator.FC_DPCM) (MOscFcDpcm)(m_oscSet1.getMod(MOscillator.FC_DPCM)).setWaveNo(subform); 214 if (form == MOscillator.WAVE ) (MOscWave)(m_oscSet1.getMod(MOscillator.WAVE )).setWaveNo(subform); 215 if (form == MOscillator.SINE ) (MOscSine)(m_oscSet1.getMod(MOscillator.SINE)).setWaveNo(subform); 242 m_oscMod1.setWaveNo(subform); 243 // if (form == MOscillator.GB_WAVE) (MOscGbWave)(m_oscSet1.getMod(MOscillator.GB_WAVE)).setWaveNo(subform); 244 // //2009.05.10 OffGao ADD 1L addDPCM 245 // if (form == MOscillator.FC_DPCM) (MOscFcDpcm)(m_oscSet1.getMod(MOscillator.FC_DPCM)).setWaveNo(subform); 246 // if (form == MOscillator.WAVE ) (MOscWave)(m_oscSet1.getMod(MOscillator.WAVE )).setWaveNo(subform); 247 // if (form == MOscillator.SINE ) (MOscSine)(m_oscSet1.getMod(MOscillator.SINE)).setWaveNo(subform); 216 248 } 217 249 public function setEnvelope1Atk(attack:int):void { … … 340 372 m_lastFreqNo = base; 341 373 } 374 public function setVoiceLimit(voiceLimit:int) : void { 375 // 無視 376 } 377 public function reset():void { 378 // 基本 379 setSoundOff(); 380 m_pulseWidth = 0.5; 381 m_voiceid = 0; 382 setForm(0, 0); 383 setDetune(0); 384 setExpression(127); 385 setVelocity(100); 386 setPan(64); 387 setVolMode(0); 388 setNoiseFreq(0.0); 389 // LFO 390 setLFOFMSF(0, 0); 391 m_osc2Connect = 0; 392 m_onCounter = 0; 393 m_lfoTarget = 0; 394 m_lfoDelay = 0; 395 m_lfoDepth = 0.0; 396 m_lfoEnd = 0; 397 // フィルタ 398 setLpfSwtAmt(0, 0); 399 setLpfFrqRes(0, 0); 400 setFormant(-1); 401 // パイプ 402 setInput(0, 0); 403 setOutput(0, 0); 404 setRing(0, 0); 405 setSync(0, 0); 406 // ポルタメント 407 m_portDepth = 0; 408 m_portDepthAdd = 0; 409 m_lastFreqNo = 4800; 410 m_portamento = 0; 411 m_portRate = 0; 412 } 413 public function clearOutPipe(max:int, start:int, delta:int):void { 414 var end:int = start + delta; 415 if (end >= max) end = max; 416 if (m_outMode == 1) { 417 for(var i:int = start; i < end; i++) { 418 s_pipeArr[m_outPipe][i] = 0.0; 419 } 420 } 421 } 342 422 protected function getNextCutoff():Number { 343 423 var cut:Number = m_lpfFrq + m_lpfAmt * m_envelope2.getNextAmplitudeLinear(); … … 355 435 if (end >= max) end = max; 356 436 var key:Number = getFrequency(m_freqNo); 357 if(m_outMode == 1 ){437 if(m_outMode == 1 && m_slaveVoice == false){ 358 438 // @o1 が指定されていれば直接パイプに音声を書き込む 359 439 trackBuffer = s_pipeArr[m_outPipe]; … … 558 638 //trace("output "+m_outPipe); 559 639 pipe = s_pipeArr[m_outPipe]; 560 for(i = start; i < end; i++) { 561 pipe[i] = trackBuffer[i]; 562 } 640 if (m_slaveVoice == false) { 641 for(i = start; i < end; i++) { 642 pipe[i] = trackBuffer[i]; 643 } 644 } 645 else { 646 for(i = start; i < end; i++) { 647 pipe[i] += trackBuffer[i]; 648 } 649 } 563 650 break; 564 651 case 2: // add … … 571 658 }else if(m_outMode == 1){ 572 659 pipe = s_pipeArr[m_outPipe]; 573 for(i = start; i < end; i++) { 574 pipe[i] = 0.0; 575 } 660 if (m_slaveVoice == false) { 661 for(i = start; i < end; i++) { 662 pipe[i] = 0.0; 663 } 664 } 576 665 } 577 666 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MEnvelope.as
r36869 r38797 50 50 } 51 51 public function setRelease(release:Number):void { 52 m_releaseTime = ((release > 0) ? release : (1 / 127)) * MSequencer.RATE44100;52 m_releaseTime = ((release > 0) ? release : (1.0 / 127.0)) * MSequencer.RATE44100; 53 53 // 現在のボリュームなどを設定 54 54 if(m_playing && !m_releasing){ … … 87 87 m_releasing = true; 88 88 m_releaseStep = (m_currentVal / m_releaseTime); 89 } 90 91 public function soundOff():void { 92 releaseEnvelope(); 93 m_playing = false; 89 94 } 90 95 … … 214 219 return m_playing; 215 220 } 221 public function isReleasing():Boolean { 222 return m_releasing; 223 } 216 224 } 217 225 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MEvent.as
r38691 r38797 6 6 private var m_data0:int; 7 7 private var m_data1:int; 8 private var m_tick:uint; 8 9 private var TEMPO_SCALE:Number = 100; // bpm小数点第二位まで有効 9 10 10 public function MEvent( ) {11 public function MEvent(tick:uint) { 11 12 set(MStatus.NOP, 0, 0); 13 setTick(tick); 12 14 } 13 15 … … 50 52 public function setSync(mode:int, pipe:int):void { set(MStatus.SYNC, mode, pipe); } 51 53 public function setDelta(delta:int):void { m_delta = delta; } 54 public function setTick(tick:uint):void { m_tick = tick; } 52 55 public function setPortamento(depth:int, len:int):void { set(MStatus.PORTAMENTO, depth, len); } 53 56 public function setMidiPort(mode:int):void { set(MStatus.MIDIPORT, mode, 0); }; 54 57 public function setMidiPortRate(rate:int):void { set(MStatus.MIDIPORTRATE, rate, 0); }; 55 58 public function setPortBase(base:int):void { set(MStatus.BASENOTE, base, 0); }; 59 public function setPoly(voiceCount:int):void { set(MStatus.POLY, voiceCount, 0); }; 60 public function setResetAll():void { set(MStatus.RESET_ALL, 0, 0); } 61 public function setSoundOff():void { set(MStatus.SOUND_OFF, 0, 0); } 56 62 public function getStatus():int { return m_status; } 57 63 public function getDelta():int { return m_delta; } 64 public function getTick():uint { return m_tick; } 58 65 public function getNoteNo():int { return m_data0; } 59 66 public function getVelocity():int { return m_data1; } … … 97 104 public function getMidiPortRate():int { return m_data0; } 98 105 public function getPortBase():int { return m_data0; } 106 public function getVoiceCount():int { return m_data0; } 99 107 } 100 108 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MML.as
r38691 r38797 28 28 protected var m_beforeNote:int; 29 29 protected var m_portamento:int; 30 protected var m_usingPoly:Boolean; 31 protected var m_polyVoice:int; 32 protected var m_polyForce:Boolean; 33 protected var m_metaTitle:String; 34 protected var m_metaArtist:String; 35 protected var m_metaCoding:String; 36 protected var m_metaComment:String; 30 37 protected static var MAX_PIPE:int = 3; 31 38 protected static var MAX_SYNCSOURCE:int = 3; 39 protected static var MAX_POLYVOICE:int = 64; 32 40 33 41 public function MML() { … … 210 218 case 'p': // Pan 211 219 next(); 212 o = getUInt(64); 213 if (o < 1) o = 1; 214 if (o > 127) o = 127; 215 m_tracks[m_trackNo].recPan(o); 220 if (getChar() == 'l') { // poly mode 221 next(); 222 o = getUInt(m_polyVoice); 223 o = Math.max(0, Math.min(m_polyVoice, o)); 224 m_tracks[m_trackNo].recPoly(o); 225 } 226 else { 227 o = getUInt(64); 228 if (o < 1) o = 1; 229 if (o > 127) o = 127; 230 m_tracks[m_trackNo].recPan(o); 231 } 216 232 break; 217 233 case '\'': // formant filter … … 480 496 case "q": // gate time (rate) 481 497 m_gate = getUInt(m_gate); 482 m_tracks[m_trackNo].recGate( m_gate / m_maxGate);498 m_tracks[m_trackNo].recGate(Number(m_gate) / Number(m_maxGate)); 483 499 break; 484 500 case "<" : // octave shift … … 510 526 warning(MWarning.UNKNOWN_COMMAND, c + c0); 511 527 break; 528 case '[': 529 m_tracks[m_trackNo].recChordStart(); 530 break; 531 case ']': 532 m_tracks[m_trackNo].recChordEnd(); 533 break; 512 534 default: 513 535 { … … 757 779 protected function processMacro():void { 758 780 var i:int; 759 // OCTAVE REVERSE 781 var matched:Array; 782 // OCTAVE REVERSE 760 783 var exp:RegExp = /^#OCTAVE\s+REVERSE\s*$/m; 761 784 if (m_string.match(exp)) { … … 769 792 m_velDir = false; 770 793 } 794 // meta informations 795 { 796 m_metaTitle = findMetaDesc("TITLE" ); // #TITLE 797 m_metaArtist = findMetaDesc("ARTIST" ); // #ARTIST 798 m_metaComment = findMetaDesc("COMMENT"); // #COMMENT 799 m_metaCoding = findMetaDesc("CODING" ); // #CODING 800 findMetaDesc("PRAGMA"); // #PRAGMA 801 } 802 // POLY MODE 803 { 804 var usePoly:String = findMetaDesc("USING\\s+POLY"); 805 usePoly = usePoly.replace("\r", ""); 806 usePoly = usePoly.replace("\n", " "); 807 usePoly = usePoly.toLowerCase(); 808 if (usePoly.length > 0) { 809 var ss:Array = usePoly.split(" "); 810 if (ss.length < 1) { 811 m_usingPoly = false; 812 } 813 else { 814 m_usingPoly = true; 815 m_polyVoice = Math.min(Math.max(1, parseInt(ss[0])), MAX_POLYVOICE); // 1~MAX_POLYVOICE 816 } 817 for (i = 1; i < ss.length; i++) { 818 if (ss[i] == "force") { 819 m_polyForce = true; 820 } 821 } 822 if (m_polyVoice <= 1) { 823 m_usingPoly = false; 824 m_polyForce = false; 825 } 826 // trace("using poly = " + m_usingPoly + ", max voice = " + m_polyVoice + ", force = " + m_polyForce); 827 } 828 } 771 829 // GB WAVE (ex. "#WAV10 0,0123456789abcdeffedcba9876543210") 772 830 { 773 831 exp = /^#WAV10\s.*$/gm; 774 var matched:Array= m_string.match(exp);832 matched = m_string.match(exp); 775 833 if (matched) { 776 834 for(i = 0; i < matched.length; i++) { … … 935 993 } 936 994 } 937 995 996 // 指定されたメタ記述を引き抜いてくる 997 protected function findMetaDesc(sectionName:String):String { 998 var i:int; 999 var matched:Array; 1000 var mm:Array; 1001 var e1:RegExp; 1002 var e2:RegExp; 1003 var tt:String = ""; 1004 1005 e1 = new RegExp("^#" + sectionName + "(\\s*|\\s+(.*))$", "gm"); // global multi-line 1006 e2 = new RegExp("^#" + sectionName + "(\\s*|\\s+(.*))$", "m"); // multi-line 1007 1008 matched = m_string.match(e1); 1009 if (matched) { 1010 m_string = m_string.replace(e1, ""); 1011 for(i = 0; i < matched.length; i++) { 1012 mm = matched[i].match(e2); 1013 if (mm.length >= 3) { 1014 tt += mm[2]; 1015 if (i + 1 < matched.length) { 1016 tt += "\r\n"; 1017 } 1018 } 1019 } 1020 // trace(sectionName + " = " + tt); 1021 } 1022 return tt; 1023 } 1024 938 1025 protected function processComment(str:String):void { 939 1026 m_string = str; … … 1109 1196 m_beforeNote = 0; 1110 1197 m_portamento = 0; 1111 1198 m_usingPoly = false; 1199 m_polyVoice = 1; 1200 m_polyForce = false; 1201 1202 m_metaTitle = ""; 1203 m_metaArtist = ""; 1204 m_metaCoding = ""; 1205 m_metaComment = ""; 1206 1112 1207 processComment(str); 1113 1208 //trace(m_string+"\n\n"); … … 1130 1225 for(var i:int = MTrack.TEMPO_TRACK; i < m_tracks.length; i++) { 1131 1226 if (i > MTrack.TEMPO_TRACK) { 1227 if (m_usingPoly && (m_polyForce || m_tracks[i].findPoly())) { 1228 m_tracks[i].usingPoly(m_polyVoice); 1229 } 1132 1230 m_tracks[i].recRestMSec(2000); 1133 1231 m_tracks[i].recClose(); … … 1187 1285 return m_sequencer.getNowTimeStr(); 1188 1286 } 1287 public function getVoiceCount():int { 1288 var i:int; 1289 var c:int = 0; 1290 for (i = 0; i < m_tracks.length; i++) { 1291 c += m_tracks[i].getVoiceCount(); 1292 } 1293 return c; 1294 } 1295 public function getMetaTitle():String { 1296 return m_metaTitle; 1297 } 1298 public function getMetaComment():String { 1299 return m_metaComment; 1300 } 1301 public function getMetaArtist():String { 1302 return m_metaArtist; 1303 } 1304 public function getMetaCoding():String { 1305 return m_metaCoding; 1306 } 1189 1307 } 1190 1308 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscFcDpcm.as
r35879 r38797 111 111 112 112 } 113 public function setWaveNo(waveNo:int):void {113 public override function setWaveNo(waveNo:int):void { 114 114 if (waveNo >= MAX_WAVE) waveNo = MAX_WAVE-1; 115 115 if (!s_table[waveNo]) waveNo = 0; -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscFcTri.as
r34488 r38797 4 4 public class MOscFcTri extends MOscMod { 5 5 public static const FC_TRI_TABLE_LEN:int = (1 << 5); 6 public static const MAX_WAVE:int = 2; 6 7 protected static var s_init:int = 0; 7 protected static var s_table:Vector.<Number> = new Vector.<Number>(FC_TRI_TABLE_LEN); 8 protected static var s_table:Vector.<Vector.<Number>>; 9 protected var m_waveNo:int; 8 10 9 11 public function MOscFcTri() { 10 12 boot(); 11 13 super(); 14 setWaveNo(0); 12 15 } 13 16 public static function boot():void { 14 17 if (s_init) return; 15 for(var i:int = 0; i < 16; i++) { 16 s_table[i] = s_table[31 - i] = Number(i) * 2.0 / 15.0 - 1.0; 18 s_table = new Vector.<Vector.<Number>>(MAX_WAVE); 19 s_table[0] = new Vector.<Number>(FC_TRI_TABLE_LEN); // @6-0 20 s_table[1] = new Vector.<Number>(FC_TRI_TABLE_LEN); // @6-1 21 var i:int; 22 for(i = 0; i < 16; i++) { 23 s_table[0][i] = s_table[0][31 - i] = Number(i) * 2.0 / 15.0 - 1.0; 17 24 } 25 for(i = 0; i < 32; i++) { 26 s_table[1][i] = (i < 8) ? Number(i)*2.0/14.0 : ((i < 24) ? Number(8-i)*2.0/15.0+1.0: Number(i-24)*2.0/15.0-1.0); 27 } 18 28 s_init = 1; 19 29 } 20 30 public override function getNextSample():Number { 21 var val:Number = s_table[m_ phase >> (PHASE_SFT+11)];31 var val:Number = s_table[m_waveNo][m_phase >> (PHASE_SFT+11)]; 22 32 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 23 33 return val; 24 34 } 25 35 public override function getNextSampleOfs(ofs:int):Number { 26 var val:Number = s_table[ ((m_phase + ofs) & PHASE_MSK) >> (PHASE_SFT+11)];36 var val:Number = s_table[m_waveNo][((m_phase + ofs) & PHASE_MSK) >> (PHASE_SFT+11)]; 27 37 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 28 38 return val; … … 31 41 var i:int; 32 42 for(i = start; i < end; i++) { 33 samples[i] = s_table[m_ phase >> (PHASE_SFT+11)];43 samples[i] = s_table[m_waveNo][m_phase >> (PHASE_SFT+11)]; 34 44 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 35 45 } … … 41 51 resetPhase(); 42 52 } 43 samples[i] = s_table[m_ phase >> (PHASE_SFT+11)];53 samples[i] = s_table[m_waveNo][m_phase >> (PHASE_SFT+11)]; 44 54 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 45 55 } … … 48 58 var i:int; 49 59 for(i = start; i < end; i++) { 50 samples[i] = s_table[m_ phase >> (PHASE_SFT+11)];60 samples[i] = s_table[m_waveNo][m_phase >> (PHASE_SFT+11)]; 51 61 m_phase += m_freqShift; 52 62 syncout[i] = (m_phase > PHASE_MSK); … … 54 64 } 55 65 } 66 public override function setWaveNo(waveNo:int):void { 67 m_waveNo = Math.min(waveNo, MAX_WAVE-1); 68 } 56 69 } 57 70 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscGbWave.as
r34488 r38797 37 37 } 38 38 } 39 public function setWaveNo(waveNo:int):void {39 public override function setWaveNo(waveNo:int):void { 40 40 if (waveNo >= MAX_WAVE) waveNo = MAX_WAVE-1; 41 41 if (!s_table[waveNo]) waveNo = 0; -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscMod.as
r34488 r38797 44 44 m_freqShift = frequency * (PHASE_LEN / MSequencer.RATE44100); 45 45 } 46 public function setWaveNo(waveNo:int):void { 47 } 46 48 } 47 49 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscSaw.as
r38673 r38797 3 3 4 4 public class MOscSaw extends MOscMod { 5 public static const MAX_WAVE:int = 2; 5 6 protected static var s_init:int = 0; 6 protected static var s_table:Vector.<Number> = new Vector.<Number>(TABLE_LEN, true); 7 protected static var s_table:Vector.<Vector.<Number>>; 8 protected var m_waveNo:int; 7 9 8 10 public function MOscSaw() { 9 11 boot(); 10 12 super(); 13 setWaveNo(0); 11 14 } 12 13 15 public static function boot():void { 14 16 if (s_init) return; … … 16 18 var p0:Number; 17 19 var i:int; 20 s_table = new Vector.<Vector.<Number>>(MAX_WAVE); 21 for (i = 0; i < MAX_WAVE; i++) { 22 s_table[i] = new Vector.<Number>(TABLE_LEN, true); 23 } 18 24 for(i = 0, p0 = 0.0; i < TABLE_LEN; i++) { 19 s_table[i] = p0 * 2.0 - 1.0; 25 s_table[0][i] = p0 * 2.0 - 1.0; 26 s_table[1][i] = (p0 < 0.5) ? 2.0 * p0 : 2.0 * p0 - 2.0; 20 27 p0 += d0; 21 28 } … … 23 30 } 24 31 public override function getNextSample():Number { 25 var val:Number = s_table[m_ phase >> PHASE_SFT];32 var val:Number = s_table[m_waveNo][m_phase >> PHASE_SFT]; 26 33 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 27 34 return val; 28 35 } 29 36 public override function getNextSampleOfs(ofs:int):Number { 30 var val:Number = s_table[ ((m_phase + ofs) & PHASE_MSK) >> PHASE_SFT];37 var val:Number = s_table[m_waveNo][((m_phase + ofs) & PHASE_MSK) >> PHASE_SFT]; 31 38 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 32 39 return val; … … 35 42 var i:int; 36 43 for(i = start; i < end; i++) { 37 samples[i] = s_table[m_ phase >> PHASE_SFT];44 samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 38 45 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 39 46 } … … 45 52 resetPhase(); 46 53 } 47 samples[i] = s_table[m_ phase >> PHASE_SFT];54 samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 48 55 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 49 56 } … … 52 59 var i:int; 53 60 for(i = start; i < end; i++) { 54 samples[i] = s_table[m_ phase >> PHASE_SFT];61 samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 55 62 m_phase += m_freqShift; 56 63 syncout[i] = (m_phase > PHASE_MSK); … … 58 65 } 59 66 } 67 public override function setWaveNo(waveNo:int):void { 68 m_waveNo = Math.min(waveNo, MAX_WAVE-1); 69 } 60 70 } 61 71 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscSine.as
r38672 r38797 69 69 } 70 70 } 71 public function setWaveNo(waveNo:int):void {71 public override function setWaveNo(waveNo:int):void { 72 72 if (waveNo >= MAX_WAVE) waveNo = MAX_WAVE-1; 73 73 if (!s_table[waveNo]) waveNo = 0; -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscTriangle.as
r38673 r38797 3 3 4 4 public class MOscTriangle extends MOscMod { 5 public static const MAX_WAVE:int = 2; 5 6 protected static var s_init:int = 0; 6 protected static var s_table:Vector.<Number> = new Vector.<Number>(TABLE_LEN, true); 7 protected static var s_table:Vector.<Vector.<Number>>; 8 protected var m_waveNo:int; 7 9 8 10 public function MOscTriangle() { 9 11 boot(); 10 12 super(); 13 setWaveNo(0); 11 14 } 12 15 public static function boot():void { … … 15 18 var p0:Number; 16 19 var i:int; 20 s_table = new Vector.<Vector.<Number>>(MAX_WAVE); 21 for (i = 0; i < MAX_WAVE; i++) { 22 s_table[i] = new Vector.<Number>(TABLE_LEN, true); 23 } 17 24 for(i = 0, p0 = 0.0; i < TABLE_LEN; i++) { 18 s_table[i] = (p0 < 0.5) ? (1 - 4 * p0) : (1 - 4 * (1 - p0)); 25 s_table[0][i] = (p0 < 0.50) ? (1.0-4.0* p0) : (1.0-4.0*(1.0-p0)); 26 s_table[1][i] = (p0 < 0.25) ? (0.0-4.0* p0) : ((p0 < 0.75) ? (-2.0+4.0* p0) : (4.0-4.0* p0)); 19 27 p0 += d0; 20 28 } … … 22 30 } 23 31 public override function getNextSample():Number { 24 var val:Number = s_table[m_ phase >> PHASE_SFT];32 var val:Number = s_table[m_waveNo][m_phase >> PHASE_SFT]; 25 33 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 26 34 return val; 27 35 } 28 36 public override function getNextSampleOfs(ofs:int):Number { 29 var val:Number = s_table[ ((m_phase + ofs) & PHASE_MSK) >> PHASE_SFT];37 var val:Number = s_table[m_waveNo][((m_phase + ofs) & PHASE_MSK) >> PHASE_SFT]; 30 38 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 31 39 return val; … … 34 42 var i:int; 35 43 for(i = start; i < end; i++) { 36 samples[i] = s_table[m_ phase >> PHASE_SFT];44 samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 37 45 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 38 46 } … … 44 52 resetPhase(); 45 53 } 46 samples[i] = s_table[m_ phase >> PHASE_SFT];54 samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 47 55 m_phase = (m_phase + m_freqShift) & PHASE_MSK; 48 56 } … … 51 59 var i:int; 52 60 for(i = start; i < end; i++) { 53 samples[i] = s_table[m_ phase >> PHASE_SFT];61 samples[i] = s_table[m_waveNo][m_phase >> PHASE_SFT]; 54 62 m_phase += m_freqShift; 55 63 syncout[i] = (m_phase > PHASE_MSK); … … 57 65 } 58 66 } 67 public override function setWaveNo(waveNo:int):void { 68 m_waveNo = Math.min(waveNo, MAX_WAVE-1); 69 } 59 70 } 60 71 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MOscWave.as
r36224 r38797 49 49 s_length[waveNo] =(PHASE_MSK+1) / s_length[waveNo]; 50 50 } 51 public function setWaveNo(waveNo:int):void {51 public override function setWaveNo(waveNo:int):void { 52 52 if (waveNo >= MAX_WAVE) waveNo = MAX_WAVE-1; 53 53 if (!s_table[waveNo]) waveNo = 0; -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MStatus.as
r38691 r38797 37 37 public static const MIDIPORTRATE:int = 34; 38 38 public static const BASENOTE:int = 35; 39 public static const POLY:int = 36; 40 public static const SOUND_OFF:int = 37; 41 public static const RESET_ALL:int = 38; 39 42 } 40 43 } -
lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MTrack.as
r38691 r38797 9 9 private var m_bpm:Number; // beat per minute 10 10 private var m_spt:Number; // samples per tick 11 private var m_ch: MChannel; // channel (instrument)11 private var m_ch:IChannel; // channel (instrument) 12 12 private var m_needle:Number // delta time 13 13 private var m_volume:int; // default volume (max:127) … … 23 23 private var m_totalMSec:uint; 24 24 public var m_signalInterval:int; 25 private var m_polyFound:Boolean; 26 private var m_chordBegin:uint; 27 private var m_chordEnd:uint; 28 private var m_chordMode:Boolean; 25 29 26 30 public function MTrack() { … … 28 32 m_ch = new MChannel(); 29 33 m_needle = 0.0; 34 m_polyFound = false; 30 35 playTempo(DEFAULT_BPM); 31 36 m_volume = 100; 32 recGate(15 /16);37 recGate(15.0/16.0); 33 38 recGate2(0); 34 39 m_events = new Array(); … … 40 45 m_lfoWidth = 0.0; 41 46 m_totalMSec = 0; 47 m_chordBegin = 0; 48 m_chordEnd = 0; 49 m_chordMode = false; 42 50 } 43 51 … … 73 81 break; 74 82 case MStatus.NOTE_OFF: 75 m_ch.noteOff( );83 m_ch.noteOff(e.getNoteNo()); 76 84 break; 77 85 case MStatus.NOTE: … … 169 177 m_ch.setPortBase(e.getPortBase() * 100); 170 178 break; 179 case MStatus.POLY: 180 m_ch.setVoiceLimit(e.getVoiceCount()); 181 break; 182 case MStatus.SOUND_OFF: 183 m_ch.setSoundOff(); 184 break; 185 case MStatus.RESET_ALL: 186 m_ch.reset(); 187 break; 171 188 case MStatus.CLOSE: 172 189 m_ch.close(); … … 219 236 m_delta += delta; 220 237 m_globalTick += delta; 221 } 238 m_chordEnd = Math.max(m_chordEnd, m_globalTick); 239 } 240 241 public function seekChordStart():void { 242 m_globalTick = m_chordBegin; 243 } 222 244 223 245 public function recDelta(e:MEvent):void { … … 227 249 228 250 public function recNote(noteNo:int, len:int, vel:int, keyon:int = 1, keyoff:int = 1):void { 229 var e0:MEvent = new MEvent();251 var e0:MEvent = makeEvent(); 230 252 if (keyon) { 231 253 e0.setNoteOn(noteNo, vel); … … 234 256 e0.setNote(noteNo); 235 257 } 236 recDelta(e0); 237 m_events.push(e0); 238 var e1:MEvent = new MEvent(); 258 pushEvent(e0); 239 259 if (keyoff) { 240 260 var gate:int; … … 242 262 if (gate <= 0) gate = 0; 243 263 seek(gate); 244 e1.setNoteOff(noteNo, vel); 245 recDelta(e1); 246 m_events.push(e1); 264 recNoteOff(noteNo, vel); 247 265 seek(len - gate); 266 if (m_chordMode) { 267 seekChordStart(); 268 } 248 269 } 249 270 else { … … 251 272 } 252 273 } 274 275 public function recNoteOff(noteNo:int, vel:int):void { 276 var e:MEvent = makeEvent(); 277 e.setNoteOff(noteNo, vel); 278 pushEvent(e); 279 } 253 280 254 281 public function recRest(len:int):void { 255 282 seek(len); 256 } 283 if (m_chordMode) { 284 m_chordBegin += len; 285 } 286 } 287 288 public function recChordStart():void { 289 if (m_chordMode == false) { 290 m_chordMode = true; 291 m_chordBegin = m_globalTick; 292 } 293 } 294 295 public function recChordEnd():void { 296 if (m_chordMode) { 297 if (m_events.length > 0) { 298 m_delta = m_chordEnd - m_events[m_events.length-1].getTick(); 299 } 300 else { 301 m_delta = 0; 302 } 303 m_globalTick = m_chordEnd; 304 m_chordMode = false; 305 } 306 } 307 257 308 public function recRestMSec(msec:int):void { 258 309 var len:int = msec * 44100 / (m_spt * 1000); … … 261 312 262 313 public function recVolume(vol:int):void { 263 var e:MEvent = new MEvent(); 264 recDelta(e); 314 var e:MEvent = makeEvent(); 265 315 e.setVolume(vol); 266 m_events.push(e);316 pushEvent(e); 267 317 } 268 318 … … 287 337 //trace("e(TEMPO"+e.getTempo()+") delta="+(globalTick-preGlobalTick)); 288 338 } 339 340 // 新規イベントインスタンスを得る 341 protected function makeEvent():MEvent { 342 var e:MEvent = new MEvent(m_globalTick); 343 e.setDelta(m_delta); 344 m_delta = 0; 345 return e; 346 } 347 348 // イベントを適切に追加する 349 protected function pushEvent(e:MEvent):void { 350 if (m_chordMode == false) { 351 m_events.push(e); 352 } 353 else { 354 insertEvent(e); 355 } 356 } 357 358 // 挿入先に同時間のイベントがあった場合、その後に挿入する 359 protected function insertEvent(e:MEvent):void { 360 var n:int = m_events.length; 361 var preGlobalTick:uint = 0; 362 var globalTick:uint = e.getTick(); 363 var tmpArr:Array = new Array(); 364 for(var i:int; i < n; i++) { 365 var en:MEvent = m_events[i]; 366 var nextTick:uint = preGlobalTick + en.getDelta(); 367 if (nextTick > globalTick) { 368 en.setDelta(nextTick - globalTick); 369 e.setDelta(globalTick - preGlobalTick); 370 m_events.splice(i, 0, e); 371 return; 372 } 373 preGlobalTick = nextTick; 374 } 375 e.setDelta(globalTick-preGlobalTick); 376 m_events.push(e); 377 } 289 378 290 379 public function recTempo(globalTick:uint, tempo:Number):void { 291 var e:MEvent = new MEvent(); 292 recDelta(e); 380 var e:MEvent = new MEvent(globalTick); // makeEvent()は使用してはならない 293 381 e.setTempo(tempo); 294 recGlobal(globalTick,e);382 insertEvent(e); 295 383 } 296 384 297 385 public function recEOT():void { 298 var e:MEvent = new MEvent(); 299 recDelta(e); 386 var e:MEvent = makeEvent(); 300 387 e.setEOT(); 301 m_events.push(e);388 pushEvent(e); 302 389 } 303 390 … … 312 399 313 400 public function recForm(form:int, sub:int):void { 314 var e:MEvent = new MEvent(); 315 recDelta(e); 401 var e:MEvent = makeEvent(); 316 402 e.setForm(form, sub); 317 m_events.push(e);403 pushEvent(e); 318 404 } 319 405 320 406 public function recEnvelope(env:int, attack:int, times:Vector.<int>, levels:Vector.<int>, release:int):void { 321 var e:MEvent = new MEvent(); 322 recDelta(e); 407 var e:MEvent = makeEvent(); 323 408 if (env == 1) e.setEnvelope1Atk(attack); else e.setEnvelope2Atk(attack); 324 m_events.push(e);409 pushEvent(e); 325 410 for(var i:int = 0, pts:int = times.length; i < pts; i++){ 326 e = new MEvent();411 e = makeEvent(); 327 412 if (env == 1) e.setEnvelope1Point(times[i], levels[i]); else e.setEnvelope2Point(times[i], levels[i]); 328 m_events.push(e);329 } 330 e = new MEvent();413 pushEvent(e); 414 } 415 e = makeEvent(); 331 416 if (env == 1) e.setEnvelope1Rel(release); else e.setEnvelope2Rel(release); 332 m_events.push(e);417 pushEvent(e); 333 418 } 334 419 335 420 public function recNoiseFreq(freq:int):void { 336 var e:MEvent = new MEvent(); 337 recDelta(e); 421 var e:MEvent = makeEvent(); 338 422 e.setNoiseFreq(freq); 339 m_events.push(e);423 pushEvent(e); 340 424 } 341 425 342 426 public function recPWM(pwm:int):void { 343 var e:MEvent = new MEvent(); 344 recDelta(e); 427 var e:MEvent = makeEvent(); 345 428 e.setPWM(pwm); 346 m_events.push(e);429 pushEvent(e); 347 430 } 348 431 349 432 public function recPan(pan:int):void { 350 var e:MEvent = new MEvent(); 351 recDelta(e); 433 var e:MEvent = makeEvent(); 352 434 e.setPan(pan); 353 m_events.push(e);435 pushEvent(e); 354 436 } 355 437 356 438 public function recFormant(vowel:int):void { 357 var e:MEvent = new MEvent(); 358 recDelta(e); 439 var e:MEvent = makeEvent(); 359 440 e.setFormant(vowel); 360 m_events.push(e);441 pushEvent(e); 361 442 } 362 443 363 444 public function recDetune(d:int):void { 364 var e:MEvent = new MEvent(); 365 recDelta(e); 445 var e:MEvent = makeEvent(); 366 446 e.setDetune(d); 367 m_events.push(e);447 pushEvent(e); 368 448 } 369 449 370 450 public function recLFO(depth:int, width:int, form:int, subform:int, delay:int, time:int, target:int):void { 371 var e:MEvent = new MEvent(); 372 recDelta(e); 451 var e:MEvent = makeEvent(); 373 452 e.setLFOFMSF(form, subform); 374 m_events.push(e);375 e = new MEvent();453 pushEvent(e); 454 e = makeEvent(); 376 455 e.setLFODPWD(depth, width); 377 m_events.push(e);378 e = new MEvent();456 pushEvent(e); 457 e = makeEvent(); 379 458 e.setLFODLTM(delay, time); 380 m_events.push(e);381 e = new MEvent();459 pushEvent(e); 460 e = makeEvent(); 382 461 e.setLFOTarget(target); 383 m_events.push(e);462 pushEvent(e); 384 463 } 385 464 386 465 public function recLPF(swt:int, amt:int, frq:int, res:int):void { 387 var e:MEvent = new MEvent(); 388 recDelta(e); 466 var e:MEvent = makeEvent(); 389 467 e.setLPFSWTAMT(swt, amt); 390 m_events.push(e);391 e = new MEvent();468 pushEvent(e); 469 e = makeEvent(); 392 470 e.setLPFFRQRES(frq, res); 393 m_events.push(e);471 pushEvent(e); 394 472 } 395 473 396 474 public function recVolMode(m:int): void { 397 var e:MEvent = new MEvent(); 398 recDelta(e); 475 var e:MEvent = makeEvent(); 399 476 e.setVolMode(m); 400 m_events.push(e);477 pushEvent(e); 401 478 } 402 479 403 480 public function recInput(sens:int, pipe:int):void { 404 var e:MEvent = new MEvent(); 405 recDelta(e); 481 var e:MEvent = makeEvent(); 406 482 e.setInput(sens, pipe); 407 m_events.push(e);483 pushEvent(e); 408 484 } 409 485 410 486 public function recOutput(mode:int, pipe:int):void { 411 var e:MEvent = new MEvent(); 412 recDelta(e); 487 var e:MEvent = makeEvent(); 413 488 e.setOutput(mode, pipe); 414 m_events.push(e);489 pushEvent(e); 415 490 } 416 491 417 492 public function recExpression(ex:int):void { 418 var e:MEvent = new MEvent(); 419 recDelta(e); 493 var e:MEvent = makeEvent(); 420 494 e.setExpression(ex); 421 m_events.push(e);495 pushEvent(e); 422 496 } 423 497 424 498 public function recRing(sens:int, pipe:int):void { 425 var e:MEvent = new MEvent(); 426 recDelta(e); 499 var e:MEvent = makeEvent(); 427 500 e.setRing(sens, pipe); 428 m_events.push(e);501 pushEvent(e); 429 502 } 430 503 431 504 public function recSync(mode:int, pipe:int):void { 432 var e:MEvent = new MEvent(); 433 recDelta(e); 505 var e:MEvent = makeEvent(); 434 506 e.setSync(mode, pipe); 435 m_events.push(e);507 pushEvent(e); 436 508 } 437 509 438 510 public function recClose():void { 439 var e:MEvent = new MEvent(); 440 recDelta(e); 511 var e:MEvent = makeEvent(); 441 512 e.setClose(); 442 m_events.push(e);513 pushEvent(e); 443 514 } 444 515 445 516 public function recPortamento(depth:int, len:int):void { 446 var e:MEvent = new MEvent(); 447 recDelta(e); 517 var e:MEvent = makeEvent(); 448 518 e.setPortamento(depth, len); 449 m_events.push(e);519 pushEvent(e); 450 520 } 451 521 452 522 public function recMidiPort(mode:int):void { 453 var e:MEvent = new MEvent(); 454 recDelta(e); 523 var e:MEvent = makeEvent(); 455 524 e.setMidiPort(mode); 456 m_events.push(e);525 pushEvent(e); 457 526 } 458 527 459 528 public function recMidiPortRate(rate:int):void { 460 var e:MEvent = new MEvent(); 461 recDelta(e); 529 var e:MEvent = makeEvent(); 462 530 e.setMidiPortRate(rate); 463 m_events.push(e);531 pushEvent(e); 464 532 } 465 533 466 534 public function recPortBase(base:int):void { 467 var e:MEvent = new MEvent(); 468 recDelta(e); 535 var e:MEvent = makeEvent(); 469 536 e.setPortBase(base); 470 m_events.push(e); 537 pushEvent(e); 538 } 539 540 public function recPoly(voiceCount:int):void { 541 var e:MEvent = makeEvent(); 542 e.setPoly(voiceCount); 543 pushEvent(e); 544 m_polyFound = true; 471 545 } 472 546 … … 491 565 var i:int, j:int; 492 566 var e:MEvent; 493 for(i ; i < ni; i++) {567 for(i = 0; i < ni; i++) { 494 568 e = m_events[i]; 495 569 globalTick += e.getDelta(); … … 510 584 if (maxGlobalTick < trackArr[j].getRecGlobalTick()) maxGlobalTick = trackArr[j].getRecGlobalTick(); 511 585 } 512 e = new MEvent();586 e = makeEvent(); 513 587 e.setClose(); 514 588 recGlobal(maxGlobalTick, e); … … 541 615 return smin.substr(smin.length-2, 2) + ":" + ssec.substr(ssec.length-2, 2); 542 616 } 617 618 // 発声数取得 619 public function getVoiceCount():int { 620 return m_ch.getVoiceCount(); 621 } 622 623 // モノモードへ移行 (再生開始前に行うこと) 624 public function usingMono():void { 625 m_ch = new MChannel(); 626 } 627 628 // ポリモードへ移行 (再生開始前に行うこと) 629 public function usingPoly(maxVoice:int):void { 630 m_ch = new MPolyChannel(maxVoice); 631 } 632 633 // ポリ命令を1回でも使ったか? 634 public function findPoly():Boolean { 635 return m_polyFound; 636 } 543 637 } 544 638 } -
lang/actionscript/flmml/trunk/src/flmml.mxml
r36224 r38797 4 4 xmlns:flmml="com.txt_nifty.sketch.flmml.*" 5 5 layout="absolute" creationComplete="init();"> 6 <!--mx:Style> 7 TextArea { 8 fontFamily: "MS ゴシック"; 9 fontSize: 10pt; 10 } 11 </mx:Style--> 12 6 13 <mx:Script> 7 14 <![CDATA[ … … 16 23 player.addEventListener(MMLEvent.COMPLETE, onComplete); 17 24 player.addEventListener(MMLEvent.BUFFERING, onBuffering); 18 m_timer = new Timer( 1000, 0);25 m_timer = new Timer(250*4, 0); 19 26 m_timer.addEventListener(TimerEvent.TIMER, onSecond); 20 }27 } 21 28 22 29 public function setHTML():void { … … 70 77 m_timer.reset(); 71 78 progress.text = ""; 79 voiceCount.text = ""; 72 80 } 73 81 … … 76 84 m_timer.reset(); 77 85 progress.text = ""; 86 voiceCount.text = ""; 78 87 } 79 88 80 89 public function onBuffering(e:MMLEvent):void { 81 if (e.progress < 100) progress.text = "Buffering " + e.progress + "%"; 82 else { 90 if (e.progress < 100) { 91 progress.text = "Buffering " + e.progress + "%"; 92 voiceCount.text = ""; 93 } else { 83 94 onSecond(e); 84 95 m_timer.start(); … … 88 99 public function onSecond(e:Event):void { 89 100 progress.text = player.getNowTimeStr() + " / " + player.getTotalTimeStr(); 101 // voiceCount.text = "♪" + player.getVoiceCount(); 90 102 } 91 103 ]]> … … 115 127 change="player.setMasterVolume(hSlider.value);"/> 116 128 <mx:Label id="progress" text="" /> 129 <mx:Label id="voiceCount" text="" /> 117 130 </mx:Box> 118 131 <flmml:FlMML id="player" />
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)