Changeset 608 for lang/javascript/jsmml
- Timestamp:
- 10/22/07 14:20:12 (6 years ago)
- Location:
- lang/javascript/jsmml/trunk
- Files:
-
- 10 modified
-
examples/textarea_play.html (modified) (1 diff)
-
src/JSMML.as (modified) (5 diffs)
-
src/JSMML.js (modified) (2 diffs)
-
src/JSMML.swf (modified) (previous)
-
vendor/flmml/com/txt_nifty/sketch/flmml/FlMML.as (modified) (1 diff)
-
vendor/flmml/com/txt_nifty/sketch/flmml/MEnvelope.as (modified) (1 diff)
-
vendor/flmml/com/txt_nifty/sketch/flmml/MML.as (modified) (6 diffs)
-
vendor/flmml/com/txt_nifty/sketch/flmml/MSequencer.as (modified) (5 diffs)
-
vendor/flmml/com/txt_nifty/sketch/flmml/MSignal.as (modified) (6 diffs)
-
vendor/flmml/com/txt_nifty/sketch/flmml/MTrack.as (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/javascript/jsmml/trunk/examples/textarea_play.html
r395 r608 9 9 function play() { 10 10 mml.play(document.getElementById('ta').value); 11 console.log(mml._uNum); 11 12 } 12 13 </script> -
lang/javascript/jsmml/trunk/src/JSMML.as
r469 r608 15 15 16 16 public class JSMML extends Sprite { 17 public static const VERSION:String = '1.0. 1';17 public static const VERSION:String = '1.0.2'; 18 18 19 19 public var mmlPlayers:Object = {}; … … 34 34 35 35 public function create():Number { 36 var uNum:Number = (new Date).getTime(); 36 var uNum:Number = getUNum(); 37 log(uNum); 37 38 mmlPlayers[uNum] = new MMLPlayer(); 38 39 player(uNum).addEventListener(Event.COMPLETE, playerCompleteHandlerBindNum(uNum)); 39 40 return uNum; 41 } 42 43 public function getUNum(uNum:Number = NaN):Number { 44 if (isNaN(uNum)) { 45 uNum = (new Date).getTime(); 46 } else { 47 uNum++; 48 } 49 50 if (mmlPlayers[uNum]) { 51 return getUNum(uNum); 52 } else { 53 return uNum; 54 } 40 55 } 41 56 … … 116 131 m_form = MOscillator.PULSE; 117 132 118 preProcess(str); 133 processMacro(str); 134 m_string = removeWhitespace(m_string); 135 processRepeat(); 136 //trace("string "+m_string); 119 137 process(); 120 138 … … 124 142 m_tracks[i].recEOT(); 125 143 } 144 // play start 126 145 } 127 146 … … 138 157 } 139 158 140 public function stop():void {141 m_sequencer.stop();159 public override function stop():void { 160 super.stop(); 142 161 m_sequencer.disconnectAll(); 143 162 } -
lang/javascript/jsmml/trunk/src/JSMML.js
r447 r608 13 13 })(); 14 14 15 JSMML.VESION = '1.0. 0';15 JSMML.VESION = '1.0.2'; 16 16 JSMML.setSWFVersion = function(v) { JSMML.SWF_VERSION = v }; 17 17 JSMML.SWF_VERSION = 'SWF don\'t load, yet.'; … … 71 71 JSMML.prototype = { 72 72 initialize: function() { 73 this.uNum = this.mmlPlayer._create();74 JSMML.instances[this.uNum] = this;75 73 this.onFinish = function() {}; 76 74 this.pauseNow = false; 77 75 }, 76 uNum: function() { 77 if (!this._uNum) { 78 this._uNum = this.mmlPlayer._create(); 79 JSMML.instances[this._uNum] = this; 80 } 81 return this._uNum; 82 }, 78 83 play: function(_mml) { 79 84 if (!_mml && this.pauseNow) { 80 this.mmlPlayer._play(this.uNum );85 this.mmlPlayer._play(this.uNum()); 81 86 } else { 82 87 if (_mml) this.score = _mml; 83 this.mmlPlayer._play(this.uNum , this.score);88 this.mmlPlayer._play(this.uNum(), this.score); 84 89 } 85 90 this.pauseNow = false; 86 91 }, 87 92 stop: function() { 88 this.mmlPlayer._stop(this.uNum );93 this.mmlPlayer._stop(this.uNum()); 89 94 }, 90 95 pause: function() { 91 96 this.pauseNow = true; 92 this.mmlPlayer._pause(this.uNum );97 this.mmlPlayer._pause(this.uNum()); 93 98 }, 94 99 destroy: function() { 95 this.mmlPlayer._destroy(this.uNum );96 delete JSMML.instances[this.uNum ];100 this.mmlPlayer._destroy(this.uNum()); 101 delete JSMML.instances[this.uNum()]; 97 102 } 98 103 /* 99 104 , 100 105 time: function() { 101 return this.mmlPlayer._time(this.uNum );106 return this.mmlPlayer._time(this.uNum()); 102 107 } 103 108 */ -
lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/FlMML.as
r447 r608 12 12 m_mml.play(mml); 13 13 } 14 15 public function stop():void { 16 m_mml.stop(); 17 } 18 19 public function setMasterVolume(vol:int):void { 20 m_mml.setMasterVolume(vol); 21 } 14 22 } 15 23 } -
lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MEnvelope.as
r447 r608 39 39 public function setSR(sustain:Number, release:Number):void { 40 40 m_sustain = sustain; 41 m_release = (release > 0) ? release : 1;41 m_release = (release > 0) ? release : (1/127); 42 42 } 43 43 -
lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MML.as
r447 r608 1 package com.txt_nifty.sketch.flmml {1 package com.txt_nifty.sketch.flmml { 2 2 import de.popforge.audio.output.*; 3 3 import flash.events.EventDispatcher; 4 import mx.utils.StringUtil; 4 5 5 6 public class MML extends EventDispatcher { … … 153 154 154 155 protected function getCharNext():String { 155 var c:String = ''; 156 do { 157 c = m_string.charAt(m_letter++); 158 } while (c == ' ' && m_letter < m_string.length); 159 return c; 156 return (m_letter < m_string.length) ? m_string.charAt(m_letter++) : ''; 160 157 } 161 158 162 159 protected function getChar():String { 163 var l:int = m_letter; 164 var c:String = ''; 165 do { 166 c = m_string.charAt(l++); 167 } while (c == ' ' && l < m_string.length); 168 return c; 160 return (m_letter < m_string.length) ? m_string.charAt(m_letter) : ''; 169 161 } 170 162 … … 227 219 } 228 220 229 protected function pr eProcess(str:String):void {230 m_string = str.toLowerCase();221 protected function processRepeat():void { 222 m_string = m_string.toLowerCase(); 231 223 m_letter = 0; 232 224 var repeat:Array = new Array(); … … 271 263 } 272 264 265 protected function replaceMacro(str:String, startIndex:int, id:String, val:String):String { 266 var letter:int = startIndex; 267 var top:int = 1; 268 loop : while(letter < str.length) { 269 var c:String = str.charAt(letter++); 270 switch(c) { 271 case '$': 272 if (top) { 273 var last:int = str.indexOf(";", letter); 274 if (last > letter) { 275 var macro:String = str.substring(letter, last); 276 var token:Array = macro.split("="); 277 if (token.length >= 2 && 278 token[0].length >= 1) { 279 var ids:Array = token[0].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); 280 if (ids != null) { 281 if (ids[0] == id) break loop; 282 } 283 letter += token[0].length; 284 } 285 } 286 } 287 if (str.substr(letter, id.length) == id) { 288 str = str.substring(0, letter-1) + val + str.substring(letter + id.length); 289 letter += id.length; 290 } 291 top = 0; 292 break; 293 case ';': 294 top = 1; 295 break; 296 default: 297 if (!StringUtil.isWhitespace(c) && c != ' ') top = 0; 298 break; 299 } 300 } 301 return str; 302 } 303 304 protected function processMacro(str:String):void { 305 m_string = str; 306 m_letter = 0; 307 var top:int = 1; 308 // [a-zA-Z][a-zA-Z0-9#\+\(\)_]* 309 // ex.) $Am =/:4a<ce>a:/; 310 // $EonG# =/:4g#b<e>b:/; 311 // $Gm =/:4gb-<d>b-:/; 312 // $DonF# =/:4f#a<d>a:/; 313 // $Am $EonG# $Gm $DonF# 314 while(m_letter < m_string.length) { 315 var c:String = getCharNext(); 316 switch(c) { 317 case '$': 318 if (top) { 319 var last:int = m_string.indexOf(";", m_letter); 320 if (last > m_letter) { 321 var macro:String = m_string.substring(m_letter, last); 322 var token:Array = macro.split("="); 323 if (token.length >= 2 && 324 token[0].length >= 1) { 325 m_letter--; 326 m_string = remove(m_string, m_letter, last); 327 var id:Array = token[0].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); 328 trace(token[0], id); 329 if (id != null) { 330 //trace("macro:$"+id[0]+"="+token[1]); 331 //trace("rest:"+m_string); 332 if (id[0].length > 0) 333 m_string = replaceMacro(m_string, m_letter, id[0], token[1]); 334 } 335 } 336 } 337 } 338 break; 339 case ';': 340 top = 1; 341 break; 342 default: 343 if (!StringUtil.isWhitespace(c) && c != ' ') top = 0; 344 break; 345 } 346 } 347 } 348 349 static public function removeWhitespace(str:String):String { 350 return str.replace(new RegExp("[ \t\n\r\f]+","g"),""); 351 } 352 353 static public function remove(str:String, start:int, end:int):String { 354 return str.substring(0, start) + str.substring(end+1); 355 } 356 273 357 public function play(str:String):void { 274 358 m_sequencer.disconnectAll(); … … 287 371 m_form = MOscillator.PULSE; 288 372 289 preProcess(str); 373 processMacro(str); 374 m_string = removeWhitespace(m_string); 375 processRepeat(); 376 //trace("string "+m_string); 290 377 process(); 291 378 … … 299 386 } 300 387 388 public function stop():void { 389 m_sequencer.stop(); 390 } 391 392 public function setMasterVolume(vol:int):void { 393 m_sequencer.setMasterVolume(vol); 394 } 395 301 396 public function getGlobalTick():uint { 302 397 return m_sequencer.getGlobalTick(); -
lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MSequencer.as
r447 r608 5 5 6 6 public class MSequencer extends EventDispatcher { 7 public var onSignal:Function ;7 public var onSignal:Function = null; 8 8 9 9 protected static const STATUS_STOP:int = 0; … … 23 23 m_trackArr = new Array(); 24 24 m_volume = 100; 25 m_signalArr = new Array( 4);25 m_signalArr = new Array(3); 26 26 for(var i:int = 0; i < m_signalArr.length; i++) { 27 27 m_signalArr[i] = new MSignal(i); … … 33 33 m_audioBuffer.onComplete = onAudioBufferComplete; 34 34 m_status = STATUS_STOP; 35 m_signalInterval = 96 /4;35 m_signalInterval = 96; 36 36 } 37 37 … … 42 42 } 43 43 44 public function pause():void {45 m_audioBuffer.stop();46 m_status = STATUS_PLAY;47 }48 49 44 public function stop():void { 50 45 m_audioBuffer.stop(); 51 46 m_status = STATUS_STOP; 52 47 } 48 49 public function setMasterVolume(vol:int):void { 50 m_volume = vol; 51 } 53 52 54 53 public function isPlaying():Boolean { … … 103 102 } 104 103 } 105 var mvol:Number = m_volume * (0. 5/ 127.0);104 var mvol:Number = m_volume * (0.4 / 127.0); 106 105 for(i = 0; i < sLen; i++) { 107 106 sample = samples[i]; -
lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MSignal.as
r469 r608 11 11 protected var m_timer:Timer; 12 12 protected var m_func:Function; 13 protected var m_preTime:Number; 13 14 14 public function MSignal(id:int, maxEachBuffer:int = 32) {15 public function MSignal(id:int, maxEachBuffer:int = 60) { 15 16 m_id = id; 16 17 m_msArr = new Array(maxEachBuffer); … … 40 41 41 42 public function reset():void { 43 // flush 44 m_timer.reset(); 45 if (m_func != null) { 46 while(m_msArr[m_ptr] >= 0) { 47 //trace("id:"+m_id+" ns:"+m_msArr[m_ptr]+" ptr:"+m_ptr+" gt:"+m_gtArr[m_ptr]+"(flush)"); 48 m_func(m_gtArr[m_ptr], m_evArr[m_ptr]); 49 m_ptr++; 50 } 51 } 52 // reset 42 53 m_ptr = 0; 43 54 m_msArr[0] = -1; … … 45 56 46 57 public function start():void { 58 m_preTime = new Date().getTime(); 47 59 m_ptr = 0; 48 60 next(); … … 50 62 51 63 protected function onSignal(timerEvent:TimerEvent):void { 64 //trace("id:"+m_id+" ns:"+m_msArr[m_ptr]+" ptr:"+m_ptr+" gt:"+m_gtArr[m_ptr]); 52 65 if (m_func != null) m_func(m_gtArr[m_ptr], m_evArr[m_ptr]); 66 var time:Number = new Date().getTime(); 67 var over:Number = (time - m_preTime) - m_msArr[m_ptr]; 68 m_preTime = time; 53 69 m_ptr++; 54 next(); 70 if (m_ptr < m_gtArr.length) { 71 // adjust 72 var i:int = m_ptr; 73 while (over > 0 && m_msArr[i] >= 0) { 74 if (m_msArr[i] >= over) { 75 m_msArr[i] -= over; 76 break; 77 } 78 else { 79 over -= m_msArr[i]; 80 m_msArr[i] = 0; 81 } 82 i++; 83 } 84 next(); 85 } 55 86 } 56 87 … … 58 89 var ns:int = m_msArr[m_ptr]; 59 90 if (ns > 0) { 60 //trace("id:"+m_id+" ns:"+ns+" ptr:"+m_ptr+" gt:"+m_gtArr[m_ptr]);61 91 m_timer.reset(); 62 92 m_timer.delay = ns; … … 66 96 } 67 97 else if (ns == 0) { 68 //trace("id:"+m_id+" ns:0 ptr:"+m_ptr+" gt:"+m_gtArr[m_ptr]); 69 while(ns == 0) { 70 if (m_func != null) m_func(m_gtArr[m_ptr], m_evArr[m_ptr]); 71 m_ptr++; 72 ns = m_msArr[m_ptr]; 73 if (ns == 0) 74 return; 75 } 98 onSignal(null); 76 99 } 77 100 } -
lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MTrack.as
r447 r608 1 1 package com.txt_nifty.sketch.flmml { 2 import de.popforge.audio.output.*;3 4 public class MTrack {5 private var m_bpm:Number;// beat per minute6 private var m_spt:Number;// samples per tick7 private var m_ch:MChannel;// channel (instrument)8 private var m_needle:Number// delta time9 private var m_volume:int; // default volume(max:127)10 private var m_gate:Number;// default gate time (max:1.0)11 private var m_events:Array;//12 private var m_pointer:int;// current event no.13 private var m_delta:int;14 private var m_isEnd:int;15 private var m_globalTick:uint;16 private var m_signalCnt:int;17 publicvar m_signalInterval:int;18 19 public function MTrack() {20 m_isEnd= 0;21 m_ch= new MChannel();22 m_needle= 0.0;23 playTempo(120);24 m_volume= 100;25 m_gate= 15/16;26 m_events= new Array();27 m_pointer = 0;28 m_delta = 0;29 m_globalTick = 0;30 m_signalInterval = 96/4; // (quater note = 96ticks)31 m_signalCnt = 0;32 }33 34 public function onAudioBufferComplete(samples:Array, signal:MSignal = null):void {35 var startCnt:int = m_signalCnt;36 if (signal != null) signal.reset();37 var sLen:int = samples.length;38 // first signal39 if (m_globalTick == 0 && signal != null) {40 signal.add(0, 0, 0);41 }42 for (var i:int = 0; i < sLen;) {43 // exec events44 var exec:int = 0;45 var eLen:int = m_events.length;46 var e:MEvent;47 var delta:Number;48 do {49 exec = 0;50 if (m_pointer < eLen) {51 e = m_events[m_pointer];52 delta = e.getDelta() * m_spt;53 if (m_needle >= delta) {54 //trace(m_pointer+"/global:"+(int)(m_globalTick/m_spt)+"/status:"+e.getStatus()+"/delta:"+delta+"-"+e.getDelta()+"/noteNo:"+e.getNoteNo());55 exec = 1;56 switch(e.getStatus()) {57 case MStatus.NOTE_ON:58 m_ch.noteOn(MEvent.getFrequency(e.getNoteNo()), e.getVelocity());59 break;60 case MStatus.NOTE_OFF:61 m_ch.noteOff();62 break;63 case MStatus.NOTE:64 m_ch.setFrequency(MEvent.getFrequency(e.getNoteNo()));65 break;66 case MStatus.VOLUME:67 break;68 case MStatus.TEMPO:69 playTempo(e.getTempo());70 break;71 case MStatus.FORM:72 m_ch.setForm(e.getForm());73 break;74 case MStatus.ENVELOPE_AD:75 m_ch.setEnvelopeAD(e.getEnvelopeA(), e.getEnvelopeD());76 break;77 case MStatus.ENVELOPE_SR:78 m_ch.setEnvelopeSR(e.getEnvelopeS(), e.getEnvelopeR());79 break;2 import de.popforge.audio.output.*; 3 4 public class MTrack { 5 private var m_bpm:Number; // beat per minute 6 private var m_spt:Number; // samples per tick 7 private var m_ch:MChannel; // channel (instrument) 8 private var m_needle:Number // delta time 9 private var m_volume:int; // default volume (max:127) 10 private var m_gate:Number; // default gate time (max:1.0) 11 private var m_events:Array; // 12 private var m_pointer:int; // current event no. 13 private var m_delta:int; 14 private var m_isEnd:int; 15 private var m_globalTick:uint; 16 private var m_signalCnt:int; 17 public var m_signalInterval:int; 18 19 public function MTrack() { 20 m_isEnd = 0; 21 m_ch = new MChannel(); 22 m_needle = 0.0; 23 playTempo(120); 24 m_volume = 100; 25 m_gate = 15/16; 26 m_events = new Array(); 27 m_pointer = 0; 28 m_delta = 0; 29 m_globalTick = 0; 30 m_signalInterval = 96/4; // (quater note = 96ticks) 31 m_signalCnt = 0; 32 } 33 34 public function onAudioBufferComplete(samples:Array, signal:MSignal = null):void { 35 var startCnt:int = m_signalCnt; 36 if (signal != null) signal.reset(); 37 var sLen:int = samples.length; 38 // first signal 39 if (m_globalTick == 0 && signal != null) { 40 signal.add(0, 0, 0); 41 } 42 for (var i:int = 0; i < sLen;) { 43 // exec events 44 var exec:int = 0; 45 var eLen:int = m_events.length; 46 var e:MEvent; 47 var delta:Number; 48 do { 49 exec = 0; 50 if (m_pointer < eLen) { 51 e = m_events[m_pointer]; 52 delta = e.getDelta() * m_spt; 53 if (m_needle >= delta) { 54 //trace(m_pointer+"/global:"+(int)(m_globalTick/m_spt)+"/status:"+e.getStatus()+"/delta:"+delta+"-"+e.getDelta()+"/noteNo:"+e.getNoteNo()); 55 exec = 1; 56 switch(e.getStatus()) { 57 case MStatus.NOTE_ON: 58 m_ch.noteOn(MEvent.getFrequency(e.getNoteNo()), e.getVelocity()); 59 break; 60 case MStatus.NOTE_OFF: 61 m_ch.noteOff(); 62 break; 63 case MStatus.NOTE: 64 m_ch.setFrequency(MEvent.getFrequency(e.getNoteNo())); 65 break; 66 case MStatus.VOLUME: 67 break; 68 case MStatus.TEMPO: 69 playTempo(e.getTempo()); 70 break; 71 case MStatus.FORM: 72 m_ch.setForm(e.getForm()); 73 break; 74 case MStatus.ENVELOPE_AD: 75 m_ch.setEnvelopeAD(e.getEnvelopeA(), e.getEnvelopeD()); 76 break; 77 case MStatus.ENVELOPE_SR: 78 m_ch.setEnvelopeSR(e.getEnvelopeS(), e.getEnvelopeR()); 79 break; 80 80 case MStatus.NOISE_FREQ: 81 81 m_ch.setNoiseFreq(e.getNoiseFreq()); … … 84 84 m_ch.setPWM(e.getPWM()); 85 85 break; 86 case MStatus.EOT:87 m_ch.noteOff();88 m_isEnd = 1;89 break;90 case MStatus.NOP:91 break;92 default:93 break;94 }95 m_needle -= delta;96 m_pointer++;97 }98 }99 } while(exec);100 101 // create a short wave102 var di:int;103 if (m_pointer < eLen) {104 e = m_events[m_pointer];105 delta = e.getDelta() * m_spt;106 di = Math.ceil(delta - m_needle);107 if (i + di >= sLen) di = sLen - i;108 m_needle += di;109 m_ch.getSamples(samples, i, di);110 i += di;111 }112 else {113 break;114 }115 116 // periodic signal117 if (signal != null) {118 m_signalCnt += di;119 var intervalSample:int = int(m_signalInterval * m_spt);120 while (m_signalCnt >= intervalSample) {121 m_globalTick += m_signalInterval;122 signal.add(int((intervalSample - startCnt) * (1000.0/44100.0)), m_globalTick, 0);123 m_signalCnt -= intervalSample;124 startCnt = 0;125 }126 }127 }128 if (signal != null) signal.terminate();129 }130 131 public function seek(delta:int):void {132 m_delta += delta;133 }134 135 public function recDelta(e:MEvent):void {136 e.setDelta(m_delta);137 m_delta = 0;138 }139 140 public function recNote(noteNo:int, len:int, vel:int, keyon:int = 1, keyoff:int = 1):void {141 var e0:MEvent = new MEvent();142 if (keyon) {143 e0.setNoteOn(noteNo, vel);144 }145 else {146 e0.setNote(noteNo);147 }148 recDelta(e0);149 m_events.push(e0);150 var e1:MEvent = new MEvent();151 if (keyoff) {152 var gate:int = (int)(len * m_gate);153 seek(gate);154 e1.setNoteOff(noteNo, vel);155 recDelta(e1);156 m_events.push(e1);157 seek(len - gate);158 }159 else {160 seek(len);161 }162 }163 164 public function recRest(len:int):void {165 seek(len);166 }167 168 public function recVolume(vol:int):void {169 var e:MEvent = new MEvent();170 recDelta(e);171 e.setVolume(vol);172 m_events.push(e);173 }174 175 public function recTempo(tempo:Number):void {176 var e:MEvent = new MEvent();177 recDelta(e);178 e.setTempo(tempo);179 m_events.push(e);180 }181 182 public function recEOT():void {183 var e:MEvent = new MEvent();184 recDelta(e);185 e.setEOT();186 m_events.push(e);187 }188 189 public function recGate(gate:Number):void {190 m_gate = gate;191 }192 193 public function recForm(form:int):void {194 var e:MEvent = new MEvent();195 recDelta(e);196 e.setForm(form);197 m_events.push(e);198 }199 200 public function recEnvelope(attack:int, decay:int, sustain:int, release:int):void {201 var e:MEvent = new MEvent();202 recDelta(e);203 e.setEnvelopeAD(attack, decay);204 m_events.push(e);205 e = new MEvent();206 e.setEnvelopeSR(sustain, release);207 m_events.push(e);208 }86 case MStatus.EOT: 87 m_ch.noteOff(); 88 m_isEnd = 1; 89 break; 90 case MStatus.NOP: 91 break; 92 default: 93 break; 94 } 95 m_needle -= delta; 96 m_pointer++; 97 } 98 } 99 } while(exec); 100 101 // create a short wave 102 var di:int; 103 if (m_pointer < eLen) { 104 e = m_events[m_pointer]; 105 delta = e.getDelta() * m_spt; 106 di = Math.ceil(delta - m_needle); 107 if (i + di >= sLen) di = sLen - i; 108 m_needle += di; 109 m_ch.getSamples(samples, i, di); 110 i += di; 111 } 112 else { 113 break; 114 } 115 116 // periodic signal 117 if (signal != null) { 118 m_signalCnt += di; 119 var intervalSample:int = int(m_signalInterval * m_spt); 120 while (m_signalCnt >= intervalSample) { 121 m_globalTick += m_signalInterval; 122 signal.add(int((intervalSample - startCnt) * (1000.0/44100.0)), m_globalTick, 0); 123 m_signalCnt -= intervalSample; 124 startCnt = 0; 125 } 126 } 127 } 128 if (signal != null) signal.terminate(); 129 } 130 131 public function seek(delta:int):void { 132 m_delta += delta; 133 } 134 135 public function recDelta(e:MEvent):void { 136 e.setDelta(m_delta); 137 m_delta = 0; 138 } 139 140 public function recNote(noteNo:int, len:int, vel:int, keyon:int = 1, keyoff:int = 1):void { 141 var e0:MEvent = new MEvent(); 142 if (keyon) { 143 e0.setNoteOn(noteNo, vel); 144 } 145 else { 146 e0.setNote(noteNo); 147 } 148 recDelta(e0); 149 m_events.push(e0); 150 var e1:MEvent = new MEvent(); 151 if (keyoff) { 152 var gate:int = (int)(len * m_gate); 153 seek(gate); 154 e1.setNoteOff(noteNo, vel); 155 recDelta(e1); 156 m_events.push(e1); 157 seek(len - gate); 158 } 159 else { 160 seek(len); 161 } 162 } 163 164 public function recRest(len:int):void { 165 seek(len); 166 } 167 168 public function recVolume(vol:int):void { 169 var e:MEvent = new MEvent(); 170 recDelta(e); 171 e.setVolume(vol); 172 m_events.push(e); 173 } 174 175 public function recTempo(tempo:Number):void { 176 var e:MEvent = new MEvent(); 177 recDelta(e); 178 e.setTempo(tempo); 179 m_events.push(e); 180 } 181 182 public function recEOT():void { 183 var e:MEvent = new MEvent(); 184 recDelta(e); 185 e.setEOT(); 186 m_events.push(e); 187 } 188 189 public function recGate(gate:Number):void { 190 m_gate = gate; 191 } 192 193 public function recForm(form:int):void { 194 var e:MEvent = new MEvent(); 195 recDelta(e); 196 e.setForm(form); 197 m_events.push(e); 198 } 199 200 public function recEnvelope(attack:int, decay:int, sustain:int, release:int):void { 201 var e:MEvent = new MEvent(); 202 recDelta(e); 203 e.setEnvelopeAD(attack, decay); 204 m_events.push(e); 205 e = new MEvent(); 206 e.setEnvelopeSR(sustain, release); 207 m_events.push(e); 208 } 209 209 210 210 public function recNoiseFreq(freq:int):void { … … 222 222 } 223 223 224 public function isEnd():int {225 return m_isEnd;226 }227 228 private function playTempo(bpm:Number):void {229 m_bpm = bpm;230 var tps:Number = m_bpm * 96.0 / 60.0; // ticks per second (quater note = 96ticks)231 m_spt = 44100.0 / tps;// samples per tick232 //trace("spt:"+m_spt)233 }234 }224 public function isEnd():int { 225 return m_isEnd; 226 } 227 228 private function playTempo(bpm:Number):void { 229 m_bpm = bpm; 230 var tps:Number = m_bpm * 96.0 / 60.0; // ticks per second (quater note = 96ticks) 231 m_spt = 44100.0 / tps; // samples per tick 232 //trace("spt:"+m_spt) 233 } 234 } 235 235 }
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)