[music] build musical tonalnost
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…
Reference in New Issue