[music] build musical tonalnost

main
Vasily Guzov 1 year ago
parent 44ec6f1f8f
commit b61adaf8eb

@ -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);
});
});

@ -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'))

@ -0,0 +1,3 @@
import { buildTonalnost } from "./buildTonalnost";
export default buildTonalnost;
Loading…
Cancel
Save