ContinuousTempoExpression.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {Fraction} from "../../../../Common/DataObjects/Fraction";
  2. import {PlacementEnum} from "../AbstractExpression";
  3. import {MultiTempoExpression} from "../MultiTempoExpression";
  4. import {AbstractTempoExpression} from "../AbstractTempoExpression";
  5. export class ContinuousTempoExpression extends AbstractTempoExpression {
  6. constructor(label: string, placement: PlacementEnum, staffNumber: number, parentMultiTempoExpression: MultiTempoExpression) {
  7. super(label, placement, staffNumber, parentMultiTempoExpression);
  8. //super.label = label;
  9. //super.placement = placement;
  10. //super.staffNumber = staffNumber;
  11. //super.parentMultiTempoExpression = parentMultiTempoExpression;
  12. this.setTempoType();
  13. }
  14. private static listContinuousTempoFaster: string[] = ["accelerando", "piu mosso", "poco piu", "stretto"];
  15. private static listContinuousTempoSlower: string[] = [
  16. "poco meno", "meno mosso", "piu lento", "calando", "allargando", "rallentando", "ritardando",
  17. "ritenuto", "ritard.", "ritard", "rit.", "rit", "riten.", "riten",
  18. ];
  19. private absoluteEndTimestamp: Fraction;
  20. private tempoType: ContinuousTempoType;
  21. private startTempo: number;
  22. private endTempo: number;
  23. public static isInputStringContinuousTempo(inputString: string): boolean {
  24. if (inputString === undefined) { return false; }
  25. return (
  26. ContinuousTempoExpression.isStringInStringList(ContinuousTempoExpression.listContinuousTempoFaster, inputString)
  27. || ContinuousTempoExpression.isStringInStringList(ContinuousTempoExpression.listContinuousTempoSlower, inputString)
  28. );
  29. }
  30. public static isIncreasingTempo(tempoType: ContinuousTempoType): boolean {
  31. return tempoType <= ContinuousTempoType.piuMosso;
  32. }
  33. public static isDecreasingTempo(tempoType: ContinuousTempoType): boolean {
  34. return (tempoType >= ContinuousTempoType.allargando) && (tempoType <= ContinuousTempoType.ritenuto);
  35. }
  36. public get TempoType(): ContinuousTempoType {
  37. return this.tempoType;
  38. }
  39. public set TempoType(value: ContinuousTempoType) {
  40. this.tempoType = value;
  41. }
  42. public get StartTempo(): number {
  43. return this.startTempo;
  44. }
  45. public set StartTempo(value: number) {
  46. this.startTempo = value;
  47. }
  48. public get EndTempo(): number {
  49. return this.endTempo;
  50. }
  51. public set EndTempo(value: number) {
  52. this.endTempo = value;
  53. }
  54. public get AbsoluteEndTimestamp(): Fraction {
  55. return this.absoluteEndTimestamp;
  56. }
  57. public set AbsoluteEndTimestamp(value: Fraction) {
  58. this.absoluteEndTimestamp = value;
  59. }
  60. public get AbsoluteTimestamp(): Fraction {
  61. return this.ParentMultiTempoExpression.AbsoluteTimestamp;
  62. }
  63. public getAbsoluteFloatTimestamp(): number {
  64. return this.ParentMultiTempoExpression.AbsoluteTimestamp.RealValue;
  65. }
  66. public getInterpolatedTempo(currentAbsoluteTimestamp: Fraction): number {
  67. let continuousAbsoluteStartTimestamp: Fraction = Fraction.plus(
  68. this.parentMultiTempoExpression.SourceMeasureParent.AbsoluteTimestamp, this.parentMultiTempoExpression.Timestamp
  69. );
  70. if (currentAbsoluteTimestamp.lt(continuousAbsoluteStartTimestamp)) { return -1; }
  71. if (currentAbsoluteTimestamp.lt(this.absoluteEndTimestamp)) { return -2; }
  72. let interpolationRatio: number =
  73. Fraction.minus(currentAbsoluteTimestamp, continuousAbsoluteStartTimestamp).RealValue
  74. / Fraction.minus(this.absoluteEndTimestamp, continuousAbsoluteStartTimestamp).RealValue;
  75. let interpolatedTempo: number = Math.max(0.0, Math.min(250.0, this.startTempo + (this.endTempo - this.startTempo) * interpolationRatio));
  76. return interpolatedTempo;
  77. }
  78. private setTempoType(): void {
  79. if (ContinuousTempoExpression.isStringInStringList(ContinuousTempoExpression.listContinuousTempoFaster, this.label)) {
  80. this.tempoType = ContinuousTempoType.accelerando;
  81. } else if (ContinuousTempoExpression.isStringInStringList(ContinuousTempoExpression.listContinuousTempoSlower, this.label)) {
  82. this.tempoType = ContinuousTempoType.ritardando;
  83. }
  84. }
  85. }
  86. export enum ContinuousTempoType {
  87. accelerando = 0,
  88. stretto = 1,
  89. stringendo = 2,
  90. mosso = 3,
  91. piuMosso = 4,
  92. allargando = 5,
  93. calando = 6,
  94. menoMosso = 7,
  95. rallentando = 8,
  96. ritardando = 9,
  97. ritard = 10,
  98. rit = 11,
  99. ritenuto = 12,
  100. rubato = 13,
  101. precipitando = 14
  102. }