vibe-editor 0.0.0 → 0.0.1-dev

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 (38) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +12 -9
  3. package/package.json +11 -5
  4. package/src/scripts/js/Core.js +212 -186
  5. package/src/scripts/js/MusicProcessor.js +286 -128
  6. package/src/scripts/js/{VerovioScoreEditor.js → VIBE.js} +62 -28
  7. package/src/scripts/js/assets/mei_template.js +5 -1
  8. package/src/scripts/js/datastructures/MeasureMatrix.js +6 -85
  9. package/src/scripts/js/datastructures/ScoreGraph.js +1 -1
  10. package/src/scripts/js/entry.js +3 -2
  11. package/src/scripts/js/gui/Annotations.js +188 -111
  12. package/src/scripts/js/gui/HarmonyLabel.js +26 -2
  13. package/src/scripts/js/gui/ScoreManipulator.js +61 -31
  14. package/src/scripts/js/gui/Tabbar.js +41 -21
  15. package/src/scripts/js/gui/Toolbar.js +4 -4
  16. package/src/scripts/js/handlers/AnnotationChangeHandler.js +131 -60
  17. package/src/scripts/js/handlers/ClickModeHandler.js +406 -143
  18. package/src/scripts/js/handlers/CustomToolbarHandler.js +26 -24
  19. package/src/scripts/js/handlers/GlobalKeyboardHandler.js +12 -7
  20. package/src/scripts/js/handlers/InsertModeHandler.js +26 -32
  21. package/src/scripts/js/handlers/KeyModeHandler.js +12 -86
  22. package/src/scripts/js/handlers/LabelHandler.js +3 -2
  23. package/src/scripts/js/handlers/PhantomElementHandler.js +1 -1
  24. package/src/scripts/js/handlers/ScoreManipulatorHandler.js +101 -14
  25. package/src/scripts/js/handlers/SelectionHandler.js +80 -36
  26. package/src/scripts/js/handlers/SideBarHandler.js +10 -3
  27. package/src/scripts/js/handlers/WindowHandler.js +25 -4
  28. package/src/scripts/js/utils/DOMCreator.js +1 -1
  29. package/src/scripts/js/utils/MEIConverter.js +13 -1
  30. package/src/scripts/js/utils/MEIOperations.js +180 -187
  31. package/src/scripts/js/utils/Mouse2SVG.js +200 -43
  32. package/src/scripts/js/utils/ReactWrapper.js +46 -0
  33. package/src/scripts/js/utils/RectWrapper.js +10 -0
  34. package/src/scripts/js/utils/SVGEditor.js +94 -3
  35. package/src/scripts/js/utils/VerovioWrapper.js +6 -1
  36. package/src/scripts/js/utils/convenienceQueries.js +2 -0
  37. package/src/scripts/js/utils/mappings.js +322 -56
  38. package/src/styles/VerovioScoreEditor.css +0 -694
@@ -7,7 +7,7 @@ const Tabbar_1 = require("./gui/Tabbar");
7
7
  /**
8
8
  * Main Class for the VerovioScoreEditor
9
9
  */
