UNPKG

jianpurender

Version:

Render music score using SVG on browsers.

1 lines 5.42 kB
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.jianpu_block=e():t.jianpu_block=e()}(self,(()=>(()=>{"use strict";var t={559:(t,e,s)=>{s.d(e,{MIN_RESOLUTION:()=>i});const i=.0625}},e={};function s(i){var n=e[i];if(void 0!==n)return n.exports;var o=e[i]={exports:{}};return t[i](o,o.exports,s),o.exports}s.d=(t,e)=>{for(var i in e)s.o(e,i)&&!s.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},s.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),s.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};s.r(i),s.d(i,{JianpuBlock:()=>h,splitJianpuNote:()=>r});var n=s(559);function o(t){return Math.abs(t)<1e-6}function r(t,e){const s=t.start+t.length;if(e<=t.start||e>=s||o(s-e))return null;const i=s-e;t.length=e-t.start;const n={start:e,length:i,pitch:t.pitch,intensity:t.intensity,jianpuNumber:t.jianpuNumber,octaveDot:t.octaveDot,accidental:0,tiedFrom:t};return t.tiedTo&&(n.tiedTo=t.tiedTo,t.tiedTo.tiedFrom=n),t.tiedTo=n,n}class h{start;length;notes;measureNumber;durationLines;augmentationDots;augmentationDash;beatBegin;beatEnd;isTieStart;isTieEnd;constructor(t=0,e=0,s=[],i=1){this.start=t,this.length=e,this.notes=s,this.measureNumber=i}addNote(t){if(0===this.notes.length)return this.start=t.start,this.length=t.length,this.notes.push(t),!0;if(!o(this.start-t.start))return console.warn(`JianpuBlock: Attempted to add note at ${t.start} to block starting at ${this.start}. Ignoring.`),!1;let e=!1,s=!1;for(let i=0;i<this.notes.length;i++)if(this.notes[i].pitch===t.pitch){s=!0,t.length<this.notes[i].length&&(this.notes[i].tiedFrom&&(t.tiedFrom=this.notes[i].tiedFrom,t.tiedFrom&&(t.tiedFrom.tiedTo=t)),this.notes[i].tiedTo&&(t.tiedTo=this.notes[i].tiedTo,t.tiedTo&&(t.tiedTo.tiedFrom=t)),this.notes[i]=t,e=!0);break}s||this.notes.push(t);let i=1/0;for(const t of this.notes)i=Math.min(i,t.length);return this.length=i,!s||e}split(t,e){const s=this.start+this.length;if(t<=this.start||t>=s||o(s-t))return null;const i=s-t,n=t-this.start,a=new h(t,i,[],e.measureNumberAtQ(t)),u=[];for(const e of this.notes){const s=e.start+e.length;if(s>t+1e-6){const s=r(e,t);s?u.push(s):console.warn("Split failed for note, unexpected state.")}else o(s-t)}return u.forEach((t=>a.addNote(t))),this.length=n,delete this.durationLines,delete this.augmentationDots,delete this.augmentationDash,this.beatEnd&&(a.beatEnd=!0,delete this.beatEnd),this.isTieEnd&&(a.isTieStart=!0,delete this.isTieEnd),a}splitToBeat(t){const e=t.timeSignatureAtQ(this.start);if(!e)return null;const s=t.measureLengthAtQ(this.start),i=t.measureNumberAtQ(this.start),n=this.start-(i-Math.floor(i))*s,r=this.start-n,h=4/e.denominator,a=r/h;this.beatBegin=o(a-Math.round(a));const u=n+(Math.floor(a+1e-6)+1)*h,l=n+s,d=this.start+this.length;let m=null;u<d-1e-6&&u>this.start+1e-6&&(m=u),l<d-1e-6&&l>this.start+1e-6&&(null===m||l<m)&&(m=l);let p=null;if(null!==m)p=this.split(m,t),p&&(this.beatEnd=!0);else{const t=(r+this.length)/h;this.beatEnd=o(t-Math.round(t)),this.beatEnd||(this.beatEnd=o(d-l))}return this.isTieStart=this.notes.some((t=>t.tiedFrom)),this.isTieEnd=this.notes.some((t=>t.tiedTo)),p&&(p.isTieStart=p.notes.some((t=>t.tiedFrom)),p.isTieEnd=p.notes.some((t=>t.tiedTo)),this.notes.some((t=>t.tiedTo&&t.start+t.length>m))&&delete this.isTieEnd),p}calculateRenderProperties(t){delete this.durationLines,delete this.augmentationDots,delete this.augmentationDash;const e=this.length;if(o(e)||e<0)return;if(t.allowDottedRests||this.notes.length>0){if(o(e-1.5))return void(this.augmentationDots=1);if(o(e-.75))return this.durationLines=1,void(this.augmentationDots=1);if(o(e-.375))return this.durationLines=2,void(this.augmentationDots=1);o(e-3)&&(this.augmentationDots=1)}if(this.durationLines=e>=3.999999||e>=1.999999||e>=.999999?0:e>=.499999?1:e>=.249999?2:e>=.124999?3:4,this.augmentationDash=!1,1===this.notes.length){const e=this.notes[0],s=t.timeSignatureAtQ(this.start);if(!s)return;const i=Math.max(4/s.denominator,1);if(!(this.measureNumber%1<=1e-6)&&e.tiedFrom&&o(e.tiedFrom.length-i)&&e.tiedFrom.pitch===e.pitch&&e.length>=1){let s=!0;if(e.tiedTo){const i=e.start+e.length;s=Math.floor(t.measureNumberAtQ(this.start))===Math.floor(t.measureNumberAtQ(i))&&e.tiedTo.length>=1}s&&(this.augmentationDash=!0)}}}splitToStandardSymbol(t){const e=this.length;if(o(e)||e<n.MIN_RESOLUTION-1e-6)return null;const s=[];t.allowDottedRests||this.notes.length>0?(s.push(6),s.push(4),s.push(3),s.push(2),s.push(1.5),s.push(1),s.push(.75),s.push(.5),s.push(.375),s.push(.25),s.push(.125),s.push(.0625)):(s.push(4),s.push(2),s.push(1),s.push(.5),s.push(.25),s.push(.125),s.push(.0625));let i=0;for(const t of s)if(e>=t-1e-6){i=t;break}o(i)&&(i=n.MIN_RESOLUTION,e<i-1e-6&&e>1e-6&&console.warn(`Block length ${e} is too small, rendering as ${i}`));let r=null;return e>i+1e-6?(r=this.split(this.start+i,t),this.length!==i&&(console.warn(`Adjusting block length after split from ${this.length} to ${i}`),this.length=i)):this.length=i,r}mergeToMap(t){const e=t.get(this.start);e?(this.notes.forEach((t=>e.addNote(t))),0!==this.measureNumber&&(e.measureNumber=this.measureNumber)):t.set(this.start,this)}isMeasureBeginning(){return o(this.measureNumber-Math.floor(this.measureNumber))}}return i})()));