vibe-editor 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/package.json +65 -61
  2. package/src/scripts/js/Core.js +32 -13
  3. package/src/scripts/js/entry.js +6 -5
  4. package/src/scripts/js/gui/Annotations.js +28 -13
  5. package/src/scripts/js/gui/ScoreManipulator.js +13 -11
  6. package/src/scripts/js/gui/Tabbar.js +14 -5
  7. package/src/scripts/js/gui/Toolbar.js +1 -1
  8. package/src/scripts/js/handlers/AnnotationChangeHandler.js +16 -4
  9. package/src/scripts/js/handlers/CustomAnnotationShapeDrawer.js +2 -2
  10. package/src/scripts/js/handlers/InsertModeHandler.js +7 -7
  11. package/src/scripts/js/handlers/KeyModeHandler.js +1 -1
  12. package/src/scripts/js/handlers/LabelHandler.js +1 -1
  13. package/src/scripts/js/handlers/NoteDragHandler.js +1 -1
  14. package/src/scripts/js/handlers/PhantomElementHandler.js +3 -10
  15. package/src/scripts/js/handlers/{SideBarHandler.js → SidebarHandler.js} +1 -1
  16. package/src/scripts/js/handlers/TooltipHandler.js +1 -1
  17. package/src/scripts/js/handlers/WindowHandler.js +7 -7
  18. package/src/scripts/js/scripts/Core.js +932 -0
  19. package/src/scripts/js/scripts/MusicProcessor.js +810 -0
  20. package/src/scripts/js/scripts/VIBE.js +219 -0
  21. package/src/scripts/js/{assets → scripts/assets}/mei_template.js +2 -2
  22. package/src/scripts/js/scripts/datastructures/MeasureMatrix.js +156 -0
  23. package/src/scripts/js/scripts/gui/Annotations.js +549 -0
  24. package/src/scripts/js/scripts/gui/Cursor.js +203 -0
  25. package/src/scripts/js/{gui → scripts/gui}/HarmonyLabel.js +1 -1
  26. package/src/scripts/js/scripts/gui/PhantomElement.js +132 -0
  27. package/src/scripts/js/scripts/gui/ScoreManipulator.js +188 -0
  28. package/src/scripts/js/scripts/gui/Tabbar.js +705 -0
  29. package/src/scripts/js/{gui → scripts/gui}/TempoLabel.js +1 -1
  30. package/src/scripts/js/{gui/Toolbar copy.js → scripts/gui/Toolbar.js} +15 -11
  31. package/src/scripts/js/scripts/handlers/AnnotationChangeHandler.js +650 -0
  32. package/src/scripts/js/scripts/handlers/ClickModeHandler.js +535 -0
  33. package/src/scripts/js/{gui → scripts/handlers}/CustomAnnotationShapeDrawer.js +34 -17
  34. package/src/scripts/js/{handlers/ModHandler.js → scripts/handlers/CustomToolbarHandler.js} +54 -66
  35. package/src/scripts/js/scripts/handlers/GlobalKeyboardHandler.js +372 -0
  36. package/src/scripts/js/scripts/handlers/Handler.js +2 -0
  37. package/src/scripts/js/{handlers/InsertModeHandler_deprecated.js → scripts/handlers/InsertModeHandler.js} +117 -164
  38. package/src/scripts/js/scripts/handlers/KeyModeHandler.js +405 -0
  39. package/src/scripts/js/scripts/handlers/LabelHandler.js +463 -0
  40. package/src/scripts/js/scripts/handlers/NoteDragHandler.js +97 -0
  41. package/src/scripts/js/scripts/handlers/PhantomElementHandler.js +168 -0
  42. package/src/scripts/js/scripts/handlers/ScoreManipulatorHandler.js +233 -0
  43. package/src/scripts/js/scripts/handlers/SidebarHandler.js +506 -0
  44. package/src/scripts/js/scripts/handlers/TooltipHandler.js +132 -0
  45. package/src/scripts/js/scripts/handlers/WindowHandler.js +278 -0
  46. package/src/scripts/js/scripts/utils/MEIOperations.js +2121 -0
  47. package/src/scripts/js/{utils/Mouse2MEI.js → scripts/utils/Mouse2SVG.js} +225 -57
  48. package/src/scripts/js/{utils → scripts/utils}/ReactWrapper.js +1 -1
  49. package/src/scripts/js/scripts/utils/SVGEditor.js +453 -0
  50. package/src/scripts/js/scripts/utils/Types.js +2 -0
  51. package/src/scripts/js/{utils/VerovioWrapper copy.js → scripts/utils/VerovioWrapper.js} +35 -21
  52. package/src/scripts/js/scripts/utils/coordinates.js +54 -0
  53. package/src/scripts/js/utils/MEIOperations.js +22 -22
  54. package/src/scripts/js/utils/Mouse2SVG.js +13 -6
  55. package/src/scripts/js/utils/SVGEditor.js +2 -2
  56. package/src/scripts/js/utils/VerovioWrapper.js +4 -4
  57. package/src/scripts/js/utils/coordinates.js +26 -2
  58. package/src/scripts/js/.DS_Store +0 -0
  59. package/src/scripts/js/MusicPlayer.js +0 -572
  60. package/src/scripts/js/datastructures/ScoreGraph copy.js +0 -432
  61. package/src/scripts/js/gui/CustomAnnotationDrawer.js +0 -114
  62. package/src/scripts/js/handlers/AnnotationDragHandler.js +0 -113
  63. package/src/scripts/js/handlers/AnnotationLineHandler.js +0 -113
  64. package/src/scripts/js/handlers/ArticulationHandler.js +0 -20
  65. package/src/scripts/js/handlers/HarmonyHandler.js +0 -282
  66. package/src/scripts/js/handlers/InsertModeHandler copy.js +0 -423
  67. package/src/scripts/js/handlers/KeyModeHandler copy.js +0 -407
  68. package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +0 -411
  69. package/src/scripts/js/handlers/NoteDragHandler copy.js +0 -148
  70. package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +0 -150
  71. package/src/scripts/js/handlers/SelectionHandler.js +0 -262
  72. package/src/scripts/js/utils/RectWrapper.js +0 -10
  73. package/src/scripts/js/utils/SVGFiller.js +0 -245
  74. package/src/scripts/js/utils/VerovioWrapperLocal.js +0 -156
  75. package/src/scripts/js/utils/firefoxBBoxes.js +0 -143
  76. package/src/styles/vibe.css +0 -785
  77. /package/src/scripts/js/{constants.js → scripts/constants.js} +0 -0
  78. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph.js +0 -0
  79. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph_deprecated.js +0 -0
  80. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreNode.js +0 -0
  81. /package/src/scripts/js/{gui → scripts/gui}/Label.js +0 -0
  82. /package/src/scripts/js/{handlers → scripts/handlers}/DeleteHandler.js +0 -0
  83. /package/src/scripts/js/{utils → scripts/utils}/DOMCreator.js +0 -0
  84. /package/src/scripts/js/{utils → scripts/utils}/MEIConverter.js +0 -0
  85. /package/src/scripts/js/{utils → scripts/utils}/convenienceQueries.js +0 -0
  86. /package/src/scripts/js/{utils → scripts/utils}/mappings.js +0 -0
  87. /package/src/scripts/js/{utils → scripts/utils}/random.js +0 -0
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("./constants");
4
+ const Core_1 = require("./Core");
5
+ const dc = require("./utils/DOMCreator");
6
+ const Tabbar_1 = require("./gui/Tabbar");
7
+ /**
8
+ * Main Class for the Verovio Interface for Browser based Editing
9
+ */
10
+ class VIBE {
11
+ /**
12
+ *
13
+ * @param container Container in which the editor will be displayed
14
+ * @param options options from Class implementing H5P functionality
15
+ */
16
+ constructor(container = null, options, meiCallback) {
17
+ var _a;
18
+ this.isFullContainer = false;
19
+ if ((container === null || container === void 0 ? void 0 : container.id) === null) {
20
+ throw new Error("The editor's container must have an id");
21
+ }
22
+ if (container === null) {
23
+ container = document.body;
24
+ container.id = "editorInBody";
25
+ }
26
+ if (container === null || container === void 0 ? void 0 : container.classList.contains("vibe-container")) {
27
+ this.isFullContainer = true;
28
+ Array.from(container.children).forEach(c => {
29
+ if (c.id != "svgContainer")
30
+ c.remove();
31
+ });
32
+ }
33
+ else {
34
+ (_a = container === null || container === void 0 ? void 0 : container.classList) === null || _a === void 0 ? void 0 : _a.add("vibe-container");
35
+ }
36
+ this.container = container;
37
+ this.options = options;
38
+ this.tabbar = new Tabbar_1.default(this.options, this.container.id); //new Toolbar(this.options, this.container.id)
39
+ this.meiChangedCallback = meiCallback;
40
+ this.loadScripts();
41
+ this.setMutationObserver();
42
+ }
43
+ /**
44
+ * Load verovio script from the internet.
45
+ * Makes sure that only one script instance is in the DOM.
46
+ */
47
+ loadScripts() {
48
+ var src = "https://www.verovio.org/javascript/" + constants_1.constants._VEROVIO_VERSION_ + "/verovio-toolkit.js";
49
+ var scriptId = "verovioScript";
50
+ var script = document.querySelector("#" + scriptId) || document.createElement('script');
51
+ script.src = src;
52
+ if (script.id === "") {
53
+ script.id = scriptId;
54
+ }
55
+ if (script.getAttribute("loaded") === null) {
56
+ script.setAttribute("loaded", "false");
57
+ }
58
+ if (script.getAttribute("loaded") === "true") {
59
+ this.initGUI().then(() => {
60
+ // if(this.meiChangedCallback != undefined){
61
+ // this.setMEIChangedCallback(this.meiChangedCallback)
62
+ // }
63
+ });
64
+ }
65
+ if (document.getElementById(scriptId) === null) {
66
+ var prior = document.getElementsByTagName('script')[0];
67
+ script.async = false;
68
+ prior.parentNode.insertBefore(script, prior);
69
+ script.onload = function () {
70
+ script.setAttribute("loaded", "true");
71
+ };
72
+ }
73
+ }
74
+ /**
75
+ * Observes if the script is already loaded. Fires initGUI() when Attribute "loaded" changes to "true"
76
+ */
77
+ setMutationObserver() {
78
+ var that = this;
79
+ var observer = new MutationObserver(function (mutations) {
80
+ mutations.forEach(function (mutation) {
81
+ if (mutation.type === "attributes") {
82
+ var t = mutation.target;
83
+ if (mutation.attributeName === "loaded" && t.getAttribute(mutation.attributeName) === "true") {
84
+ that.initGUI().then(() => {
85
+ // if(that.meiChangedCallback != undefined){
86
+ // that.setMEIChangedCallback(that.meiChangedCallback)
87
+ // }
88
+ });
89
+ }
90
+ }
91
+ });
92
+ });
93
+ observer.observe(document.getElementById("verovioScript"), {
94
+ attributes: true
95
+ });
96
+ }
97
+ /**
98
+ * Init gui on load.
99
+ * Toolbars are predefined.
100
+ */
101
+ initGUI() {
102
+ return new Promise((resolve) => {
103
+ var btnGrpClass = "btn-group-md me-2";
104
+ // MAIN/ Permanent TOOLBAR
105
+ // parentElement for dropdown
106
+ this.container.append(dc.makeNewDiv("handlerGroup", btnGrpClass, { role: "group" })); //"me-2 h-100"))
107
+ //parentElement for Notebuttons
108
+ this.container.append(dc.makeNewDiv("noteGroup", btnGrpClass, { role: "group" }));
109
+ //parentElement for Dotbuttons
110
+ this.container.append(dc.makeNewDiv("dotGroup", btnGrpClass, { role: "group" }));
111
+ //parentElement for local modifier Buttons
112
+ this.container.append(dc.makeNewDiv("modGroup", btnGrpClass, { role: "group" }));
113
+ //parentElement for local accidental Buttons
114
+ this.container.append(dc.makeNewDiv("accidGroup", btnGrpClass, { role: "group" }));
115
+ //parentElement for local articulation Buttons
116
+ this.container.append(dc.makeNewDiv("articGroup", btnGrpClass, { role: "group" }));
117
+ //sidebarList
118
+ this.container.append(dc.makeNewDiv("sidebarContainer", "sidebar closedSidebar"));
119
+ //parentElement for sidebar open/close
120
+ this.container.append(dc.makeNewDiv("sideBarGroup", btnGrpClass, { role: "group" }));
121
+ //parentElement for playback
122
+ this.container.append(dc.makeNewDiv("soundGroup", btnGrpClass, { role: "group" }));
123
+ //parentElement for zoom
124
+ this.container.append(dc.makeNewDiv("zoomGroup", btnGrpClass, { role: "group" }));
125
+ //parentElement for colorPicker
126
+ this.container.append(dc.makeNewDiv("colorGroup", btnGrpClass, { role: "group" }));
127
+ //parentElement for midi device selection
128
+ this.container.append(dc.makeNewDiv("midiSelectGroup", btnGrpClass, { role: "group" }));
129
+ //parentElement for fileselect group
130
+ this.container.append(dc.makeNewDiv("fileSelectGroup", btnGrpClass, { role: "group" }));
131
+ // parentElement for toolbarTop
132
+ this.container.append(dc.makeNewDiv("btnToolbar", "btn-toolbar d-inline-flex align-items-stretch", { role: "toolbar" }));
133
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
134
+ // CUSTOM TOOLBAR
135
+ // parentElement for customToolbar
136
+ this.container.append(dc.makeNewDiv("customToolbar", "btn-toolbar align-items-stretch", { role: "toolbar" }));
137
+ // and now the tabs
138
+ this.container.append(dc.makeNewDiv("notationTabGroup", btnGrpClass, { role: "group" }));
139
+ this.container.append(dc.makeNewDiv("articulationTabGroup", btnGrpClass, { role: "group" }));
140
+ this.container.append(dc.makeNewDiv("annotationTabGroup", btnGrpClass, { role: "group" }));
141
+ //this.container.append(dc.makeNewDiv("melismaTabGroup", btnGrpClass, {role: "group"}))
142
+ this.tabbar.createToolbars();
143
+ resolve(this.createCoreInstance());
144
+ });
145
+ }
146
+ createCoreInstance() {
147
+ return new Promise(resolve => {
148
+ var _a, _b;
149
+ //attach mei first time
150
+ this.coreInstance = new Core_1.default(this.container.id);
151
+ if (!this.isFullContainer) {
152
+ this.container.append(dc.makeNewDiv(constants_1.constants._TARGETDIVID_, ""));
153
+ }
154
+ else {
155
+ const sc = this.container.querySelector("#svgContainer");
156
+ sc.parentElement.append(sc);
157
+ }
158
+ var initEvent = new Event("vibeInit");
159
+ var data;
160
+ var isUrl = false;
161
+ if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.meiURL) != undefined) {
162
+ data = this.options.meiURL;
163
+ isUrl = true;
164
+ }
165
+ else if (((_b = this.options) === null || _b === void 0 ? void 0 : _b.data) != undefined) {
166
+ data = this.options.data;
167
+ }
168
+ else if (this.options === null) {
169
+ data = null;
170
+ }
171
+ this.coreInstance.setMEIChangedCallback(this.meiChangedCallback);
172
+ if (!this.isFullContainer) {
173
+ this.coreInstance.loadData(data, isUrl).then(() => {
174
+ this.container.dispatchEvent(initEvent);
175
+ resolve();
176
+ });
177
+ }
178
+ else {
179
+ this.coreInstance.loadWithExistingSVG(this.container, data, isUrl).then(() => {
180
+ this.container.dispatchEvent(initEvent);
181
+ resolve();
182
+ });
183
+ }
184
+ this.tabbar
185
+ .setImportCallback(this.coreInstance.loadDataHandler)
186
+ .setAlignCallback(this.coreInstance.alignFunctionHandler)
187
+ .setGetMEICallback(this.coreInstance.getMEI.bind(this.coreInstance));
188
+ //block everthing when firefox is not at least version 114.0
189
+ if (navigator.userAgent.toLowerCase().includes("firefox")) {
190
+ const userAgent = navigator.userAgent;
191
+ const firefoxVersion = parseFloat(userAgent.split("Firefox/")[1]);
192
+ const isAtLeast114 = firefoxVersion >= 114.0;
193
+ if (!isAtLeast114) {
194
+ var div = document.createElement("div");
195
+ div.id = "ff_warning";
196
+ this.container.insertAdjacentElement("beforebegin", div);
197
+ div.append(this.container);
198
+ div.textContent = "This application can't be used with your current Firefox version (" + navigator.userAgent.match(/Firefox\/(\d+(\.\d+)?)/)[1] + ").\n Please update at least to version 114.0.2 or use another browser.";
199
+ }
200
+ }
201
+ });
202
+ }
203
+ /**
204
+ *
205
+ * @param meiChangedCallback Function in which the mei will be used by the calling instance
206
+ */
207
+ setMEIChangedCallback(meiChangedCallback) {
208
+ this.meiChangedCallback = meiChangedCallback;
209
+ this.coreInstance.setMEIChangedCallback(this.meiChangedCallback);
210
+ }
211
+ /**
212
+ * Get Core Instance to manipulate svg output
213
+ * @returns
214
+ */
215
+ getCore() {
216
+ return this.coreInstance;
217
+ }
218
+ }
219
+ exports.default = VIBE;
@@ -134,7 +134,7 @@ class MeiTemplate {
134
134
  }
