vibe-editor 0.0.6 → 0.0.7
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/package.json +1 -1
- package/src/scripts/js/scripts/Core.js +21 -12
- package/src/scripts/js/scripts/VIBE.js +1 -1
- package/src/scripts/js/scripts/gui/HarmonyLabel.js +1 -1
- package/src/scripts/js/scripts/gui/Tabbar.js +10 -5
- package/src/scripts/js/scripts/handlers/AnnotationChangeHandler.js +9 -7
- package/src/scripts/js/scripts/handlers/DeleteHandler.js +2 -0
- package/src/scripts/js/scripts/handlers/InsertModeHandler.js +43 -30
- package/src/scripts/js/scripts/handlers/LabelHandler.js +4 -4
- package/src/scripts/js/scripts/handlers/PhantomElementHandler.js +7 -1
- package/src/scripts/js/scripts/utils/MEIOperations.js +30 -60
- package/src/scripts/js/scripts/utils/SVGEditor.js +18 -3
- package/src/styles/vibe.css +10 -7
package/package.json
CHANGED
@@ -104,7 +104,7 @@ class Core {
|
|
104
104
|
this.undoAnnotationStacks.push([annotCanvas, annotList]);
|
105
105
|
annotCanvas.replaceWith(annotstate[0]);
|
106
106
|
annotList.replaceWith(annotstate[1]);
|
107
|
-
this.
|
107
|
+
this.globalKeyboardHandler.resetListeners();
|
108
108
|
this.container.dispatchEvent(new Event("annotationCanvasChanged"));
|
109
109
|
}
|
110
110
|
resolve(true);
|
@@ -136,7 +136,7 @@ class Core {
|
|
136
136
|
this.undoAnnotationStacks.push([annotCanvas, annotList]);
|
137
137
|
annotCanvas.replaceWith(annotstate[0]);
|
138
138
|
annotList.replaceWith(annotstate[1]);
|
139
|
-
this.
|
139
|
+
this.globalKeyboardHandler.resetListeners();
|
140
140
|
}
|
141
141
|
resolve(true);
|
142
142
|
return;
|
@@ -303,6 +303,7 @@ class Core {
|
|
303
303
|
d = new XMLSerializer().serializeToString(data);
|
304
304
|
u = false;
|
305
305
|
break;
|
306
|
+
case null:
|
306
307
|
case undefined:
|
307
308
|
d = new mei_template_1.default().emptyMEI();
|
308
309
|
u = false;
|
@@ -472,6 +473,7 @@ class Core {
|
|
472
473
|
this.labelHandler
|
473
474
|
.setContainerId(this.containerId)
|
474
475
|
.setCurrentMEI(this.currentMEIDoc)
|
476
|
+
.setm2s(this.m2s)
|
475
477
|
.reset();
|
476
478
|
this.insertModeHandler
|
477
479
|
.setContainerId(this.containerId)
|
@@ -480,7 +482,7 @@ class Core {
|
|
480
482
|
.setMusicProcessor(this.musicProcessor)
|
481
483
|
.setDeleteHandler(this.deleteHandler)
|
482
484
|
.setLabelHandler(this.labelHandler)
|
483
|
-
|
485
|
+
//.activateHarmonyMode()
|
484
486
|
//.activateSelectionMode()
|
485
487
|
.setInsertCallback(this.insert)
|
486
488
|
.setDeleteCallback(this.delete)
|
@@ -634,7 +636,6 @@ class Core {
|
|
634
636
|
(_a = document.getElementById(this.containerId).querySelector("#interactionOverlay #scoreRects")) === null || _a === void 0 ? void 0 : _a.remove();
|
635
637
|
var scoreRects = document.createElementNS(constants_1.constants._SVGNS_, "svg");
|
636
638
|
scoreRects.setAttribute("id", "scoreRects");
|
637
|
-
//scoreRects.setAttribute("viewBox", ["0", "0", rootWidth.toString(), rootHeigth.toString()].join(" "))
|
638
639
|
Array.from(refSVG.attributes).forEach(a => {
|
639
640
|
if (!["id", "width", "height"].includes(a.name)) {
|
640
641
|
this.interactionOverlay.setAttribute(a.name, a.value);
|
@@ -644,20 +645,28 @@ class Core {
|
|
644
645
|
refSVG.insertAdjacentElement("beforebegin", this.interactionOverlay);
|
645
646
|
if (loadBBoxes) {
|
646
647
|
var svgBoxes = Array.from(document.getElementById(this.containerId)
|
647
|
-
.querySelectorAll(".definition-scale :is(g,path)"))
|
648
|
+
.querySelectorAll(".definition-scale :is(g,path)"))
|
648
649
|
.filter(el => {
|
649
650
|
var condition = !["system", "measure", "layer", "ledgerLines", "flag"].some(cn => el.classList.contains(cn));
|
650
651
|
return condition;
|
651
652
|
});
|
652
653
|
var reorderedBoxes = new Array(); // reorder so that dependent elements are already in array
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
reorderedBoxes.unshift(sb);
|
659
|
-
}
|
654
|
+
var classOrder = ["harm", "slur", "tie", "tupleNum", "tupletBracket", "clef", "meterSig", "keySig", "notehead", "stem", "rest", "barLine", "staff"];
|
655
|
+
let filteredElements;
|
656
|
+
classOrder.forEach(c => {
|
657
|
+
filteredElements = svgBoxes.filter(e => e.classList.contains(c));
|
658
|
+
reorderedBoxes.push(...filteredElements);
|
660
659
|
});
|
660
|
+
filteredElements = svgBoxes.filter(e => e.classList.length === 0 || !classOrder.some(c => e.classList.contains(c)));
|
661
|
+
// {
|
662
|
+
// if(e.classList.length === 0){
|
663
|
+
// return e
|
664
|
+
// }
|
665
|
+
// if(!classOrder.some(c => e.classList.contains(c))){
|
666
|
+
// return e
|
667
|
+
// }
|
668
|
+
// })
|
669
|
+
reorderedBoxes.push(...filteredElements);
|
661
670
|
// staff always has to be on top of sibling elements, so that one can interact with score elements
|
662
671
|
reorderedBoxes = reorderedBoxes.reverse();
|
663
672
|
async function computeCoords(box, interactionOverlay) {
|
@@ -182,7 +182,7 @@ class VIBE {
|
|
182
182
|
});
|
183
183
|
}
|
184
184
|
this.tabbar
|
185
|
-
.
|
185
|
+
.setLoadDataCallback(this.coreInstance.loadDataHandler)
|
186
186
|
.setAlignCallback(this.coreInstance.alignFunctionHandler)
|
187
187
|
.setGetMEICallback(this.coreInstance.getMEI.bind(this.coreInstance));
|
188
188
|
//block everthing when firefox is not at least version 114.0
|
@@ -366,6 +366,7 @@ class Tabbar {
|
|
366
366
|
}
|
367
367
|
this.colorGroup.append(ReactWrapper.createColorPicker("colorPicker", handleColor.bind(this)));
|
368
368
|
this.fileSelectGroup = cq.getContainer(this.containerId).querySelector("#fileSelectGroup");
|
369
|
+
this.fileSelectGroup.append(dc.makeNewButton("Empty Score", "emptyScoreBtn", buttonStyleDarkOutline));
|
369
370
|
this.fileSelectGroup.append(dc.makeNewInput("importAudioFile", "file", ""));
|
370
371
|
this.fileSelectGroup.append(dc.makeNewButton("Import Audiofile", "importAudioFileBtn", buttonStyleDarkOutline));
|
371
372
|
this.fileSelectGroup.append(dc.makeNewInput("importXML", "file", ""));
|
@@ -516,10 +517,11 @@ class Tabbar {
|
|
516
517
|
cq.getContainer(this.containerId).querySelector("#importXML").addEventListener("input", function (e) {
|
517
518
|
var fr = new FileReader();
|
518
519
|
fr.onload = function () {
|
519
|
-
that.
|
520
|
+
that.loadDataCallback("", fr.result, false, constants_1.constants._TARGETDIVID_).then(mei => {
|
520
521
|
var meiXml = meioperations.mergeSectionScoreDefToLayer(mei);
|
521
|
-
meiXml = meioperations.
|
522
|
-
|
522
|
+
meiXml = meioperations.mergeNotechildrenToAttributes(meiXml);
|
523
|
+
meiXml = meioperations.adjustOrderNumbers(meiXml);
|
524
|
+
that.loadDataCallback("", meiXml, false, constants_1.constants._TARGETDIVID_);
|
523
525
|
that.align(null, null);
|
524
526
|
});
|
525
527
|
};
|
@@ -560,6 +562,9 @@ class Tabbar {
|
|
560
562
|
that.download(fileName, mei);
|
561
563
|
});
|
562
564
|
});
|
565
|
+
cq.getContainer(this.containerId).querySelector("#emptyScoreBtn").addEventListener("click", function () {
|
566
|
+
that.loadDataCallback("", null, false, constants_1.constants._TARGETDIVID_).then(() => cq.getContainer(that.containerId).querySelectorAll("#annotationCanvas > g").forEach(g => g.remove()));
|
567
|
+
});
|
563
568
|
}
|
564
569
|
/**
|
565
570
|
* Call the alignCallback with parameters. Only when the audioBlob and audioFile are defined, an alignment can take place.
|
@@ -673,8 +678,8 @@ class Tabbar {
|
|
673
678
|
* Callback from Core, so that imported mei or musicxml can be loaded in the editor
|
674
679
|
* @param importCallback
|
675
680
|
*/
|
676
|
-
|
677
|
-
this.
|
681
|
+
setLoadDataCallback(loadDataCallback) {
|
682
|
+
this.loadDataCallback = loadDataCallback;
|
678
683
|
return this;
|
679
684
|
}
|
680
685
|
setAlignCallback(alignCallback) {
|
@@ -27,6 +27,8 @@ class AnnotationChangeHandler {
|
|
27
27
|
this.dragAnnotEndEvent = new Event("dragAnnotEnd");
|
28
28
|
this.isInteracting = false;
|
29
29
|
this.factor = 100;
|
30
|
+
this.positionx = 0;
|
31
|
+
this.positiony = 0;
|
30
32
|
}
|
31
33
|
setListeners() {
|
32
34
|
//if(document.getElementById(this.containerId).querySelector(".sidebar.openSidebar") != null) return
|
@@ -74,7 +76,7 @@ class AnnotationChangeHandler {
|
|
74
76
|
that.interactTarget.dispatchEvent(that.annotResizedEvent);
|
75
77
|
that.isInteracting = false;
|
76
78
|
}
|
77
|
-
}
|
79
|
+
}
|
78
80
|
})
|
79
81
|
.draggable({
|
80
82
|
listeners: {
|
@@ -86,12 +88,12 @@ class AnnotationChangeHandler {
|
|
86
88
|
that.isInteracting = false;
|
87
89
|
}
|
88
90
|
},
|
89
|
-
modifiers: [
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
]
|
91
|
+
// modifiers: [
|
92
|
+
// interact.modifiers.restrictRect({
|
93
|
+
// restriction: 'parent',
|
94
|
+
// endOnly: true
|
95
|
+
// })
|
96
|
+
// ]
|
95
97
|
});
|
96
98
|
this.lineListener = interactjs_1.default("#" + this.containerId + " #interactionOverlay .lineDragRect.x1")
|
97
99
|
.draggable({
|
@@ -29,6 +29,8 @@ class DeleteHandler {
|
|
29
29
|
this.backSpaceHandler = (function backSpaceHandler(e) {
|
30
30
|
if (!cq.hasActiveElement(this.containerId))
|
31
31
|
return;
|
32
|
+
if (cq.getContainer(this.containerId).querySelector("[contenteditable=\"true\"]"))
|
33
|
+
return;
|
32
34
|
if (e.code !== "Backspace")
|
33
35
|
return;
|
34
36
|
var hasRests = false;
|
@@ -63,52 +63,65 @@ class InsertModeHandler {
|
|
63
63
|
.resetListeners();
|
64
64
|
this.deleteHandler.setListeners();
|
65
65
|
(_a = this.annotations) === null || _a === void 0 ? void 0 : _a.setm2s(this.m2s);
|
66
|
+
this.labelHandler.deactivateHarmonyHighlight();
|
66
67
|
//this.annotations?.updateCanvas()
|
67
68
|
//this.annotations?.resetTextListeners() // annotations should also be interactable when in notation mode
|
68
69
|
//this.activateSelectionMode()
|
69
70
|
}
|
70
71
|
activateAnnotationMode() {
|
71
|
-
var _a;
|
72
|
+
var _a, _b;
|
72
73
|
this.insertDeactivate();
|
73
74
|
var that = this;
|
74
75
|
this.keyMode = false;
|
75
76
|
this.clickInsertMode = false;
|
76
|
-
var
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
77
|
+
var selectedButtonId = (_a = this.container.querySelector("#annotGroupKM button.selected")) === null || _a === void 0 ? void 0 : _a.id;
|
78
|
+
setAnnotationState(selectedButtonId);
|
79
|
+
// the annotationgroup buttons are just created, when AnnnotationTabBtn is clicked
|
80
|
+
(_b = Array.from(this.container.querySelectorAll("#annotGroupKM button"))) === null || _b === void 0 ? void 0 : _b.forEach(b => {
|
81
|
+
b.addEventListener("click", setButtonId);
|
82
|
+
});
|
83
|
+
function setButtonId(e) {
|
84
|
+
selectedButtonId = e.target.id;
|
85
|
+
setAnnotationState(selectedButtonId);
|
86
|
+
}
|
87
|
+
function setAnnotationState(selectedButtonId) {
|
88
|
+
switch (selectedButtonId) {
|
89
|
+
case "harmonyAnnotButton":
|
90
|
+
that.harmonyMode = true;
|
91
|
+
that.annotationMode = false;
|
92
|
+
that.isGlobal = false;
|
93
|
+
that.activateHarmonyMode();
|
94
|
+
break;
|
95
|
+
case "staticTextButton":
|
96
|
+
case "linkedAnnotButton":
|
97
|
+
that.container.classList.remove("harmonyMode");
|
98
|
+
that.annotationMode = true;
|
99
|
+
that.harmonyMode = false;
|
100
|
+
if (that.annotations == undefined) {
|
101
|
+
that.annotations = new Annotations_1.default(that.containerId);
|
102
|
+
}
|
103
|
+
else {
|
104
|
+
that.annotations.updateCanvas();
|
105
|
+
}
|
106
|
+
that.annotations.setAnnotationCanvas(cq.getInteractOverlay(that.containerId).querySelector("#annotationCanvas"));
|
107
|
+
that.annotations.updateLinkedTexts();
|
108
|
+
break;
|
109
|
+
}
|
110
|
+
that.annotations
|
111
|
+
.setContainerId(that.containerId)
|
112
|
+
.setm2s(that.m2s)
|
113
|
+
.setMusicProcessor(that.musicPlayer)
|
114
|
+
//.setToFront()
|
115
|
+
.setListeners()
|
116
|
+
.setMenuClickHandler();
|
97
117
|
}
|
98
|
-
this.annotations
|
99
|
-
.setContainerId(this.containerId)
|
100
|
-
.setm2s(this.m2s)
|
101
|
-
.setMusicProcessor(this.musicPlayer)
|
102
|
-
//.setToFront()
|
103
|
-
.setListeners()
|
104
|
-
.setMenuClickHandler();
|
105
118
|
}
|
106
119
|
activateHarmonyMode() {
|
107
120
|
if (this.labelHandler == undefined) {
|
108
121
|
this.labelHandler = new LabelHandler_1.default(this.containerId);
|
109
122
|
}
|
110
123
|
//Activate/ Deactivate Global functions according to selected harmonymode
|
111
|
-
if (this.
|
124
|
+
if (!this.isGlobal) {
|
112
125
|
this.insertDeactivate();
|
113
126
|
this.container.classList.add("harmonyMode");
|
114
127
|
this.isGlobal = false;
|
@@ -183,7 +183,7 @@ class LabelHandler {
|
|
183
183
|
* Open Inputbox for (first) selected Note
|
184
184
|
*/
|
185
185
|
harmonyLabelHandler(e) {
|
186
|
-
var nextNote = this.vrvSVG.querySelector(".note.marked, .chord.marked");
|
186
|
+
var nextNote = this.vrvSVG.querySelector(".note.marked, .chord.marked, .rest.marked");
|
187
187
|
if (nextNote === null) {
|
188
188
|
return;
|
189
189
|
}
|
@@ -328,7 +328,7 @@ class LabelHandler {
|
|
328
328
|
if (refElementClass === "harm") { // change existing harm
|
329
329
|
let harmLabel = label;
|
330
330
|
harmLabel.modifyLabel(text);
|
331
|
-
|
331
|
+
this.currentMEI.getElementById(harmLabel.getElement().id).replaceWith(harmLabel.getElement());
|
332
332
|
}
|
333
333
|
else if (["note", "chord"].some(cn => refElementClass === cn)) { //create new harm
|
334
334
|
let harmLabel = this.setLabel(labelDiv.textContent, labelDiv.closest("g").getAttribute("refElementId"));
|
@@ -382,8 +382,8 @@ class LabelHandler {
|
|
382
382
|
text.setAttribute("y", (posy).toString());
|
383
383
|
textForeignObject.setAttribute("x", "0");
|
384
384
|
textForeignObject.setAttribute("y", "0");
|
385
|
-
textForeignObject.setAttribute("height", "1000")
|
386
|
-
textForeignObject.setAttribute("width", "1000")
|
385
|
+
// textForeignObject.setAttribute("height", "1000") //(textDiv.clientHeight + 2 * rectPadding).toString())
|
386
|
+
// textForeignObject.setAttribute("width", "1000")//(textDiv.clientHeight + 2 * rectPadding).toString())
|
387
387
|
this.labelCanvas.appendChild(textGroup);
|
388
388
|
textGroup.appendChild(text);
|
389
389
|
textForeignObject.appendChild(textDiv);
|
@@ -89,7 +89,13 @@ class PhantomElementHandler {
|
|
89
89
|
}
|
90
90
|
this.isTrackingMouse = true;
|
91
91
|
var target = e.target;
|
92
|
-
|
92
|
+
try {
|
93
|
+
target = target.closest("g");
|
94
|
+
}
|
95
|
+
catch (error) {
|
96
|
+
console.log(e, target);
|
97
|
+
return;
|
98
|
+
}
|
93
99
|
var options = {};
|
94
100
|
if (target === null || target === void 0 ? void 0 : target.classList.contains("staffLine")) {
|
95
101
|
options["staffLineId"] = target.id;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.setArticulation = exports.getTimestamp = exports.getElementTimestampById = exports.insertTempo = exports.insertMeter = exports.replaceMeterInScoreDef = exports.insertKey = exports.replaceKeyInScoreDef = exports.insertClef = exports.replaceClefinScoreDef = exports.paste = exports.createTuplet = exports.addLayerForStaff = exports.removeStaff = exports.addStaff = exports.removeMeasure = exports.addMeasure = exports.cleanUp = exports.elementIsOverfilling = exports.changeDur = exports.changeDurationsInLayer = exports.fillLayerWithRests = exports.fillWithRests = exports.disableFeatures = exports.changeMeter = exports.transposeByStep = exports.mergeArticToParent = exports.mergeSectionScoreDefToLayer = exports.adjustAccids = exports.extrapolateMeter = exports.getAbsoluteRatio = exports.connectNotes = exports.addToMEI = exports.getMeterRatioLocal = exports.removeFromMEI = void 0;
|
3
|
+
exports.setArticulation = exports.getTimestamp = exports.getElementTimestampById = exports.insertTempo = exports.insertMeter = exports.replaceMeterInScoreDef = exports.insertKey = exports.replaceKeyInScoreDef = exports.insertClef = exports.replaceClefinScoreDef = exports.paste = exports.createTuplet = exports.addLayerForStaff = exports.removeStaff = exports.addStaff = exports.removeMeasure = exports.addMeasure = exports.adjustOrderNumbers = exports.cleanUp = exports.elementIsOverfilling = exports.changeDur = exports.changeDurationsInLayer = exports.fillLayerWithRests = exports.fillWithRests = exports.disableFeatures = exports.changeMeter = exports.transposeByStep = exports.mergeNotechildrenToAttributes = exports.mergeArticToParent = exports.mergeSectionScoreDefToLayer = exports.adjustAccids = exports.extrapolateMeter = exports.getAbsoluteRatio = exports.connectNotes = exports.addToMEI = exports.getMeterRatioLocal = exports.removeFromMEI = void 0;
|
4
4
|
const meiConverter = require("./MEIConverter");
|
5
5
|
const random_1 = require("./random");
|
6
6
|
const constants_1 = require("../constants");
|
@@ -980,6 +980,14 @@ function mergeArticToParent(currentMEI) {
|
|
980
980
|
return currentMEI;
|
981
981
|
}
|
982
982
|
exports.mergeArticToParent = mergeArticToParent;
|
983
|
+
function mergeNotechildrenToAttributes(currentMEI) {
|
984
|
+
currentMEI.querySelectorAll("note > *").forEach(a => {
|
985
|
+
a.parentElement.setAttribute(a.tagName, a.getAttribute(a.tagName));
|
986
|
+
a.remove();
|
987
|
+
});
|
988
|
+
return currentMEI;
|
989
|
+
}
|
990
|
+
exports.mergeNotechildrenToAttributes = mergeNotechildrenToAttributes;
|
983
991
|
/**
|
984
992
|
* Transpose marked notes according to direcion (up or down)
|
985
993
|
* @param currentMEI
|
@@ -1137,65 +1145,6 @@ function fillLayerWithRests(layer, currentMEI) {
|
|
1137
1145
|
}
|
1138
1146
|
}
|
1139
1147
|
exports.fillLayerWithRests = fillLayerWithRests;
|
1140
|
-
/**
|
1141
|
-
* Fill Empty Space with rest
|
1142
|
-
* @deprecated
|
1143
|
-
* @param currentMEI
|
1144
|
-
*/
|
1145
|
-
function _fillWithRests(currentMEI) {
|
1146
|
-
var staffDef = currentMEI.getElementsByTagName("staffDef").item(0);
|
1147
|
-
var meterCount;
|
1148
|
-
var meterUnit;
|
1149
|
-
var meterRatio;
|
1150
|
-
if (staffDef.getAttribute(constants_1.constants._METERCOUNT_) !== null && staffDef.getAttribute(constants_1.constants._METERUNIT_) !== null) {
|
1151
|
-
meterCount = staffDef.getAttribute(constants_1.constants._METERCOUNT_);
|
1152
|
-
meterUnit = staffDef.getAttribute(constants_1.constants._METERUNIT_);
|
1153
|
-
meterRatio = parseInt(meterCount) / parseInt(meterUnit);
|
1154
|
-
}
|
1155
|
-
else {
|
1156
|
-
var meterRatio = getMeterRatioGlobal(currentMEI);
|
1157
|
-
meterCount = (meterRatio * 4).toString();
|
1158
|
-
meterUnit = "4";
|
1159
|
-
}
|
1160
|
-
currentMEI.querySelectorAll("measure").forEach(m => {
|
1161
|
-
m.querySelectorAll("staff").forEach(s => {
|
1162
|
-
s.querySelectorAll("layer").forEach((l, idx) => {
|
1163
|
-
//mRest for empty Layer
|
1164
|
-
if (l.childElementCount === 0) {
|
1165
|
-
if (idx === 0) {
|
1166
|
-
var restEl = document.createElementNS(constants_1.constants._MEINS_, "mRest");
|
1167
|
-
l.appendChild(restEl);
|
1168
|
-
}
|
1169
|
-
else { // remove 1+ empty layer
|
1170
|
-
l.remove();
|
1171
|
-
}
|
1172
|
-
}
|
1173
|
-
else {
|
1174
|
-
var actualMeterFill = getAbsoluteRatio(l);
|
1175
|
-
var ratioDiff = Math.abs(actualMeterFill - meterRatio);
|
1176
|
-
var smallestValue = gcd(ratioDiff);
|
1177
|
-
//var restDurs = findDotsRecursive(ratioDiff, gcd(ratioDiff))
|
1178
|
-
if (Number.isInteger(ratioDiff / smallestValue) && ratioDiff > 0) {
|
1179
|
-
var leftRatio = ratioDiff;
|
1180
|
-
var durArr = new Array();
|
1181
|
-
while (!Number.isInteger(1 / leftRatio)) {
|
1182
|
-
var leftRatio = ratioDiff - smallestValue;
|
1183
|
-
durArr.push(1 / smallestValue);
|
1184
|
-
}
|
1185
|
-
durArr.push(1 / leftRatio);
|
1186
|
-
durArr = durArr.reverse();
|
1187
|
-
durArr.forEach(dur => {
|
1188
|
-
var newRest = currentMEI.createElementNS(constants_1.constants._MEINS_, "rest");
|
1189
|
-
newRest.setAttribute("dur", dur.toString());
|
1190
|
-
l.appendChild(newRest);
|
1191
|
-
});
|
1192
|
-
}
|
1193
|
-
//console.log(document.getElementById(l.id), ratioDiff, gcd(ratioDiff), durArr)
|
1194
|
-
}
|
1195
|
-
});
|
1196
|
-
});
|
1197
|
-
});
|
1198
|
-
}
|
1199
1148
|
/**
|
1200
1149
|
* Replace given id with rest
|
1201
1150
|
* @param element element from svg
|
@@ -1519,6 +1468,27 @@ function adjustRests(currentMEI) {
|
|
1519
1468
|
}
|
1520
1469
|
});
|
1521
1470
|
}
|
1471
|
+
function adjustOrderNumbers(currentMEI) {
|
1472
|
+
function setN(nodeList) {
|
1473
|
+
var tagCounter = new Map();
|
1474
|
+
nodeList.forEach(n => {
|
1475
|
+
if (!tagCounter.has(n.tagName)) {
|
1476
|
+
tagCounter.set(n.tagName, 1);
|
1477
|
+
}
|
1478
|
+
n.setAttribute("n", tagCounter.get(n.tagName).toString());
|
1479
|
+
tagCounter.set(n.tagName, tagCounter.get(n.tagName) + 1);
|
1480
|
+
});
|
1481
|
+
}
|
1482
|
+
setN(currentMEI.querySelectorAll("measure"));
|
1483
|
+
currentMEI.querySelectorAll("measure").forEach(m => {
|
1484
|
+
setN(m.querySelectorAll("staff"));
|
1485
|
+
});
|
1486
|
+
currentMEI.querySelectorAll("staff").forEach(s => {
|
1487
|
+
setN(s.querySelectorAll("layer"));
|
1488
|
+
});
|
1489
|
+
return currentMEI;
|
1490
|
+
}
|
1491
|
+
exports.adjustOrderNumbers = adjustOrderNumbers;
|
1522
1492
|
/**
|
1523
1493
|
* Give harm new start id if related note was included in chord during process
|
1524
1494
|
* @param currentMEI
|
@@ -427,9 +427,24 @@ class SVGEditor {
|
|
427
427
|
}
|
428
428
|
setActiveLayer() {
|
429
429
|
var container = cq.getContainer(this.containerId);
|
430
|
-
|
431
|
-
|
432
|
-
|
430
|
+
var staffN = "0";
|
431
|
+
// find out if all staves have at least one active layer
|
432
|
+
container.querySelectorAll(".staff").forEach(s => {
|
433
|
+
var n = s.getAttribute("n");
|
434
|
+
if (parseInt(n) > parseInt(staffN))
|
435
|
+
staffN = n;
|
436
|
+
});
|
437
|
+
var i = 1;
|
438
|
+
do {
|
439
|
+
let activeLayer = container.querySelector(`.staff[n='${i}'] > .layer.activeLayer`);
|
440
|
+
if (!activeLayer) {
|
441
|
+
container.querySelectorAll(`.staff[n='${i}'] > .layer[n='1']`).forEach(l => l.classList.add("activeLayer"));
|
442
|
+
}
|
443
|
+
i += 1;
|
444
|
+
} while (i <= parseInt(staffN));
|
445
|
+
// if (!container.querySelector(".layer.activeLayer")) {
|
446
|
+
// container.querySelectorAll(".layer[n='1']").forEach(l => l.classList.add("activeLayer"))
|
447
|
+
// }
|
433
448
|
container.querySelectorAll(".activeLayer").forEach(al => {
|
434
449
|
var staffN = al.closest(".staff").getAttribute("n");
|
435
450
|
var layerN = al.getAttribute("n");
|
package/src/styles/vibe.css
CHANGED
@@ -471,7 +471,7 @@ text{
|
|
471
471
|
|
472
472
|
|
473
473
|
|
474
|
-
.annotLinkedText .
|
474
|
+
.annotLinkedText .annotDiv{
|
475
475
|
/*background-color: rgba(255, 255, 153, 0.8);*/
|
476
476
|
background-color: rgba(0, 0, 0, 0.1);
|
477
477
|
border-radius: 0px 10px 10px 10px;
|
@@ -618,17 +618,20 @@ g.currentlyPlaying *{
|
|
618
618
|
.labelDiv{
|
619
619
|
border: 2px solid black;
|
620
620
|
border-radius: 10px;
|
621
|
-
height: fit-content;
|
621
|
+
/* height: fit-content;
|
622
622
|
width: fit-content;
|
623
|
-
min-width: 50px;
|
623
|
+
min-width: 50px; */
|
624
624
|
background-color: beige;
|
625
|
-
font-size: 40px;
|
626
|
-
font-family: 'Times New Roman', Times, serif;
|
625
|
+
/* font-size: 40px;
|
626
|
+
font-family: 'Times New Roman', Times, serif; */
|
627
627
|
}
|
628
628
|
|
629
|
-
.
|
629
|
+
.labelFO{
|
630
|
+
font-size: 16pt;
|
631
|
+
font-family: 'Times New Roman', Times, serif;
|
632
|
+
text-align: center;
|
633
|
+
width: 10%;
|
630
634
|
height: 100%;
|
631
|
-
width: 100%;
|
632
635
|
}
|
633
636
|
|
634
637
|
/* KEYMODE */
|