chordsheetjs 5.3.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.husky/pre-commit +5 -0
- package/README.md +90 -4
- package/lib/chord.js +42 -35
- package/lib/chord_sheet/chord_lyrics_pair.js +5 -0
- package/lib/chord_sheet/line.js +23 -1
- package/lib/chord_sheet/metadata.js +14 -0
- package/lib/chord_sheet/song.js +189 -11
- package/lib/chord_sheet/tag.js +19 -5
- package/lib/formatter/templates/html_div_formatter.js +4 -4
- package/lib/formatter/templates/html_table_formatter.js +2 -2
- package/lib/formatter/text_formatter.js +2 -2
- package/lib/helpers.js +33 -9
- package/lib/key.js +48 -25
- package/lib/normalize_mappings/enharmonic-normalize.js +124 -0
- package/lib/normalize_mappings/generate-suffix-normalize-mapping.js +36 -0
- package/lib/normalize_mappings/suffix-normalize-mapping.js +914 -0
- package/lib/note.js +8 -3
- package/package.json +17 -9
- package/d7b54993c4ea66c07a35bd36690482ab620f836e.patch +0 -105
package/lib/chord_sheet/tag.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports["default"] = exports._KEY = exports.YEAR = exports.TRANSPOSE = exports.TITLE = exports.TIME = exports.TEMPO = exports.SUBTITLE = exports.START_OF_VERSE = exports.START_OF_TAB = exports.START_OF_CHORUS = exports.READ_ONLY_TAGS = exports.META_TAGS = exports.LYRICIST = exports.KEY = exports.END_OF_VERSE = exports.END_OF_TAB = exports.END_OF_CHORUS = exports.DURATION = exports.COPYRIGHT = exports.COMPOSER = exports.COMMENT = exports.CAPO = exports.ARTIST = exports.ALBUM = void 0;
|
|
6
|
+
exports["default"] = exports._KEY = exports.YEAR = exports.TRANSPOSE = exports.TITLE = exports.TIME = exports.TEMPO = exports.SUBTITLE = exports.START_OF_VERSE = exports.START_OF_TAB = exports.START_OF_CHORUS = exports.READ_ONLY_TAGS = exports.NEW_KEY = exports.META_TAGS = exports.LYRICIST = exports.KEY = exports.END_OF_VERSE = exports.END_OF_TAB = exports.END_OF_CHORUS = exports.DURATION = exports.COPYRIGHT = exports.COMPOSER = exports.COMMENT = exports.CAPO = exports.ARTIST = exports.ALBUM = void 0;
|
|
7
7
|
exports.isReadonlyTag = isReadonlyTag;
|
|
8
8
|
|
|
9
9
|
var _ALIASES;
|
|
@@ -162,11 +162,18 @@ var TITLE = 'title';
|
|
|
162
162
|
exports.TITLE = TITLE;
|
|
163
163
|
var TRANSPOSE = 'transpose';
|
|
164
164
|
/**
|
|
165
|
-
*
|
|
165
|
+
* New Key meta directive. See: https://github.com/PraiseCharts/ChordChartJS/issues/53
|
|
166
166
|
* @type {string}
|
|
167
167
|
*/
|
|
168
168
|
|
|
169
169
|
exports.TRANSPOSE = TRANSPOSE;
|
|
170
|
+
var NEW_KEY = 'new_key';
|
|
171
|
+
/**
|
|
172
|
+
* Year meta directive. See https://www.chordpro.org/chordpro/directives-year/
|
|
173
|
+
* @type {string}
|
|
174
|
+
*/
|
|
175
|
+
|
|
176
|
+
exports.NEW_KEY = NEW_KEY;
|
|
170
177
|
var YEAR = 'year';
|
|
171
178
|
exports.YEAR = YEAR;
|
|
172
179
|
var TITLE_SHORT = 't';
|
|
@@ -176,12 +183,13 @@ var START_OF_CHORUS_SHORT = 'soc';
|
|
|
176
183
|
var END_OF_CHORUS_SHORT = 'eoc';
|
|
177
184
|
var START_OF_TAB_SHORT = 'sot';
|
|
178
185
|
var END_OF_TAB_SHORT = 'eot';
|
|
186
|
+
var NEW_KEY_SHORT = 'nk';
|
|
179
187
|
var RENDERABLE_TAGS = [COMMENT];
|
|
180
188
|
var META_TAGS = [ALBUM, ARTIST, CAPO, COMPOSER, COPYRIGHT, DURATION, KEY, LYRICIST, TEMPO, TIME, TITLE, SUBTITLE, YEAR];
|
|
181
189
|
exports.META_TAGS = META_TAGS;
|
|
182
190
|
var READ_ONLY_TAGS = [_KEY];
|
|
183
191
|
exports.READ_ONLY_TAGS = READ_ONLY_TAGS;
|
|
184
|
-
var ALIASES = (_ALIASES = {}, _defineProperty(_ALIASES, TITLE_SHORT, TITLE), _defineProperty(_ALIASES, SUBTITLE_SHORT, SUBTITLE), _defineProperty(_ALIASES, COMMENT_SHORT, COMMENT), _defineProperty(_ALIASES, START_OF_CHORUS_SHORT, START_OF_CHORUS), _defineProperty(_ALIASES, END_OF_CHORUS_SHORT, END_OF_CHORUS), _defineProperty(_ALIASES, START_OF_TAB_SHORT, START_OF_TAB), _defineProperty(_ALIASES, END_OF_TAB_SHORT, END_OF_TAB), _ALIASES);
|
|
192
|
+
var ALIASES = (_ALIASES = {}, _defineProperty(_ALIASES, TITLE_SHORT, TITLE), _defineProperty(_ALIASES, SUBTITLE_SHORT, SUBTITLE), _defineProperty(_ALIASES, COMMENT_SHORT, COMMENT), _defineProperty(_ALIASES, START_OF_CHORUS_SHORT, START_OF_CHORUS), _defineProperty(_ALIASES, END_OF_CHORUS_SHORT, END_OF_CHORUS), _defineProperty(_ALIASES, START_OF_TAB_SHORT, START_OF_TAB), _defineProperty(_ALIASES, END_OF_TAB_SHORT, END_OF_TAB), _defineProperty(_ALIASES, NEW_KEY_SHORT, NEW_KEY), _ALIASES);
|
|
185
193
|
var META_TAG_REGEX = /^meta:\s*([^:\s]+)(\s*(.+))?$/;
|
|
186
194
|
var TAG_REGEX = /^([^:\s]+)(:?\s*(.+))?$/;
|
|
187
195
|
var CUSTOM_META_TAG_NAME_REGEX = /^x_(.+)$/;
|
|
@@ -263,7 +271,7 @@ var Tag = /*#__PURE__*/function () {
|
|
|
263
271
|
*/
|
|
264
272
|
function get() {
|
|
265
273
|
if (this._value) {
|
|
266
|
-
return this._value.trim();
|
|
274
|
+
return "".concat(this._value).trim();
|
|
267
275
|
}
|
|
268
276
|
|
|
269
277
|
return this._value || null;
|
|
@@ -309,13 +317,19 @@ var Tag = /*#__PURE__*/function () {
|
|
|
309
317
|
}, {
|
|
310
318
|
key: "clone",
|
|
311
319
|
value: function clone() {
|
|
312
|
-
return new Tag(this.
|
|
320
|
+
return new Tag(this._originalName, this.value);
|
|
313
321
|
}
|
|
314
322
|
}, {
|
|
315
323
|
key: "toString",
|
|
316
324
|
value: function toString() {
|
|
317
325
|
return "Tag(name=".concat(this.name, ", value=").concat(this.name, ")");
|
|
318
326
|
}
|
|
327
|
+
}, {
|
|
328
|
+
key: "set",
|
|
329
|
+
value: function set(_ref2) {
|
|
330
|
+
var value = _ref2.value;
|
|
331
|
+
return new Tag(this._originalName, value);
|
|
332
|
+
}
|
|
319
333
|
}], [{
|
|
320
334
|
key: "parse",
|
|
321
335
|
value: function parse(tag) {
|
|
@@ -379,7 +379,7 @@ templates['html_div_formatter'] = template({
|
|
|
379
379
|
return undefined;
|
|
380
380
|
};
|
|
381
381
|
|
|
382
|
-
return "<div class=\"column\"><div class=\"chord\">" + alias3((lookupProperty(helpers, "renderChord") || depth0 && lookupProperty(depth0, "renderChord") || alias2).call(alias1, depth0 != null ? lookupProperty(depth0, "chords") : depth0, (stack1 = blockParams[3][0]) != null ? lookupProperty(stack1, "key") : stack1, (stack1 =
|
|
382
|
+
return "<div class=\"column\"><div class=\"chord\">" + alias3((lookupProperty(helpers, "renderChord") || depth0 && lookupProperty(depth0, "renderChord") || alias2).call(alias1, depth0 != null ? lookupProperty(depth0, "chords") : depth0, (stack1 = blockParams[3][0]) != null ? lookupProperty(stack1, "key") : stack1, (stack1 = blockParams[3][0]) != null ? lookupProperty(stack1, "transposeKey") : stack1, (stack1 = data && lookupProperty(data, "root")) && lookupProperty(stack1, "song"), {
|
|
383
383
|
"name": "renderChord",
|
|
384
384
|
"hash": {},
|
|
385
385
|
"data": data,
|
|
@@ -391,7 +391,7 @@ templates['html_div_formatter'] = template({
|
|
|
391
391
|
},
|
|
392
392
|
"end": {
|
|
393
393
|
"line": 18,
|
|
394
|
-
"column":
|
|
394
|
+
"column": 117
|
|
395
395
|
}
|
|
396
396
|
}
|
|
397
397
|
})) + "</div><div class=\"lyrics\">" + alias3((helper = (helper = lookupProperty(helpers, "lyrics") || (depth0 != null ? lookupProperty(depth0, "lyrics") : depth0)) != null ? helper : alias2, typeof helper === "function" ? helper.call(alias1, {
|
|
@@ -402,11 +402,11 @@ templates['html_div_formatter'] = template({
|
|
|
402
402
|
"loc": {
|
|
403
403
|
"start": {
|
|
404
404
|
"line": 18,
|
|
405
|
-
"column":
|
|
405
|
+
"column": 143
|
|
406
406
|
},
|
|
407
407
|
"end": {
|
|
408
408
|
"line": 18,
|
|
409
|
-
"column":
|
|
409
|
+
"column": 153
|
|
410
410
|
}
|
|
411
411
|
}
|
|
412
412
|
}) : helper)) + "</div></div>";
|
|
@@ -416,7 +416,7 @@ templates['html_table_formatter'] = template({
|
|
|
416
416
|
return undefined;
|
|
417
417
|
};
|
|
418
418
|
|
|
419
|
-
return "<td class=\"chord\">" + container.escapeExpression((lookupProperty(helpers, "renderChord") || depth0 && lookupProperty(depth0, "renderChord") || container.hooks.helperMissing).call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? lookupProperty(depth0, "chords") : depth0, (stack1 = blockParams[4][0]) != null ? lookupProperty(stack1, "key") : stack1, (stack1 =
|
|
419
|
+
return "<td class=\"chord\">" + container.escapeExpression((lookupProperty(helpers, "renderChord") || depth0 && lookupProperty(depth0, "renderChord") || container.hooks.helperMissing).call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? lookupProperty(depth0, "chords") : depth0, (stack1 = blockParams[4][0]) != null ? lookupProperty(stack1, "key") : stack1, (stack1 = blockParams[4][0]) != null ? lookupProperty(stack1, "transposeKey") : stack1, (stack1 = data && lookupProperty(data, "root")) && lookupProperty(stack1, "song"), {
|
|
420
420
|
"name": "renderChord",
|
|
421
421
|
"hash": {},
|
|
422
422
|
"data": data,
|
|
@@ -428,7 +428,7 @@ templates['html_table_formatter'] = template({
|
|
|
428
428
|
},
|
|
429
429
|
"end": {
|
|
430
430
|
"line": 21,
|
|
431
|
-
"column":
|
|
431
|
+
"column": 102
|
|
432
432
|
}
|
|
433
433
|
}
|
|
434
434
|
})) + "</td>";
|
|
@@ -115,7 +115,7 @@ var TextFormatter = /*#__PURE__*/function () {
|
|
|
115
115
|
}, {
|
|
116
116
|
key: "chordLyricsPairLength",
|
|
117
117
|
value: function chordLyricsPairLength(chordLyricsPair, line) {
|
|
118
|
-
var chords = (0, _helpers.renderChord)(chordLyricsPair.chords, line.key, this.song
|
|
118
|
+
var chords = (0, _helpers.renderChord)(chordLyricsPair.chords, line.key, line.transposeKey, this.song);
|
|
119
119
|
var lyrics = chordLyricsPair.lyrics;
|
|
120
120
|
var chordsLength = (chords || '').length;
|
|
121
121
|
var lyricsLength = (lyrics || '').length;
|
|
@@ -134,7 +134,7 @@ var TextFormatter = /*#__PURE__*/function () {
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
if (item instanceof _chord_lyrics_pair["default"]) {
|
|
137
|
-
var chords = (0, _helpers.renderChord)(item.chords, line.key, this.song
|
|
137
|
+
var chords = (0, _helpers.renderChord)(item.chords, line.key, line.transposeKey, this.song);
|
|
138
138
|
return (0, _utilities.padLeft)(chords, this.chordLyricsPairLength(item, line));
|
|
139
139
|
}
|
|
140
140
|
|
package/lib/helpers.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.renderChord = renderChord;
|
|
7
|
+
exports.transposeDistance = transposeDistance;
|
|
7
8
|
|
|
8
9
|
var _chord = _interopRequireDefault(require("./chord"));
|
|
9
10
|
|
|
@@ -13,20 +14,43 @@ var _key = _interopRequireDefault(require("./key"));
|
|
|
13
14
|
|
|
14
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
15
16
|
|
|
16
|
-
function transposeDistance(
|
|
17
|
-
if (/^\d+$/.test(
|
|
18
|
-
return parseInt(
|
|
17
|
+
function transposeDistance(transposeKey, songKey) {
|
|
18
|
+
if (/^\d+$/.test(transposeKey)) {
|
|
19
|
+
return parseInt(transposeKey, 10);
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
return _key["default"].distance(songKey,
|
|
22
|
+
return _key["default"].distance(songKey, transposeKey);
|
|
22
23
|
}
|
|
23
|
-
/* eslint import/prefer-default-export: 0 */
|
|
24
24
|
|
|
25
|
+
function chordTransposeDistance(capo, transposeKey, songKey) {
|
|
26
|
+
var transpose = -1 * (capo || 0);
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return _chord["default"].parse(chord).transpose(transposeDistance(lineKey, songKey)).useModifier(lineKey.modifier).toString();
|
|
28
|
+
if ((0, _utilities.isPresent)(transposeKey) && (0, _utilities.isPresent)(songKey)) {
|
|
29
|
+
transpose += transposeDistance(transposeKey, songKey);
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
return
|
|
32
|
+
return transpose;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function renderChord(chord, lineKey, transposeKey, song) {
|
|
36
|
+
var chordObj = _chord["default"].parse(chord);
|
|
37
|
+
|
|
38
|
+
var capo = song.capo,
|
|
39
|
+
songKey = song.key;
|
|
40
|
+
|
|
41
|
+
if (!chordObj) {
|
|
42
|
+
return chord;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
chordObj = chordObj.transpose(chordTransposeDistance(capo, transposeKey, songKey));
|
|
46
|
+
|
|
47
|
+
if ((0, _utilities.isPresent)(transposeKey)) {
|
|
48
|
+
chordObj = chordObj.useModifier(transposeKey.modifier);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if ((0, _utilities.isPresent)(lineKey)) {
|
|
52
|
+
chordObj = chordObj.normalize(lineKey);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return chordObj.toString();
|
|
32
56
|
}
|
package/lib/key.js
CHANGED
|
@@ -11,6 +11,8 @@ var _note = _interopRequireDefault(require("./note"));
|
|
|
11
11
|
|
|
12
12
|
var _constants = require("./constants");
|
|
13
13
|
|
|
14
|
+
var _enharmonicNormalize = _interopRequireDefault(require("./normalize_mappings/enharmonic-normalize"));
|
|
15
|
+
|
|
14
16
|
var _MODIFIER_TRANSPOSITI;
|
|
15
17
|
|
|
16
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
@@ -43,14 +45,16 @@ var FLAT = 'b';
|
|
|
43
45
|
var SHARP = '#';
|
|
44
46
|
var MODIFIER_TRANSPOSITION = (_MODIFIER_TRANSPOSITI = {}, _defineProperty(_MODIFIER_TRANSPOSITI, SHARP, 1), _defineProperty(_MODIFIER_TRANSPOSITI, FLAT, -1), _MODIFIER_TRANSPOSITI);
|
|
45
47
|
|
|
46
|
-
var symbolKeyRegex = /*#__PURE__*/_wrapRegExp(/^([A-G])(#|b)?$/i, {
|
|
48
|
+
var symbolKeyRegex = /*#__PURE__*/_wrapRegExp(/^([A-G])(#|b)?(m)?$/i, {
|
|
47
49
|
note: 1,
|
|
48
|
-
modifier: 2
|
|
50
|
+
modifier: 2,
|
|
51
|
+
minor: 3
|
|
49
52
|
});
|
|
50
53
|
|
|
51
|
-
var numericKeyRegex = /*#__PURE__*/_wrapRegExp(/^(#|b)?([1-7])
|
|
54
|
+
var numericKeyRegex = /*#__PURE__*/_wrapRegExp(/^(#|b)?([1-7])(m)?$/, {
|
|
52
55
|
modifier: 1,
|
|
53
|
-
note: 2
|
|
56
|
+
note: 2,
|
|
57
|
+
minor: 3
|
|
54
58
|
});
|
|
55
59
|
|
|
56
60
|
var numeralKeyRegex = /*#__PURE__*/_wrapRegExp(/^(#|b)?(I{1,3}|IV|VI{0,2}|i{1,3}|iv|vi{0,2})$/, {
|
|
@@ -66,7 +70,9 @@ var Key = /*#__PURE__*/function () {
|
|
|
66
70
|
function Key(_ref) {
|
|
67
71
|
var note = _ref.note,
|
|
68
72
|
_ref$modifier = _ref.modifier,
|
|
69
|
-
modifier = _ref$modifier === void 0 ? null : _ref$modifier
|
|
73
|
+
modifier = _ref$modifier === void 0 ? null : _ref$modifier,
|
|
74
|
+
_ref$minor = _ref.minor,
|
|
75
|
+
minor = _ref$minor === void 0 ? false : _ref$minor;
|
|
70
76
|
|
|
71
77
|
_classCallCheck(this, Key);
|
|
72
78
|
|
|
@@ -74,6 +80,7 @@ var Key = /*#__PURE__*/function () {
|
|
|
74
80
|
|
|
75
81
|
this.note = note instanceof _note["default"] ? note : _note["default"].parse(note);
|
|
76
82
|
this.modifier = modifier || null;
|
|
83
|
+
this.minor = !!minor || false;
|
|
77
84
|
}
|
|
78
85
|
|
|
79
86
|
_createClass(Key, [{
|
|
@@ -100,6 +107,21 @@ var Key = /*#__PURE__*/function () {
|
|
|
100
107
|
value: function clone() {
|
|
101
108
|
return _classPrivateMethodGet(this, _set, _set2).call(this, {});
|
|
102
109
|
}
|
|
110
|
+
}, {
|
|
111
|
+
key: "toChordSymbol",
|
|
112
|
+
value: function toChordSymbol(key) {
|
|
113
|
+
if (this.is(_constants.SYMBOL)) {
|
|
114
|
+
return this.clone();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
var transposeDistance = this.note.getTransposeDistance(key.minor) + (MODIFIER_TRANSPOSITION[this.modifier] || 0);
|
|
118
|
+
return key.transpose(transposeDistance).normalize().useModifier(key.modifier);
|
|
119
|
+
}
|
|
120
|
+
}, {
|
|
121
|
+
key: "toChordSymbolString",
|
|
122
|
+
value: function toChordSymbolString(key) {
|
|
123
|
+
return this.toChordSymbol(key).toString();
|
|
124
|
+
}
|
|
103
125
|
}, {
|
|
104
126
|
key: "is",
|
|
105
127
|
value: function is(type) {
|
|
@@ -127,21 +149,6 @@ var Key = /*#__PURE__*/function () {
|
|
|
127
149
|
modifier = _ref2.modifier;
|
|
128
150
|
return this.note.equals(note) && this.modifier === modifier;
|
|
129
151
|
}
|
|
130
|
-
}, {
|
|
131
|
-
key: "toChordSymbol",
|
|
132
|
-
value: function toChordSymbol(key) {
|
|
133
|
-
if (this.is(_constants.SYMBOL)) {
|
|
134
|
-
return this.clone();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
var transposeDistance = this.note.getTransposeDistance() + (MODIFIER_TRANSPOSITION[this.modifier] || 0);
|
|
138
|
-
return key.transpose(transposeDistance).normalize().useModifier(key.modifier);
|
|
139
|
-
}
|
|
140
|
-
}, {
|
|
141
|
-
key: "toChordSymbolString",
|
|
142
|
-
value: function toChordSymbolString(key) {
|
|
143
|
-
return this.toChordSymbol(key).toString();
|
|
144
|
-
}
|
|
145
152
|
}, {
|
|
146
153
|
key: "toNumeric",
|
|
147
154
|
value: function toNumeric(key) {
|
|
@@ -159,11 +166,11 @@ var Key = /*#__PURE__*/function () {
|
|
|
159
166
|
note: 1
|
|
160
167
|
});
|
|
161
168
|
var symbolKey = key.clone();
|
|
162
|
-
var reference = this.clone().normalize().useModifier(key.modifier);
|
|
169
|
+
var reference = this.clone().normalize().useModifier(key.modifier).normalizeEnharmonics(key);
|
|
163
170
|
|
|
164
171
|
while (!symbolKey.equals(reference)) {
|
|
165
172
|
numericKey = numericKey.transposeUp().useModifier(key.modifier);
|
|
166
|
-
symbolKey = symbolKey.transposeUp().normalize().useModifier(key.modifier);
|
|
173
|
+
symbolKey = symbolKey.transposeUp().normalize().useModifier(key.modifier).normalizeEnharmonics(key);
|
|
167
174
|
}
|
|
168
175
|
|
|
169
176
|
return numericKey;
|
|
@@ -190,11 +197,11 @@ var Key = /*#__PURE__*/function () {
|
|
|
190
197
|
note: 'I'
|
|
191
198
|
});
|
|
192
199
|
var symbolKey = key.clone();
|
|
193
|
-
var reference = this.clone().normalize().useModifier(key.modifier);
|
|
200
|
+
var reference = this.clone().normalize().useModifier(key.modifier).normalizeEnharmonics(key);
|
|
194
201
|
|
|
195
202
|
while (!symbolKey.equals(reference)) {
|
|
196
203
|
numeralKey = numeralKey.transposeUp().useModifier(key.modifier);
|
|
197
|
-
symbolKey = symbolKey.transposeUp().normalize().useModifier(key.modifier);
|
|
204
|
+
symbolKey = symbolKey.transposeUp().normalize().useModifier(key.modifier).normalizeEnharmonics(key);
|
|
198
205
|
}
|
|
199
206
|
|
|
200
207
|
return numeralKey;
|
|
@@ -318,6 +325,21 @@ var Key = /*#__PURE__*/function () {
|
|
|
318
325
|
});
|
|
319
326
|
}
|
|
320
327
|
|
|
328
|
+
return this.clone();
|
|
329
|
+
}
|
|
330
|
+
}, {
|
|
331
|
+
key: "normalizeEnharmonics",
|
|
332
|
+
value: function normalizeEnharmonics(key) {
|
|
333
|
+
if (key) {
|
|
334
|
+
var rootKeyString = key.minor ? "".concat(key, "m") : key.toString();
|
|
335
|
+
var enharmonics = _enharmonicNormalize["default"][rootKeyString];
|
|
336
|
+
var thisKeyString = this.toString();
|
|
337
|
+
|
|
338
|
+
if (enharmonics && enharmonics[thisKeyString]) {
|
|
339
|
+
return Key.parse(enharmonics[thisKeyString]);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
321
343
|
return this.clone();
|
|
322
344
|
}
|
|
323
345
|
}], [{
|
|
@@ -355,7 +377,8 @@ var Key = /*#__PURE__*/function () {
|
|
|
355
377
|
function _set2(attributes) {
|
|
356
378
|
return new this.constructor(_objectSpread({
|
|
357
379
|
note: this.note.clone(),
|
|
358
|
-
modifier: this.modifier
|
|
380
|
+
modifier: this.modifier,
|
|
381
|
+
minor: !!this.minor
|
|
359
382
|
}, attributes));
|
|
360
383
|
}
|
|
361
384
|
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
var _default = {
|
|
8
|
+
'Ab': {
|
|
9
|
+
'B': 'Cb'
|
|
10
|
+
},
|
|
11
|
+
'Cb': {
|
|
12
|
+
'B': 'Cb',
|
|
13
|
+
'A#': 'Bb',
|
|
14
|
+
'E': 'Fb'
|
|
15
|
+
},
|
|
16
|
+
'C': {
|
|
17
|
+
'C#': 'Db',
|
|
18
|
+
'D#': 'Eb',
|
|
19
|
+
'F#': 'Gb',
|
|
20
|
+
'G#': 'Ab',
|
|
21
|
+
'A#': 'Bb'
|
|
22
|
+
},
|
|
23
|
+
'C#': {
|
|
24
|
+
'D#': 'Eb',
|
|
25
|
+
'A#': 'Bb'
|
|
26
|
+
},
|
|
27
|
+
'Db': {
|
|
28
|
+
'B': 'Cb'
|
|
29
|
+
},
|
|
30
|
+
'D': {
|
|
31
|
+
'D#': 'Eb',
|
|
32
|
+
'A#': 'Bb'
|
|
33
|
+
},
|
|
34
|
+
'E': {
|
|
35
|
+
'Ab': 'G#',
|
|
36
|
+
'A#': 'Bb',
|
|
37
|
+
'D#': 'Eb'
|
|
38
|
+
},
|
|
39
|
+
'F': {
|
|
40
|
+
'A#': 'Bb',
|
|
41
|
+
'F#': 'Gb',
|
|
42
|
+
'C#': 'Db',
|
|
43
|
+
'D#': 'Eb',
|
|
44
|
+
'G#': 'Ab'
|
|
45
|
+
},
|
|
46
|
+
'F#': {
|
|
47
|
+
'A#': 'Bb',
|
|
48
|
+
'D#': 'Eb'
|
|
49
|
+
},
|
|
50
|
+
'Gb': {
|
|
51
|
+
'A#': 'Bb',
|
|
52
|
+
'D#': 'Eb',
|
|
53
|
+
'G#': 'Ab',
|
|
54
|
+
'B': 'Cb',
|
|
55
|
+
'E': 'Fb'
|
|
56
|
+
},
|
|
57
|
+
'G': {
|
|
58
|
+
'A#': 'Bb',
|
|
59
|
+
'D#': 'Eb',
|
|
60
|
+
'G#': 'Ab'
|
|
61
|
+
},
|
|
62
|
+
'G#': {
|
|
63
|
+
'A#': 'Bb',
|
|
64
|
+
'D#': 'Eb'
|
|
65
|
+
},
|
|
66
|
+
'Am': {
|
|
67
|
+
'Gb': 'G',
|
|
68
|
+
'G#': 'Ab',
|
|
69
|
+
'F#': 'Gb',
|
|
70
|
+
'C#': 'Db',
|
|
71
|
+
'D#': 'Eb',
|
|
72
|
+
'A#': 'Bb'
|
|
73
|
+
},
|
|
74
|
+
'Bbm': {
|
|
75
|
+
'Cb': 'B'
|
|
76
|
+
},
|
|
77
|
+
'Bm': {
|
|
78
|
+
'A#': 'Bb',
|
|
79
|
+
'D#': 'Eb'
|
|
80
|
+
},
|
|
81
|
+
'C#m': {
|
|
82
|
+
'A#': 'Bb',
|
|
83
|
+
'D#': 'Eb'
|
|
84
|
+
},
|
|
85
|
+
'Cm': {
|
|
86
|
+
'G#': 'Ab',
|
|
87
|
+
'A#': 'Bb',
|
|
88
|
+
'D#': 'Eb',
|
|
89
|
+
'F#': 'Gb',
|
|
90
|
+
'C#': 'Db'
|
|
91
|
+
},
|
|
92
|
+
'Dm': {
|
|
93
|
+
'A#': 'Bb',
|
|
94
|
+
'D#': 'Eb'
|
|
95
|
+
},
|
|
96
|
+
'Em': {
|
|
97
|
+
'A#': 'Bb',
|
|
98
|
+
'D#': 'Eb'
|
|
99
|
+
},
|
|
100
|
+
'F#m': {
|
|
101
|
+
'A#': 'Bb',
|
|
102
|
+
'D#': 'Eb',
|
|
103
|
+
'Gb': 'F#',
|
|
104
|
+
'Ab': 'G#',
|
|
105
|
+
'Db': 'C#'
|
|
106
|
+
},
|
|
107
|
+
'Fm': {
|
|
108
|
+
'G#': 'Ab',
|
|
109
|
+
'A#': 'Bb',
|
|
110
|
+
'D#': 'Eb',
|
|
111
|
+
'F#': 'Gb',
|
|
112
|
+
'C#': 'Db'
|
|
113
|
+
},
|
|
114
|
+
'Gm': {
|
|
115
|
+
'G#': 'Ab',
|
|
116
|
+
'A#': 'Bb',
|
|
117
|
+
'D#': 'Eb'
|
|
118
|
+
},
|
|
119
|
+
'G#m': {
|
|
120
|
+
'A#': 'Bb',
|
|
121
|
+
'D#': 'Eb'
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
4
|
+
|
|
5
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
6
|
+
|
|
7
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
|
+
|
|
9
|
+
var fs = require('fs');
|
|
10
|
+
|
|
11
|
+
console.warn('\x1b[34m', '👷 Building suffix normalize mapping from suffix-mapping.txt');
|
|
12
|
+
fs.readFile('src/normalize_mappings/suffix-mapping.txt', function (err, data) {
|
|
13
|
+
if (err) throw err;
|
|
14
|
+
var suffixs = [];
|
|
15
|
+
data.toString().split('\n').map(function (line) {
|
|
16
|
+
var items = line.split(',');
|
|
17
|
+
var cleanStringsArray = [];
|
|
18
|
+
items.forEach(function (item) {
|
|
19
|
+
cleanStringsArray.push(item.trim());
|
|
20
|
+
});
|
|
21
|
+
suffixs.push(cleanStringsArray);
|
|
22
|
+
return suffixs;
|
|
23
|
+
});
|
|
24
|
+
var flatObject = {};
|
|
25
|
+
suffixs.forEach(function (line) {
|
|
26
|
+
line.forEach(function (item) {
|
|
27
|
+
flatObject = _objectSpread(_defineProperty({}, item, line[0]), flatObject);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
var suffixMappingJson = JSON.stringify(flatObject, null, 2);
|
|
31
|
+
var suffixMappingJs = "export default ".concat(suffixMappingJson, ";\n");
|
|
32
|
+
fs.writeFile('src/normalize_mappings/suffix-normalize-mapping.js', suffixMappingJs, 'utf-8', function (error) {
|
|
33
|
+
if (error) throw error;
|
|
34
|
+
console.warn('\x1b[32m', '✨ Sucessfully built suffix-normalize-mapping.js');
|
|
35
|
+
});
|
|
36
|
+
});
|