diff --git a/lib/buildTonalnost/buildTonalnost.test.ts b/lib/buildTonalnost/buildTonalnost.test.ts new file mode 100644 index 0000000..8d49a64 --- /dev/null +++ b/lib/buildTonalnost/buildTonalnost.test.ts @@ -0,0 +1,14 @@ +import { describe, it, expect } from "vitest"; +import { buildTonalnost } from "./buildTonalnost.ts"; + +describe("buildTonalnost", () => { + let sortedArray = [-12, 1, 4, 6, 22]; + + it("buildTonalnost", () => { + expect(buildTonalnost(sortedArray, 4)).toBe(2); + }); + + it("buildTonalnost", () => { + expect(buildTonalnost(sortedArray, 3)).toBe(-1); + }); +}); diff --git a/lib/buildTonalnost/buildTonalnost.ts b/lib/buildTonalnost/buildTonalnost.ts new file mode 100644 index 0000000..5e573ea --- /dev/null +++ b/lib/buildTonalnost/buildTonalnost.ts @@ -0,0 +1,71 @@ +type Gamma = "A" | "B" | "C" | "D" | "E" | 'F' | "G"; + +type BaseNote = + "A" | "B" | "C" | "D" | "E" | 'F' | "G" | + "Ab" | "Bb" | "Cb" | "Db" | "Eb" | "Fb" | "Gb" | + "Am" | "Bm" | "Cm" | "Dm" | "Em" | "Fm" | "Gm" | + "Abm" | "Bbm" | "Cbm" | "Dbm" | "Ebm" | "Fbm" | "Gbm"; + +function buildGamma(baseNote: Gamma, poluton: string[], isBemol: boolean = false) { + const gamma = ['C', 'D', 'E', 'F', 'G', 'A', 'B']; + const gammaIndexNote = gamma.findIndex((n) => n === baseNote); + const gammaBaseNote = gammaIndexNote !== 0 ? [...gamma.slice(gammaIndexNote), ...gamma.slice(0, gammaIndexNote)] : gamma.slice(gammaIndexNote); + + const resultGamma = gammaBaseNote.map(n => { + if (poluton.includes(n)) { + return isBemol ? n + "b" : n + "#"; + } + return n; + }) + + return resultGamma; +} + + +export function buildTonalnost(baseNote: BaseNote) { + let res: string[] = []; + const searchSeaquencies = ['F', 'C', 'G', 'D', 'A', 'E', 'B']; + const gamma = ['C', 'D', 'E', 'F', 'G', 'A', 'B']; + const isMinor = baseNote.slice(-1) === 'm' + const isBemol = /b/.test(baseNote); + const isDies = !isBemol; + const note = baseNote.slice(0, 1); + + if (isDies) { + const gammaIndexNote = gamma.findIndex((n) => n === note); + const prevNoteGammIndex = gammaIndexNote === 0 ? 6 : gammaIndexNote - 1; + const noteSearchSeq = gamma[prevNoteGammIndex]; + const searchSeaquenciesIndex = searchSeaquencies.findIndex(n => n === noteSearchSeq); + const diesSlice = searchSeaquencies.slice(0, searchSeaquenciesIndex + 1) + res = buildGamma(note as Gamma, diesSlice) + } + + if (isBemol) { + const searchSeaquenciesIndex = searchSeaquencies.findIndex(n => n === note); + const prevNoteSearchSeqIndex = searchSeaquenciesIndex === 0 ? 6 : searchSeaquenciesIndex - 1; + const bemoleSlice = searchSeaquencies.slice(prevNoteSearchSeqIndex); + res = buildGamma(note as Gamma, bemoleSlice, true) + } + + if (isMinor) { + console.log({ isMinor }) + } + + return `note: ${baseNote}, gamma: ${res.join(' | ')}`; +}; + + +console.log(buildTonalnost('A')) +console.log(buildTonalnost('Ab')) +console.log(buildTonalnost('B')) +console.log(buildTonalnost('Bb')) +console.log(buildTonalnost('C')) +console.log(buildTonalnost('Cb')) +console.log(buildTonalnost('D')) +console.log(buildTonalnost('Db')) +console.log(buildTonalnost('E')) +console.log(buildTonalnost('Eb')) +console.log(buildTonalnost('F')) +console.log(buildTonalnost('Fb')) +console.log(buildTonalnost('G')) +console.log(buildTonalnost('Gb')) diff --git a/lib/buildTonalnost/index.ts b/lib/buildTonalnost/index.ts new file mode 100644 index 0000000..a197ded --- /dev/null +++ b/lib/buildTonalnost/index.ts @@ -0,0 +1,3 @@ +import { buildTonalnost } from "./buildTonalnost"; + +export default buildTonalnost;