UNPKG

tonal-abc-notation

Version:

Conversion between notes in ABC and scientific notation

276 lines (275 loc) 8.16 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for index.js</title> <meta charset="utf-8" /> <link rel="stylesheet" href="prettify.css" /> <link rel="stylesheet" href="base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="index.html">All files</a> index.js </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">95% </span> <span class="quiet">Statements</span> <span class='fraction'>19/20</span> </div> <div class='fl pad1y space-right2'> <span class="strong">95% </span> <span class="quiet">Branches</span> <span class='fraction'>19/20</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>4/4</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Lines</span> <span class='fraction'>16/16</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">7x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">10x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">16x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/** * [![npm version](https://img.shields.io/npm/v/tonal-abc-notation.svg?style=flat-square)](https://www.npmjs.com/package/tonal-abc-notation) * * Convert note strings between ABC and scientific notation * * This is part of [tonal](https://www.npmjs.com/package/tonal) music theory library. * * @example * const Abc = require("tonal-abc-notation") * Abc.toNote("c") // =&gt; "C5" * Abc.toAbc("Db2") // =&gt; "_D,," * * @example * import Tonal from "tonal" * import { toAbc } from "tonal-abc-notation" * Tonal.Scale.notes("C major").map(toAbc); * * @module Abc */ import { props } from "tonal-note"; &nbsp; const REGEX = /^(_{1,}|=|\^{1,}|)([abcdefgABCDEFG])([,']*)$/; const fillStr = (s, n) =&gt; Array(n + 1).join(s); &nbsp; export function tokenize(str) { const m = REGEX.exec(str); if (!m) return ["", "", ""]; return [m[1], m[2], m[3]]; } &nbsp; /** * Convert a (string) note in ABC notation into a (string) note in scientific notation * * @param {string} abcNote - the note in ABC notation * @return {string} the note in scientific notation of null if not valid * @example * Abc.toNote("c") // =&gt; "C5" */ export function toNote(str) { const [acc, letter, oct] = tokenize(str); <span class="missing-if-branch" title="if path not taken" >I</span>if (letter === "") <span class="cstat-no" title="statement not covered" >return null;</span> let o = 4; for (let i = 0; i &lt; oct.length; i++) o += oct[i] === "," ? -1 : 1; const a = acc[0] === "_" ? acc.replace(/_/g, "b") : acc[0] === "^" ? acc.replace(/\^/g, "#") : ""; return letter.charCodeAt(0) &gt; 96 ? letter.toUpperCase() + a + (o + 1) : letter + a + o; } &nbsp; /** * Convert a (string) note in scientific notation into a (string) note in ABC notation * * @param {string} note - a note in scientific notation * @return {string} the note in ABC notation or null if not valid note * @example * abc.toAbc("C#4") // =&gt; "^C" */ export function toAbc(str) { const { letter, acc, oct } = props(str); const a = acc[0] === "b" ? acc.replace(/b/g, "_") : acc.replace(/#/g, "^"); const l = oct &gt; 4 ? letter.toLowerCase() : letter; const o = oct === 5 ? "" : oct &gt; 4 ? fillStr("'", oct - 5) : fillStr(",", 4 - oct); return a + l + o; } &nbsp;</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Tue Feb 26 2019 22:00:54 GMT+0100 (CET) </div> </div> <script src="prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="sorter.js"></script> </body> </html>