Key_Test.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. import { MusicSheetReader } from "../../../src/MusicalScore/ScoreIO/MusicSheetReader";
  2. import { MusicSheet } from "../../../src/MusicalScore/MusicSheet";
  3. import { IXmlElement } from "../../../src/Common/FileIO/Xml";
  4. import { KeyInstruction } from "../../../src/MusicalScore/VoiceData/Instructions/KeyInstruction";
  5. import { KeyEnum as KeyModeEnum } from "../../../src/MusicalScore/VoiceData/Instructions/KeyInstruction";
  6. let reader: MusicSheetReader;
  7. let parser: DOMParser;
  8. describe("MusicXML parser for element 'key'", () => {
  9. before((): void => {
  10. reader = new MusicSheetReader();
  11. parser = new DOMParser();
  12. });
  13. describe("for group traditional keys", () => {
  14. xit("enforces single occurrence of element 'fifths'", (done: MochaDone) => {
  15. let keyInstruction: KeyInstruction = getIllegalMusicXmlWithTwoFifthsElements().getFirstSourceMeasure().getKeyInstruction(0);
  16. // TODO Make sure we detect the multiple fifths and react properly
  17. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.none);
  18. done();
  19. });
  20. it("reads key signature with no optional 'mode' element present", (done: MochaDone) => {
  21. let keyInstruction: KeyInstruction = getMusicSheetWithKey(0, undefined).getFirstSourceMeasure().getKeyInstruction(0);
  22. chai.expect(keyInstruction.Key).to.equal(0);
  23. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.none);
  24. done();
  25. });
  26. describe("major keys", () => {
  27. it("reads key signature C-major", (done: MochaDone) => {
  28. let keyInstruction: KeyInstruction = getMusicSheetWithKey(0, "major").getFirstSourceMeasure().getKeyInstruction(0);
  29. chai.expect(keyInstruction.Key).to.equal(0);
  30. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  31. done();
  32. });
  33. it("reads key signature G-major", (done: MochaDone) => {
  34. let keyInstruction: KeyInstruction = getMusicSheetWithKey(1, "major").getFirstSourceMeasure().getKeyInstruction(0);
  35. chai.expect(keyInstruction.Key).to.equal(1);
  36. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  37. done();
  38. });
  39. it("reads key signature D-major", (done: MochaDone) => {
  40. let keyInstruction: KeyInstruction = getMusicSheetWithKey(2, "major").getFirstSourceMeasure().getKeyInstruction(0);
  41. chai.expect(keyInstruction.Key).to.equal(2);
  42. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  43. done();
  44. });
  45. it("reads key signature A-major", (done: MochaDone) => {
  46. let keyInstruction: KeyInstruction = getMusicSheetWithKey(3, "major").getFirstSourceMeasure().getKeyInstruction(0);
  47. chai.expect(keyInstruction.Key).to.equal(3);
  48. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  49. done();
  50. });
  51. it("reads key signature E-major", (done: MochaDone) => {
  52. let keyInstruction: KeyInstruction = getMusicSheetWithKey(4, "major").getFirstSourceMeasure().getKeyInstruction(0);
  53. chai.expect(keyInstruction.Key).to.equal(4);
  54. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  55. done();
  56. });
  57. it("reads key signature B-major", (done: MochaDone) => {
  58. let keyInstruction: KeyInstruction = getMusicSheetWithKey(5, "major").getFirstSourceMeasure().getKeyInstruction(0);
  59. chai.expect(keyInstruction.Key).to.equal(5);
  60. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  61. done();
  62. });
  63. it("reads key signature Fis-major", (done: MochaDone) => {
  64. let keyInstruction: KeyInstruction = getMusicSheetWithKey(6, "major").getFirstSourceMeasure().getKeyInstruction(0);
  65. chai.expect(keyInstruction.Key).to.equal(6);
  66. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  67. done();
  68. });
  69. it("reads key signature Cis-major", (done: MochaDone) => {
  70. let keyInstruction: KeyInstruction = getMusicSheetWithKey(7, "major").getFirstSourceMeasure().getKeyInstruction(0);
  71. chai.expect(keyInstruction.Key).to.equal(7);
  72. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  73. done();
  74. });
  75. it("reads key signature Gis-major", (done: MochaDone) => {
  76. let keyInstruction: KeyInstruction = getMusicSheetWithKey(8, "major").getFirstSourceMeasure().getKeyInstruction(0);
  77. chai.expect(keyInstruction.Key).to.equal(8);
  78. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  79. done();
  80. });
  81. it("reads key signature F-major", (done: MochaDone) => {
  82. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-1, "major").getFirstSourceMeasure().getKeyInstruction(0);
  83. chai.expect(keyInstruction.Key).to.equal(-1);
  84. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  85. done();
  86. });
  87. it("reads key signature B-major", (done: MochaDone) => {
  88. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-2, "major").getFirstSourceMeasure().getKeyInstruction(0);
  89. chai.expect(keyInstruction.Key).to.equal(-2);
  90. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  91. done();
  92. });
  93. it("reads key signature Es-major", (done: MochaDone) => {
  94. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-3, "major").getFirstSourceMeasure().getKeyInstruction(0);
  95. chai.expect(keyInstruction.Key).to.equal(-3);
  96. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  97. done();
  98. });
  99. it("reads key signature As-major", (done: MochaDone) => {
  100. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-4, "major").getFirstSourceMeasure().getKeyInstruction(0);
  101. chai.expect(keyInstruction.Key).to.equal(-4);
  102. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  103. done();
  104. });
  105. it("reads key signature Des-major", (done: MochaDone) => {
  106. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-5, "major").getFirstSourceMeasure().getKeyInstruction(0);
  107. chai.expect(keyInstruction.Key).to.equal(-5);
  108. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  109. done();
  110. });
  111. it("reads key signature Ges-major", (done: MochaDone) => {
  112. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-6, "major").getFirstSourceMeasure().getKeyInstruction(0);
  113. chai.expect(keyInstruction.Key).to.equal(-6);
  114. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  115. done();
  116. });
  117. it("reads key signature Fes-major", (done: MochaDone) => {
  118. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-8, "major").getFirstSourceMeasure().getKeyInstruction(0);
  119. chai.expect(keyInstruction.Key).to.equal(-8);
  120. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.major);
  121. done();
  122. });
  123. });
  124. describe("minor keys", () => {
  125. it("reads key signature a-minor", (done: MochaDone) => {
  126. let keyInstruction: KeyInstruction = getMusicSheetWithKey(0, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  127. chai.expect(keyInstruction.Key).to.equal(0);
  128. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  129. done();
  130. });
  131. it("reads key signature e-minor", (done: MochaDone) => {
  132. let keyInstruction: KeyInstruction = getMusicSheetWithKey(1, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  133. chai.expect(keyInstruction.Key).to.equal(1);
  134. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  135. done();
  136. });
  137. it("reads key signature b-minor", (done: MochaDone) => {
  138. let keyInstruction: KeyInstruction = getMusicSheetWithKey(2, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  139. chai.expect(keyInstruction.Key).to.equal(2);
  140. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  141. done();
  142. });
  143. it("reads key signature fis-minor", (done: MochaDone) => {
  144. let keyInstruction: KeyInstruction = getMusicSheetWithKey(3, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  145. chai.expect(keyInstruction.Key).to.equal(3);
  146. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  147. done();
  148. });
  149. it("reads key signature cis-minor", (done: MochaDone) => {
  150. let keyInstruction: KeyInstruction = getMusicSheetWithKey(4, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  151. chai.expect(keyInstruction.Key).to.equal(4);
  152. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  153. done();
  154. });
  155. it("reads key signature gis-minor", (done: MochaDone) => {
  156. let keyInstruction: KeyInstruction = getMusicSheetWithKey(5, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  157. chai.expect(keyInstruction.Key).to.equal(5);
  158. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  159. done();
  160. });
  161. it("reads key signature dis-minor", (done: MochaDone) => {
  162. let keyInstruction: KeyInstruction = getMusicSheetWithKey(6, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  163. chai.expect(keyInstruction.Key).to.equal(6);
  164. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  165. done();
  166. });
  167. it("reads key signature ais-minor", (done: MochaDone) => {
  168. let keyInstruction: KeyInstruction = getMusicSheetWithKey(7, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  169. chai.expect(keyInstruction.Key).to.equal(7);
  170. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  171. done();
  172. });
  173. it("reads key signature d-minor", (done: MochaDone) => {
  174. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-1, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  175. chai.expect(keyInstruction.Key).to.equal(-1);
  176. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  177. done();
  178. });
  179. it("reads key signature g-minor", (done: MochaDone) => {
  180. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-2, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  181. chai.expect(keyInstruction.Key).to.equal(-2);
  182. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  183. done();
  184. });
  185. it("reads key signature c-minor", (done: MochaDone) => {
  186. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-3, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  187. chai.expect(keyInstruction.Key).to.equal(-3);
  188. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  189. done();
  190. });
  191. it("reads key signature f-minor", (done: MochaDone) => {
  192. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-4, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  193. chai.expect(keyInstruction.Key).to.equal(-4);
  194. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  195. done();
  196. });
  197. it("reads key signature bb-minor", (done: MochaDone) => {
  198. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-5, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  199. chai.expect(keyInstruction.Key).to.equal(-5);
  200. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  201. done();
  202. });
  203. it("reads key signature es-minor", (done: MochaDone) => {
  204. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-6, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  205. chai.expect(keyInstruction.Key).to.equal(-6);
  206. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  207. done();
  208. });
  209. it("reads key signature as-minor", (done: MochaDone) => {
  210. let keyInstruction: KeyInstruction = getMusicSheetWithKey(-7, "minor").getFirstSourceMeasure().getKeyInstruction(0);
  211. chai.expect(keyInstruction.Key).to.equal(-7);
  212. chai.expect(keyInstruction.Mode).to.equal(KeyModeEnum.minor);
  213. done();
  214. });
  215. });
  216. });
  217. });
  218. function getMusicSheetWithKey(fifths: number = undefined, mode: string = undefined): MusicSheet {
  219. let doc: Document = parser.parseFromString(getMusicXmlWithKey(fifths, mode), "text/xml");
  220. chai.expect(doc).to.not.be.undefined;
  221. let score: IXmlElement = new IXmlElement(doc.getElementsByTagName("score-partwise")[0]);
  222. chai.expect(score).to.not.be.undefined;
  223. return reader.createMusicSheet(score, "template.xml");
  224. }
  225. function getMusicXmlWithKey(fifths: number = undefined, mode: string = undefined): string {
  226. let modeElement: string = mode ? `<mode>${mode}</mode>` : "";
  227. let fifthsElement: string = fifths ? `<fifths>${fifths}</fifths>` : "";
  228. return `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  229. <!DOCTYPE score-partwise PUBLIC
  230. "-//Recordare//DTD MusicXML 3.0 Partwise//EN"
  231. "http://www.musicxml.org/dtds/partwise.dtd">
  232. <score-partwise version="3.0">
  233. <part-list>
  234. <score-part id="P1">
  235. <part-name>Music</part-name>
  236. </score-part>
  237. </part-list>
  238. <part id="P1">
  239. <measure number="1">
  240. <attributes>
  241. <divisions>1</divisions>
  242. <key>
  243. ${fifthsElement}
  244. ${modeElement}
  245. </key>
  246. <time>
  247. <beats>4</beats>
  248. <beat-type>4</beat-type>
  249. </time>
  250. <clef>
  251. <sign>G</sign>
  252. <line>2</line>
  253. </clef>
  254. </attributes>
  255. <note>
  256. <pitch>
  257. <step>C</step>
  258. <octave>4</octave>
  259. </pitch>
  260. <duration>4</duration>
  261. <type>whole</type>
  262. </note>
  263. </measure>
  264. </part>
  265. </score-partwise>`;
  266. }
  267. function getIllegalMusicXmlWithTwoFifthsElements(): MusicSheet {
  268. let doc: Document = parser.parseFromString(
  269. `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  270. <!DOCTYPE score-partwise PUBLIC
  271. "-//Recordare//DTD MusicXML 3.0 Partwise//EN"
  272. "http://www.musicxml.org/dtds/partwise.dtd">
  273. <score-partwise version="3.0">
  274. <part-list>
  275. <score-part id="P1">
  276. <part-name>Music</part-name>
  277. </score-part>
  278. </part-list>
  279. <part id="P1">
  280. <measure number="1">
  281. <attributes>
  282. <divisions>1</divisions>
  283. <key>
  284. <fifths>1</fifths>
  285. <fifths>2</fifths>
  286. <fifths>3</fifths>
  287. </key>
  288. <time>
  289. <beats>4</beats>
  290. <beat-type>4</beat-type>
  291. </time>
  292. <clef>
  293. <sign>G</sign>
  294. <line>2</line>
  295. </clef>
  296. </attributes>
  297. <note>
  298. <pitch>
  299. <step>C</step>
  300. <octave>4</octave>
  301. </pitch>
  302. <duration>4</duration>
  303. <type>whole</type>
  304. </note>
  305. </measure>
  306. </part>
  307. </score-partwise>`,
  308. "text/xml"
  309. );
  310. chai.expect(doc).to.not.be.undefined;
  311. let score: IXmlElement = new IXmlElement(doc.getElementsByTagName("score-partwise")[0]);
  312. chai.expect(score).to.not.be.undefined;
  313. return reader.createMusicSheet(score, "template.xml");
  314. }