multiExpression.ts 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import {SourceMeasure} from "../SourceMeasure";
  2. import {Fraction} from "../../../Common/DataObjects/fraction";
  3. import {InstantaniousDynamicExpression} from "./instantaniousDynamicExpression";
  4. import {ContinuousDynamicExpression} from "./ContinuousExpressions/continuousDynamicExpression";
  5. import {OctaveShift} from "./ContinuousExpressions/octaveShift";
  6. import {MoodExpression} from "./moodExpression";
  7. import {UnknownExpression} from "./unknownExpression";
  8. import {AbstractExpression} from "./abstractExpression";
  9. import {PlacementEnum} from "./abstractExpression";
  10. export class MultiExpression /*implements IComparable<MultiExpression>*/ {
  11. constructor(sourceMeasure: SourceMeasure, timestamp: Fraction) {
  12. this.sourceMeasure = sourceMeasure;
  13. this.timestamp = timestamp;
  14. }
  15. private sourceMeasure: SourceMeasure;
  16. private staffNumber: number;
  17. private timestamp: Fraction;
  18. private instantaniousDynamic: InstantaniousDynamicExpression;
  19. private endingContinuousDynamic: ContinuousDynamicExpression;
  20. private startingContinuousDynamic: ContinuousDynamicExpression;
  21. private unknownList: UnknownExpression[] = [];
  22. private moodList: MoodExpression[] = [];
  23. private expressions: MultiExpressionEntry[] = [];
  24. private combinedExpressionsText: string;
  25. private octaveShiftStart: OctaveShift;
  26. private octaveShiftEnd: OctaveShift;
  27. public get SourceMeasureParent(): SourceMeasure {
  28. return this.sourceMeasure;
  29. }
  30. public set SourceMeasureParent(value: SourceMeasure) {
  31. this.sourceMeasure = value;
  32. }
  33. public get StaffNumber(): number {
  34. return this.staffNumber;
  35. }
  36. public set StaffNumber(value: number) {
  37. this.staffNumber = value;
  38. }
  39. public get Timestamp(): Fraction {
  40. return this.timestamp;
  41. }
  42. public set Timestamp(value: Fraction) {
  43. this.timestamp = value;
  44. }
  45. public get AbsoluteTimestamp(): Fraction {
  46. return Fraction.plus(this.timestamp, this.sourceMeasure.AbsoluteTimestamp);
  47. }
  48. public get InstantaniousDynamic(): InstantaniousDynamicExpression {
  49. return this.instantaniousDynamic;
  50. }
  51. public set InstantaniousDynamic(value: InstantaniousDynamicExpression) {
  52. this.instantaniousDynamic = value;
  53. }
  54. public get EndingContinuousDynamic(): ContinuousDynamicExpression {
  55. return this.endingContinuousDynamic;
  56. }
  57. public set EndingContinuousDynamic(value: ContinuousDynamicExpression) {
  58. this.endingContinuousDynamic = value;
  59. }
  60. public get StartingContinuousDynamic(): ContinuousDynamicExpression {
  61. return this.startingContinuousDynamic;
  62. }
  63. public set StartingContinuousDynamic(value: ContinuousDynamicExpression) {
  64. this.startingContinuousDynamic = value;
  65. }
  66. public get MoodList(): MoodExpression[] {
  67. return this.moodList;
  68. }
  69. public get UnknownList(): UnknownExpression[] {
  70. return this.unknownList;
  71. }
  72. public get EntriesList(): MultiExpressionEntry[] {
  73. return this.expressions;
  74. }
  75. public get OctaveShiftStart(): OctaveShift {
  76. return this.octaveShiftStart;
  77. }
  78. public set OctaveShiftStart(value: OctaveShift) {
  79. this.octaveShiftStart = value;
  80. }
  81. public get OctaveShiftEnd(): OctaveShift {
  82. return this.octaveShiftEnd;
  83. }
  84. public set OctaveShiftEnd(value: OctaveShift) {
  85. this.octaveShiftEnd = value;
  86. }
  87. public get CombinedExpressionsText(): string {
  88. return this.combinedExpressionsText;
  89. }
  90. public set CombinedExpressionsText(value: string) {
  91. this.combinedExpressionsText = value;
  92. }
  93. public getPlacementOfFirstEntry(): PlacementEnum {
  94. var placement: PlacementEnum = PlacementEnum.Above;
  95. if (this.expressions.length > 0) {
  96. if (this.expressions[0].expression instanceof InstantaniousDynamicExpression)
  97. placement = (<InstantaniousDynamicExpression>(this.expressions[0].expression)).Placement;
  98. else if (this.expressions[0].expression instanceof ContinuousDynamicExpression)
  99. placement = (<ContinuousDynamicExpression>(this.expressions[0].expression)).Placement;
  100. else if (this.expressions[0].expression instanceof MoodExpression)
  101. placement = (<MoodExpression>(this.expressions[0].expression)).Placement;
  102. else if (this.expressions[0].expression instanceof UnknownExpression)
  103. placement = (<UnknownExpression>(this.expressions[0].expression)).Placement;
  104. }
  105. return placement;
  106. }
  107. // (*)
  108. //public getFontstyleOfFirstEntry(): PSFontStyles {
  109. // var fontStyle: PSFontStyles = PSFontStyles.Regular;
  110. // if (this.expressions.length > 0) {
  111. // if (this.expressions[0].expression instanceof ContinuousDynamicExpression)
  112. // fontStyle = PSFontStyles.Italic;
  113. // else if (this.expressions[0].expression instanceof MoodExpression)
  114. // fontStyle = PSFontStyles.Italic;
  115. // else if (this.expressions[0].expression instanceof UnknownExpression)
  116. // fontStyle = PSFontStyles.Regular;
  117. // }
  118. // return fontStyle;
  119. //}
  120. //public getFirstEntry(staffLine: StaffLine, graphLabel: GraphicalLabel): AbstractGraphicalExpression {
  121. // var indexOfFirstNotInstDynExpr: number = 0;
  122. // if (this.expressions[0].expression instanceof InstantaniousDynamicExpression)
  123. // indexOfFirstNotInstDynExpr = 1;
  124. // if (this.expressions.length > 0) {
  125. // if (this.expressions[indexOfFirstNotInstDynExpr].expression instanceof ContinuousDynamicExpression)
  126. // return new GraphicalContinuousDynamicExpression(<ContinuousDynamicExpression>(this.expressions[indexOfFirstNotInstDynExpr].expression), graphLabel);
  127. // else if (this.expressions[indexOfFirstNotInstDynExpr].expression instanceof MoodExpression)
  128. // return new GraphicalMoodExpression(<MoodExpression>(this.expressions[indexOfFirstNotInstDynExpr].expression), graphLabel);
  129. // else if (this.expressions[indexOfFirstNotInstDynExpr].expression instanceof UnknownExpression)
  130. // return new GraphicalUnknownExpression(<UnknownExpression>(this.expressions[indexOfFirstNotInstDynExpr].expression), graphLabel);
  131. // else return null;
  132. // }
  133. // else return null;
  134. //}
  135. public addExpression(abstractExpression: AbstractExpression, prefix: string): void {
  136. if (abstractExpression instanceof InstantaniousDynamicExpression) {
  137. if (this.instantaniousDynamic != null)
  138. this.removeExpressionFromEntryList(this.InstantaniousDynamic);
  139. this.instantaniousDynamic = <InstantaniousDynamicExpression>abstractExpression;
  140. this.instantaniousDynamic.ParentMultiExpression = this;
  141. }
  142. else if (abstractExpression instanceof ContinuousDynamicExpression) {
  143. this.startingContinuousDynamic = <ContinuousDynamicExpression>abstractExpression;
  144. }
  145. else if (abstractExpression instanceof MoodExpression) {
  146. this.moodList.push(<MoodExpression>abstractExpression);
  147. }
  148. else if (abstractExpression instanceof UnknownExpression) {
  149. this.unknownList.push(<UnknownExpression>abstractExpression);
  150. }
  151. this.addExpressionToEntryList(abstractExpression, prefix);
  152. }
  153. public CompareTo(other: MultiExpression): number {
  154. if (this.SourceMeasureParent.MeasureNumber > other.SourceMeasureParent.MeasureNumber)
  155. return 1;
  156. if (this.SourceMeasureParent.MeasureNumber < other.SourceMeasureParent.MeasureNumber)
  157. return -1;
  158. else {
  159. if (this.Timestamp.RealValue > other.Timestamp.RealValue)
  160. return 1;
  161. if (this.Timestamp.RealValue < other.Timestamp.RealValue)
  162. return -1;
  163. else return 0;
  164. }
  165. }
  166. private addExpressionToEntryList(expression: AbstractExpression, prefix: string): void {
  167. var multiExpressionEntry: MultiExpressionEntry = new MultiExpressionEntry();
  168. multiExpressionEntry.prefix = prefix;
  169. multiExpressionEntry.expression = expression;
  170. if (expression instanceof ContinuousDynamicExpression)
  171. multiExpressionEntry.label = (<ContinuousDynamicExpression>(expression)).Label;
  172. else if (expression instanceof MoodExpression)
  173. multiExpressionEntry.label = (<MoodExpression>(expression)).Label;
  174. else if (expression instanceof UnknownExpression)
  175. multiExpressionEntry.label = (<UnknownExpression>(expression)).Label;
  176. else multiExpressionEntry.label = "";
  177. this.expressions.push(multiExpressionEntry);
  178. }
  179. private removeExpressionFromEntryList(expression: AbstractExpression): void {
  180. for (var idx: number = 0, len = this.expressions.length; idx < len; ++idx) {
  181. var entry: MultiExpressionEntry = this.expressions[idx];
  182. if (entry.expression == expression) {
  183. this.expressions.splice(idx, 1);
  184. break;
  185. }
  186. }
  187. }
  188. }
  189. export class MultiExpressionEntry {
  190. public prefix: string;
  191. public expression: AbstractExpression;
  192. public label: string;
  193. }