You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
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 res.join(' | ');
|
|
};
|