135
135
  createTempo(mm, mmUnit, tstamp = null, startId = null) {
136
136
  var newElement = document.createElementNS(constants_1.constants._MEINS_, "tempo");
137
- newElement.setAttribute("id", (0, random_1.uuidv4)());
137
+ newElement.setAttribute("id", random_1.uuidv4());
138
138
  newElement.setAttribute("place", "above");
139
139
  if (startId === null && tstamp === null) {
140
140
  throw new Error("Tempo MUST either have timestamp or startId");
@@ -148,7 +148,7 @@ class MeiTemplate {
148
148
  newElement.setAttribute("midi.bpm", (parseFloat(mm) * parseFloat(mmUnit)).toString());
149
149
  newElement.setAttribute("staff", "1");
150
150
  var rend = document.createElementNS(constants_1.constants._MEINS_, "rend");
151
- rend.setAttribute("id", (0, random_1.uuidv4)());
151
+ rend.setAttribute("id", random_1.uuidv4());
152
152
  rend.setAttribute("fontname", "VerovioText");
153
153
  rend.textContent = "__";
154
154
  newElement.appendChild(rend);
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //@ts-ignore
4
+ //const $ = H5P.jQuery;
5
+ class MeasureMatrix {
6
+ constructor(rows = null, cols = null) {
7
+ this.rows = rows;
8
+ this.cols = cols;
9
+ this.matrix = null;
10
+ if (cols !== null && rows !== null) {
11
+ // empty matrix
12
+ this.matrix = new Array();
13
+ for (var i = 0; i < cols; i++) {
14
+ let col = new Array();
15
+ for (var j = 0; j < rows; j++) {
16
+ var staff = {};
17
+ col.push(staff);
18
+ }
19
+ this.matrix.push(col);
20
+ }
21
+ }
22
+ }
23
+ populateFromMEI(mei) {
24
+ var _a, _b, _c, _d, _e, _f;
25
+ this.matrix = new Array();
26
+ this.cols = mei.querySelectorAll("measure").length;
27
+ this.rows = mei.querySelector("measure").querySelectorAll("staff").length;
28
+ var measures = mei.querySelectorAll("measure");
29
+ for (var i = 0; i < this.cols; i++) {
30
+ let col = new Array();
31
+ let measure = measures[i];
32
+ let prevMeasure;
33
+ if (i == 0) {
34
+ prevMeasure = measure;
35
+ }
36
+ else {
37
+ prevMeasure = measures[i - 1];
38
+ }
39
+ let staves = measure.querySelectorAll("staff");
40
+ let prevStaves = prevMeasure.querySelectorAll("staff");
41
+ for (var j = 0; j < this.rows; j++) {
42
+ let staffDef = mei.querySelector("staffDef[n=\"" + (j + 1).toString() + "\"]");
43
+ let staff = {};
44
+ let clefs = i === 0 ? [] : prevStaves[j].querySelectorAll("clef");
45
+ let keysigs = i === 0 ? [] : staves[j].querySelectorAll("keySig");
46
+ let meterSigs = staves[j].querySelectorAll("meterSig");
47
+ let clefIdx;
48
+ if (clefs.length > 0) {
49
+ if (i === 0) {
50
+ clefIdx = 0;
51
+ }
52
+ else {
53
+ clefIdx = clefs.length - 1;
54
+ }
55
+ let clefShape = clefs[clefIdx].getAttribute("shape");
56
+ staff.clef = clefShape;
57
+ }
58
+ else {
59
+ if (i > 0) {
60
+ staff.clef = this.matrix[i - 1][j].clef;
61
+ staff.clefline = this.matrix[i - 1][j].clefline;
62
+ staff.clefdisplacement = this.matrix[i - 1][j].clefdisplacement;
63
+ }
64
+ else {
65
+ staff.clef = ((_a = staffDef.querySelector("clef")) === null || _a === void 0 ? void 0 : _a.getAttribute("shape")) || staffDef.getAttribute("clef.shape");
66
+ staff.clefline = ((_b = staffDef.querySelector("clef")) === null || _b === void 0 ? void 0 : _b.getAttribute("line")) || staffDef.getAttribute("clef.line");
67
+ staff.clefdisplacement = ((_c = staffDef.querySelector("clef")) === null || _c === void 0 ? void 0 : _c.getAttribute("dis")) ? ((_d = staffDef.querySelector("clef")) === null || _d === void 0 ? void 0 : _d.getAttribute("dis")) + ((_e = staffDef.querySelector("clef")) === null || _e === void 0 ? void 0 : _e.getAttribute("dis.place")) : null;
68
+ }
69
+ }
70
+ if (keysigs.length > 0) {
71
+ let lastIdx = keysigs.length - 1;
72
+ let keysig = keysigs[lastIdx].getAttribute("sig");
73
+ staff.keysig = keysig;
74
+ }
75
+ else if (i > 0) {
76
+ staff.keysig = this.matrix[i - 1][j].keysig;
77
+ }
78
+ else {
79
+ if (staffDef.querySelector("keySig") === null) {
80
+ staff.keysig = "0";
81
+ }
82
+ else {
83
+ staff.keysig = ((_f = staffDef.querySelector("keySig")) === null || _f === void 0 ? void 0 : _f.getAttribute("sig")) || staffDef.getAttribute("keysig");
84
+ }
85
+ }
86
+ if (meterSigs.length > 0) {
87
+ let lastIdx = meterSigs.length - 1;
88
+ let unit = meterSigs[lastIdx].getAttribute("unit");
89
+ let count = meterSigs[lastIdx].getAttribute("count");
90
+ staff.meterSig = { unit: unit, count: count };
91
+ }
92
+ else if (i > 0) {
93
+ staff.meterSig = this.matrix[i - 1][j].meterSig;
94
+ }
95
+ else {
96
+ if (staffDef.querySelector("meterSig") !== null) {
97
+ staff.meterSig = { unit: staffDef.querySelector("meterSig").getAttribute("unit"), count: staffDef.querySelector("meterSig").getAttribute("count") };
98
+ }
99
+ else if (staffDef.getAttribute("meter.unit") !== null) {
100
+ staff.meterSig = { unit: staffDef.getAttribute("meter.unit"), count: staffDef.getAttribute("meter.count") };
101
+ }
102
+ else {
103
+ staff.meterSig = null;
104
+ }
105
+ }
106
+ col.push(staff);
107
+ }
108
+ this.matrix.push(col);
109
+ }
110
+ //console.log(this.matrix)
111
+ }
112
+ addMeasure(n = 1) {
113
+ for (var i = 0; i < n; i++) {
114
+ let col = new Array();
115
+ for (var j = 0; j < this.rows; j++) {
116
+ var staff = {};
117
+ col.push(staff);
118
+ }
119
+ this.matrix.push(col);
120
+ }
121
+ this.cols += n;
122
+ }
123
+ addStaff(n = 1) {
124
+ for (var i = 0; i < this.cols; i++) {
125
+ for (var j = 0; j < n; j++) {
126
+ var staff = {};
127
+ this.matrix[i].push(staff);
128
+ }
129
+ }
130
+ this.rows += n;
131
+ }
132
+ /**
133
+ * Get StaffType from matrix for [staff][measure]
134
+ * @param row measure index = attribute("n")-1
135
+ * @param col staff index = attribute("n")-1
136
+ * @returns
137
+ */
138
+ get(row, col) {
139
+ if (!isNaN(parseInt(row.toString())) && !isNaN(parseInt(col.toString()))) {
140
+ if (typeof row === "string") {
141
+ row = parseInt(row.toString()) - 1;
142
+ }
143
+ if (typeof col === "string") {
144
+ col = parseInt(col.toString()) - 1;
145
+ }
146
+ return this.matrix[row][col];
147
+ }
148
+ else {
149
+ return null;
150
+ }
151
+ }
152
+ getDimensions() {
153
+ return { rows: this.rows, cols: this.cols };
154
+ }
155
+ }
156
+ exports.default = MeasureMatrix;