score-key
Version:
Simple package to get score key value.
206 lines (195 loc) • 5.45 kB
text/typescript
import { Line, Space, Clef, Key, Note, PicthVariation } from "./constant";
import { SpaceLineMap } from "./types";
const py = require('pythonic');
const picthes = [
{note: Note.B, octave: 6},
{note: Note.A, octave: 6},
{note: Note.G, octave: 6},
{note: Note.F, octave: 6},
{note: Note.E, octave: 6},
{note: Note.D, octave: 6},
{note: Note.C, octave: 6},
{note: Note.B, octave: 5},
{note: Note.A, octave: 5},
{note: Note.G, octave: 5},
{note: Note.F, octave: 5},
{note: Note.E, octave: 5},
{note: Note.D, octave: 5},
{note: Note.C, octave: 5},
{note: Note.B, octave: 4},
{note: Note.A, octave: 4},
{note: Note.G, octave: 4},
{note: Note.F, octave: 4},
{note: Note.E, octave: 4},
{note: Note.D, octave: 4},
{note: Note.C, octave: 4},
{note: Note.B, octave: 3},
{note: Note.A, octave: 3},
{note: Note.G, octave: 3},
{note: Note.F, octave: 3},
{note: Note.E, octave: 3},
{note: Note.D, octave: 3},
{note: Note.C, octave: 3},
{note: Note.B, octave: 2},
{note: Note.A, octave: 2},
{note: Note.G, octave: 2},
{note: Note.F, octave: 2},
{note: Note.E, octave: 2},
{note: Note.D, octave: 2},
{note: Note.C, octave: 2},
{note: Note.B, octave: 1},
{note: Note.A, octave: 1},
{note: Note.G, octave: 1},
{note: Note.F, octave: 1},
{note: Note.E, octave: 1},
{note: Note.D, octave: 1},
{note: Note.C, octave: 1},
{note: Note.B, octave: 0},
{note: Note.A, octave: 0}
];
const positions = [
Line.ABOVE_FIVE, Space.ABOVE_FIVE, Line.ABOVE_FOUR, Space.ABOVE_FOUR,
Line.ABOVE_THREE, Space.ABOVE_THREE, Line.ABOVE_TWO, Space.ABOVE_TWO,
Line.ABOVE_ONE, Space.ABOVE_ONE,
Line.ONE, Space.ONE, Line.TWO, Space.TWO, Line.THREE, Space.THREE, Line.FOUR,
Space.FOUR, Line.FIVE, Space.BELOW_ONE, Line.BELOW_ONE, Space.BELOW_TWO,
Line.BELOW_TWO, Space.BELOW_THREE, Line.BELOW_THREE, Space.BELOW_FOUR,
Line.BELOW_FOUR, Space.BELOW_FIVE, Line.BELOW_FIVE,
]
export function getLineOrSpaceMap(firstLine: number, staffSpacing: number) {
const map: SpaceLineMap = {};
const step = 0.50 * staffSpacing;
let start = (-5.25 * staffSpacing) + firstLine;
for (const line of positions) {
for(const number of py.range(Math.round(start), Math.round(start + step))) {
map[String(number)] = line;
}
start += step
}
return map;
}
export function getPitch(clef: Clef, position: Space|Line) {
let idx = positions.findIndex(x => x === position);
if (idx === -1) {
return picthes[0];
}
if (clef === Clef.BASE) {
idx += 12;
}
return picthes[idx];
}
export function getPitchVariationMap(key: Key) {
let defaultVariation = {
'A': PicthVariation.NORMAL,
'B': PicthVariation.NORMAL,
'C': PicthVariation.NORMAL,
'D': PicthVariation.NORMAL,
'E': PicthVariation.NORMAL,
'F': PicthVariation.NORMAL,
'G': PicthVariation.NORMAL,
}
switch (key) {
case Key.B:
return {
...defaultVariation,
'D': PicthVariation.SHARP,
'G': PicthVariation.SHARP,
'C': PicthVariation.SHARP,
'F': PicthVariation.SHARP,
'A': PicthVariation.SHARP
}
case Key.E:
return {
...defaultVariation,
'D': PicthVariation.SHARP,
'G': PicthVariation.SHARP,
'C': PicthVariation.SHARP,
'F': PicthVariation.SHARP
}
case Key.A:
return {
...defaultVariation,
'G': PicthVariation.SHARP,
'C': PicthVariation.SHARP,
'F': PicthVariation.SHARP
}
case Key.D:
return {
...defaultVariation,
'C': PicthVariation.SHARP,
'F': PicthVariation.SHARP
}
case Key.G:
return {
...defaultVariation,
'F': PicthVariation.SHARP
}
case Key.D_FLAT:
return {
...defaultVariation,
'G': PicthVariation.FLAT,
'D': PicthVariation.FLAT,
'A': PicthVariation.FLAT,
'E': PicthVariation.FLAT,
'B': PicthVariation.FLAT
}
case Key.A_FLAT:
return {
...defaultVariation,
'D': PicthVariation.FLAT,
'A': PicthVariation.FLAT,
'E': PicthVariation.FLAT,
'B': PicthVariation.FLAT
}
case Key.E_FLAT:
return {
...defaultVariation,
'A': PicthVariation.FLAT,
'E': PicthVariation.FLAT,
'B': PicthVariation.FLAT
}
case Key.B_FLAT:
return {
...defaultVariation,
'E': PicthVariation.FLAT,
'B': PicthVariation.FLAT
}
case Key.F:
return {
...defaultVariation,
'B': PicthVariation.FLAT
}
default:
return defaultVariation;
}
}
export function getKey(flats = 0, sharps = 0) {
if (flats > 0) {
switch (flats) {
case 1: return Key.F;
case 2: return Key.B_FLAT;
case 3: return Key.E_FLAT;
case 4: return Key.A_FLAT;
case 5: return Key.D_FLAT;
case 6: return Key.G_FLAT;
default: break;
}
} else if (sharps > 0) {
switch (sharps) {
case 1: return Key.G;
case 2: return Key.D;
case 3: return Key.A;
case 4: return Key.E;
case 5: return Key.B;
case 6: return Key.F_SHARP;
default: break;
}
}
return Key.C; // Defaults
}
export function getSharpKey(sharps = 0) {
return getKey(0, sharps);
}
export function getFlatKey(flats = 0) {
return getKey(flats);
}