Pitch_Test.js 5.8 KB

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