Slur.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import {Note} from "../../Note";
  2. import { Fraction } from "../../../../Common/DataObjects/Fraction";
  3. import { PlacementEnum } from "../AbstractExpression";
  4. export class Slur {
  5. constructor() {
  6. // ?
  7. }
  8. private startNote: Note;
  9. private endNote: Note;
  10. public PlacementXml: PlacementEnum; // how the slur is placed in the XML
  11. public get StartNote(): Note {
  12. return this.startNote;
  13. }
  14. public set StartNote(value: Note) {
  15. this.startNote = value;
  16. }
  17. public get EndNote(): Note {
  18. return this.endNote;
  19. }
  20. public set EndNote(value: Note) {
  21. this.endNote = value;
  22. }
  23. public startNoteHasMoreStartingSlurs(): boolean {
  24. if (!this.startNote) { return false; }
  25. for (let idx: number = 0, len: number = this.startNote.NoteSlurs.length; idx < len; ++idx) {
  26. const slur: Slur = this.startNote.NoteSlurs[idx];
  27. if (slur !== this && slur.StartNote === this.startNote) {
  28. return true;
  29. }
  30. }
  31. return false;
  32. }
  33. public endNoteHasMoreEndingSlurs(): boolean {
  34. if (!this.endNote) { return false; }
  35. for (let idx: number = 0, len: number = this.endNote.NoteSlurs.length; idx < len; ++idx) {
  36. const slur: Slur = this.endNote.NoteSlurs[idx];
  37. if (slur !== this && slur.EndNote === this.endNote) {
  38. return true;
  39. }
  40. }
  41. return false;
  42. }
  43. public isCrossed(): boolean {
  44. return (this.startNote.ParentStaffEntry.ParentStaff !== this.endNote.ParentStaffEntry.ParentStaff);
  45. }
  46. public isSlurLonger(): boolean {
  47. if (!this.endNote || !this.startNote) {
  48. return false;
  49. }
  50. const length: Fraction = Fraction.minus(this.endNote.getAbsoluteTimestamp(), this.startNote.getAbsoluteTimestamp());
  51. for (let idx: number = 0, len: number = this.startNote.NoteSlurs.length; idx < len; ++idx) {
  52. const slur: Slur = this.startNote.NoteSlurs[idx];
  53. if (
  54. slur !== this
  55. && slur.EndNote !== undefined
  56. && slur.StartNote !== undefined
  57. && Fraction.minus(slur.EndNote.getAbsoluteTimestamp(), slur.StartNote.getAbsoluteTimestamp()).CompareTo(length) === -1
  58. ) {
  59. return true;
  60. }
  61. }
  62. for (let idx: number = 0, len: number = this.endNote.NoteSlurs.length; idx < len; ++idx) {
  63. const slur: Slur = this.endNote.NoteSlurs[idx];
  64. if (
  65. slur !== this
  66. && slur.EndNote !== undefined
  67. && slur.StartNote !== undefined
  68. && Fraction.minus(slur.EndNote.getAbsoluteTimestamp(), slur.StartNote.getAbsoluteTimestamp()).CompareTo(length)
  69. ) {
  70. return true;
  71. }
  72. }
  73. return false;
  74. }
  75. }