vibe-editor 0.0.4 → 0.0.6

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 (78) hide show
  1. package/package.json +66 -61
  2. package/src/scripts/js/Core.js +28 -9
  3. package/src/scripts/js/entry.js +6 -5
  4. package/src/scripts/js/gui/Annotations.js +27 -12
  5. package/src/scripts/js/gui/ScoreManipulator.js +6 -4
  6. package/src/scripts/js/gui/Tabbar.js +13 -4
  7. package/src/scripts/js/handlers/AnnotationChangeHandler.js +13 -1
  8. package/src/scripts/js/handlers/InsertModeHandler.js +3 -3
  9. package/src/scripts/js/handlers/PhantomElementHandler.js +3 -10
  10. package/src/scripts/js/handlers/WindowHandler.js +7 -7
  11. package/src/scripts/js/scripts/Core.js +932 -0
  12. package/src/scripts/js/scripts/MusicProcessor.js +810 -0
  13. package/src/scripts/js/scripts/VIBE.js +219 -0
  14. package/src/scripts/js/scripts/datastructures/MeasureMatrix.js +156 -0
  15. package/src/scripts/js/scripts/gui/Annotations.js +549 -0
  16. package/src/scripts/js/scripts/gui/Cursor.js +203 -0
  17. package/src/scripts/js/scripts/gui/PhantomElement.js +132 -0
  18. package/src/scripts/js/scripts/gui/ScoreManipulator.js +188 -0
  19. package/src/scripts/js/scripts/gui/Tabbar.js +705 -0
  20. package/src/scripts/js/{gui/Toolbar copy.js → scripts/gui/Toolbar.js} +15 -11
  21. package/src/scripts/js/scripts/handlers/AnnotationChangeHandler.js +650 -0
  22. package/src/scripts/js/scripts/handlers/ClickModeHandler.js +535 -0
  23. package/src/scripts/js/{gui → scripts/handlers}/CustomAnnotationShapeDrawer.js +34 -17
  24. package/src/scripts/js/{handlers/ModHandler.js → scripts/handlers/CustomToolbarHandler.js} +54 -66
  25. package/src/scripts/js/scripts/handlers/GlobalKeyboardHandler.js +372 -0
  26. package/src/scripts/js/scripts/handlers/Handler.js +2 -0
  27. package/src/scripts/js/{handlers/InsertModeHandler_deprecated.js → scripts/handlers/InsertModeHandler.js} +117 -164
  28. package/src/scripts/js/scripts/handlers/KeyModeHandler.js +405 -0
  29. package/src/scripts/js/scripts/handlers/LabelHandler.js +463 -0
  30. package/src/scripts/js/scripts/handlers/NoteDragHandler.js +97 -0
  31. package/src/scripts/js/scripts/handlers/PhantomElementHandler.js +161 -0
  32. package/src/scripts/js/scripts/handlers/ScoreManipulatorHandler.js +233 -0
  33. package/src/scripts/js/scripts/handlers/SidebarHandler.js +506 -0
  34. package/src/scripts/js/scripts/handlers/TooltipHandler.js +132 -0
  35. package/src/scripts/js/scripts/handlers/WindowHandler.js +278 -0
  36. package/src/scripts/js/scripts/utils/MEIOperations.js +2121 -0
  37. package/src/scripts/js/{utils/Mouse2MEI.js → scripts/utils/Mouse2SVG.js} +225 -57
  38. package/src/scripts/js/scripts/utils/SVGEditor.js +453 -0
  39. package/src/scripts/js/scripts/utils/Types.js +2 -0
  40. package/src/scripts/js/{utils/VerovioWrapper copy.js → scripts/utils/VerovioWrapper.js} +32 -18
  41. package/src/scripts/js/scripts/utils/coordinates.js +78 -0
  42. package/src/scripts/js/utils/Mouse2SVG.js +11 -4
  43. package/src/scripts/js/utils/VerovioWrapper.js +4 -4
  44. package/src/scripts/js/utils/coordinates.js +26 -2
  45. package/src/styles/vibe.css +32 -6
  46. package/src/scripts/js/.DS_Store +0 -0
  47. package/src/scripts/js/MusicPlayer.js +0 -572
  48. package/src/scripts/js/datastructures/ScoreGraph copy.js +0 -432
  49. package/src/scripts/js/gui/CustomAnnotationDrawer.js +0 -114
  50. package/src/scripts/js/handlers/AnnotationDragHandler.js +0 -113
  51. package/src/scripts/js/handlers/AnnotationLineHandler.js +0 -113
  52. package/src/scripts/js/handlers/ArticulationHandler.js +0 -20
  53. package/src/scripts/js/handlers/HarmonyHandler.js +0 -282
  54. package/src/scripts/js/handlers/InsertModeHandler copy.js +0 -423
  55. package/src/scripts/js/handlers/KeyModeHandler copy.js +0 -407
  56. package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +0 -411
  57. package/src/scripts/js/handlers/NoteDragHandler copy.js +0 -148
  58. package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +0 -150
  59. package/src/scripts/js/handlers/SelectionHandler.js +0 -262
  60. package/src/scripts/js/utils/RectWrapper.js +0 -10
  61. package/src/scripts/js/utils/SVGFiller.js +0 -245
  62. package/src/scripts/js/utils/VerovioWrapperLocal.js +0 -156
  63. package/src/scripts/js/utils/firefoxBBoxes.js +0 -143
  64. /package/src/scripts/js/{assets → scripts/assets}/mei_template.js +0 -0
  65. /package/src/scripts/js/{constants.js → scripts/constants.js} +0 -0
  66. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph.js +0 -0
  67. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph_deprecated.js +0 -0
  68. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreNode.js +0 -0
  69. /package/src/scripts/js/{gui → scripts/gui}/HarmonyLabel.js +0 -0
  70. /package/src/scripts/js/{gui → scripts/gui}/Label.js +0 -0
  71. /package/src/scripts/js/{gui → scripts/gui}/TempoLabel.js +0 -0
  72. /package/src/scripts/js/{handlers → scripts/handlers}/DeleteHandler.js +0 -0
  73. /package/src/scripts/js/{utils → scripts/utils}/DOMCreator.js +0 -0
  74. /package/src/scripts/js/{utils → scripts/utils}/MEIConverter.js +0 -0
  75. /package/src/scripts/js/{utils → scripts/utils}/ReactWrapper.js +0 -0
  76. /package/src/scripts/js/{utils → scripts/utils}/convenienceQueries.js +0 -0
  77. /package/src/scripts/js/{utils → scripts/utils}/mappings.js +0 -0
  78. /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;
@@ -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;