top.CRLF="\r\n";top.cfgDef={velocity:100,ppqn:480,curChannel:1};if(typeof console=="undefined"||!console){var console={log:function(A){}}}var app={noteDropped:false,noteEntered:false,midiUrl:"",notes:[],hltrID:null,prefLabels:["tempo","gridSnap"],prefs:{},trkCur:1,trkCfg:[],posEnd:0,tplSMFWrap:"MFile 1 #{trkCount} #{ppqn}"+top.CRLF+"MTrk"+top.CRLF+"0 TimeSig 4/4 24 8"+top.CRLF+"0 Tempo #{midiTempo}"+top.CRLF+"0 Meta TrkEnd"+top.CRLF+"TrkEnd"+top.CRLF+"#{txtBody}",tplSMFItem:"MTrk"+top.CRLF+"0 PrCh ch=#{trkChannel} p=#{trkProgram}"+top.CRLF+"#{trkBody}"+top.CRLF+"TrkEnd"+top.CRLF};app.setEvents=function(){try{Element.Events.noteleftclick={base:"click",condition:function(D){var B=$(D.target);var C=(typeof B.hasClass=="function"&&B.hasClass("grid-note")&&D.rightClick==false);return C}};Element.Events.noterightclick={base:"mouseup",condition:function(D){var B=$(D.target);var C=(typeof B.hasClass=="function"&&B.hasClass("grid-note")&&D.rightClick==true);return C}};Element.Events.maprightclick={base:"mouseup",condition:function(D){var B=$(D.target);var C=(typeof B.hasClass=="function"&&B.hasClass("mapBody")&&D.rightClick==true);return C}};$("btnRender").addEvent("click",app.onRender);window.addEvent("contextmenu",commands.contextMenu);window.addEvent("noterightclick",commands.wndRightClick);window.addEvent("noteleftclick",commands.wndLeftClick);window.addEvent("maprightclick",commands.mapRightClick)}catch(A){console.log("setEvents() exception: "+A)}};app.setupNoteEvents=function(D){try{var A=app.prefs.gridSnap?app.prefs.gridSnap:3;for(var C=0;C<D.length;C++){var B=$(D[C]).getProperty("name");this.drags[B]=new Drag.Move($(D[C]),{droppables:".mapMask",grid:{x:A,y:5},onDrop:function(H,J){try{if(!J){var G=$(H).getProperty("name");app.drags[G].cancel();app.resizers[G].cancel();H.style.display="none";H.style.left="";H.style.top="";H.style.width="";$(H).destroy()}else{var F=midiUtil.getNoteLabel(H.style.top);if(F){H.set("text",F)}}app.noteDropped=true;app.noteEntered=false;$clear(app.hltrID);$("hltr").setStyle("display","none");$("hltrNfo").setStyle("display","none")}catch(I){console.log("onDrop() exception",I," @ ",H)}},onEnter:function(F,G){if(G){if(app.hltrID){$clear(app.hltrID)}app.hltrID=commands.hltrDraw.periodical(15,commands,F)}app.noteEntered=false},onLeave:function(F,G){}});this.resizers[B]=$(D[C]).makeResizable({modifiers:{x:"width",y:false},limit:{x:[3,480]},grid:{x:A,y:5},onComplete:function(F){F.style.width=parseInt(F.style.width)-2+"px";app.noteDropped=true;return false}});if($(D[C]).hasClass("dragdrop")){this.resizers[B].detach()}else{if($(D[C]).hasClass("dragresize")){this.drags[B].detach()}}}}catch(E){console.log("app.setupNoteEvents exception: "+E+". "+E.name+" # "+E.message)}};app.init=function(){try{app.prefs=app._getUserPrefs(app.prefs);for(var B=0;B<16;B++){app.trkCfg[B]={title:"",channel:(1+B),patch:0,velocity:top.cfgDef.velocity}}app.trkCur=parseInt($("trkCurrent").value);app.setEvents();app.mapScrLn=parseInt($("MapBody").getWidth())-parseInt($("MapMask").getWidth());var A=$$(".handle")[0];app.slider=new Slider($$(".note-resizer")[0],A,{steps:100,wheel:false,onChange:function(){$("MapBody").setStyle("left",parseInt(app.mapScrLn/100*this.step*(-1))+"px")}});app.slider.set(0);this.notes=$$(".grid-note");this.drags={};this.resizers={};this.setupNoteEvents(this.notes);$("txtR").value="";app.setPlayer()}catch(C){console.log("app.init exception: "+C+". "+C.name+" # "+C.message)}};app.renderTrk=function(B,I){if(typeof I!="number"){var I=1}var F,C,G="",J=[],L=[];if(!B.length){return L}for(var H=0;H<B.length;H++){F=$(B[H]);C=parseInt(F.style.left);var K=F.get("text");var D=(new RegExp("^([a-h])([-+]?)([0-9]+)$","g")).exec(K);if(!D){continue}J[H]={pos_idx:(C/midiUtil.pixelsPerQtr),duration:((parseInt(F.style.width)+2)/midiUtil.pixelsPerQtr),note:(midiUtil.getMidiNote(D.slice(1))),velocity:top.cfgDef.velocity,channel:I};L[L.length]=midiUtil.renderMidiTxtItem(J[H],"on");L[L.length]=midiUtil.renderMidiTxtItem(J[H],"off")}if(L.length){L.sort(midiUtil.eventDataSortCB);var A=(new RegExp("(\\d+)\\sOff","g")).exec(L[L.length-1]);if(A){var E=parseInt(A[1]);if(app.posEnd<E){app.posEnd=E}L[L.length]=((E+120)+" Meta TrkEnd")}}return L};app.onRender=function(){try{console.log("app.onRender() ");var A=$$(".grid-note");if(A.length<1){return }var C=0,F=[],D=[];for(var I=0;I<16;I++){var B=$$(".trk"+(I+1));if(B.length){C++;F[F.length]=I;D[D.length]=B}}var K="";for(var I=0;I<D.length;I++){var G=app.trkCfg[F[I]];var O=app.renderTrk(D[I],G.channel);var J=O.join(top.CRLF);var E={trkChannel:G.channel,trkProgram:G.patch,trkBody:J};K+=Tpl.parse(app.tplSMFItem,E)}var H={trkCount:1+C,ppqn:top.cfgDef.ppqn,txtBody:K};H=app._getUserPrefs(H);H.midiTempo=parseInt(60000000/H.tempo);var M=Tpl.parse(app.tplSMFWrap,H);var N=$("txtR");N.value=M;if(false&&!$("txtRWrap").hasClass("show")){commands.swapClass("txtRWrap",["hide","show"])}commands.getSMF(M)}catch(L){console.log("app.onRender() exception: ",L)}};app._getUserPrefs=function(B){try{var A=$("prefsForm");for(var C=0;(A&&C<app.prefLabels.length);C++){B[app.prefLabels[C]]=A[app.prefLabels[C]].value}return B}catch(D){console.log("app._getUserPrefs() exception: ",D)}};app.onChangeSnapX=function(D){try{app.prefs.gridSnap=D;for(var B in app.resizers){var A=app.resizers[B];if(A){A.options.grid.x=D}}for(var B in app.drags){var C=app.drags[B];if(C){C.options.grid.x=D}}}catch(E){console.log("app.onChangeSnapX() exception: ",E)}this.resizers[B]};app.onChangeTrk=function(D){try{if(10==D){$("trkProgram").setProperty("disabled","disabled")}else{$("trkProgram").removeProperty("disabled")}var A=$$(".ghost");for(var F=0;F<A.length;F++){$(A[F]).removeClass("ghost");$(A[F]).addClass("hide")}var B=$$(".trk"+app.trkCur);for(var F=0;F<B.length;F++){$(B[F]).removeClass("show");$(B[F]).addClass("ghost")}app.trkCur=parseInt(D);var C=$$(".trk"+app.trkCur);for(var F=0;F<C.length;F++){$(C[F]).removeClass("hide");$(C[F]).addClass("show")}$("trkProgram").value=parseInt(app.trkCfg[app.trkCur-1].patch)}catch(E){console.log("app.onChangeTrk() exception: ",E)}};app.onChangePatch=function(A){app.trkCfg[app.trkCur-1].patch=parseInt(A)};app.onChangeTrkTitle=function(B){var A=$("trkCurrent").value;if(10==A){return }$("trkCurrent").options[A-1].text=(A<10?"0"+A:A)+" : "+B};app.setPlayer=function(B){try{if(typeof B=="undefined"||!B){B="http://"+location.host+"/proj/miditools/tmp/welcome.mid"}var C=QT_GenerateOBJECTText_XHTML(B,"160","16","","enablejavascript","true","postdomevents","true","obj#id","movie1","emb#name","movie1","emb#id","movie1embed","controller","true");var A='\r\n<input id="btnGetSMF" onclick="if(app.midiUrl.length){window.open(app.midiUrl);}" type="button" value="get SMF"/>';$("QTWrap").innerHTML="";$("QTWrap").innerHTML=C+A}catch(D){console.log("setPlayer() exception: ",D)}};var commands={moveActions:["dragresize","dragdrop"]};commands.getSMF=function(C){try{var A=$H({plug:"qt",txt:C}).toQueryString();var B={method:"post",url:"http://"+location.host+"/proj/miditools/txt2mid.ajax2.php",data:A,noCache:true,onSuccess:commands.playSMF};var E=new Request(B);E.send(A)}catch(D){console.log("commands.getSMF() exception: ",D)}};commands.playSMF=function(C){try{var B=app.midiUrl="http://"+location.host+C;if(Browser.Engine.presto){app.setPlayer(B)}else{var A=(document.movie1||window.movie1);A.SetURL(B);A.Play()}var D=$("btnGetSMF");if(D.getStyle("display")=="none"){D.style.display="inline"}}catch(E){console.log("commands.playSMF() exception : ",E.name,E.message,E.line,E.stacktrace)}};commands.swapClass=function(C,E){C=$(C);if(E.length){var F=E.length;var D=false;for(var B=0;B<E.length;B++){if(!D&&C.hasClass(E[B])){C.removeClass(E[B]);var A=(((B+1)%F)+F)%F;C.addClass(E[A]);D=true}}}return C};commands.toggleClass=function(B,A){if(B.hasClass(A)){B.removeClass(A)}else{B.addClass(A)}};commands.calcSnap=function(A,C){var E=(A%C);var D=(A-E)/C;var B=((E)?(C-E<=E?(D+1):D):D);return(C*B)};commands.mapRightClick=function(G){try{var C=parseInt($("MapBody").style.left);C=(C?C:0);if(G.page.y<midiUtil.vertRange[0]||G.page.y>midiUtil.vertRange[1]){return }var A=parseInt(app.prefs.gridSnap?app.prefs.gridSnap:12);var F=commands.calcSnap((G.page.x-C),A);var B=parseInt(G.page.y/5)*5;var H=midiUtil.getNoteLabel(B);var I=app.notes.length;var E=app.notes[app.notes.length]=new Element("div",{rel:"","class":("grid-note dragdrop trk"+app.trkCur),name:"note"+I,html:H,styles:{position:"absolute",width:(A-2)+"px",left:F+"px",top:B}});E.inject($("MapBody"));app.setupNoteEvents([E]);commands.hltrDraw(E);(function(){$("hltr").setStyle("display","none");$("hltrNfo").setStyle("display","none")}).delay(1200)}catch(D){console.log("mapRightClick() exception: ",D)}};commands.wndRightClick=function(C){try{var B=$(C.target);C.stop();B=commands.swapClass(B,commands.moveActions);var A=B.getProperty("name");if(B.hasClass("dragdrop")){app.resizers[A].detach();app.drags[A].attach()}else{if(B.hasClass("dragresize")){app.resizers[A].options.handle=false;app.resizers[A].attach();app.drags[A].detach()}}return false}catch(D){console.log("wndRightClick exception: "+D)}};commands.wndLeftClick=function(B){try{var A=$(B.target);if(app.noteDropped){app.noteDropped=false;B.stop();return }commands.toggleClass(A,"active")}catch(C){console.log("wndLeftClick exception: "+C)}};commands.contextMenu=function(A){A.stop()};commands.hltrDraw=function(F){var A=F.getPosition();$("hltr").setStyles({display:"block",left:(A.x)+"px",height:(A.y-1)+"px"});var D=$("MapBody").getPosition();var B=A.x-D.x;var E="";var G=midiUtil.getNoteNumber(A.y);if(F.hasClass("trk10")&&(typeof top.midiDrumset[G]!="undefined")){E=(" : "+top.midiDrumset[G])}if(!isNaN(B)){$("hltrNfo").set("text",B+E)}$("hltrNfo").setStyles({display:"block",left:A.x,width:(E.length?"200px":"24px"),top:"15px"});var C=midiUtil.getNoteLabel(A.y);if(C!=F.get("text")){F.set("text",C)}};commands.gridLoad=function(){try{var F=JSON.decode($("txtIO").value);if(typeof F=="undefined"||(!F)||typeof F.app=="undefined"||!F.app||typeof F.prefs=="undefined"||!F.prefs||typeof F.trkCfg=="undefined"||!F.trkCfg){$("txtIO").value="project file is damaged";return }$("txtR").value="";app.notes=[];for(var B in app.drags){app.drags[B].stop()}for(var B in app.resizers){app.resizers[B].stop()}app.drags={};app.resizers={};app.trkCur=1;app.prefs={};app.trkCfg=[];$("MapBody").empty();app.slider.set(0);app.trkCur=parseInt(F.app.trkCur);app.prefs=F.prefs;app.trkCfg=F.trkCfg;$("tempo").value=F.prefs.tempo;$("trkCurrent").value=parseInt(app.trkCur);$("trkProgram").value=parseInt(app.trkCfg[app.trkCur-1].patch);$("gridSnap").value=parseInt(app.prefs.gridSnap);if(10==app.trkCur){$("trkProgram").setProperty("disabled","disabled")}else{$("trkProgram").removeProperty("disabled")}for(var A=0;A<F.evt.length;A++){var E=F.evt[A];var C=app.notes[app.notes.length]=new Element("div",{rel:"","class":E.attributes.className,name:E.attributes.name,html:E.text,styles:E.styles});if(C.hasClass("ghost")){C.removeClass("ghost");C.addClass("hide")}C.inject($("MapBody"))}app.setupNoteEvents(app.notes)}catch(D){console.log("commands.gridLoad() exception: ",D)}};commands.gridSave=function(){var D=$("MapBody").getChildren();if(D.length){$("txtIO").value="";var B=$("MapBody").getChildren();var F=[];for(var C=0;C<B.length;C++){F[F.length]={text:B[C].get("text"),attributes:{className:B[C].className,rel:"",name:B[C].getProperty("name")},styles:B[C].getStyles("position","left","top","width")}}var E={app:{trkCur:app.trkCur},prefs:(app._getUserPrefs(app.prefs)),trkCfg:app.trkCfg,evt:F};var A=JSON.encode(E);$("txtIO").value=A;var G=JSON.decode(A)}};midiUtil={vertRange:[0,468],pixelsPerStep:5,pixelsPerQtr:48,midiNoteMap:{c:0,d:2,e:4,f:5,g:7,a:9,b:11,h:11},midiNoteRMap:["c","c+","d","d+","e","f","f+","g","g+","a","a+","b"]};midiUtil.getNotePos=function(A){A=parseInt(A);return(A/midiUtil.pixelsPerQtr)};midiUtil.getNoteNumber=function(A){A=parseInt(A);if(A>midiUtil.vertRange[1]||A<midiUtil.vertRange[0]){return }A=midiUtil.vertRange[1]-A;var B=(A%midiUtil.pixelsPerStep)?(Math.ceil(A/midiUtil.pixelsPerStep)-1):(A/midiUtil.pixelsPerStep);return B};midiUtil.getNoteLabel=function(D){D=parseInt(D);if(D>midiUtil.vertRange[1]||D<midiUtil.vertRange[0]){return }D=midiUtil.vertRange[1]-D;var C=(D%midiUtil.pixelsPerStep)?(Math.ceil(D/midiUtil.pixelsPerStep)-1):(D/midiUtil.pixelsPerStep);var A=((C%12)?(Math.ceil(C/12)-1):(parseInt(C/12)));var B=midiUtil.midiNoteRMap[(C%12)]+A;return B};midiUtil.getMidiNote=function(A){var D=0,B=0;try{var C=A[0];var F=A[2];if("+"===A[1]){B++}else{if("-"===A[1]){B--}}D=(12*F)+midiUtil.midiNoteMap[C]+B}catch(E){except(E)}return D};midiUtil.eventDataSortCB=function(E,D){var C=0;var B=E.split(" ");var A=D.split(" ");B[0]=parseInt(B[0]);A[0]=parseInt(A[0]);if(B[0]<A[0]){C=-1}else{if(B[0]>A[0]){C=1}else{if("On"==B[1]){if("Off"==A[1]){C=1}}else{if("Off"==B[1]){if("On"==A[1]){C=-1}}}}}return C};midiUtil.renderMidiTxtItem=function(K,F){var A="";try{var B=top.cfgDef.ppqn;var G=K.pos_idx;var D=K.duration;var J=K.note;var E=K.velocity;var I=K.channel?K.channel:top.cfgDef.curChannel;var L=parseInt(G*top.cfgDef.ppqn)+" On ch="+I+" n="+J+" v="+E;var C=parseInt((G+D)*top.cfgDef.ppqn)+" Off ch="+I+" n="+J+" v="+E;if("on"===F){return L}else{if("off"===F){return C}}return(L+C)}catch(H){console.log("midiUtil.renderMiditxtItem() exception: ",H)}};window.addEvent("domready",app.init.bind(app));