UNPKG

satie

Version:

A sheet music renderer for the web

656 lines (641 loc) 12.6 kB
/** * This file is part of Satie music engraver <https://github.com/jnetterf/satie>. * Copyright (C) Joshua Netterfield <joshua.ca> 2015 - present. * * Satie is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * Satie is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Satie. If not, see <http://www.gnu.org/licenses/>. */ export let ptPerMM = 2.842; export let mmPerIn = 25.4; export let V_PADDING = 20; export let staveSeperation = 3.24; export let rastalToHeight = [ /* largest is '0' */ 9.2, // educational 7.9, // educational 7.4, // piano (uncommon) 7, // single stave / piano 6.5, // single stave / piano 6, // single stave (uncommon) / piano (uncommon) 5.5, // choral, cue staves, or ossia 4.8, // choral, cue staves, or ossia 3.7 // full score // Tags from Behind Bars by Elaine Gould, pp. 483 ]; export let pageSizes = [ // Sizes to actually display // (For other sizes, Google works well enough :-) { name: "U.S. Letter", lilypondName: "letter", width: 215.9, height: 279.4, unit: "mm" }, { name: "U.S. Legal", lilypondName: "legal", width: 215.9, height: 355.6, unit: "mm" }, { name: "ISO A4", lilypondName: "a4", width: 210, height: 297, unit: "mm" }, { name: "ISO B4", lilypondName: "b4", width: 250, height: 353, unit: "mm" }, { name: "ISO A3", lilypondName: "a3", width: 297, height: 420, unit: "mm" }, { name: "Print", lilypondName: "arch a", width: 229, height: 305, unit: "mm" }, { name: "Choral", lilypondName: "choral", // XXX: Common format, but does not exist in lilypond width: 178, height: 254, unit: "mm" }, { name: "Marching Band", lilypondName: "marching", // XXX: Common format, but does not exist in lilypond width: 133, height: 170, unit: "mm" } ]; export function defaultPageSize() { return pageSizes[0]; }; export let defaultIndent = 15; export let defaultMargins = { top: 15.25, right: 15.25, bottom: 15.25, left: 15.25 }; // This means that 4 spaces (i.e., 1 stave) equals 6.3mm. export let defaultStaveHeight = rastalToHeight[4]; export let lilypondSizes = { // Sizes that we support loading from Lilypond. // Did you know there were this many sizes? "choral": { // XXX: Common format, but does not exist in lilypond width: 178, height: 254, unit: "mm" }, "marching": { // XXX: Common format, but does not exist in lilypond width: 133, height: 170, unit: "mm" }, "a10": { width: 26, height: 37, unit: "mm" }, "a9": { width: 37, height: 52, unit: "mm" }, "a8": { width: 52, height: 74, unit: "mm" }, "a7": { width: 74, height: 105, unit: "mm" }, "a6": { width: 105, height: 148, unit: "mm" }, "a5": { width: 148, height: 210, unit: "mm" }, "a4": { width: 210, height: 297, unit: "mm" }, "a3": { width: 297, height: 420, unit: "mm" }, "a2": { width: 420, height: 594, unit: "mm" }, "a1": { width: 594, height: 841, unit: "mm" }, "a0": { width: 841, height: 1189, unit: "mm" }, "b10": { width: 31, height: 44, unit: "mm" }, "b9": { width: 44, height: 62, unit: "mm" }, "b8": { width: 62, height: 88, unit: "mm" }, "b7": { width: 88, height: 125, unit: "mm" }, "b6": { width: 125, height: 176, unit: "mm" }, "b5": { width: 176, height: 250, unit: "mm" }, "b4": { width: 250, height: 353, unit: "mm" }, "b3": { width: 353, height: 500, unit: "mm" }, "b2": { width: 500, height: 707, unit: "mm" }, "b1": { width: 707, height: 1000, unit: "mm" }, "b0": { width: 1000, height: 1414, unit: "mm" }, "4a0": { width: 1682, height: 2378, unit: "mm" }, "2a0": { width: 1189, height: 1682, unit: "mm" }, "c10": { width: 28, height: 40, unit: "mm" }, "c9": { width: 40, height: 57, unit: "mm" }, "c8": { width: 57, height: 81, unit: "mm" }, "c7": { width: 81, height: 114, unit: "mm" }, "c6": { width: 114, height: 162, unit: "mm" }, "c5": { width: 162, height: 229, unit: "mm" }, "c4": { width: 229, height: 324, unit: "mm" }, "c3": { width: 324, height: 458, unit: "mm" }, "c2": { width: 458, height: 648, unit: "mm" }, "c1": { width: 648, height: 917, unit: "mm" }, "c0": { width: 917, height: 1297, unit: "mm" }, "junior-legal": { width: 8.0, height: 5.0, unit: "in" }, "legal": { width: 8.5, height: 14.0, unit: "in" }, "ledger": { width: 17.0, height: 11.0, unit: "in" }, "letter": { width: 8.5, height: 11.0, unit: "in" }, "tabloid": { width: 11.0, height: 17.0, unit: "in" }, "11x17": { width: 11.0, height: 17.0, unit: "in" }, "17x11": { width: 17.0, height: 11.0, unit: "in" }, "government-letter": { width: 8, height: 10.5, unit: "in" }, "government-legal": { width: 8.5, height: 13.0, unit: "in" }, "philippine-legal": { width: 8.5, height: 13.0, unit: "in" }, "ansi a": { width: 8.5, height: 11.0, unit: "in" }, "ansi b": { width: 17.0, height: 11.0, unit: "in" }, "ansi c": { width: 17.0, height: 22.0, unit: "in" }, "ansi d": { width: 22.0, height: 34.0, unit: "in" }, "ansi e": { width: 34.0, height: 44.0, unit: "in" }, "engineering f": { width: 28.0, height: 40.0, unit: "in" }, "arch a": { width: 9.0, height: 12.0, unit: "in" }, "arch b": { width: 12.0, height: 18.0, unit: "in" }, "arch c": { width: 18.0, height: 24.0, unit: "in" }, "arch d": { width: 24.0, height: 36.0, unit: "in" }, "arch e": { width: 36.0, height: 48.0, unit: "in" }, "arch e1": { width: 30.0, height: 42.0, unit: "in" }, "statement": { width: 5.5, height: 8.5, unit: "in" }, "half letter": { width: 5.5, height: 8.5, unit: "in" }, "quarto": { width: 8.0, height: 10.0, unit: "in" }, "octavo": { width: 6.75, height: 10.5, unit: "in" }, "executive": { width: 7.25, height: 10.5, unit: "in" }, "monarch": { width: 7.25, height: 10.5, unit: "in" }, "foolscap": { width: 8.27, height: 13.0, unit: "in" }, "folio": { width: 8.27, height: 13.0, unit: "in" }, "super-b": { width: 13.0, height: 19.0, unit: "in" }, "post": { width: 15.5, height: 19.5, unit: "in" }, "crown": { width: 15.0, height: 20.0, unit: "in" }, "large post": { width: 16.5, height: 21.0, unit: "in" }, "demy": { width: 17.5, height: 22.5, unit: "in" }, "medium": { width: 18.0, height: 23.0, unit: "in" }, "broadsheet": { width: 18.0, height: 24.0, unit: "in" }, "royal": { width: 20.0, height: 25.0, unit: "in" }, "elephant": { width: 23.0, height: 28.0, unit: "in" }, "double demy": { width: 22.5, height: 35.0, unit: "in" }, "quad demy": { width: 35.0, height: 45.0, unit: "in" }, "atlas": { width: 26.0, height: 34.0, unit: "in" }, "imperial": { width: 22.0, height: 30.0, unit: "in" }, "antiquarian": { width: 31.0, height: 53.0, unit: "in" }, "pa0": { width: 840, height: 1120, unit: "mm" }, "pa1": { width: 560, height: 840, unit: "mm" }, "pa2": { width: 420, height: 560, unit: "mm" }, "pa3": { width: 280, height: 420, unit: "mm" }, "pa4": { width: 210, height: 280, unit: "mm" }, "pa5": { width: 140, height: 210, unit: "mm" }, "pa6": { width: 105, height: 140, unit: "mm" }, "pa7": { width: 70, height: 105, unit: "mm" }, "pa8": { width: 52, height: 70, unit: "mm" }, "pa9": { width: 35, height: 52, unit: "mm" }, "pa10": { width: 26, height: 35, unit: "mm" }, "f4": { width: 210, height: 330, unit: "mm" }, "a8landscape": { width: 74, height: 52, unit: "mm" } }; /** * Converts a length in mms to tenths of a standard stave height. * * @param scaling40 the standard stave height */ export function mmToTenths(scaling40: number, mm: number) { return mm / scaling40 * 40; } /** * Converts a 'px' size or a named css size (e.g., "small") to tenths of a standard stave height. * * @param scaling40 the standard stave height */ export function cssSizeToTenths(scaling40: number, css: string) { let px = NaN; // The xx-small - xx-large values were found from Chrome computed sizes. switch (true) { case css.indexOf("px") !== -1: case !isNaN(parseFloat(css)): px = parseFloat(css.split("px")[0]); break; case css === "xx-small": px = 9; break; case css === "x-small": px = 10; break; case css === "medium": px = 16; break; case css === "large": px = 18; break; case css === "x-large": px = 24; break; case css === "xx-large": px = 32; break; case css === "small": px = 13; break; default: px = 13; break; } // 1 px = 3/4 pt // 1 pt = 1/72 in // 1 in = 25.4 mm // ================= // 1 px = 25.4/96 mm return mmToTenths(scaling40, px * mmPerIn / 96); } /** * Converts a length in tenths of a stave length to mm. * * @param scaling40 the standard stave height */ export function tenthsToMM(scaling40: number, tenths: number) { return scaling40 * tenths / 40; }