InstantaniousDynamicExpression.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import {PlacementEnum, AbstractExpression} from "./AbstractExpression";
  2. import {MultiExpression} from "./MultiExpression";
  3. import {DynamicExpressionSymbolEnum} from "./DynamicExpressionSymbolEnum";
  4. //import {ArgumentOutOfRangeException} from "../../Exceptions";
  5. import {InvalidEnumArgumentException} from "../../Exceptions";
  6. import {Logging} from "../../../Common/Logging";
  7. export class InstantaniousDynamicExpression extends AbstractExpression {
  8. constructor(dynamicExpression: string, soundDynamics: number, placement: PlacementEnum, staffNumber: number) {
  9. super();
  10. this.dynamicEnum = DynamicEnum[dynamicExpression.toLowerCase()];
  11. this.soundDynamic = soundDynamics;
  12. this.placement = placement;
  13. this.staffNumber = staffNumber;
  14. }
  15. public static dynamicToRelativeVolumeDict: { [_: string]: number; } = {
  16. "ffffff": (127.0 / 127.0),
  17. "fffff": (126.0 / 127.0) ,
  18. "ffff": 125.0 / 127.0,
  19. "fff": 124.0 / 127.0,
  20. "ff": 108.0 / 127.0,
  21. "f": 92.0 / 127.0,
  22. "mf": 76.0 / 127.0,
  23. "mp": 60.0 / 127.0,
  24. "p": 44.0 / 127.0,
  25. "pp": 28.0 / 127.0,
  26. "ppp": 12.0 / 127.0,
  27. "pppp": 10.0 / 127.0,
  28. "ppppp": 8.0 / 127.0,
  29. "pppppp": 6.0 / 127.0,
  30. "sf": 0.5,
  31. "sfp": 0.5,
  32. "sfpp": 0.5,
  33. "fp": 0.5,
  34. "rf": 0.5,
  35. "rfz": 0.5,
  36. "sfz": 0.5,
  37. "sffz": 0.5,
  38. "fz": 0.5,
  39. };
  40. //private static weight: number;
  41. private static listInstantaniousDynamics: string[] = [
  42. "pppppp", "ppppp", "pppp", "ppp", "pp", "p",
  43. "ffffff", "fffff", "ffff", "fff", "ff", "f",
  44. "mf", "mp", "sf", "sp", "spp", "fp", "rf", "rfz", "sfz", "sffz", "fz",
  45. ];
  46. private multiExpression: MultiExpression;
  47. private dynamicEnum: DynamicEnum;
  48. private soundDynamic: number;
  49. private placement: PlacementEnum;
  50. private staffNumber: number;
  51. private length: number;
  52. public get ParentMultiExpression(): MultiExpression {
  53. return this.multiExpression;
  54. }
  55. public set ParentMultiExpression(value: MultiExpression) {
  56. this.multiExpression = value;
  57. }
  58. public get DynEnum(): DynamicEnum {
  59. return this.dynamicEnum;
  60. }
  61. public set DynEnum(value: DynamicEnum) {
  62. this.dynamicEnum = value;
  63. }
  64. public get SoundDynamic(): number {
  65. return this.soundDynamic;
  66. }
  67. public set SoundDynamic(value: number) {
  68. this.soundDynamic = value;
  69. }
  70. public get Placement(): PlacementEnum {
  71. return this.placement;
  72. }
  73. public set Placement(value: PlacementEnum) {
  74. this.placement = value;
  75. }
  76. public get StaffNumber(): number {
  77. return this.staffNumber;
  78. }
  79. public set StaffNumber(value: number) {
  80. this.staffNumber = value;
  81. }
  82. public get Length(): number {
  83. if (Math.abs(this.length) < 0.0001) {
  84. this.length = this.calculateLength();
  85. }
  86. return this.length;
  87. }
  88. public get MidiVolume(): number {
  89. return InstantaniousDynamicExpression.dynamicToRelativeVolumeDict[this.dynamicEnum] * 127;
  90. }
  91. public static isInputStringInstantaniousDynamic(inputString: string): boolean {
  92. if (inputString === undefined) { return false; }
  93. return InstantaniousDynamicExpression.isStringInStringList(InstantaniousDynamicExpression.listInstantaniousDynamics, inputString);
  94. }
  95. //public getInstantaniousDynamicSymbol(expressionSymbolEnum:DynamicExpressionSymbolEnum): FontInfo.MusicFontSymbol {
  96. // switch (expressionSymbolEnum) {
  97. // case DynamicExpressionSymbolEnum.p:
  98. // return FontInfo.MusicFontSymbol.P;
  99. // case DynamicExpressionSymbolEnum.f:
  100. // return FontInfo.MusicFontSymbol.F;
  101. // case DynamicExpressionSymbolEnum.s:
  102. // return FontInfo.MusicFontSymbol.S;
  103. // case DynamicExpressionSymbolEnum.z:
  104. // return FontInfo.MusicFontSymbol.Z;
  105. // case DynamicExpressionSymbolEnum.m:
  106. // return FontInfo.MusicFontSymbol.M;
  107. // case DynamicExpressionSymbolEnum.r:
  108. // return FontInfo.MusicFontSymbol.R;
  109. // default:
  110. // throw new ArgumentOutOfRangeException("expressionSymbolEnum");
  111. // }
  112. //}
  113. public getDynamicExpressionSymbol(c: string): DynamicExpressionSymbolEnum {
  114. switch (c) {
  115. case "p":
  116. return DynamicExpressionSymbolEnum.p;
  117. case "f":
  118. return DynamicExpressionSymbolEnum.f;
  119. case "s":
  120. return DynamicExpressionSymbolEnum.s;
  121. case "z":
  122. return DynamicExpressionSymbolEnum.z;
  123. case "m":
  124. return DynamicExpressionSymbolEnum.m;
  125. case "r":
  126. return DynamicExpressionSymbolEnum.r;
  127. default:
  128. throw new InvalidEnumArgumentException("unknown DynamicExpressionSymbolEnum: " + c);
  129. }
  130. }
  131. private calculateLength(): number {
  132. //let length: number = 0.0;
  133. //let dynamic: string = DynamicEnum[this.dynamicEnum];
  134. //for (let idx: number = 0, len: number = dynamic.length; idx < len; ++idx) {
  135. // let c: string = dynamic[idx];
  136. // let dynamicExpressionSymbol: DynamicExpressionSymbolEnum = this.getDynamicExpressionSymbol(c);
  137. // let symbol: FontInfo.MusicFontSymbol = this.getInstantaniousDynamicSymbol(dynamicExpressionSymbol);
  138. // length += FontInfo.Info.getBoundingBox(symbol).Width;
  139. //}
  140. //return length;
  141. Logging.debug("[Andrea] instantaniousDynamicExpression: not implemented: calculateLength!");
  142. return 0.0;
  143. }
  144. }
  145. export enum DynamicEnum {
  146. pppppp = 0,
  147. ppppp = 1,
  148. pppp = 2,
  149. ppp = 3,
  150. pp = 4,
  151. p = 5,
  152. mp = 6,
  153. mf = 7,
  154. f = 8,
  155. ff = 9,
  156. fff = 10,
  157. ffff = 11,
  158. fffff = 12,
  159. ffffff = 13,
  160. sf = 14,
  161. sfp = 15,
  162. sfpp = 16,
  163. fp = 17,
  164. rf = 18,
  165. rfz = 19,
  166. sfz = 20,
  167. sffz = 21,
  168. fz = 22,
  169. other = 23
  170. }