(
keySignature: KeySignature,
noteValue: number,
accidentalMode: NoteAccidentalMode
)
| 1001 | } |
| 1002 | |
| 1003 | public static resolveSpelling( |
| 1004 | keySignature: KeySignature, |
| 1005 | noteValue: number, |
| 1006 | accidentalMode: NoteAccidentalMode |
| 1007 | ): ResolvedSpelling { |
| 1008 | const chroma = ModelUtils.flooredDivision(noteValue, 12); |
| 1009 | |
| 1010 | const preferred = ModelUtils._getPreferredSpellingForKeySignature(keySignature, chroma); |
| 1011 | const desiredOffset = ModelUtils._forcedAccidentalOffsetByMode.has(accidentalMode) |
| 1012 | ? ModelUtils._forcedAccidentalOffsetByMode.get(accidentalMode)! |
| 1013 | : Number.NaN; |
| 1014 | |
| 1015 | let spelling: SpellingBase = preferred; |
| 1016 | if (!Number.isNaN(desiredOffset)) { |
| 1017 | const candidates = ModelUtils._spellingCandidates[chroma]; |
| 1018 | const exact = candidates.find(c => c.accidentalOffset === desiredOffset); |
| 1019 | if (exact) { |
| 1020 | spelling = exact; |
| 1021 | } |
| 1022 | } |
| 1023 | |
| 1024 | const baseSemitone = ModelUtils._degreeSemitones[spelling.degree] + spelling.accidentalOffset; |
| 1025 | const octave = Math.floor((noteValue - baseSemitone) / 12) - 1; |
| 1026 | |
| 1027 | return { |
| 1028 | degree: spelling.degree, |
| 1029 | accidentalOffset: spelling.accidentalOffset, |
| 1030 | chroma, |
| 1031 | octave |
| 1032 | }; |
| 1033 | } |
| 1034 | |
| 1035 | public static computeAccidental( |
| 1036 | keySignature: KeySignature, |
no test coverage detected