Pitch_Test.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { Pitch, NoteEnum, AccidentalEnum } from "../../../src/Common/DataObjects/pitch";
  2. describe("Pitch Unit Tests:", () => {
  3. describe("transpose Pitch", () => {
  4. let pitch: Pitch = new Pitch(NoteEnum.A, 1, AccidentalEnum.NONE);
  5. let transposedFundamentalAndOctave: number[] = Pitch.CalculateTransposedHalfTone(pitch, 12);
  6. let higherTransposedFundamentalAndOctave: number[] = Pitch.CalculateTransposedHalfTone(pitch, 26);
  7. it("should be 1 octave higher and same fundamental", (done: MochaDone) => {
  8. chai.expect(transposedFundamentalAndOctave[1]).to.equal(1);
  9. chai.expect(transposedFundamentalAndOctave[0]).to.equal(pitch.FundamentalNote);
  10. chai.expect(higherTransposedFundamentalAndOctave[1]).to.equal(2);
  11. chai.expect(higherTransposedFundamentalAndOctave[0]).to.equal(pitch.FundamentalNote + 2);
  12. done();
  13. });
  14. });
  15. describe("calculate Frequency from Pitch", () => {
  16. let pitch1: Pitch = new Pitch(NoteEnum.A, 1, AccidentalEnum.NONE);
  17. let pitch2: Pitch = new Pitch(NoteEnum.B, 1, AccidentalEnum.DOUBLEFLAT);
  18. let pitch3: Pitch = new Pitch(NoteEnum.G, 1, AccidentalEnum.DOUBLESHARP);
  19. let frequency1: number = Pitch.calcFrequency(Pitch.calcFractionalKey(pitch1.Frequency));
  20. let frequency2: number = Pitch.calcFrequency(Pitch.calcFractionalKey(pitch2.Frequency));
  21. let frequency3: number = Pitch.calcFrequency(Pitch.calcFractionalKey(pitch3.Frequency));
  22. it("should be 440Hz", (done: MochaDone) => {
  23. chai.expect(pitch1.Frequency).to.equal(440);
  24. chai.expect(pitch2.Frequency).to.equal(440);
  25. chai.expect(pitch3.Frequency).to.equal(440);
  26. chai.expect(frequency1).to.equal(440);
  27. chai.expect(frequency2).to.equal(440);
  28. chai.expect(frequency3).to.equal(440);
  29. done();
  30. });
  31. });
  32. describe("calculate fractional key", () => {
  33. // the values are validated against the C# output. TODO: ask mauz about the shift
  34. let pitch1: Pitch = new Pitch(NoteEnum.C, 6, AccidentalEnum.SHARP); // C#6 -> 109
  35. let pitch2: Pitch = new Pitch(NoteEnum.B, 1, AccidentalEnum.NONE); // B1 -> 59
  36. let pitch3: Pitch = new Pitch(NoteEnum.F, 4, AccidentalEnum.DOUBLEFLAT); // Fbb4 -> 87
  37. let pitch4: Pitch = new Pitch(NoteEnum.E, -1, AccidentalEnum.DOUBLESHARP); // E##-1 -> 30
  38. let pitch5: Pitch = new Pitch(NoteEnum.A, 1, AccidentalEnum.NONE); // A1 -> 57
  39. let key1: number = Pitch.calcFractionalKey(pitch1.Frequency);
  40. let key2: number = Pitch.calcFractionalKey(pitch2.Frequency);
  41. let key3: number = Pitch.calcFractionalKey(pitch3.Frequency);
  42. let key4: number = Pitch.calcFractionalKey(pitch4.Frequency);
  43. let key5: number = Pitch.calcFractionalKey(pitch5.Frequency);
  44. it("pitch key should equal midi key", (done: MochaDone) => {
  45. chai.expect(key1).to.equal(109);
  46. chai.expect(key2).to.equal(59);
  47. chai.expect(key3).to.equal(87);
  48. chai.expect(key4).to.equal(30);
  49. chai.expect(key5).to.equal(57);
  50. done();
  51. });
  52. });
  53. describe("calculate Pitch from Frequency", () => {
  54. let octave: number = 1;
  55. let accidentals: number[] = [AccidentalEnum.DOUBLEFLAT,
  56. AccidentalEnum.FLAT,
  57. AccidentalEnum.NONE,
  58. AccidentalEnum.SHARP,
  59. AccidentalEnum.DOUBLESHARP,
  60. ];
  61. let pitch: Pitch;
  62. let calcedPitch: Pitch;
  63. for (let i: number = 0; i < Pitch.pitchEnumValues.length; i++) {
  64. for (let j: number = 0; j < accidentals.length; j++) {
  65. pitch = new Pitch(Pitch.pitchEnumValues[i], octave, accidentals[j]);
  66. calcedPitch = Pitch.getPitchFromFrequency(pitch.Frequency);
  67. it( "calcedPitch equals original, " +
  68. `note: ${pitch.FundamentalNote}, octave: ${pitch.Octave}, accidental; ${pitch.Accidental}`,
  69. (done: MochaDone) => {
  70. // compare the frequencies here -> only AccidentalEnum None and Sharp will lead to same note, octave and accidental
  71. chai.expect(pitch.Frequency).to.equal(calcedPitch.Frequency);
  72. done();
  73. });
  74. }
  75. }
  76. });
  77. describe("get Pitch from fractional key", () => {
  78. let octave: number = 5;
  79. let accidentals: number[] = [AccidentalEnum.DOUBLEFLAT,
  80. AccidentalEnum.FLAT,
  81. AccidentalEnum.NONE,
  82. AccidentalEnum.SHARP,
  83. AccidentalEnum.DOUBLESHARP,
  84. ];
  85. let pitch: Pitch;
  86. let calcedPitch: Pitch;
  87. for (let i: number = 0; i < Pitch.pitchEnumValues.length; i++) {
  88. for (let j: number = 0; j < accidentals.length; j++) {
  89. pitch = new Pitch(Pitch.pitchEnumValues[i], octave, accidentals[j]);
  90. let halftone: number = pitch.getHalfTone();
  91. calcedPitch = Pitch.getPitchFromHalftone(halftone);
  92. it( "calcedPitch equals original, " +
  93. `note: ${pitch.FundamentalNote}, octave: ${pitch.Octave}, accidental; ${pitch.Accidental}`,
  94. (done: MochaDone) => {
  95. chai.expect(pitch.getHalfTone()).to.equal(calcedPitch.getHalfTone());
  96. done();
  97. });
  98. }
  99. }
  100. });
  101. // TODO: test ceiling and floor (needed for the music sheet transpose)
  102. // TODO: test getTransposedPitch (or delete it -> seems to be a less powerful implementation of CalculateTransposedHalfTone)
  103. // TODO: test DoEnharmonicEnchange (needed for the midi reader)
  104. });