{"version":3,"sources":["../index.ts"],"sourcesContent":["import { rotate } from \"@tonaljs/collection\";\nimport { simplify, transposeFifths } from \"@tonaljs/interval\";\nimport { EmptyPcset, Pcset } from \"@tonaljs/pcset\";\nimport { transpose } from \"@tonaljs/pitch-distance\";\nimport { NoteName } from \"@tonaljs/pitch-note\";\nimport { get as getType } from \"@tonaljs/scale-type\";\n\nconst MODES = [\n  [0, 2773, 0, \"ionian\", \"\", \"Maj7\", \"major\"],\n  [1, 2902, 2, \"dorian\", \"m\", \"m7\"],\n  [2, 3418, 4, \"phrygian\", \"m\", \"m7\"],\n  [3, 2741, -1, \"lydian\", \"\", \"Maj7\"],\n  [4, 2774, 1, \"mixolydian\", \"\", \"7\"],\n  [5, 2906, 3, \"aeolian\", \"m\", \"m7\", \"minor\"],\n  [6, 3434, 5, \"locrian\", \"dim\", \"m7b5\"],\n] as const;\n\ntype ModeDatum = (typeof MODES)[number];\n\nexport interface Mode extends Pcset {\n  readonly name: string;\n  readonly modeNum: number;\n  readonly alt: number; // number of alterations === number of fifths\n  readonly triad: string;\n  readonly seventh: string;\n  readonly aliases: string[];\n}\n\nconst NoMode: Mode = {\n  ...EmptyPcset,\n  name: \"\",\n  alt: 0,\n  modeNum: NaN,\n  triad: \"\",\n  seventh: \"\",\n  aliases: [],\n};\n\nconst modes: Mode[] = MODES.map(toMode);\nconst index: Record<string, Mode> = {};\nmodes.forEach((mode) => {\n  index[mode.name] = mode;\n  mode.aliases.forEach((alias) => {\n    index[alias] = mode;\n  });\n});\n\ntype ModeLiteral = string | { name: string };\n\n/**\n * Get a Mode by it's name\n *\n * @example\n * get('dorian')\n * // =>\n * // {\n * //   intervals: [ '1P', '2M', '3m', '4P', '5P', '6M', '7m' ],\n * //   modeNum: 1,\n * //   chroma: '101101010110',\n * //   normalized: '101101010110',\n * //   name: 'dorian',\n * //   setNum: 2902,\n * //   alt: 2,\n * //   triad: 'm',\n * //   seventh: 'm7',\n * //   aliases: []\n * // }\n */\nexport function get(name: ModeLiteral): Mode {\n  return typeof name === \"string\"\n    ? index[name.toLowerCase()] || NoMode\n    : name && name.name\n      ? get(name.name)\n      : NoMode;\n}\n\n/** @deprecated */\nexport const mode = get;\n\n/**\n * Get a list of all modes\n */\nexport function all() {\n  return modes.slice();\n}\n\n/** @deprecated */\nexport const entries = all;\n\n/**\n * Get a list of all mode names\n */\nexport function names() {\n  return modes.map((mode) => mode.name);\n}\n\nfunction toMode(mode: ModeDatum): Mode {\n  const [modeNum, setNum, alt, name, triad, seventh, alias] = mode;\n  const aliases = alias ? [alias] : [];\n  const chroma = Number(setNum).toString(2);\n  const intervals = getType(name).intervals;\n  return {\n    empty: false,\n    intervals,\n    modeNum,\n    chroma,\n    normalized: chroma,\n    name,\n    setNum,\n    alt,\n    triad,\n    seventh,\n    aliases,\n  };\n}\n\nexport function notes(modeName: ModeLiteral, tonic: NoteName) {\n  return get(modeName).intervals.map((ivl) => transpose(tonic, ivl));\n}\n\nfunction chords(chords: string[]) {\n  return (modeName: ModeLiteral, tonic: NoteName) => {\n    const mode = get(modeName);\n    if (mode.empty) return [];\n    const triads = rotate(mode.modeNum, chords);\n    const tonics = mode.intervals.map((i) => transpose(tonic, i));\n    return triads.map((triad, i) => tonics[i] + triad);\n  };\n}\n\nexport const triads = chords(MODES.map((x) => x[4]));\nexport const seventhChords = chords(MODES.map((x) => x[5]));\n\nexport function distance(destination: ModeLiteral, source: ModeLiteral) {\n  const from = get(source);\n  const to = get(destination);\n  if (from.empty || to.empty) return \"\";\n  return simplify(transposeFifths(\"1P\", to.alt - from.alt));\n}\n\nexport function relativeTonic(\n  destination: ModeLiteral,\n  source: ModeLiteral,\n  tonic: NoteName,\n) {\n  return transpose(tonic, distance(destination, source));\n}\n\n/** @deprecated */\nexport default {\n  get,\n  names,\n  all,\n  distance,\n  relativeTonic,\n  notes,\n  triads,\n  seventhChords,\n  // deprecated\n  entries,\n  mode,\n};\n"],"mappings":"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","names":["mode","chords","triads"]}