vibe-editor 0.0.0 → 0.0.1
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.
- package/LICENSE +1 -1
- package/README.md +12 -9
- package/package.json +11 -5
- package/src/scripts/js/Core.js +212 -186
- package/src/scripts/js/MusicProcessor.js +286 -128
- package/src/scripts/js/{VerovioScoreEditor.js → VIBE.js} +62 -28
- package/src/scripts/js/assets/mei_template.js +5 -1
- package/src/scripts/js/datastructures/MeasureMatrix.js +6 -85
- package/src/scripts/js/datastructures/ScoreGraph.js +1 -1
- package/src/scripts/js/entry.js +3 -2
- package/src/scripts/js/gui/Annotations.js +188 -111
- package/src/scripts/js/gui/HarmonyLabel.js +26 -2
- package/src/scripts/js/gui/ScoreManipulator.js +61 -31
- package/src/scripts/js/gui/Tabbar.js +41 -21
- package/src/scripts/js/gui/Toolbar.js +4 -4
- package/src/scripts/js/handlers/AnnotationChangeHandler.js +131 -60
- package/src/scripts/js/handlers/ClickModeHandler.js +406 -143
- package/src/scripts/js/handlers/CustomToolbarHandler.js +26 -24
- package/src/scripts/js/handlers/GlobalKeyboardHandler.js +12 -7
- package/src/scripts/js/handlers/InsertModeHandler.js +26 -32
- package/src/scripts/js/handlers/KeyModeHandler.js +12 -86
- package/src/scripts/js/handlers/LabelHandler.js +3 -2
- package/src/scripts/js/handlers/PhantomElementHandler.js +1 -1
- package/src/scripts/js/handlers/ScoreManipulatorHandler.js +101 -14
- package/src/scripts/js/handlers/SelectionHandler.js +80 -36
- package/src/scripts/js/handlers/SideBarHandler.js +10 -3
- package/src/scripts/js/handlers/WindowHandler.js +25 -4
- package/src/scripts/js/utils/DOMCreator.js +1 -1
- package/src/scripts/js/utils/MEIConverter.js +13 -1
- package/src/scripts/js/utils/MEIOperations.js +180 -187
- package/src/scripts/js/utils/Mouse2SVG.js +200 -43
- package/src/scripts/js/utils/ReactWrapper.js +46 -0
- package/src/scripts/js/utils/RectWrapper.js +10 -0
- package/src/scripts/js/utils/SVGEditor.js +94 -3
- package/src/scripts/js/utils/VerovioWrapper.js +6 -1
- package/src/scripts/js/utils/convenienceQueries.js +2 -0
- package/src/scripts/js/utils/mappings.js +322 -56
- 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
|
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
|
-
(
|
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
|
51
|
-
|
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
|
76
|
-
|
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
|
89
|
-
*
|
98
|
+
* Init gui on load.
|
99
|
+
* Toolbars are predefined.
|
90
100
|
*/
|
91
101
|
initGUI() {
|
92
102
|
return new Promise((resolve) => {
|
93
|
-
var
|
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
|
-
|
130
|
-
|
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.
|
134
|
-
|
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.
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
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
|
186
|
+
//block everthing when firefox is not at least version 114.0
|
156
187
|
if (navigator.userAgent.toLowerCase().includes("firefox")) {
|
157
|
-
|
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 =
|
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
|
-
|
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 = ((
|
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
|
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()) {
|
package/src/scripts/js/entry.js
CHANGED