forked from tonaljs/tonal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
123 lines (107 loc) · 2.33 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import { deprecate } from "@tonaljs/core";
import {
EmptyPcset,
get as pcset,
Pcset,
PcsetChroma,
PcsetNum
} from "@tonaljs/pcset";
import data from "./data";
/**
* Properties for a scale in the scale dictionary. It's a pitch class set
* properties with the following additional information:
* - name: the scale name
* - aliases: alternative list of names
* - intervals: an array of interval names
*/
export interface ScaleType extends Pcset {
readonly name: string;
readonly aliases: string[];
}
export const NoScaleType: ScaleType = {
...EmptyPcset,
intervals: [],
aliases: []
};
type ScaleTypeName = string | PcsetChroma | PcsetNum;
let dictionary: ScaleType[] = [];
let index: Record<ScaleTypeName, ScaleType> = {};
export function names() {
return dictionary.map(scale => scale.name);
}
/**
* Given a scale name or chroma, return the scale properties
*
* @param {string} type - scale name or pitch class set chroma
* @example
* import { get } from 'tonaljs/scale-type'
* get('major') // => { name: 'major', ... }
*/
export function get(type: ScaleTypeName): ScaleType {
return index[type] || NoScaleType;
}
export const scaleType = deprecate(
"ScaleDictionary.scaleType",
"ScaleType.get",
get
);
/**
* Return a list of all scale types
*/
export function all() {
return dictionary.slice();
}
export const entries = deprecate(
"ScaleDictionary.entries",
"ScaleType.all",
all
);
/**
* Keys used to reference scale types
*/
export function keys() {
return Object.keys(index);
}
/**
* Clear the dictionary
*/
export function removeAll() {
dictionary = [];
index = {};
}
/**
* Add a scale into dictionary
* @param intervals
* @param name
* @param aliases
*/
export function add(
intervals: string[],
name: string,
aliases: string[] = []
): ScaleType {
const scale = { ...pcset(intervals), name, intervals, aliases };
dictionary.push(scale);
index[scale.name] = scale;
index[scale.setNum] = scale;
index[scale.chroma] = scale;
scale.aliases.forEach(alias => addAlias(scale, alias));
return scale;
}
export function addAlias(scale: ScaleType, alias: string) {
index[alias] = scale;
}
data.forEach(([ivls, name, ...aliases]: string[]) =>
add(ivls.split(" "), name, aliases)
);
export default {
names,
get,
all,
add,
removeAll,
keys,
// deprecated
entries,
scaleType
};