ContinuousDynamicExpression.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import {PlacementEnum, AbstractExpression} from "../AbstractExpression";
  2. import {MultiExpression} from "../MultiExpression";
  3. import {Fraction} from "../../../../Common/DataObjects/Fraction";
  4. export class ContinuousDynamicExpression extends AbstractExpression {
  5. //constructor(placement: PlacementEnum, staffNumber: number, label: string) {
  6. // this.label = label;
  7. // this.placement = placement;
  8. // this.staffNumber = staffNumber;
  9. // this.startVolume = -1;
  10. // this.endVolume = -1;
  11. // this.setType();
  12. //}
  13. constructor(dynamicType: ContDynamicEnum, placement: PlacementEnum, staffNumber: number, label: string) {
  14. super();
  15. this.dynamicType = dynamicType;
  16. this.label = label;
  17. this.placement = placement;
  18. this.staffNumber = staffNumber;
  19. this.startVolume = -1;
  20. this.endVolume = -1;
  21. this.setType();
  22. }
  23. private static listContinuousDynamicIncreasing: string[] = ["crescendo", "cresc", "cresc.", "cres."];
  24. private static listContinuousDynamicDecreasing: string[] = ["decrescendo", "decresc", "decr.", "diminuendo", "dim.", "dim"];
  25. // private static listContinuousDynamicGeneral: string[] = ["subito","al niente","piu","meno"];
  26. private dynamicType: ContDynamicEnum;
  27. private startMultiExpression: MultiExpression;
  28. private endMultiExpression: MultiExpression;
  29. private startVolume: number;
  30. private endVolume: number;
  31. private placement: PlacementEnum;
  32. private staffNumber: number;
  33. private label: string;
  34. public get DynamicType(): ContDynamicEnum {
  35. return this.dynamicType;
  36. }
  37. public set DynamicType(value: ContDynamicEnum) {
  38. this.dynamicType = value;
  39. }
  40. public get StartMultiExpression(): MultiExpression {
  41. return this.startMultiExpression;
  42. }
  43. public set StartMultiExpression(value: MultiExpression) {
  44. this.startMultiExpression = value;
  45. }
  46. public get EndMultiExpression(): MultiExpression {
  47. return this.endMultiExpression;
  48. }
  49. public set EndMultiExpression(value: MultiExpression) {
  50. this.endMultiExpression = value;
  51. }
  52. public get Placement(): PlacementEnum {
  53. return this.placement;
  54. }
  55. public set Placement(value: PlacementEnum) {
  56. this.placement = value;
  57. }
  58. public get StartVolume(): number {
  59. return this.startVolume;
  60. }
  61. public set StartVolume(value: number) {
  62. this.startVolume = value;
  63. }
  64. public get EndVolume(): number {
  65. return this.endVolume;
  66. }
  67. public set EndVolume(value: number) {
  68. this.endVolume = value;
  69. }
  70. public get StaffNumber(): number {
  71. return this.staffNumber;
  72. }
  73. public set StaffNumber(value: number) {
  74. this.staffNumber = value;
  75. }
  76. public get Label(): string {
  77. return this.label;
  78. }
  79. public set Label(value: string) {
  80. this.label = value;
  81. this.setType();
  82. }
  83. public static isInputStringContinuousDynamic(inputString: string): boolean {
  84. if (inputString === undefined) { return false; }
  85. return (
  86. ContinuousDynamicExpression.isStringInStringList(ContinuousDynamicExpression.listContinuousDynamicIncreasing, inputString)
  87. || ContinuousDynamicExpression.isStringInStringList(ContinuousDynamicExpression.listContinuousDynamicDecreasing, inputString)
  88. );
  89. }
  90. public getInterpolatedDynamic(currentAbsoluteTimestamp: Fraction): number {
  91. const continuousAbsoluteStartTimestamp: Fraction = this.StartMultiExpression.AbsoluteTimestamp;
  92. let continuousAbsoluteEndTimestamp: Fraction;
  93. if (this.EndMultiExpression !== undefined) {
  94. continuousAbsoluteEndTimestamp = this.EndMultiExpression.AbsoluteTimestamp;
  95. } else {
  96. continuousAbsoluteEndTimestamp = Fraction.plus(
  97. this.startMultiExpression.SourceMeasureParent.AbsoluteTimestamp, this.startMultiExpression.SourceMeasureParent.Duration
  98. );
  99. }
  100. if (currentAbsoluteTimestamp.lt(continuousAbsoluteStartTimestamp)) { return -1; }
  101. if (continuousAbsoluteEndTimestamp.lt(currentAbsoluteTimestamp)) { return -2; }
  102. const interpolationRatio: number =
  103. Fraction.minus(currentAbsoluteTimestamp, continuousAbsoluteStartTimestamp).RealValue
  104. / Fraction.minus(continuousAbsoluteEndTimestamp, continuousAbsoluteStartTimestamp).RealValue;
  105. const interpolatedVolume: number = Math.max(0.0, Math.min(99.9, this.startVolume + (this.endVolume - this.startVolume) * interpolationRatio));
  106. return interpolatedVolume;
  107. }
  108. public isWedge(): boolean {
  109. return this.label === undefined;
  110. }
  111. private setType(): void {
  112. if (ContinuousDynamicExpression.isStringInStringList(ContinuousDynamicExpression.listContinuousDynamicIncreasing, this.label)) {
  113. this.dynamicType = ContDynamicEnum.crescendo;
  114. } else if (ContinuousDynamicExpression.isStringInStringList(ContinuousDynamicExpression.listContinuousDynamicDecreasing, this.label)) {
  115. this.dynamicType = ContDynamicEnum.diminuendo;
  116. }
  117. }
  118. }
  119. export enum ContDynamicEnum {
  120. crescendo = 0,
  121. diminuendo = 1
  122. }