UNPKG

sus-stringify

Version:

A SUS (Sliding Universal Score) stringifier.

3 lines (2 loc) 3.62 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),"function"==typeof SuppressedError&&SuppressedError;class t extends Error{constructor(t,e){super(`Notes are not aligned correctly, with gcd ${t}. Note ticks: ${e.join(", ")}`),this.name="InvalidAlignmentError",this.gcdValue=t,this.noteTicks=e}}var e;function r(t,e){return t<e?r(e,t):0===e?t:r(e,t%e)}class o extends Map{constructor(t){super(),this.generateDefault=t}get(t){const e=super.get(t);if(void 0===e){const e=this.generateDefault();return super.set(t,e),e}return e}}class s{constructor(){e.set(this,void 0),function(t,e,r,o,s){if("m"===o)throw new TypeError("Private method is not writable");if("a"===o&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");"a"===o?s.call(t,r):s?s.value=r:e.set(t,r)}(this,e,[...Array(36).keys()].map((t=>[t,[0,0]])),"f")}generateChannel(t,r){const o=function(t,e,r,o){if("a"===r&&!o)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!o:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?o:"a"===r?o.call(t):o?o.value:e.get(t)}(this,e,"f").find((([,[e,o]])=>0===e&&0===o||r<e||o<t));if(!o)throw new Error("No more channel available.");return o[1]=[t,r],o[0]}}function n(e,n="This file was generated by sus-js v1.1.0"){var a;const{metadata:i,bpms:c,taps:u,directionals:l,slides:p,barLengths:f}=e;let h=480;const d=[];d.push(n);for(const[t,e]of Object.entries(i))if("requests"!==t)d.push(`#${t.toUpperCase()} ${"number"==typeof e?e:(w=e,`"${w}"`)}`);else{d.push("");for(const t of e)d.push(`#REQUEST "${t}"`),t.startsWith("ticks_per_beat")&&(h=+t.split(" ")[1])}var w;d.push("");const g=new o((()=>({raws:[],ticksPerMeasure:0})));for(const[t,e]of f)d.push(`#${t.toString().padStart(3,"0")}02:${e}`);d.push("");let v=0;const $=f.map((([t,e],r,o)=>{var s;const[n]=null!==(s=o[r+1])&&void 0!==s?s:[Number.POSITIVE_INFINITY],a=v;return v+=(n-t)*e*h,{tick:a,measure:t,value:e}})).reverse(),m=(t,e,r)=>{var o;const{tick:s,measure:n,value:a}=null!==(o=$.find((({tick:e})=>t>=e)))&&void 0!==o?o:{tick:0,measure:0,value:4},i=Math.floor(n+(t-s)/h/a),c=g.get(`${i.toString().padStart(3,"0")}${e}`);c.raws.push({tick:t-s,value:r}),c.ticksPerMeasure=a*h};if(c.length>=Math.pow(36,2)-1)throw new Error(`Too much BPMS (${c.length} >= 36^2 -1 = ${Math.pow(36,2)-1})`);const k=new Map;for(const[t,e]of c){const r=(k.size+1).toString(36).padStart(2,"0");k.has(e)||(k.set(e,r),d.push(`#BPM${k.get(e)}:${e}`)),m(t,"08",null!==(a=k.get(e))&&void 0!==a?a:r)}for(const{tick:t,lane:e,width:r,type:o}of u)m(t,`1${e.toString(36)}`,`${o}${r.toString(36)}`);for(const{tick:t,lane:e,width:r,type:o}of l)m(t,`5${e.toString(36)}`,`${o}${r.toString(36)}`);const y=new s;for(const t of p){const e=t[0].tick,r=t[t.length-1].tick,o=y.generateChannel(e,r).toString(36);for(const{tick:e,lane:r,width:s,type:n}of t)m(e,`3${r.toString(36)}${o}`,`${n}${s.toString(36)}`)}return g.forEach((({raws:e,ticksPerMeasure:o},s)=>{var n;const a=e.reduce(((t,e)=>r(e.tick,t)),o);if(!Number.isInteger(a))throw new t(a,e.map((({tick:t})=>t)));const i=new Map(e.sort((({tick:t},{tick:e})=>t-e)).map((({tick:t,value:e})=>[t%o,e]))),c=[];for(let t=0;t*a<o;t++){const e=t*a;c.push(null!==(n=i.get(e))&&void 0!==n?n:"00")}d.push(`#${s}:${c.join("")}`)})),d.join("\n")}e=new WeakMap,exports.InvalidAlignmentError=t,exports.default=n,exports.stringify=n; //# sourceMappingURL=index.cjs.js.map