@tonaljs/abc-notation
Version:
Parse musical notes in abc notation
1 lines • 3.67 kB
Source Map (JSON)
{"version":3,"sources":["../index.ts"],"sourcesContent":["import { distance as dist, transpose as tr } from \"@tonaljs/pitch-distance\";\nimport { note } from \"@tonaljs/pitch-note\";\n\nconst fillStr = (character: string, times: number) =>\n Array(times + 1).join(character);\n\nconst REGEX = /^(_{1,}|=|\\^{1,}|)([abcdefgABCDEFG])([,']*)$/;\n\ntype AbcTokens = [string, string, string];\n\nexport function tokenize(str: string): AbcTokens {\n const m = REGEX.exec(str);\n if (!m) {\n return [\"\", \"\", \"\"];\n }\n return [m[1], m[2], m[3]];\n}\n\n/**\n * Convert a (string) note in ABC notation into a (string) note in scientific notation\n *\n * @example\n * abcToScientificNotation(\"c\") // => \"C5\"\n */\nexport function abcToScientificNotation(str: string): string {\n const [acc, letter, oct] = tokenize(str);\n if (letter === \"\") {\n return \"\";\n }\n let o = 4;\n for (let i = 0; i < oct.length; i++) {\n o += oct.charAt(i) === \",\" ? -1 : 1;\n }\n const a =\n acc[0] === \"_\"\n ? acc.replace(/_/g, \"b\")\n : acc[0] === \"^\"\n ? acc.replace(/\\^/g, \"#\")\n : \"\";\n return letter.charCodeAt(0) > 96\n ? letter.toUpperCase() + a + (o + 1)\n : letter + a + o;\n}\n\n/**\n * Convert a (string) note in scientific notation into a (string) note in ABC notation\n *\n * @example\n * scientificToAbcNotation(\"C#4\") // => \"^C\"\n */\nexport function scientificToAbcNotation(str: string): string {\n const n = note(str);\n if (n.empty || (!n.oct && n.oct !== 0)) {\n return \"\";\n }\n const { letter, acc, oct } = n;\n const a = acc[0] === \"b\" ? acc.replace(/b/g, \"_\") : acc.replace(/#/g, \"^\");\n const l = oct > 4 ? letter.toLowerCase() : letter;\n const o =\n oct === 5 ? \"\" : oct > 4 ? fillStr(\"'\", oct - 5) : fillStr(\",\", 4 - oct);\n return a + l + o;\n}\n\nexport function transpose(note: string, interval: string): string {\n return scientificToAbcNotation(tr(abcToScientificNotation(note), interval));\n}\n\nexport function distance(from: string, to: string): string {\n return dist(abcToScientificNotation(from), abcToScientificNotation(to));\n}\n\n/** @deprecated */\nexport default {\n abcToScientificNotation,\n scientificToAbcNotation,\n tokenize,\n transpose,\n distance,\n};\n"],"mappings":";AAAA,SAAS,YAAY,MAAM,aAAa,UAAU;AAClD,SAAS,YAAY;AAErB,IAAM,UAAU,CAAC,WAAmB,UAClC,MAAM,QAAQ,CAAC,EAAE,KAAK,SAAS;AAEjC,IAAM,QAAQ;AAIP,SAAS,SAAS,KAAwB;AAC/C,QAAM,IAAI,MAAM,KAAK,GAAG;AACxB,MAAI,CAAC,GAAG;AACN,WAAO,CAAC,IAAI,IAAI,EAAE;AAAA,EACpB;AACA,SAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1B;AAQO,SAAS,wBAAwB,KAAqB;AAC3D,QAAM,CAAC,KAAK,QAAQ,GAAG,IAAI,SAAS,GAAG;AACvC,MAAI,WAAW,IAAI;AACjB,WAAO;AAAA,EACT;AACA,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,SAAK,IAAI,OAAO,CAAC,MAAM,MAAM,KAAK;AAAA,EACpC;AACA,QAAM,IACJ,IAAI,CAAC,MAAM,MACP,IAAI,QAAQ,MAAM,GAAG,IACrB,IAAI,CAAC,MAAM,MACT,IAAI,QAAQ,OAAO,GAAG,IACtB;AACR,SAAO,OAAO,WAAW,CAAC,IAAI,KAC1B,OAAO,YAAY,IAAI,KAAK,IAAI,KAChC,SAAS,IAAI;AACnB;AAQO,SAAS,wBAAwB,KAAqB;AAC3D,QAAM,IAAI,KAAK,GAAG;AAClB,MAAI,EAAE,SAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAI;AACtC,WAAO;AAAA,EACT;AACA,QAAM,EAAE,QAAQ,KAAK,IAAI,IAAI;AAC7B,QAAM,IAAI,IAAI,CAAC,MAAM,MAAM,IAAI,QAAQ,MAAM,GAAG,IAAI,IAAI,QAAQ,MAAM,GAAG;AACzE,QAAM,IAAI,MAAM,IAAI,OAAO,YAAY,IAAI;AAC3C,QAAM,IACJ,QAAQ,IAAI,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,CAAC,IAAI,QAAQ,KAAK,IAAI,GAAG;AACzE,SAAO,IAAI,IAAI;AACjB;AAEO,SAAS,UAAUA,OAAc,UAA0B;AAChE,SAAO,wBAAwB,GAAG,wBAAwBA,KAAI,GAAG,QAAQ,CAAC;AAC5E;AAEO,SAAS,SAAS,MAAc,IAAoB;AACzD,SAAO,KAAK,wBAAwB,IAAI,GAAG,wBAAwB,EAAE,CAAC;AACxE;AAGA,IAAO,uBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["note"]}