ChordSymbolReader.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import {IXmlElement} from "../../../Common/FileIO/Xml";
  2. import {MusicSheet} from "../../MusicSheet";
  3. import {ChordDegreeText, ChordSymbolContainer, ChordSymbolEnum, Degree} from "../../VoiceData/ChordSymbolContainer";
  4. import {AccidentalEnum, NoteEnum, Pitch} from "../../../Common/DataObjects/Pitch";
  5. import {KeyInstruction} from "../../VoiceData/Instructions/KeyInstruction";
  6. import {ITextTranslation} from "../../Interfaces/ITextTranslation";
  7. import {Logging} from "../../../Common/Logging";
  8. export class ChordSymbolReader {
  9. public static readChordSymbol(xmlNode: IXmlElement, musicSheet: MusicSheet, activeKey: KeyInstruction): ChordSymbolContainer {
  10. let root: IXmlElement = xmlNode.element("root");
  11. let kind: IXmlElement = xmlNode.element("kind");
  12. // must be always present
  13. if (root === undefined || kind === undefined) {
  14. return undefined;
  15. }
  16. let rootStep: IXmlElement = root.element("root-step");
  17. let rootAlter: IXmlElement = root.element("root-alter");
  18. // a valid NoteEnum value should be present
  19. if (rootStep === undefined) {
  20. return undefined;
  21. }
  22. let rootNote: NoteEnum;
  23. try {
  24. rootNote = NoteEnum[rootStep.value.trim()];
  25. } catch (ex) {
  26. let errorMsg: string = ITextTranslation.translateText("ReaderErrorMessages/ChordSymbolError",
  27. "Invalid chord symbol");
  28. musicSheet.SheetErrors.pushMeasureError(errorMsg);
  29. Logging.error(LogLevel.DEBUG, "InstrumentReader.readChordSymbol", errorMsg, ex);
  30. return undefined;
  31. }
  32. // an alteration value isn't necessary
  33. let rootAlteration: AccidentalEnum = AccidentalEnum.NONE;
  34. if (rootAlter !== undefined) {
  35. try {
  36. rootAlteration = <AccidentalEnum>parseInt(rootAlter.value, undefined);
  37. } catch (ex) {
  38. let errorMsg: string = ITextTranslation.translateText("ReaderErrorMessages/ChordSymbolError",
  39. "Invalid chord symbol");
  40. musicSheet.SheetErrors.pushMeasureError(errorMsg);
  41. Logging.error(LogLevel.DEBUG, "InstrumentReader.readChordSymbol", errorMsg, ex);
  42. }
  43. }
  44. // using default octave value, to be changed later
  45. let rootPitch: Pitch = new Pitch(rootNote, 1, rootAlteration);
  46. let kindValue: string = kind.value.trim().replace("-", "");
  47. let chordKind: ChordSymbolEnum;
  48. try {
  49. chordKind = ChordSymbolEnum[kindValue];
  50. } catch (ex) {
  51. let errorMsg: string = ITextTranslation.translateText("ReaderErrorMessages/ChordSymbolError",
  52. "Invalid chord symbol");
  53. musicSheet.SheetErrors.pushMeasureError(errorMsg);
  54. Logging.error(LogLevel.DEBUG, "InstrumentReader.readChordSymbol", errorMsg, ex);
  55. return undefined;
  56. }
  57. // bass is optional
  58. let bassPitch: Pitch = undefined;
  59. let bass: IXmlElement = xmlNode.element("bass");
  60. if (bass !== undefined) {
  61. let bassStep: IXmlElement = bass.element("bass-step");
  62. let bassAlter: IXmlElement = bass.element("bass-alter");
  63. let bassNote: NoteEnum = NoteEnum.C;
  64. if (bassStep !== undefined) {
  65. try {
  66. bassNote = NoteEnum[bassStep.value.trim()];
  67. } catch (ex) {
  68. let errorMsg: string = ITextTranslation.translateText("ReaderErrorMessages/ChordSymbolError",
  69. "Invalid chord symbol");
  70. musicSheet.SheetErrors.pushMeasureError(errorMsg);
  71. Logging.error(LogLevel.DEBUG, "InstrumentReader.readChordSymbol", errorMsg, ex);
  72. return undefined;
  73. }
  74. }
  75. let bassAlteration: AccidentalEnum = AccidentalEnum.NONE;
  76. if (bassAlter !== undefined) {
  77. try {
  78. bassAlteration = <AccidentalEnum>parseInt(bassAlter.value, undefined);
  79. } catch (ex) {
  80. let errorMsg: string = ITextTranslation.translateText("ReaderErrorMessages/ChordSymbolError",
  81. "Invalid chord symbol");
  82. musicSheet.SheetErrors.pushMeasureError(errorMsg);
  83. Logging.error(LogLevel.DEBUG, "InstrumentReader.readChordSymbol", errorMsg, ex);
  84. }
  85. }
  86. bassPitch = new Pitch(bassNote, 1, bassAlteration);
  87. }
  88. // degree is optional
  89. let degree: Degree = undefined;
  90. let degreeNode: IXmlElement = xmlNode.element("degree");
  91. if (degreeNode !== undefined) {
  92. let degreeValue: IXmlElement = degreeNode.element("degree-value");
  93. let degreeAlter: IXmlElement = degreeNode.element("degree-alter");
  94. let degreeType: IXmlElement = degreeNode.element("degree-type");
  95. if (degreeValue === undefined || degreeAlter === undefined || degreeType === undefined) {
  96. return undefined;
  97. }
  98. let value: number;
  99. try {
  100. value = parseInt(degreeValue.value.trim(), undefined);
  101. } catch (ex) {
  102. let errorMsg: string = ITextTranslation.translateText("ReaderErrorMessages/ChordSymbolError",
  103. "Invalid chord symbol");
  104. musicSheet.SheetErrors.pushMeasureError(errorMsg);
  105. Logging.error(LogLevel.DEBUG, "InstrumentReader.readChordSymbol", errorMsg, ex);
  106. return undefined;
  107. }
  108. let alter: AccidentalEnum;
  109. try {
  110. alter = <AccidentalEnum>parseInt(degreeAlter.value, undefined);
  111. } catch (ex) {
  112. let errorMsg: string = ITextTranslation.translateText("ReaderErrorMessages/ChordSymbolError",
  113. "Invalid chord symbol");
  114. musicSheet.SheetErrors.pushMeasureError(errorMsg);
  115. Logging.error(LogLevel.DEBUG, "InstrumentReader.readChordSymbol", errorMsg, ex);
  116. return undefined;
  117. }
  118. let text: ChordDegreeText;
  119. try {
  120. text = ChordDegreeText[degreeType.value.trim().toLowerCase()];
  121. } catch (ex) {
  122. let errorMsg: string = ITextTranslation.translateText("ReaderErrorMessages/ChordSymbolError",
  123. "Invalid chord symbol");
  124. musicSheet.SheetErrors.pushMeasureError(errorMsg);
  125. Logging.error(LogLevel.DEBUG, "InstrumentReader.readChordSymbol", errorMsg, ex);
  126. return undefined;
  127. }
  128. degree = new Degree(value, alter, text);
  129. }
  130. return new ChordSymbolContainer(rootPitch, chordKind, bassPitch, degree, activeKey);
  131. }
  132. }