10
- class VerovioScoreEditor {
10
+ class VIBE {
11
11
  /**
12
12
  *
13
13
  * @param container Container in which the editor will be displayed
@@ -15,6 +15,7 @@ class VerovioScoreEditor {
15
15
  */
16
16
  constructor(container = null, options, meiCallback) {
17
17
  var _a;
18
+ this.isFullContainer = false;
18
19
  if ((container === null || container === void 0 ? void 0 : container.id) === null) {
19
20
  throw new Error("The editor's container must have an id");
20
21
  }
@@ -22,17 +23,26 @@ class VerovioScoreEditor {
22
23
  container = document.body;
23
24
  container.id = "editorInBody";
24
25
  }
25
- (_a = container === null || container === void 0 ? void 0 : container.classList) === null || _a === void 0 ? void 0 : _a.add("vse-container");
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
+ }
26
36
  this.container = container;
27
37
  this.options = options;
38
+ this.tabbar = new Tabbar_1.default(this.options, this.container.id); //new Toolbar(this.options, this.container.id)
28
39
  this.meiChangedCallback = meiCallback;
29
40
  this.loadScripts();
30
41
  this.setMutationObserver();
31
42
  }
32
43
  /**
33
- * Load verovio script.
44
+ * Load verovio script from the internet.
34
45
  * Makes sure that only one script instance is in the DOM.
35
- *
36
46
  */
37
47
  loadScripts() {
38
48
  var src = "https://www.verovio.org/javascript/" + constants_1.constants._VEROVIO_VERSION_ + "/verovio-toolkit.js";
@@ -47,9 +57,9 @@ class VerovioScoreEditor {
47
57
  }
48
58
  if (script.getAttribute("loaded") === "true") {
49
59
  this.initGUI().then(() => {
50
- if (this.meiChangedCallback != undefined) {
51
- this.setMEIChangedCallback(this.meiChangedCallback);
52
- }
60
+ // if(this.meiChangedCallback != undefined){
61
+ // this.setMEIChangedCallback(this.meiChangedCallback)
62
+ // }
53
63
  });
54
64
  }
55
65
  if (document.getElementById(scriptId) === null) {
@@ -72,9 +82,9 @@ class VerovioScoreEditor {
72
82
  var t = mutation.target;
73
83
  if (mutation.attributeName === "loaded" && t.getAttribute(mutation.attributeName) === "true") {
74
84
  that.initGUI().then(() => {
75
- if (that.meiChangedCallback != undefined) {
76
- that.setMEIChangedCallback(that.meiChangedCallback);
77
- }
85
+ // if(that.meiChangedCallback != undefined){
86
+ // that.setMEIChangedCallback(that.meiChangedCallback)
87
+ // }
78
88
  });
79
89
  }
80
90
  }
@@ -85,13 +95,12 @@ class VerovioScoreEditor {
85
95
  });
86
96
  }
87
97
  /**
88
- * Init everything on load
89
- * @param container container provided by H5P
98
+ * Init gui on load.
99
+ * Toolbars are predefined.
90
100
  */
91
101
  initGUI() {
92
102
  return new Promise((resolve) => {
93
- var _a, _b;
94
- var btnGrpClass = "btn-group-sm me-2";
103
+ var btnGrpClass = "btn-group-md me-2";
95
104
  // MAIN/ Permanent TOOLBAR
96
105
  // parentElement for dropdown
97
106
  this.container.append(dc.makeNewDiv("handlerGroup", btnGrpClass, { role: "group" })); //"me-2 h-100"))
@@ -111,6 +120,8 @@ class VerovioScoreEditor {
111
120
  this.container.append(dc.makeNewDiv("soundGroup", btnGrpClass, { role: "group" }));
112
121
  //parentElement for zoom
113
122
  this.container.append(dc.makeNewDiv("zoomGroup", btnGrpClass, { role: "group" }));
123
+ //parentElement for colorPicker
124
+ this.container.append(dc.makeNewDiv("colorGroup", btnGrpClass, { role: "group" }));
114
125
  //parentElement for midi device selection
115
126
  this.container.append(dc.makeNewDiv("midiSelectGroup", btnGrpClass, { role: "group" }));
116
127
  //parentElement for fileselect group
@@ -126,12 +137,23 @@ class VerovioScoreEditor {
126
137
  this.container.append(dc.makeNewDiv("articulationTabGroup", btnGrpClass, { role: "group" }));
127
138
  this.container.append(dc.makeNewDiv("annotationTabGroup", btnGrpClass, { role: "group" }));
128
139
  //this.container.append(dc.makeNewDiv("melismaTabGroup", btnGrpClass, {role: "group"}))
129
- var tb = new Tabbar_1.default(this.options, this.container.id); //new Toolbar(this.options, this.container.id)
130
- tb.createToolbars();
140
+ this.tabbar.createToolbars();
141
+ resolve(this.createCoreInstance());
142
+ });
143
+ }
144
+ createCoreInstance() {
145
+ return new Promise(resolve => {
146
+ var _a, _b;
131
147
  //attach mei first time
132
148
  this.coreInstance = new Core_1.default(this.container.id);
133
- this.container.append(dc.makeNewDiv(constants_1.constants._TARGETDIVID_, ""));
134
- var initEvent = new Event("vseInit");
149
+ if (!this.isFullContainer) {
150
+ this.container.append(dc.makeNewDiv(constants_1.constants._TARGETDIVID_, ""));
151
+ }
152
+ else {
153
+ const sc = this.container.querySelector("#svgContainer");
154
+ sc.parentElement.append(sc);
155
+ }
156
+ var initEvent = new Event("vibeInit");
135
157
  var data;
136
158
  var isUrl = false;
137
159
  if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.meiURL) != undefined) {
@@ -144,17 +166,29 @@ class VerovioScoreEditor {
144
166
  else if (this.options === null) {
145
167
  data = null;
146
168
  }
147
- this.coreInstance.loadData(data, isUrl).then(() => {
148
- this.container.dispatchEvent(initEvent);
149
- resolve();
150
- });
151
- tb
152
- .setImportCallback(this.coreInstance.loadDataFunction)
153
- .setAlignCallback(this.coreInstance.alignFunctionCall)
169
+ this.coreInstance.setMEIChangedCallback(this.meiChangedCallback);
170
+ if (!this.isFullContainer) {
171
+ this.coreInstance.loadData(data, isUrl).then(() => {
172
+ this.container.dispatchEvent(initEvent);
173
+ resolve();
174
+ });
175
+ }
176
+ else {
177
+ this.coreInstance.loadWithExistingSVG(this.container, data, isUrl).then(() => {
178
+ this.container.dispatchEvent(initEvent);
179
+ resolve();
180
+ });
181
+ }
182
+ this.tabbar
183
+ .setImportCallback(this.coreInstance.loadDataHandler)
184
+ .setAlignCallback(this.coreInstance.alignFunctionHandler)
154
185
  .setGetMEICallback(this.coreInstance.getMEI.bind(this.coreInstance));
155
- //block everthing when firefox (use at least version 114.0.2)
186
+ //block everthing when firefox is not at least version 114.0
156
187
  if (navigator.userAgent.toLowerCase().includes("firefox")) {
157
- if (!navigator.userAgent.match("Firefox.*")[0].includes("114.0")) {
188
+ const userAgent = navigator.userAgent;
189
+ const firefoxVersion = parseFloat(userAgent.split("Firefox/")[1]);
190
+ const isAtLeast114 = firefoxVersion >= 114.0;
191
+ if (!isAtLeast114) {
158
192
  var div = document.createElement("div");
159
193
  div.id = "ff_warning";
160
194
  this.container.insertAdjacentElement("beforebegin", div);
@@ -180,4 +214,4 @@ class VerovioScoreEditor {
180
214
  return this.coreInstance;
181
215
  }
182
216
  }
183
- exports.default = VerovioScoreEditor;
217
+ exports.default = VIBE;
@@ -109,10 +109,14 @@ class MeiTemplate {
109
109
  createStaff(n = 1, layerCount = 1) {
110
110
  var newElem = document.createElement("staff");
111
111
  newElem.setAttribute("n", n.toString());
112
- newElem.appendChild(this.createLayer(1));
112
+ for (let i = 0; i < layerCount; i++) {
113
+ newElem.appendChild(this.createLayer(i + 1));
114
+ }
113
115
  return newElem;
114
116
  }
115
117
  createLayer(n = 1) {
118
+ if (typeof n === "string")
119
+ n = parseInt(n);
116
120
  var newElem = document.createElement("layer");
117
121
  newElem.setAttribute("n", n.toString());
118
122
  if (this.isEmpty) {
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const mappings_1 = require("../utils/mappings");
4
3
  //@ts-ignore
5
4
  //const $ = H5P.jQuery;
6
5
  class MeasureMatrix {
@@ -21,90 +20,8 @@ class MeasureMatrix {
21
20
  }
22
21
  }
23
22
  }
24
- /**
25
- * @deprecated
26
- * @param svg
27
- */
28
- populateFromSVG(svg) {
29
- this.matrix = new Array();
30
- this.cols = svg.querySelectorAll(".measure").length;
31
- this.rows = svg.querySelector(".measure").querySelectorAll(".staff").length;
32
- var measures = svg.querySelectorAll(".measure");
33
- for (var i = 0; i < this.cols; i++) {
34
- let col = new Array();
35
- let measure = measures[i];
36
- let prevMeasure;
37
- if (i == 0) {
38
- prevMeasure = measure;
39
- }
40
- else {
41
- prevMeasure = measures[i - 1];
42
- }
43
- let staves = measure.querySelectorAll(".staff");
44
- let prevStaves = prevMeasure.querySelectorAll(".staff");
45
- for (var j = 0; j < this.rows; j++) {
46
- let staff = {};
47
- let clefs = prevStaves[j].querySelectorAll(".clef");
48
- let keysigs = staves[j].querySelectorAll(".keySig");
49
- let meterSigs = staves[j].querySelectorAll(".meterSig");
50
- if (clefs.length > 0) {
51
- let clefIdx;
52
- if (i === 0) {
53
- clefIdx = 0;
54
- }
55
- else {
56
- clefIdx = clefs.length - 1;
57
- }
58
- let clefShape = clefs[clefIdx].querySelector("use").getAttribute("xlink:href");
59
- if (clefShape.includes("-")) {
60
- let clefRegex = /^(.*?)-/g;
61
- clefShape = clefRegex.exec(clefShape)[0];
62
- clefShape = clefShape.slice(0, -1);
63
- }
64
- clefShape = mappings_1.idToClef.get(clefShape);
65
- staff.clef = clefShape;
66
- }
67
- else {
68
- staff.clef = this.matrix[i - 1][j].clef;
69
- }
70
- if (keysigs.length > 0) {
71
- let lastIdx = keysigs.length - 1;
72
- let keysigcount = keysigs[lastIdx].querySelectorAll("use").length;
73
- let keysig = keysigs[lastIdx].querySelector("use").getAttribute("xlink:href") === "#E262" ? "f" : "s";
74
- keysig = keysigcount.toString() + keysig;
75
- staff.keysig = keysig;
76
- }
77
- else if (i > 0) {
78
- staff.keysig = this.matrix[i - 1][j].keysig;
79
- }
80
- else { // if first measure has no accidentials
81
- staff.keysig = "0";
82
- }
83
- if (meterSigs.length > 0) {
84
- let lastIdx = meterSigs.length - 1;
85
- let unit = meterSigs[lastIdx].getAttribute("unit");
86
- let count = meterSigs[lastIdx].getAttribute("count");
87
- staff.meterSig = { unit: unit, count: count };
88
- }
89
- else if (i > 0) {
90
- staff.meterSig = this.matrix[i - 1][j].meterSig;
91
- }
92
- else {
93
- if (staves[j].querySelector("metersig") === null) {
94
- staff.meterSig = null;
95
- }
96
- else {
97
- staff.meterSig = { unit: staves[j].querySelector("metersig").getAttribute("unit"), count: staves[j].querySelector("metersig").getAttribute("count") };
98
- }
99
- }
100
- col.push(staff);
101
- }
102
- this.matrix.push(col);
103
- }
104
- //console.log(this.matrix)
105
- }
106
23
  populateFromMEI(mei) {
107
- var _a, _b;
24
+ var _a, _b, _c, _d, _e, _f;
108
25
  this.matrix = new Array();
109
26
  this.cols = mei.querySelectorAll("measure").length;
110
27
  this.rows = mei.querySelector("measure").querySelectorAll("staff").length;
@@ -141,9 +58,13 @@ class MeasureMatrix {
141
58
  else {
142
59
  if (i > 0) {
143
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;
144
63
  }
145
64
  else {
146
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;
147
68
  }
148
69
  }
149
70
  if (keysigs.length > 0) {
@@ -159,7 +80,7 @@ class MeasureMatrix {
159
80
  staff.keysig = "0";
160
81
  }
161
82
  else {
162
- staff.keysig = ((_b = staffDef.querySelector("keySig")) === null || _b === void 0 ? void 0 : _b.getAttribute("sig")) || staffDef.getAttribute("keysig");
83
+ staff.keysig = ((_f = staffDef.querySelector("keySig")) === null || _f === void 0 ? void 0 : _f.getAttribute("sig")) || staffDef.getAttribute("keysig");
163
84
  }
164
85
  }
165
86
  if (meterSigs.length > 0) {
@@ -125,7 +125,7 @@ class ScoreGraph {
125
125
  }
126
126
  }
127
127
  //Assign up/down nodes
128
- if (this.midiTimes == undefined) {
128
+ if (this.midiTimes) {
129
129
  // miditimes contain svg Elements (not mei Elements!!!)
130
130
  // first: direct up/down references
131
131
  for (const [key, value] of this.midiTimes.entries()) {
@@ -1,4 +1,5 @@
1
1
  import VerovioScoreEditor from "./VerovioScoreEditor.js"
2
2
 
3
-
4
- export default VerovioScoreEditor
3
+ export default function createEditor(container, options, meiCallback){
4
+ return new VerovioScoreEditor(container, options, meiCallback)
5
+ }