-
Notifications
You must be signed in to change notification settings - Fork 2
/
getBeatString.js
86 lines (81 loc) · 2.21 KB
/
getBeatString.js
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
import symbols from '../../symbols';
/**
* Returns the rendered string of a given beat, e.g. a single chord or a sub-beat group of chords.
* This is useful for the purpose of measuring a beat length (e.g. alignment)
* @param {Bar} bar
* @param {Number} beatIndex
* @param {Object} options
* @param {Boolean} options.shouldPrintSubBeatDelimiters
* @param {('chord'|'roman')} options.symbolType
* @returns {String}
*/
export function getBeatString(
bar,
beatIndex,
{ shouldPrintSubBeatDelimiters = true, symbolType = 'chord' } = {}
) {
const beatChords = bar.allChords.filter(
(chord) => chord.beat === beatIndex
);
switch (beatChords.length) {
case 0:
return '';
case 1: {
return getChordString(bar, beatChords[0], {
shouldPrintSubBeatDelimiters,
symbolType,
});
}
default: {
return beatChords.reduce((allChords, chord, i) => {
const spacesBefore =
i > 0 ? ' '.repeat(symbols.spacesAfterSubBeatDefault) : '';
return (
allChords +
spacesBefore +
getChordString(bar, chord, {
shouldPrintSubBeatDelimiters,
symbolType,
})
);
}, '');
}
}
}
/**
* Returns the rendered string of a given chord
* This is useful for the purpose of measuring a beat length (e.g. alignment)
* @param {Bar} bar
* @param {ChordDef} chord
* @param {Object} options
* @param {Boolean} options.shouldPrintSubBeatDelimiters
* @param {('chord'|'roman')} options.symbolType
* @returns {String}
*/
export function getChordString(
bar,
chord,
{ shouldPrintSubBeatDelimiters, symbolType = 'chord' }
) {
const shouldPrintChordSymbol =
symbolType === 'chord' ||
chord.model === symbols.barRepeat ||
chord.model === symbols.noChordSymbol;
const symbol = shouldPrintChordSymbol
? chord.symbol
: chord.model.numeral.symbol;
if (!chord.isInSubBeatGroup) {
const chordDuration = bar.shouldPrintChordsDuration
? symbols.chordBeat.repeat(chord.duration)
: '';
return symbol + chordDuration;
} else {
if (shouldPrintSubBeatDelimiters && chord.isFirstOfSubBeat) {
return symbols.subBeatGroupOpener + symbol;
} else if (shouldPrintSubBeatDelimiters && chord.isLastOfSubBeat) {
return symbol + symbols.subBeatGroupCloser;
} else {
return symbol;
}
}
}