vibe-editor 0.0.0
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 +21 -0
- package/README.md +51 -0
- package/package.json +56 -0
- package/src/fonts/bravura/FONTLOG.txt +243 -0
- package/src/fonts/bravura/OFL-FAQ.txt +369 -0
- package/src/fonts/bravura/OFL.txt +94 -0
- package/src/fonts/bravura/bravura-text.md +153 -0
- package/src/fonts/bravura/bravura_metadata.json +34718 -0
- package/src/fonts/bravura/eot/Bravura.eot +0 -0
- package/src/fonts/bravura/eot/BravuraText.eot +0 -0
- package/src/fonts/bravura/otf/Bravura.otf +0 -0
- package/src/fonts/bravura/otf/BravuraText.otf +0 -0
- package/src/fonts/bravura/svg/Bravura.svg +3517 -0
- package/src/fonts/bravura/svg/BravuraText.svg +18879 -0
- package/src/fonts/bravura/woff/Bravura.woff +0 -0
- package/src/fonts/bravura/woff/BravuraText.woff +0 -0
- package/src/fonts/colaborate/ColabBol-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabBol-webfont.svg +976 -0
- package/src/fonts/colaborate/ColabBol-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabBol-webfont.woff +0 -0
- package/src/fonts/colaborate/ColabLig-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabLig-webfont.svg +976 -0
- package/src/fonts/colaborate/ColabLig-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabLig-webfont.woff +0 -0
- package/src/fonts/colaborate/ColabMed-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabMed-webfont.svg +976 -0
- package/src/fonts/colaborate/ColabMed-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabMed-webfont.woff +0 -0
- package/src/fonts/colaborate/ColabReg-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabReg-webfont.svg +976 -0
- package/src/fonts/colaborate/ColabReg-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabReg-webfont.woff +0 -0
- package/src/fonts/colaborate/ColabThi-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabThi-webfont.svg +970 -0
- package/src/fonts/colaborate/ColabThi-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabThi-webfont.woff +0 -0
- package/src/images/GUI/.DS_Store +0 -0
- package/src/images/GUI/backward-fast-solid.svg +1 -0
- package/src/images/GUI/bars-solid.svg +1 -0
- package/src/images/GUI/caret-left-solid.svg +1 -0
- package/src/images/GUI/caret-right-solid.svg +1 -0
- package/src/images/GUI/edit-solid.svg +1 -0
- package/src/images/GUI/pause-solid.svg +1 -0
- package/src/images/GUI/play-solid.svg +1 -0
- package/src/images/GUI/triplet.svg +21 -0
- package/src/images/GUI/zoomin.svg +1 -0
- package/src/images/GUI/zoomout.svg +1 -0
- package/src/images/bravura_notes/.DS_Store +0 -0
- package/src/images/bravura_notes/16th.svg +1 -0
- package/src/images/bravura_notes/32th.svg +1 -0
- package/src/images/bravura_notes/alterDDown.svg +1 -0
- package/src/images/bravura_notes/alterDUp.svg +1 -0
- package/src/images/bravura_notes/alterDown.svg +1 -0
- package/src/images/bravura_notes/alterNeutral.svg +1 -0
- package/src/images/bravura_notes/alterUp.svg +1 -0
- package/src/images/bravura_notes/beams.svg +1 -0
- package/src/images/bravura_notes/eigth.svg +1 -0
- package/src/images/bravura_notes/full.svg +1 -0
- package/src/images/bravura_notes/half.svg +1 -0
- package/src/images/bravura_notes/oneDot.svg +1 -0
- package/src/images/bravura_notes/pauseNote.svg +1 -0
- package/src/images/bravura_notes/quarter.svg +1 -0
- package/src/images/bravura_notes/tie.svg +1 -0
- package/src/images/bravura_notes/twoDot.svg +1 -0
- package/src/scripts/js/.DS_Store +0 -0
- package/src/scripts/js/Core.js +887 -0
- package/src/scripts/js/MusicPlayer.js +572 -0
- package/src/scripts/js/MusicProcessor.js +652 -0
- package/src/scripts/js/VerovioScoreEditor.js +183 -0
- package/src/scripts/js/assets/mei_template.js +161 -0
- package/src/scripts/js/constants.js +20 -0
- package/src/scripts/js/datastructures/MeasureMatrix.js +235 -0
- package/src/scripts/js/datastructures/ScoreGraph.js +432 -0
- package/src/scripts/js/datastructures/ScoreNode.js +78 -0
- package/src/scripts/js/entry.js +4 -0
- package/src/scripts/js/gui/Annotations.js +456 -0
- package/src/scripts/js/gui/Cursor.js +203 -0
- package/src/scripts/js/gui/CustomAnnotationDrawer.js +114 -0
- package/src/scripts/js/gui/CustomAnnotationShapeDrawer.js +114 -0
- package/src/scripts/js/gui/HarmonyLabel.js +104 -0
- package/src/scripts/js/gui/Label.js +2 -0
- package/src/scripts/js/gui/PhantomElement.js +132 -0
- package/src/scripts/js/gui/ScoreManipulator.js +156 -0
- package/src/scripts/js/gui/Tabbar.js +675 -0
- package/src/scripts/js/gui/TempoLabel.js +60 -0
- package/src/scripts/js/gui/Toolbar copy.js +614 -0
- package/src/scripts/js/gui/Toolbar.js +618 -0
- package/src/scripts/js/handlers/AnnotationChangeHandler.js +567 -0
- package/src/scripts/js/handlers/AnnotationDragHandler.js +113 -0
- package/src/scripts/js/handlers/AnnotationLineHandler.js +113 -0
- package/src/scripts/js/handlers/ArticulationHandler.js +20 -0
- package/src/scripts/js/handlers/ClickModeHandler.js +265 -0
- package/src/scripts/js/handlers/CustomAnnotationShapeDrawer.js +131 -0
- package/src/scripts/js/handlers/CustomToolbarHandler.js +297 -0
- package/src/scripts/js/handlers/DeleteHandler.js +102 -0
- package/src/scripts/js/handlers/GlobalKeyboardHandler.js +367 -0
- package/src/scripts/js/handlers/Handler.js +2 -0
- package/src/scripts/js/handlers/HarmonyHandler.js +282 -0
- package/src/scripts/js/handlers/InsertModeHandler copy.js +423 -0
- package/src/scripts/js/handlers/InsertModeHandler.js +380 -0
- package/src/scripts/js/handlers/InsertModeHandler_deprecated.js +424 -0
- package/src/scripts/js/handlers/KeyModeHandler copy.js +407 -0
- package/src/scripts/js/handlers/KeyModeHandler.js +456 -0
- package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +411 -0
- package/src/scripts/js/handlers/LabelHandler.js +461 -0
- package/src/scripts/js/handlers/ModHandler.js +311 -0
- package/src/scripts/js/handlers/NoteDragHandler copy.js +148 -0
- package/src/scripts/js/handlers/NoteDragHandler.js +97 -0
- package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +150 -0
- package/src/scripts/js/handlers/PhantomElementHandler.js +168 -0
- package/src/scripts/js/handlers/ScoreManipulatorHandler.js +135 -0
- package/src/scripts/js/handlers/SelectionHandler.js +218 -0
- package/src/scripts/js/handlers/SideBarHandler.js +499 -0
- package/src/scripts/js/handlers/TooltipHandler.js +132 -0
- package/src/scripts/js/handlers/WindowHandler.js +257 -0
- package/src/scripts/js/utils/DOMCreator.js +174 -0
- package/src/scripts/js/utils/MEIConverter.js +64 -0
- package/src/scripts/js/utils/MEIOperations.js +2112 -0
- package/src/scripts/js/utils/Mouse2MEI.js +735 -0
- package/src/scripts/js/utils/Mouse2SVG.js +737 -0
- package/src/scripts/js/utils/SVGEditor.js +352 -0
- package/src/scripts/js/utils/SVGFiller.js +245 -0
- package/src/scripts/js/utils/Types.js +2 -0
- package/src/scripts/js/utils/VerovioWrapper copy.js +156 -0
- package/src/scripts/js/utils/VerovioWrapper.js +165 -0
- package/src/scripts/js/utils/VerovioWrapperLocal.js +156 -0
- package/src/scripts/js/utils/convenienceQueries.js +37 -0
- package/src/scripts/js/utils/coordinates.js +54 -0
- package/src/scripts/js/utils/firefoxBBoxes.js +143 -0
- package/src/scripts/js/utils/mappings.js +332 -0
- package/src/scripts/js/utils/random.js +45 -0
- package/src/styles/VerovioScoreEditor.css +694 -0
@@ -0,0 +1,183 @@
|
|
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 VerovioScoreEditor
|
9
|
+
*/
|
10
|
+
class VerovioScoreEditor {
|
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
|
+
if ((container === null || container === void 0 ? void 0 : container.id) === null) {
|
19
|
+
throw new Error("The editor's container must have an id");
|
20
|
+
}
|
21
|
+
if (container === null) {
|
22
|
+
container = document.body;
|
23
|
+
container.id = "editorInBody";
|
24
|
+
}
|
25
|
+
(_a = container === null || container === void 0 ? void 0 : container.classList) === null || _a === void 0 ? void 0 : _a.add("vse-container");
|
26
|
+
this.container = container;
|
27
|
+
this.options = options;
|
28
|
+
this.meiChangedCallback = meiCallback;
|
29
|
+
this.loadScripts();
|
30
|
+
this.setMutationObserver();
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* Load verovio script.
|
34
|
+
* Makes sure that only one script instance is in the DOM.
|
35
|
+
*
|
36
|
+
*/
|
37
|
+
loadScripts() {
|
38
|
+
var src = "https://www.verovio.org/javascript/" + constants_1.constants._VEROVIO_VERSION_ + "/verovio-toolkit.js";
|
39
|
+
var scriptId = "verovioScript";
|
40
|
+
var script = document.querySelector("#" + scriptId) || document.createElement('script');
|
41
|
+
script.src = src;
|
42
|
+
if (script.id === "") {
|
43
|
+
script.id = scriptId;
|
44
|
+
}
|
45
|
+
if (script.getAttribute("loaded") === null) {
|
46
|
+
script.setAttribute("loaded", "false");
|
47
|
+
}
|
48
|
+
if (script.getAttribute("loaded") === "true") {
|
49
|
+
this.initGUI().then(() => {
|
50
|
+
if (this.meiChangedCallback != undefined) {
|
51
|
+
this.setMEIChangedCallback(this.meiChangedCallback);
|
52
|
+
}
|
53
|
+
});
|
54
|
+
}
|
55
|
+
if (document.getElementById(scriptId) === null) {
|
56
|
+
var prior = document.getElementsByTagName('script')[0];
|
57
|
+
script.async = false;
|
58
|
+
prior.parentNode.insertBefore(script, prior);
|
59
|
+
script.onload = function () {
|
60
|
+
script.setAttribute("loaded", "true");
|
61
|
+
};
|
62
|
+
}
|
63
|
+
}
|
64
|
+
/**
|
65
|
+
* Observes if the script is already loaded. Fires initGUI() when Attribute "loaded" changes to "true"
|
66
|
+
*/
|
67
|
+
setMutationObserver() {
|
68
|
+
var that = this;
|
69
|
+
var observer = new MutationObserver(function (mutations) {
|
70
|
+
mutations.forEach(function (mutation) {
|
71
|
+
if (mutation.type === "attributes") {
|
72
|
+
var t = mutation.target;
|
73
|
+
if (mutation.attributeName === "loaded" && t.getAttribute(mutation.attributeName) === "true") {
|
74
|
+
that.initGUI().then(() => {
|
75
|
+
if (that.meiChangedCallback != undefined) {
|
76
|
+
that.setMEIChangedCallback(that.meiChangedCallback);
|
77
|
+
}
|
78
|
+
});
|
79
|
+
}
|
80
|
+
}
|
81
|
+
});
|
82
|
+
});
|
83
|
+
observer.observe(document.getElementById("verovioScript"), {
|
84
|
+
attributes: true
|
85
|
+
});
|
86
|
+
}
|
87
|
+
/**
|
88
|
+
* Init everything on load
|
89
|
+
* @param container container provided by H5P
|
90
|
+
*/
|
91
|
+
initGUI() {
|
92
|
+
return new Promise((resolve) => {
|
93
|
+
var _a, _b;
|
94
|
+
var btnGrpClass = "btn-group-sm me-2";
|
95
|
+
// MAIN/ Permanent TOOLBAR
|
96
|
+
// parentElement for dropdown
|
97
|
+
this.container.append(dc.makeNewDiv("handlerGroup", btnGrpClass, { role: "group" })); //"me-2 h-100"))
|
98
|
+
//parentElement for Notebuttons
|
99
|
+
this.container.append(dc.makeNewDiv("noteGroup", btnGrpClass, { role: "group" }));
|
100
|
+
//parentElement for Dotbuttons
|
101
|
+
this.container.append(dc.makeNewDiv("dotGroup", btnGrpClass, { role: "group" }));
|
102
|
+
//parentElement for local modifier Buttons
|
103
|
+
this.container.append(dc.makeNewDiv("modGroup", btnGrpClass, { role: "group" }));
|
104
|
+
//parentElement for local accidental Buttons
|
105
|
+
this.container.append(dc.makeNewDiv("accidGroup", btnGrpClass, { role: "group" }));
|
106
|
+
//sidebarList
|
107
|
+
this.container.append(dc.makeNewDiv("sidebarContainer", "sidebar closedSidebar"));
|
108
|
+
//parentElement for sidebar open/close
|
109
|
+
this.container.append(dc.makeNewDiv("sideBarGroup", btnGrpClass, { role: "group" }));
|
110
|
+
//parentElement for playback
|
111
|
+
this.container.append(dc.makeNewDiv("soundGroup", btnGrpClass, { role: "group" }));
|
112
|
+
//parentElement for zoom
|
113
|
+
this.container.append(dc.makeNewDiv("zoomGroup", btnGrpClass, { role: "group" }));
|
114
|
+
//parentElement for midi device selection
|
115
|
+
this.container.append(dc.makeNewDiv("midiSelectGroup", btnGrpClass, { role: "group" }));
|
116
|
+
//parentElement for fileselect group
|
117
|
+
this.container.append(dc.makeNewDiv("fileSelectGroup", btnGrpClass, { role: "group" }));
|
118
|
+
// parentElement for toolbarTop
|
119
|
+
this.container.append(dc.makeNewDiv("btnToolbar", "btn-toolbar d-inline-flex align-items-stretch", { role: "toolbar" }));
|
120
|
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
121
|
+
// CUSTOM TOOLBAR
|
122
|
+
// parentElement for customToolbar
|
123
|
+
this.container.append(dc.makeNewDiv("customToolbar", "btn-toolbar align-items-stretch", { role: "toolbar" }));
|
124
|
+
// and now the tabs
|
125
|
+
this.container.append(dc.makeNewDiv("notationTabGroup", btnGrpClass, { role: "group" }));
|
126
|
+
this.container.append(dc.makeNewDiv("articulationTabGroup", btnGrpClass, { role: "group" }));
|
127
|
+
this.container.append(dc.makeNewDiv("annotationTabGroup", btnGrpClass, { role: "group" }));
|
128
|
+
//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();
|
131
|
+
//attach mei first time
|
132
|
+
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");
|
135
|
+
var data;
|
136
|
+
var isUrl = false;
|
137
|
+
if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.meiURL) != undefined) {
|
138
|
+
data = this.options.meiURL;
|
139
|
+
isUrl = true;
|
140
|
+
}
|
141
|
+
else if (((_b = this.options) === null || _b === void 0 ? void 0 : _b.data) != undefined) {
|
142
|
+
data = this.options.data;
|
143
|
+
}
|
144
|
+
else if (this.options === null) {
|
145
|
+
data = null;
|
146
|
+
}
|
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)
|
154
|
+
.setGetMEICallback(this.coreInstance.getMEI.bind(this.coreInstance));
|
155
|
+
//block everthing when firefox (use at least version 114.0.2)
|
156
|
+
if (navigator.userAgent.toLowerCase().includes("firefox")) {
|
157
|
+
if (!navigator.userAgent.match("Firefox.*")[0].includes("114.0")) {
|
158
|
+
var div = document.createElement("div");
|
159
|
+
div.id = "ff_warning";
|
160
|
+
this.container.insertAdjacentElement("beforebegin", div);
|
161
|
+
div.append(this.container);
|
162
|
+
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.";
|
163
|
+
}
|
164
|
+
}
|
165
|
+
});
|
166
|
+
}
|
167
|
+
/**
|
168
|
+
*
|
169
|
+
* @param meiChangedCallback Function in which the mei will be used by the calling instance
|
170
|
+
*/
|
171
|
+
setMEIChangedCallback(meiChangedCallback) {
|
172
|
+
this.meiChangedCallback = meiChangedCallback;
|
173
|
+
this.coreInstance.setMEIChangedCallback(this.meiChangedCallback);
|
174
|
+
}
|
175
|
+
/**
|
176
|
+
* Get Core Instance to manipulate svg output
|
177
|
+
* @returns
|
178
|
+
*/
|
179
|
+
getCore() {
|
180
|
+
return this.coreInstance;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
exports.default = VerovioScoreEditor;
|
@@ -0,0 +1,161 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const constants_1 = require("../constants");
|
4
|
+
const random_1 = require("../utils/random");
|
5
|
+
class MeiTemplate {
|
6
|
+
/**
|
7
|
+
* Create templates for MEI-Componets to be inserted
|
8
|
+
* @param xml xml document provided to be altered
|
9
|
+
*/
|
10
|
+
constructor(xml) {
|
11
|
+
this.xmlDoc = xml;
|
12
|
+
this.isEmpty = true;
|
13
|
+
}
|
14
|
+
emptyMEI() {
|
15
|
+
this.isEmpty = true;
|
16
|
+
var mei = document.createElementNS(constants_1.constants._MEINS_, "mei");
|
17
|
+
//mei.setAttribute("xmlns", "http://www.music-encoding.org/ns/mei");
|
18
|
+
//mei.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
|
19
|
+
mei.setAttribute("meiversion", "4.0.0");
|
20
|
+
mei.appendChild(this.createMeiHead());
|
21
|
+
mei.appendChild(this.createMusic());
|
22
|
+
var meiString = mei.outerHTML;
|
23
|
+
meiString = meiString.replace(/def/gi, "Def");
|
24
|
+
meiString = meiString.replace(/\grp/gi, "Grp");
|
25
|
+
meiString = meiString.replace(/\head/gi, "Head");
|
26
|
+
meiString = meiString.replace(/space/gi, "Space");
|
27
|
+
return meiString;
|
28
|
+
}
|
29
|
+
createMusic() {
|
30
|
+
var newElem = document.createElement("music");
|
31
|
+
newElem.appendChild(this.createBody());
|
32
|
+
return newElem;
|
33
|
+
}
|
34
|
+
createBody() {
|
35
|
+
var newElem = document.createElement("body");
|
36
|
+
newElem.appendChild(this.createMDiv());
|
37
|
+
return newElem;
|
38
|
+
}
|
39
|
+
createMDiv() {
|
40
|
+
var newElem = document.createElement("mdiv");
|
41
|
+
newElem.appendChild(this.createScore());
|
42
|
+
return newElem;
|
43
|
+
}
|
44
|
+
createScore() {
|
45
|
+
var newElem = document.createElement("score");
|
46
|
+
newElem.appendChild(this.createScoreDef());
|
47
|
+
newElem.appendChild(this.createSection());
|
48
|
+
return newElem;
|
49
|
+
}
|
50
|
+
createSection() {
|
51
|
+
var newElem = document.createElement("section");
|
52
|
+
newElem.appendChild(this.createMeasure());
|
53
|
+
return newElem;
|
54
|
+
}
|
55
|
+
createScoreDef() {
|
56
|
+
var newElem = document.createElement("scoreDef");
|
57
|
+
newElem.appendChild(this.createStaffGrp());
|
58
|
+
return newElem;
|
59
|
+
}
|
60
|
+
createStaffGrp() {
|
61
|
+
var newElem = document.createElement("staffGrp");
|
62
|
+
newElem.appendChild(this.createStaffDef());
|
63
|
+
return newElem;
|
64
|
+
}
|
65
|
+
createStaffDef(n = 1, lines = 5, meterCount = 4, meterUnit = 4) {
|
66
|
+
var newElem = document.createElement("staffDef");
|
67
|
+
newElem.setAttribute("n", n.toString());
|
68
|
+
newElem.setAttribute("lines", lines.toString());
|
69
|
+
newElem.setAttribute("meter.count", meterCount.toString());
|
70
|
+
newElem.setAttribute("meter.unit", meterUnit.toString());
|
71
|
+
newElem.appendChild(this.createClef());
|
72
|
+
newElem.appendChild(this.createKeySig());
|
73
|
+
return newElem;
|
74
|
+
}
|
75
|
+
createClef(shape = "G", line = 2) {
|
76
|
+
var newElem = document.createElement("clef");
|
77
|
+
newElem.setAttribute("shape", shape);
|
78
|
+
newElem.setAttribute("line", line.toString());
|
79
|
+
return newElem;
|
80
|
+
}
|
81
|
+
createKeySig(mode = "major", sig = "0") {
|
82
|
+
var newElem = document.createElementNS(constants_1.constants._MEINS_, "keySig");
|
83
|
+
newElem.setAttribute("mode", mode);
|
84
|
+
newElem.setAttribute("sig", sig);
|
85
|
+
return newElem;
|
86
|
+
}
|
87
|
+
createMeterSig(count, unit) {
|
88
|
+
var newElem = document.createElementNS(constants_1.constants._MEINS_, "meterSig");
|
89
|
+
newElem.setAttribute("count", count);
|
90
|
+
newElem.setAttribute("unit", unit);
|
91
|
+
return newElem;
|
92
|
+
}
|
93
|
+
createMeiHead() {
|
94
|
+
var newElem = document.createElement("meiHead");
|
95
|
+
return newElem;
|
96
|
+
}
|
97
|
+
/**
|
98
|
+
* Return Measure to be inserted into new MEI
|
99
|
+
* @param n number count of measures in current staff
|
100
|
+
*/
|
101
|
+
createMeasure(n = 1, staffCount = 1, layerCount = 1) {
|
102
|
+
var newElem = document.createElement("measure");
|
103
|
+
newElem.setAttribute("n", n.toString());
|
104
|
+
for (let i = 0; i < staffCount; i++) {
|
105
|
+
newElem.appendChild(this.createStaff(i + 1, layerCount));
|
106
|
+
}
|
107
|
+
return newElem;
|
108
|
+
}
|
109
|
+
createStaff(n = 1, layerCount = 1) {
|
110
|
+
var newElem = document.createElement("staff");
|
111
|
+
newElem.setAttribute("n", n.toString());
|
112
|
+
newElem.appendChild(this.createLayer(1));
|
113
|
+
return newElem;
|
114
|
+
}
|
115
|
+
createLayer(n = 1) {
|
116
|
+
var newElem = document.createElement("layer");
|
117
|
+
newElem.setAttribute("n", n.toString());
|
118
|
+
if (this.isEmpty) {
|
119
|
+
newElem.appendChild(this.createMRest());
|
120
|
+
}
|
121
|
+
return newElem;
|
122
|
+
}
|
123
|
+
createMSpace() {
|
124
|
+
var newElem = document.createElementNS(constants_1.constants._MEINS_, "mSpace");
|
125
|
+
return newElem;
|
126
|
+
}
|
127
|
+
createMRest() {
|
128
|
+
var newElem = document.createElementNS(constants_1.constants._MEINS_, "mRest");
|
129
|
+
return newElem;
|
130
|
+
}
|
131
|
+
createTempo(mm, mmUnit, tstamp = null, startId = null) {
|
132
|
+
var newElement = document.createElementNS(constants_1.constants._MEINS_, "tempo");
|
133
|
+
newElement.setAttribute("id", random_1.uuidv4());
|
134
|
+
newElement.setAttribute("place", "above");
|
135
|
+
if (startId === null && tstamp === null) {
|
136
|
+
throw new Error("Tempo MUST either have timestamp or startId");
|
137
|
+
}
|
138
|
+
if (tstamp !== null)
|
139
|
+
newElement.setAttribute("tstamp", tstamp);
|
140
|
+
if (startId !== null)
|
141
|
+
newElement.setAttribute("startId", startId);
|
142
|
+
newElement.setAttribute("mm", mm);
|
143
|
+
newElement.setAttribute("mm.unit", mmUnit);
|
144
|
+
newElement.setAttribute("midi.bpm", (parseFloat(mm) * parseFloat(mmUnit)).toString());
|
145
|
+
newElement.setAttribute("staff", "1");
|
146
|
+
var rend = document.createElementNS(constants_1.constants._MEINS_, "rend");
|
147
|
+
rend.setAttribute("id", random_1.uuidv4());
|
148
|
+
rend.setAttribute("fontname", "VerovioText");
|
149
|
+
rend.textContent = "__";
|
150
|
+
newElement.appendChild(rend);
|
151
|
+
newElement.textContent = "__ = " + mm;
|
152
|
+
return newElement;
|
153
|
+
}
|
154
|
+
appendToRoot(node) {
|
155
|
+
if (this.xmlDoc instanceof XMLDocument) {
|
156
|
+
var refElem = this.xmlDoc.getElementsByTagName("measure").item(0);
|
157
|
+
refElem.parentNode.appendChild(node);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
}
|
161
|
+
exports.default = MeiTemplate;
|
@@ -0,0 +1,20 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.constants = void 0;
|
4
|
+
var constants;
|
5
|
+
(function (constants) {
|
6
|
+
constants["_TARGETDIVID_"] = "svgContainer";
|
7
|
+
constants["_TARGETDIVID_WITH_IDSELECTOR_"] = "#svgContainer";
|
8
|
+
constants["_MEASURE_"] = "measure";
|
9
|
+
constants["_NOTE_"] = "note";
|
10
|
+
constants["_NOTE_WITH_CLASSSELECTOR_"] = ".note";
|
11
|
+
constants["_STAFF_WITH_CLASSSELECTOR_"] = ".staff";
|
12
|
+
constants["_NOTEHEAD_"] = "notehead";
|
13
|
+
constants["_vrvSVGID_"] = "vrvSVG";
|
14
|
+
constants["_vrvSVGID_WITH_IDSELECTOR_"] = "#vrvSVG";
|
15
|
+
constants["_VEROVIO_VERSION_"] = "3.6.0";
|
16
|
+
constants["_METERUNIT_"] = "meter.unit";
|
17
|
+
constants["_METERCOUNT_"] = "meter.count";
|
18
|
+
constants["_SVGNS_"] = "http://www.w3.org/2000/svg";
|
19
|
+
constants["_MEINS_"] = "http://www.music-encoding.org/ns/mei";
|
20
|
+
})(constants = exports.constants || (exports.constants = {}));
|
@@ -0,0 +1,235 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const mappings_1 = require("../utils/mappings");
|
4
|
+
//@ts-ignore
|
5
|
+
//const $ = H5P.jQuery;
|
6
|
+
class MeasureMatrix {
|
7
|
+
constructor(rows = null, cols = null) {
|
8
|
+
this.rows = rows;
|
9
|
+
this.cols = cols;
|
10
|
+
this.matrix = null;
|
11
|
+
if (cols !== null && rows !== null) {
|
12
|
+
// empty matrix
|
13
|
+
this.matrix = new Array();
|
14
|
+
for (var i = 0; i < cols; i++) {
|
15
|
+
let col = new Array();
|
16
|
+
for (var j = 0; j < rows; j++) {
|
17
|
+
var staff = {};
|
18
|
+
col.push(staff);
|
19
|
+
}
|
20
|
+
this.matrix.push(col);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
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
|
+
populateFromMEI(mei) {
|
107
|
+
var _a, _b;
|
108
|
+
this.matrix = new Array();
|
109
|
+
this.cols = mei.querySelectorAll("measure").length;
|
110
|
+
this.rows = mei.querySelector("measure").querySelectorAll("staff").length;
|
111
|
+
var measures = mei.querySelectorAll("measure");
|
112
|
+
for (var i = 0; i < this.cols; i++) {
|
113
|
+
let col = new Array();
|
114
|
+
let measure = measures[i];
|
115
|
+
let prevMeasure;
|
116
|
+
if (i == 0) {
|
117
|
+
prevMeasure = measure;
|
118
|
+
}
|
119
|
+
else {
|
120
|
+
prevMeasure = measures[i - 1];
|
121
|
+
}
|
122
|
+
let staves = measure.querySelectorAll("staff");
|
123
|
+
let prevStaves = prevMeasure.querySelectorAll("staff");
|
124
|
+
for (var j = 0; j < this.rows; j++) {
|
125
|
+
let staffDef = mei.querySelector("staffDef[n=\"" + (j + 1).toString() + "\"]");
|
126
|
+
let staff = {};
|
127
|
+
let clefs = i === 0 ? [] : prevStaves[j].querySelectorAll("clef");
|
128
|
+
let keysigs = i === 0 ? [] : staves[j].querySelectorAll("keySig");
|
129
|
+
let meterSigs = staves[j].querySelectorAll("meterSig");
|
130
|
+
let clefIdx;
|
131
|
+
if (clefs.length > 0) {
|
132
|
+
if (i === 0) {
|
133
|
+
clefIdx = 0;
|
134
|
+
}
|
135
|
+
else {
|
136
|
+
clefIdx = clefs.length - 1;
|
137
|
+
}
|
138
|
+
let clefShape = clefs[clefIdx].getAttribute("shape");
|
139
|
+
staff.clef = clefShape;
|
140
|
+
}
|
141
|
+
else {
|
142
|
+
if (i > 0) {
|
143
|
+
staff.clef = this.matrix[i - 1][j].clef;
|
144
|
+
}
|
145
|
+
else {
|
146
|
+
staff.clef = ((_a = staffDef.querySelector("clef")) === null || _a === void 0 ? void 0 : _a.getAttribute("shape")) || staffDef.getAttribute("clef.shape");
|
147
|
+
}
|
148
|
+
}
|
149
|
+
if (keysigs.length > 0) {
|
150
|
+
let lastIdx = keysigs.length - 1;
|
151
|
+
let keysig = keysigs[lastIdx].getAttribute("sig");
|
152
|
+
staff.keysig = keysig;
|
153
|
+
}
|
154
|
+
else if (i > 0) {
|
155
|
+
staff.keysig = this.matrix[i - 1][j].keysig;
|
156
|
+
}
|
157
|
+
else {
|
158
|
+
if (staffDef.querySelector("keySig") === null) {
|
159
|
+
staff.keysig = "0";
|
160
|
+
}
|
161
|
+
else {
|
162
|
+
staff.keysig = ((_b = staffDef.querySelector("keySig")) === null || _b === void 0 ? void 0 : _b.getAttribute("sig")) || staffDef.getAttribute("keysig");
|
163
|
+
}
|
164
|
+
}
|
165
|
+
if (meterSigs.length > 0) {
|
166
|
+
let lastIdx = meterSigs.length - 1;
|
167
|
+
let unit = meterSigs[lastIdx].getAttribute("unit");
|
168
|
+
let count = meterSigs[lastIdx].getAttribute("count");
|
169
|
+
staff.meterSig = { unit: unit, count: count };
|
170
|
+
}
|
171
|
+
else if (i > 0) {
|
172
|
+
staff.meterSig = this.matrix[i - 1][j].meterSig;
|
173
|
+
}
|
174
|
+
else {
|
175
|
+
if (staffDef.querySelector("meterSig") !== null) {
|
176
|
+
staff.meterSig = { unit: staffDef.querySelector("meterSig").getAttribute("unit"), count: staffDef.querySelector("meterSig").getAttribute("count") };
|
177
|
+
}
|
178
|
+
else if (staffDef.getAttribute("meter.unit") !== null) {
|
179
|
+
staff.meterSig = { unit: staffDef.getAttribute("meter.unit"), count: staffDef.getAttribute("meter.count") };
|
180
|
+
}
|
181
|
+
else {
|
182
|
+
staff.meterSig = null;
|
183
|
+
}
|
184
|
+
}
|
185
|
+
col.push(staff);
|
186
|
+
}
|
187
|
+
this.matrix.push(col);
|
188
|
+
}
|
189
|
+
//console.log(this.matrix)
|
190
|
+
}
|
191
|
+
addMeasure(n = 1) {
|
192
|
+
for (var i = 0; i < n; i++) {
|
193
|
+
let col = new Array();
|
194
|
+
for (var j = 0; j < this.rows; j++) {
|
195
|
+
var staff = {};
|
196
|
+
col.push(staff);
|
197
|
+
}
|
198
|
+
this.matrix.push(col);
|
199
|
+
}
|
200
|
+
this.cols += n;
|
201
|
+
}
|
202
|
+
addStaff(n = 1) {
|
203
|
+
for (var i = 0; i < this.cols; i++) {
|
204
|
+
for (var j = 0; j < n; j++) {
|
205
|
+
var staff = {};
|
206
|
+
this.matrix[i].push(staff);
|
207
|
+
}
|
208
|
+
}
|
209
|
+
this.rows += n;
|
210
|
+
}
|
211
|
+
/**
|
212
|
+
* Get StaffType from matrix for [staff][measure]
|
213
|
+
* @param row measure index = attribute("n")-1
|
214
|
+
* @param col staff index = attribute("n")-1
|
215
|
+
* @returns
|
216
|
+
*/
|
217
|
+
get(row, col) {
|
218
|
+
if (!isNaN(parseInt(row.toString())) && !isNaN(parseInt(col.toString()))) {
|
219
|
+
if (typeof row === "string") {
|
220
|
+
row = parseInt(row.toString()) - 1;
|
221
|
+
}
|
222
|
+
if (typeof col === "string") {
|
223
|
+
col = parseInt(col.toString()) - 1;
|
224
|
+
}
|
225
|
+
return this.matrix[row][col];
|
226
|
+
}
|
227
|
+
else {
|
228
|
+
return null;
|
229
|
+
}
|
230
|
+
}
|
231
|
+
getDimensions() {
|
232
|
+
return { rows: this.rows, cols: this.cols };
|
233
|
+
}
|
234
|
+
}
|
235
|
+
exports.default = MeasureMatrix;
|