{"code":"var NAMES = \"C C# Db D D# Eb E F F# Gb G G# Ab A A# Bb B\".split(\" \");\r\nexport var names = function (accTypes) {\r\n    return typeof accTypes !== \"string\"\r\n        ? NAMES.slice()\r\n        : NAMES.filter(function (n) {\r\n            var acc = n[1] || \" \";\r\n            return accTypes.indexOf(acc) !== -1;\r\n        });\r\n};\r\nvar SHARPS = names(\" #\");\r\nvar FLATS = names(\" b\");\r\nvar REGEX = /^([a-gA-G]?)(#{1,}|b{1,}|x{1,}|)(-?\\d*)\\s*(.*)$/;\r\nexport function tokenize(str) {\r\n    if (typeof str !== \"string\")\r\n        str = \"\";\r\n    var m = REGEX.exec(str);\r\n    return [m[1].toUpperCase(), m[2].replace(/x/g, \"##\"), m[3], m[4]];\r\n}\r\nvar NO_NOTE = Object.freeze({\r\n    pc: null,\r\n    name: null,\r\n    step: null,\r\n    alt: null,\r\n    oct: null,\r\n    octStr: null,\r\n    chroma: null,\r\n    midi: null,\r\n    freq: null\r\n});\r\nvar SEMI = [0, 2, 4, 5, 7, 9, 11];\r\nvar properties = function (str) {\r\n    var tokens = tokenize(str);\r\n    if (tokens[0] === \"\" || tokens[3] !== \"\")\r\n        return NO_NOTE;\r\n    var letter = tokens[0], acc = tokens[1], octStr = tokens[2];\r\n    var p = {\r\n        letter: letter,\r\n        acc: acc,\r\n        octStr: octStr,\r\n        pc: letter + acc,\r\n        name: letter + acc + octStr,\r\n        step: (letter.charCodeAt(0) + 3) % 7,\r\n        alt: acc[0] === \"b\" ? -acc.length : acc.length,\r\n        oct: octStr.length ? +octStr : null,\r\n        chroma: 0,\r\n        midi: null,\r\n        freq: null\r\n    };\r\n    p.chroma = (SEMI[p.step] + p.alt + 120) % 12;\r\n    p.midi = p.oct !== null ? SEMI[p.step] + p.alt + 12 * (p.oct + 1) : null;\r\n    p.freq = midiToFreq(p.midi);\r\n    return Object.freeze(p);\r\n};\r\nvar memo = function (fn, cache) {\r\n    if (cache === void 0) { cache = {}; }\r\n    return function (str) { return cache[str] || (cache[str] = fn(str)); };\r\n};\r\nexport var props = memo(properties);\r\nexport var name = function (str) { return props(str).name; };\r\nexport var pc = function (str) { return props(str).pc; };\r\nvar isMidiRange = function (m) { return m >= 0 && m <= 127; };\r\nexport var midi = function (note) {\r\n    if (typeof note !== \"number\" && typeof note !== \"string\") {\r\n        return null;\r\n    }\r\n    var midi = props(note).midi;\r\n    var value = midi || midi === 0 ? midi : +note;\r\n    return isMidiRange(value) ? value : null;\r\n};\r\nexport var midiToFreq = function (midi, tuning) {\r\n    if (tuning === void 0) { tuning = 440; }\r\n    return typeof midi === \"number\" ? Math.pow(2, (midi - 69) / 12) * tuning : null;\r\n};\r\nexport var freq = function (note) { return props(note).freq || midiToFreq(note); };\r\nvar L2 = Math.log(2);\r\nvar L440 = Math.log(440);\r\nexport var freqToMidi = function (freq) {\r\n    var v = (12 * (Math.log(freq) - L440)) / L2 + 69;\r\n    return Math.round(v * 100) / 100;\r\n};\r\nexport var chroma = function (str) { return props(str).chroma; };\r\nexport var oct = function (str) { return props(str).oct; };\r\nvar LETTERS = \"CDEFGAB\";\r\nexport var stepToLetter = function (step) { return LETTERS[step]; };\r\nvar fillStr = function (s, n) { return Array(n + 1).join(s); };\r\nvar numToStr = function (num, op) {\r\n    return typeof num !== \"number\" ? \"\" : op(num);\r\n};\r\nexport var altToAcc = function (alt) {\r\n    return numToStr(alt, function (alt) { return (alt < 0 ? fillStr(\"b\", -alt) : fillStr(\"#\", alt)); });\r\n};\r\nexport var from = function (fromProps, baseNote) {\r\n    if (fromProps === void 0) { fromProps = {}; }\r\n    if (baseNote === void 0) { baseNote = null; }\r\n    var _a = baseNote\r\n        ? Object.assign({}, props(baseNote), fromProps)\r\n        : fromProps, step = _a.step, alt = _a.alt, oct = _a.oct;\r\n    if (typeof step !== \"number\")\r\n        return null;\r\n    var letter = stepToLetter(step);\r\n    if (!letter)\r\n        return null;\r\n    var pc = letter + altToAcc(alt);\r\n    return oct || oct === 0 ? pc + oct : pc;\r\n};\r\nexport var build = from;\r\nexport function fromMidi(num, sharps) {\r\n    if (sharps === void 0) { sharps = false; }\r\n    num = Math.round(num);\r\n    var pcs = sharps === true ? SHARPS : FLATS;\r\n    var pc = pcs[num % 12];\r\n    var o = Math.floor(num / 12) - 1;\r\n    return pc + o;\r\n}\r\nexport var simplify = function (note, sameAcc) {\r\n    if (sameAcc === void 0) { sameAcc = true; }\r\n    var _a = props(note), alt = _a.alt, chroma = _a.chroma, midi = _a.midi;\r\n    if (chroma === null)\r\n        return null;\r\n    var alteration = alt;\r\n    var useSharps = sameAcc === false ? alteration < 0 : alteration > 0;\r\n    return midi === null\r\n        ? pc(fromMidi(chroma, useSharps))\r\n        : fromMidi(midi, useSharps);\r\n};\r\nexport var enharmonic = function (note) { return simplify(note, false); };\r\n","dts":{"name":"/Users/dani/Code/Tonal/tonal/packages/note/index.d.ts","writeByteOrderMark":false,"text":"declare type NoteLetter = \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\" | \"G\";\r\ndeclare type NoteAccidental = string;\r\ndeclare type Note = string;\r\ndeclare type Midi = number;\r\ndeclare type Octave = number;\r\ndeclare type OrNull<T> = T | null;\r\ndeclare type NoteName = string;\r\ndeclare type NoteProps = {\r\n    name: NoteName;\r\n    letter: NoteLetter;\r\n    acc: NoteAccidental;\r\n    oct: OrNull<Octave>;\r\n    step: number;\r\n    pc: NoteName;\r\n    alt: number;\r\n    chroma: number;\r\n    midi: OrNull<Midi>;\r\n    freq: OrNull<number>;\r\n};\r\ndeclare type NoNoteProps = {\r\n    name: null;\r\n    oct: null;\r\n    step: null;\r\n    pc: null;\r\n    alt: null;\r\n    chroma: null;\r\n    midi: null;\r\n    freq: null;\r\n};\r\nexport declare const names: (accTypes?: string | undefined) => string[];\r\nexport declare function tokenize(str?: Note | Midi): [\"\" | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\" | \"G\", string, string, string];\r\nexport declare const props: (str: string | number) => Readonly<NoNoteProps> | Readonly<NoteProps>;\r\nexport declare const name: (str: string) => string;\r\nexport declare const pc: (str: string) => OrNull<string>;\r\nexport declare const midi: (note: string | number) => OrNull<number>;\r\nexport declare const midiToFreq: (midi: string | number | null, tuning?: number) => OrNull<number>;\r\nexport declare const freq: (note: string | number) => OrNull<number>;\r\nexport declare const freqToMidi: (freq: number) => number;\r\nexport declare const chroma: (str: string) => OrNull<number>;\r\nexport declare const oct: (str: string) => OrNull<number>;\r\nexport declare const stepToLetter: (step: number) => string;\r\nexport declare const altToAcc: (alt?: number | undefined) => string;\r\nexport declare const from: (fromProps?: Partial<NoteProps>, baseNote?: OrNull<string>) => OrNull<string>;\r\nexport declare const build: (fromProps?: Partial<NoteProps>, baseNote?: OrNull<string>) => OrNull<string>;\r\nexport declare function fromMidi(num: Midi, sharps?: boolean | number): string;\r\nexport declare const simplify: (note: string, sameAcc?: number | boolean) => OrNull<string>;\r\nexport declare const enharmonic: (note: string) => OrNull<string>;\r\nexport {};\r\n"}}
