OctaveShift.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import {MultiExpression} from "../MultiExpression";
  2. import { Pitch } from "../../../../Common/DataObjects/Pitch";
  3. export class OctaveShift {
  4. constructor(type: string, octave: number) {
  5. this.setOctaveShiftValue(type, octave);
  6. }
  7. private octaveValue: OctaveEnum;
  8. private staffNumber: number;
  9. private startMultiExpression: MultiExpression;
  10. private endMultiExpression: MultiExpression;
  11. public get Type(): OctaveEnum {
  12. return this.octaveValue;
  13. }
  14. public set Type(value: OctaveEnum) {
  15. this.octaveValue = value;
  16. }
  17. public get StaffNumber(): number {
  18. return this.staffNumber;
  19. }
  20. public set StaffNumber(value: number) {
  21. this.staffNumber = value;
  22. }
  23. public get ParentStartMultiExpression(): MultiExpression {
  24. return this.startMultiExpression;
  25. }
  26. public set ParentStartMultiExpression(value: MultiExpression) {
  27. this.startMultiExpression = value;
  28. }
  29. public get ParentEndMultiExpression(): MultiExpression {
  30. return this.endMultiExpression;
  31. }
  32. public set ParentEndMultiExpression(value: MultiExpression) {
  33. this.endMultiExpression = value;
  34. }
  35. private setOctaveShiftValue(type: string, octave: number): void {
  36. if (octave === 1 && type === "down") {
  37. this.octaveValue = OctaveEnum.VA8;
  38. } else if (octave === 1 && type === "up") {
  39. this.octaveValue = OctaveEnum.VB8;
  40. } else if (octave === 2 && type === "down") {
  41. this.octaveValue = OctaveEnum.MA15;
  42. } else if (octave === 2 && type === "up") {
  43. this.octaveValue = OctaveEnum.MB15;
  44. } else {
  45. this.octaveValue = OctaveEnum.NONE;
  46. }
  47. }
  48. /**
  49. * Convert a source (XML) pitch of a note to the pitch needed to draw. E.g. 8va would draw +1 octave so we reduce by 1
  50. * @param pitch Original pitch
  51. * @param octaveShiftValue octave shift
  52. * @returns New pitch with corrected octave shift
  53. */
  54. public static getPitchFromOctaveShift(pitch: Pitch, octaveShiftValue: OctaveEnum): Pitch {
  55. let result: number = pitch.Octave;
  56. switch (octaveShiftValue) {
  57. case OctaveEnum.VA8:
  58. result -= 1;
  59. break;
  60. case OctaveEnum.VB8:
  61. result += 1;
  62. break;
  63. case OctaveEnum.MA15:
  64. result -= 2;
  65. break;
  66. case OctaveEnum.MB15:
  67. result += 2;
  68. break;
  69. case OctaveEnum.NONE:
  70. default:
  71. result += 0;
  72. }
  73. return new Pitch(pitch.FundamentalNote, result, pitch.Accidental);
  74. }
  75. }
  76. export enum OctaveEnum {
  77. VA8,
  78. VB8,
  79. MA15,
  80. MB15,
  81. NONE
  82. }