InstantaneousDynamicExpression.ts 6.1 KB

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