Spaces:
Sleeping
Sleeping
| import{_ as J,r as R,c as L,o as d,a as i,w as g,b,d as x,v as Z,F as G,e as Y,t as E,f as T,n as X,g as z,h as W,i as q,j as V,k as P,l as Q,m as $}from"./index-DvfQQ4hm.js";import{B as ee,S as te,m as ne,d as O,r as k,C as _,L as B,a as oe,b as se,c as w,e as H,f as A}from"./bool-store-input-BqSYkTSj.js";import{L as ie,S as re,a as ae,b as F,l as le}from"./loading-dots-Dk5xtdK1.js";const ue=o=>` | |
| #(set-global-staff-size ${o}) | |
| \\paper { | |
| paper-width = ${o*.16}\\cm | |
| paper-height = ${o*.08}\\cm | |
| top-margin = 0 | |
| bottom-margin = 0 | |
| left-margin = 0.2\\cm | |
| right-margin = 0 | |
| } | |
| \\layout | |
| { | |
| indent = 0 | |
| } | |
| {c'1} | |
| `,U=o=>o.replace(/(?:>)[^<>]+lilypond.org(?=<)/g,""),ce={name:"flex-engraver",components:{SourceEditor:ae,StoreInput:te,BoolStoreInput:ee,SheetSimple:re,Loading:ie},data(){return{containerSize:{width:100,height:100,offsetWidth:1215,offsetHeight:495},dragHover:!1,sourceList:[],chosenSourceIndex:0,sourceDirty:!1,gaugeSvgDoc:null,staffSizeRange:{min:10,max:40},containerSvgs:null,containerEngraving:!1,staffSampleSvgMin:null,staffSampleSvgMax:null,fitStaffSize:24,fixStaffSize:!1}},computed:{currentSource(){return this.sourceList[this.chosenSourceIndex]},currentSourceContent(){return this.currentSource&&this.currentSource.content},containerSizeHash(){return`${this.containerSize.width},${this.containerSize.height}`}},async created(){window.$main=this,this.loadSource(),this.lilyParser=await le($(()=>import("./lilypond-CRjqli1b.js"),[],import.meta.url)),console.log("Lilypond parser loaded."),this.updateStaffSamples()},async mounted(){await this.$nextTick(),this.updateContainerSize()},beforeUnmount(){this.checkAndSaveSource()},methods:{updateContainerSize({widthOffset:o=!0}={}){this.containerSize.width=this.$refs.sheetContainer.clientWidth,this.containerSize.height=this.$refs.sheetContainer.clientHeight,o&&(this.containerSize.offsetWidth=this.$refs.sheetContainer.offsetWidth,this.containerSize.offsetHeight=this.$refs.sheetContainer.offsetHeight)},async onDropFile(o){this.dragHover=!1;const e=o.dataTransfer.files[0];if(e)switch(e.type){case"text/x-lilypond":case"text/lilypond-source":const c=await e.readAs("Text"),u=e.name.replace(/\.ly$/,"");this.sourceList.push({name:u,content:c}),this.sourceDirty=!0;break}},removeCurrentSource(){this.sourceList.splice(this.chosenSourceIndex,1),this.chosenSourceIndex=Math.min(this.chosenSourceIndex,this.sourceList.length-1)},loadSource(){localStorage.lotusFlexEngraverSources&&(this.sourceList=JSON.parse(localStorage.lotusFlexEngraverSources),console.log("Source list loaded.")),this.sourceDirty=!1},saveSource(){localStorage.lotusFlexEngraverSources=JSON.stringify(this.sourceList),console.log("Source list saved."),this.sourceDirty=!1},checkAndSaveSource(){this.sourceDirty&&this.saveSource()},async gauge(){const u=new F(await this.lilyParser.parse(this.currentSourceContent)),t=u.globalAttributes();t.staffSize.value=20,t.paperWidth.value.number=1e4,t.paperHeight.value.number=1e3,t.raggedLast.value=!0,t.topMargin.value=0,t.leftMargin.value=0;const s=u.toString();try{const l=await this.engrave(s,{tokenize:!0});this.gaugeSvgDoc=l.svgs[0],console.assert(l.svgs.length===1,"invalid page count:",l);const f=k(l.doc,{StaffToken:A,SheetDocument:H}),S=f.pages[0].systems[0],h=1e4/f.pages[0].viewBox.width/20,v=S.width*h,n=(S.bottom-S.top)*h;t.paperWidth.value.number=2;const y=await this.engrave(u.toString(),{tokenize:!0});console.assert(y.svgs.length===1,"invalid page count:",y);const C=k(y.doc,{StaffToken:A,SheetDocument:H}).pages[0].systems,I=Array(C.length-1).fill(null).map((a,D)=>C[D+1].y-C[D].y),M=Math.max(S.bottom-S.top,...I)*h-n,r=new F(await this.lilyParser.parse(this.currentSourceContent));r.root.appendAssignment("naturalWidth",v),r.root.appendAssignment("naturalHeight",n),r.root.appendAssignment("systemSpacing",M),this.currentSource.content=r.toString(),this.checkAndSaveSource()}catch(l){console.warn("Engraving failed:",l)}},async engrave(o,{tokenize:e}={}){const c=new FormData;c.append("source",o),e&&c.append("tokenize",e);const u=await fetch("/engrave",{method:"POST",body:c});if(!u.ok)throw new Error(await u.text());return u.json()},async fitContainer(){if(!this.lilyParser||!this.currentSourceContent)return null;const o=new F(await this.lilyParser.parse(this.currentSourceContent)),e=o.root.getField("naturalWidth"),c=o.root.getField("naturalHeight"),u=o.root.getField("systemSpacing");if(!e||!c||!u)return console.log("natural size is not set.",e,c),null;const t=e.value,s=c.value,l=u.value+.04,f=o.globalAttributes(),S=this.containerSize.width/_,h=(this.containerSize.height-9)/_,v=m=>f[m].value?f[m].value.number:null,n=v("leftMargin")||B,y=v("rightMargin")||B,N=v("topMargin")||oe,C=v("bottomMargin")||se,I=h-N-C,M=S-n-y;let r=1,a=null;if(this.fixStaffSize){a=this.fitStaffSize;const m=(t-w)*a/(M-w*a);r=Math.ceil(m-.2)}else{for(;r<1e3;++r){const m=I/(s*r+l*(r-1));if(m<this.staffSizeRange.min){Number.isFinite(a)||(a=m),--r,console.log("too samll vertical prefered staff size:",m,r);break}a=Math.min(m,this.staffSizeRange.max);const p=(t-w)*a/(M-w*a);if(p<0){console.warn("Horizontal space too little:",p,M-w*a);return}if(p<r+.2){r=Math.max(Math.round(p),1),console.log("proper xsc:",p,r);break}}if(console.log("systemCount:",r,a),a<=this.staffSizeRange.min){console.warn("Vertical space too little:",a);return}}const D=(t-w)*a/(M-w*a);console.log("horizontalNaturalCount:",D,r);const j=a*(s*r+l*(r-1)),K=Math.max(.9*(h-j)/2,0);if(f.topMargin.value={proto:"NumberUnit",number:K,unit:"\\cm"},r===1){const m=a*t,p=.9*(S-m)/2;p>1&&(f.leftMargin.value={proto:"NumberUnit",number:p,unit:"\\cm"},f.rightMargin.value={proto:"NumberUnit",number:p,unit:"\\cm"})}return f.staffSize.value=a,f.paperWidth.value={proto:"NumberUnit",number:S,unit:"\\cm"},f.paperHeight.value={proto:"NumberUnit",number:h,unit:"\\cm"},f.raggedLast.value=r<=1&&D<.8,this.fixStaffSize||(this.fitStaffSize=a),o.toString()},async renderSheet(){const o=await this.fitContainer();if(!o)return;this.containerEngraving=!0;const e=await this.engrave(o,{tokenize:!1});this.containerSvgs=e.svgs,this.containerSvgs=this.containerSvgs.map(U),this.containerEngraving=!1},async exportScore(){const o=await this.fitContainer();if(!o){console.warn("no source.");return}const e=await this.engrave(o,{tokenize:!0}),c={doc:k(e.doc,{StaffToken:A,SheetDocument:H}),midi:e.midi,hashTable:e.hashTable},u=new Blob([JSON.stringify(c)]);O(URL.createObjectURL(u),"score.json")},async copySource(){const o=await this.fitContainer();navigator.clipboard.writeText(o),console.log("Source copyed.")},async exportSourceList(){const o=JSON.stringify(this.sourceList),e=new Blob([o],{type:"text/plain"});O(URL.createObjectURL(e),"FlexEngraverSources.json")},async delayRenderSheet(){await ne("renderSheet",500)&&this.renderSheet()},async engraveSample(o){const e=ue(o);return(await this.engrave(e)).svgs[0]},async updateStaffSampleMin(){this.staffSampleSvgMin=U(await this.engraveSample(this.staffSizeRange.min))},async updateStaffSampleMax(){this.staffSampleSvgMax=U(await this.engraveSample(this.staffSizeRange.max))},updateStaffSamples(){this.updateStaffSampleMin(),this.updateStaffSampleMax()}},watch:{currentSourceContent(o,e){o&&e!==void 0&&(this.sourceDirty=!0)},async chosenSourceIndex(){this.gaugeSvgDoc=null,this.checkAndSaveSource(),await this.$nextTick(),this.sourceDirty=!1,this.renderSheet()},containerSizeHash:"delayRenderSheet",fixStaffSize(o){o||this.delayRenderSheet()}}},fe=["value"],Se={key:0,class:"gauge-view"},ge={class:"viewer"},me={class:"container-size"},de={key:0,class:"staff-size"},he={class:"adjuster"},pe=["disabled","min","max"],ve={class:"min"},ye={class:"max"};function xe(o,e,c,u,t,s){const l=R("StoreInput"),f=R("BoolStoreInput"),S=R("SheetSimple"),h=R("SourceEditor"),v=R("Loading");return d(),L("div",{class:Q(["flex-engraver",{"drag-hover":t.dragHover}]),onDragover:e[23]||(e[23]=P(n=>t.dragHover=!0,["prevent"])),onDragleave:e[24]||(e[24]=n=>t.dragHover=!1),onDrop:e[25]||(e[25]=P((...n)=>s.onDropFile&&s.onDropFile(...n),["prevent"]))},[i("header",null,[g(x(l,{modelValue:t.containerSize.offsetWidth,"onUpdate:modelValue":e[0]||(e[0]=n=>t.containerSize.offsetWidth=n),localKey:"lotus-flexEngraverContainerWidth"},null,8,["modelValue"]),[[z,!1]]),g(x(l,{modelValue:t.containerSize.offsetHeight,"onUpdate:modelValue":e[1]||(e[1]=n=>t.containerSize.offsetHeight=n),localKey:"lotus-flexEngraverContainerHeight"},null,8,["modelValue"]),[[z,!1]]),g(x(l,{modelValue:t.chosenSourceIndex,"onUpdate:modelValue":e[2]||(e[2]=n=>t.chosenSourceIndex=n),localKey:"lotus-flexEngraverChosenSourceIndex"},null,8,["modelValue"]),[[z,!1]]),g(x(l,{modelValue:t.staffSizeRange.min,"onUpdate:modelValue":e[3]||(e[3]=n=>t.staffSizeRange.min=n),localKey:"lotus-flexEngraverStaffSizeRangeMin"},null,8,["modelValue"]),[[z,!1]]),g(x(l,{modelValue:t.staffSizeRange.max,"onUpdate:modelValue":e[4]||(e[4]=n=>t.staffSizeRange.max=n),localKey:"lotus-flexEngraverStaffSizeRangeMaX"},null,8,["modelValue"]),[[z,!1]]),g(x(l,{modelValue:t.fitStaffSize,"onUpdate:modelValue":e[5]||(e[5]=n=>t.fitStaffSize=n),localKey:"lotus-flexEngraverFitStaffSize"},null,8,["modelValue"]),[[z,!1]]),g(x(f,{modelValue:t.fixStaffSize,"onUpdate:modelValue":e[6]||(e[6]=n=>t.fixStaffSize=n),localKey:"lotus-flexEngraverFixStaffSize"},null,8,["modelValue"]),[[z,!1]]),g(i("select",{class:"source-list","onUpdate:modelValue":e[7]||(e[7]=n=>t.chosenSourceIndex=n)},[(d(!0),L(G,null,Y(t.sourceList,(n,y)=>(d(),L("option",{key:y,value:y},E(n.name),9,fe))),128))],512),[[Z,t.chosenSourceIndex]]),i("span",{class:"dirty",onClick:e[8]||(e[8]=(...n)=>s.saveSource&&s.saveSource(...n))},E(t.sourceDirty?"*":" "),1),i("button",{onClick:e[9]||(e[9]=(...n)=>s.removeCurrentSource&&s.removeCurrentSource(...n))},"🗑"),i("button",{onClick:e[10]||(e[10]=(...n)=>s.gauge&&s.gauge(...n))},"📏"),i("button",{onClick:e[11]||(e[11]=(...n)=>s.renderSheet&&s.renderSheet(...n))},"🎼"),i("button",{onClick:e[12]||(e[12]=(...n)=>s.copySource&&s.copySource(...n)),title:"copy lilypond source"},"⎘"),i("button",{onClick:e[13]||(e[13]=(...n)=>s.exportSourceList&&s.exportSourceList(...n)),title:"export scores json"},"⤓"),t.gaugeSvgDoc?(d(),L("div",Se,[t.gaugeSvgDoc?(d(),T(S,{key:0,documents:[t.gaugeSvgDoc]},null,8,["documents"])):b("",!0)])):b("",!0)]),i("main",null,[s.currentSource?(d(),T(h,{key:0,source:s.currentSource.content,"onUpdate:source":e[14]||(e[14]=n=>s.currentSource.content=n)},null,8,["source"])):b("",!0),i("div",ge,[i("div",{class:"sheet-container",ref:"sheetContainer",style:X({width:`${t.containerSize.offsetWidth}px`,height:`${t.containerSize.offsetHeight}px`}),onMousemove:e[15]||(e[15]=(...n)=>s.updateContainerSize&&s.updateContainerSize(...n))},[t.containerSvgs?(d(),T(S,{key:0,documents:t.containerSvgs},null,8,["documents"])):b("",!0),g(x(v,null,null,512),[[z,t.containerEngraving]])],36),i("div",me,[i("span",null,E(t.containerSize.width),1),e[26]||(e[26]=W(" × ",-1)),i("span",null,E(t.containerSize.height),1)]),t.fitStaffSize?(d(),L("div",de,[i("em",null,E(t.fitStaffSize.toFixed(2)),1),e[27]||(e[27]=W(" pt ",-1)),i("span",he,[g(i("input",{type:"checkbox","onUpdate:modelValue":e[16]||(e[16]=n=>t.fixStaffSize=n),title:"fix staff size"},null,512),[[q,t.fixStaffSize]]),g(i("input",{class:"slider",type:"range",disabled:!t.fixStaffSize,"onUpdate:modelValue":e[17]||(e[17]=n=>t.fitStaffSize=n),min:t.staffSizeRange.min,max:t.staffSizeRange.max,step:"any",onChange:e[18]||(e[18]=(...n)=>s.delayRenderSheet&&s.delayRenderSheet(...n))},null,40,pe),[[V,t.fitStaffSize,void 0,{number:!0}]]),i("span",ve,[g(i("input",{type:"number","onUpdate:modelValue":e[19]||(e[19]=n=>t.staffSizeRange.min=n),onChange:e[20]||(e[20]=(...n)=>s.updateStaffSampleMin&&s.updateStaffSampleMin(...n))},null,544),[[V,t.staffSizeRange.min]]),t.staffSampleSvgMin?(d(),T(S,{key:0,documents:[t.staffSampleSvgMin]},null,8,["documents"])):b("",!0)]),i("span",ye,[g(i("input",{type:"number","onUpdate:modelValue":e[21]||(e[21]=n=>t.staffSizeRange.max=n),onChange:e[22]||(e[22]=(...n)=>s.updateStaffSampleMax&&s.updateStaffSampleMax(...n))},null,544),[[V,t.staffSizeRange.max]]),t.staffSampleSvgMax?(d(),T(S,{key:0,documents:[t.staffSampleSvgMax]},null,8,["documents"])):b("",!0)])])])):b("",!0)])])],34)}const Me=J(ce,[["render",xe]]);export{Me as default}; | |