vibe-editor 0.0.4 → 0.0.5
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 +65 -61
- package/src/scripts/js/Core.js +28 -9
- package/src/scripts/js/entry.js +6 -5
- package/src/scripts/js/gui/Annotations.js +27 -12
- package/src/scripts/js/gui/ScoreManipulator.js +6 -4
- package/src/scripts/js/gui/Tabbar.js +13 -4
- package/src/scripts/js/handlers/AnnotationChangeHandler.js +13 -1
- package/src/scripts/js/handlers/InsertModeHandler.js +3 -3
- package/src/scripts/js/handlers/PhantomElementHandler.js +3 -10
- package/src/scripts/js/handlers/WindowHandler.js +7 -7
- package/src/scripts/js/scripts/Core.js +932 -0
- package/src/scripts/js/scripts/MusicProcessor.js +810 -0
- package/src/scripts/js/scripts/VIBE.js +219 -0
- package/src/scripts/js/scripts/datastructures/MeasureMatrix.js +156 -0
- package/src/scripts/js/scripts/gui/Annotations.js +549 -0
- package/src/scripts/js/scripts/gui/Cursor.js +203 -0
- package/src/scripts/js/scripts/gui/PhantomElement.js +132 -0
- package/src/scripts/js/scripts/gui/ScoreManipulator.js +188 -0
- package/src/scripts/js/scripts/gui/Tabbar.js +705 -0
- package/src/scripts/js/{gui/Toolbar copy.js → scripts/gui/Toolbar.js} +15 -11
- package/src/scripts/js/scripts/handlers/AnnotationChangeHandler.js +650 -0
- package/src/scripts/js/scripts/handlers/ClickModeHandler.js +535 -0
- package/src/scripts/js/{gui → scripts/handlers}/CustomAnnotationShapeDrawer.js +34 -17
- package/src/scripts/js/{handlers/ModHandler.js → scripts/handlers/CustomToolbarHandler.js} +54 -66
- package/src/scripts/js/scripts/handlers/GlobalKeyboardHandler.js +372 -0
- package/src/scripts/js/scripts/handlers/Handler.js +2 -0
- package/src/scripts/js/{handlers/InsertModeHandler_deprecated.js → scripts/handlers/InsertModeHandler.js} +117 -164
- package/src/scripts/js/scripts/handlers/KeyModeHandler.js +405 -0
- package/src/scripts/js/scripts/handlers/LabelHandler.js +463 -0
- package/src/scripts/js/scripts/handlers/NoteDragHandler.js +97 -0
- package/src/scripts/js/scripts/handlers/PhantomElementHandler.js +168 -0
- package/src/scripts/js/scripts/handlers/ScoreManipulatorHandler.js +233 -0
- package/src/scripts/js/scripts/handlers/SidebarHandler.js +506 -0
- package/src/scripts/js/scripts/handlers/TooltipHandler.js +132 -0
- package/src/scripts/js/scripts/handlers/WindowHandler.js +278 -0
- package/src/scripts/js/scripts/utils/MEIOperations.js +2121 -0
- package/src/scripts/js/{utils/Mouse2MEI.js → scripts/utils/Mouse2SVG.js} +225 -57
- package/src/scripts/js/scripts/utils/SVGEditor.js +453 -0
- package/src/scripts/js/scripts/utils/Types.js +2 -0
- package/src/scripts/js/{utils/VerovioWrapper copy.js → scripts/utils/VerovioWrapper.js} +35 -21
- package/src/scripts/js/scripts/utils/coordinates.js +54 -0
- package/src/scripts/js/utils/Mouse2SVG.js +11 -4
- package/src/scripts/js/utils/VerovioWrapper.js +4 -4
- package/src/scripts/js/utils/coordinates.js +26 -2
- package/src/scripts/js/.DS_Store +0 -0
- package/src/scripts/js/MusicPlayer.js +0 -572
- package/src/scripts/js/datastructures/ScoreGraph copy.js +0 -432
- package/src/scripts/js/gui/CustomAnnotationDrawer.js +0 -114
- package/src/scripts/js/handlers/AnnotationDragHandler.js +0 -113
- package/src/scripts/js/handlers/AnnotationLineHandler.js +0 -113
- package/src/scripts/js/handlers/ArticulationHandler.js +0 -20
- package/src/scripts/js/handlers/HarmonyHandler.js +0 -282
- package/src/scripts/js/handlers/InsertModeHandler copy.js +0 -423
- package/src/scripts/js/handlers/KeyModeHandler copy.js +0 -407
- package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +0 -411
- package/src/scripts/js/handlers/NoteDragHandler copy.js +0 -148
- package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +0 -150
- package/src/scripts/js/handlers/SelectionHandler.js +0 -262
- package/src/scripts/js/utils/RectWrapper.js +0 -10
- package/src/scripts/js/utils/SVGFiller.js +0 -245
- package/src/scripts/js/utils/VerovioWrapperLocal.js +0 -156
- package/src/scripts/js/utils/firefoxBBoxes.js +0 -143
- package/src/styles/vibe.css +0 -785
- /package/src/scripts/js/{assets → scripts/assets}/mei_template.js +0 -0
- /package/src/scripts/js/{constants.js → scripts/constants.js} +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph.js +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph_deprecated.js +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreNode.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/HarmonyLabel.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/Label.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/TempoLabel.js +0 -0
- /package/src/scripts/js/{handlers → scripts/handlers}/DeleteHandler.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/DOMCreator.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/MEIConverter.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/ReactWrapper.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/convenienceQueries.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/mappings.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/random.js +0 -0
@@ -0,0 +1,405 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const mappings_1 = require("../utils/mappings");
|
4
|
+
const random_1 = require("../utils/random");
|
5
|
+
const cq = require("../utils/convenienceQueries");
|
6
|
+
const meiOperation = require("../utils/MEIOperations");
|
7
|
+
const marked = "marked";
|
8
|
+
class KeyModeHandler {
|
9
|
+
constructor(containerId) {
|
10
|
+
/**
|
11
|
+
* Event handler for inserting Notes
|
12
|
+
*/
|
13
|
+
this.noteInputHandler = (function noteInputHandler(e) {
|
14
|
+
this.noteInput(e);
|
15
|
+
}).bind(this);
|
16
|
+
this.midiHandler = (function midiHandler(e) {
|
17
|
+
e.preventDefault();
|
18
|
+
this.midiInput(e.detail);
|
19
|
+
}).bind(this);
|
20
|
+
this.pressedHandler = (function pressedHandler(e) {
|
21
|
+
this.assignKeys(e);
|
22
|
+
}).bind(this);
|
23
|
+
/**
|
24
|
+
* Event Handler for any Keyboard input (except inserting)
|
25
|
+
*/
|
26
|
+
this.keyInputHandler = (function keyInputHandler(e) {
|
27
|
+
if (!cq.hasActiveElement(this.containerId))
|
28
|
+
return;
|
29
|
+
if (e.ctrlKey || e.metaKey)
|
30
|
+
return; //prevent confusion with global keyboard functionalities
|
31
|
+
if (this.interactionOverlay.querySelector("div[contenteditable=true]") !== null)
|
32
|
+
return; // prevent navigating in scrore, when label editor is open
|
33
|
+
if (this.scoreGraph.getCurrentNode() == undefined)
|
34
|
+
return;
|
35
|
+
if (e.shiftKey && e.key.includes("Arrow")) {
|
36
|
+
e.preventDefault();
|
37
|
+
this.navigateSelection(e.key);
|
38
|
+
}
|
39
|
+
else if (e.key.includes("Arrow")) {
|
40
|
+
e.preventDefault();
|
41
|
+
this.endSelection();
|
42
|
+
this.navigateCursor(e.key);
|
43
|
+
}
|
44
|
+
else if (["Delete", "Backspace"].indexOf(e.key) > -1) {
|
45
|
+
e.preventDefault();
|
46
|
+
//this.deleteByKey(e.key)
|
47
|
+
}
|
48
|
+
}).bind(this);
|
49
|
+
/**
|
50
|
+
* Set Cursor to new position after pasting
|
51
|
+
*/
|
52
|
+
this.pastedHandler = (function pastedHandler(e) {
|
53
|
+
console.log("PASTED ", e);
|
54
|
+
this.scoreGraph.setCurrentNodeById(e.detail);
|
55
|
+
//this.cursor.definePosById(this.scoreGraph.getCurrentNode()?.getId())
|
56
|
+
}).bind(this);
|
57
|
+
this.setContainerId(containerId);
|
58
|
+
}
|
59
|
+
setListeners() {
|
60
|
+
document.addEventListener("keydown", this.pressedHandler);
|
61
|
+
document.addEventListener("keyup", this.pressedHandler);
|
62
|
+
document.addEventListener('keydown', this.noteInputHandler);
|
63
|
+
document.addEventListener('keydown', this.keyInputHandler);
|
64
|
+
document.addEventListener("pasted", this.pastedHandler);
|
65
|
+
document.addEventListener("midiin", this.midiHandler);
|
66
|
+
}
|
67
|
+
removeListeners() {
|
68
|
+
document.removeEventListener("keydown", this.pressedHandler);
|
69
|
+
document.removeEventListener("keyup", this.pressedHandler);
|
70
|
+
document.removeEventListener('keydown', this.noteInputHandler);
|
71
|
+
document.removeEventListener('keydown', this.keyInputHandler);
|
72
|
+
document.removeEventListener("pasted", this.pastedHandler);
|
73
|
+
document.removeEventListener("midiin", this.midiHandler);
|
74
|
+
}
|
75
|
+
resetListeners() {
|
76
|
+
this.removeListeners();
|
77
|
+
this.setListeners();
|
78
|
+
}
|
79
|
+
noteInput(e) {
|
80
|
+
var _a;
|
81
|
+
if (e.shiftKey || e.metaKey)
|
82
|
+
return;
|
83
|
+
if (this.container.querySelector("[contenteditable=true]"))
|
84
|
+
return;
|
85
|
+
var currentNode = this.scoreGraph.getCurrentNode();
|
86
|
+
if (document.getElementById(currentNode.getId()) === null)
|
87
|
+
return;
|
88
|
+
if (!cq.hasActiveElement(this.containerId))
|
89
|
+
return;
|
90
|
+
if (this.musicPlayer.getIsPlaying() === true) {
|
91
|
+
return;
|
92
|
+
} // getIsPlaying could also be undefined
|
93
|
+
if (mappings_1.keyCodeNoteMap.has(e.code)) {
|
94
|
+
e.preventDefault();
|
95
|
+
var pname = mappings_1.keyCodeNoteMap.get(e.code);
|
96
|
+
var oct = mappings_1.octToNum.get((_a = this.container.querySelector("#octaveGroupKM .selected")) === null || _a === void 0 ? void 0 : _a.id) || "4";
|
97
|
+
const newNote = this.createNewNote(pname, oct, null);
|
98
|
+
if (!newNote)
|
99
|
+
return;
|
100
|
+
this.processNewNote(newNote);
|
101
|
+
}
|
102
|
+
}
|
103
|
+
processNewNote(newNote) {
|
104
|
+
var _a, _b, _c, _d, _e, _f;
|
105
|
+
var currentNode = this.scoreGraph.getCurrentNode();
|
106
|
+
var noteExists = false;
|
107
|
+
var noteToDelete;
|
108
|
+
if (document.getElementById(currentNode.getId()).closest(".chord") !== null) {
|
109
|
+
var chordNotes = Array.from(document.getElementById(currentNode.getId()).closest(".chord").querySelectorAll(".note"));
|
110
|
+
chordNotes.forEach((n) => {
|
111
|
+
var meiNote = this.m2s.getCurrentMei().getElementById(n.id);
|
112
|
+
var sameOct = meiNote.getAttribute("oct") === newNote.oct;
|
113
|
+
var samePname = meiNote.getAttribute("pname") === newNote.pname;
|
114
|
+
if (sameOct && samePname) {
|
115
|
+
noteExists = true;
|
116
|
+
noteToDelete = n;
|
117
|
+
}
|
118
|
+
});
|
119
|
+
}
|
120
|
+
if (!noteExists) {
|
121
|
+
var currentStaff = this.m2s.getCurrentMei().getElementById(newNote.staffId);
|
122
|
+
// check if new note should replace a rest
|
123
|
+
if (this.scoreGraph.getCurrentNode().getDocElement().classList.contains("rest")) {
|
124
|
+
newNote.relPosX = "left";
|
125
|
+
newNote.nearestNoteId = this.scoreGraph.getCurrentNode().getId();
|
126
|
+
}
|
127
|
+
else if (!((_a = this.scoreGraph.getCurrentNode()) === null || _a === void 0 ? void 0 : _a.getDocElement().classList.contains("mRest")) && this.scoreGraph.lookUp(["note", "rest", "mRest"], "right") == null && newNote.chordElement == undefined) {
|
128
|
+
//check if new Measure must be created
|
129
|
+
meiOperation.addMeasure(this.m2s.getCurrentMei());
|
130
|
+
var staffN = currentStaff.getAttribute("n");
|
131
|
+
var layerN = this.m2s.getCurrentMei().getElementById(newNote.layerId).getAttribute("n");
|
132
|
+
newNote.staffId = currentStaff.closest("measure").nextElementSibling.querySelector(`staff[n='${staffN}']`).id;
|
133
|
+
newNote.layerId = currentStaff.closest("measure").nextElementSibling.querySelector(`staff[n='${staffN}'] layer[n='${layerN}']`).id;
|
134
|
+
newNote.relPosX = "left";
|
135
|
+
newNote.nearestNoteId = this.m2s.getCurrentMei().querySelector("#" + newNote.staffId).querySelector(`layer[n='${layerN}'] > mRest`).id;
|
136
|
+
}
|
137
|
+
else {
|
138
|
+
//or if ne note must be rendered into the next bar
|
139
|
+
var oldStaffId = newNote.staffId;
|
140
|
+
if (this.m2s.getCurrentMei().querySelector("#" + newNote.nearestNoteId) === null)
|
141
|
+
return;
|
142
|
+
if (this.m2s.getCurrentMei().querySelector("#" + newNote.nearestNoteId).tagName !== "mRest") {
|
143
|
+
// newNote.staffId = this.m2s.getCurrentMei().getElementById(this.scoreGraph.getNextClass(["note", "rest", "mRest"], "right")?.getId())?.closest("staff").id || newNote.staffId
|
144
|
+
// newNote.layerId = this.m2s.getCurrentMei().getElementById(this.scoreGraph.getNextClass(["note", "rest", "mRest"], "right")?.getId())?.closest("layer").id || newNote.layerId
|
145
|
+
newNote.staffId = ((_c = this.m2s.getCurrentMei().getElementById((_b = this.scoreGraph.lookUp(["note", "rest", "mRest"], "right")) === null || _b === void 0 ? void 0 : _b.getId())) === null || _c === void 0 ? void 0 : _c.closest("staff").id) || newNote.staffId;
|
146
|
+
newNote.layerId = ((_e = this.m2s.getCurrentMei().getElementById((_d = this.scoreGraph.lookUp(["note", "rest", "mRest"], "right")) === null || _d === void 0 ? void 0 : _d.getId())) === null || _e === void 0 ? void 0 : _e.closest("layer").id) || newNote.layerId;
|
147
|
+
}
|
148
|
+
if (oldStaffId !== newNote.staffId) {
|
149
|
+
newNote.relPosX = "left";
|
150
|
+
newNote.nearestNoteId = (_f = this.scoreGraph.getNextClass(["note", "rest", "mRest"], "right")) === null || _f === void 0 ? void 0 : _f.getId(); //this.scoreGraph.getCurrentNode()?.getId()
|
151
|
+
}
|
152
|
+
}
|
153
|
+
this.insertCallback(newNote, true).then(() => {
|
154
|
+
//this.m2s.update();
|
155
|
+
this.resetListeners();
|
156
|
+
var currentTargetId;
|
157
|
+
if (newNote.chordElement != undefined) {
|
158
|
+
currentTargetId = this.vrvSVG.querySelector("#" + newNote.chordElement.id).closest(".chord").id; // new chord with own ID is created, if note is added
|
159
|
+
}
|
160
|
+
else {
|
161
|
+
currentTargetId = newNote.id;
|
162
|
+
}
|
163
|
+
this.scoreGraph.setCurrentNodeById(currentTargetId);
|
164
|
+
this.musicPlayer.generateTone(newNote);
|
165
|
+
}).catch(() => {
|
166
|
+
//alert("your bar is too small")
|
167
|
+
});
|
168
|
+
}
|
169
|
+
else {
|
170
|
+
this.deleteCallback([noteToDelete]).then(() => {
|
171
|
+
var _a;
|
172
|
+
//this.m2s.update();
|
173
|
+
this.resetListeners();
|
174
|
+
this.scoreGraph.setCurrentNodeById((_a = newNote.chordElement) === null || _a === void 0 ? void 0 : _a.id);
|
175
|
+
});
|
176
|
+
}
|
177
|
+
}
|
178
|
+
midiInput(midiArray) {
|
179
|
+
var [_, midiNum, velocity] = midiArray;
|
180
|
+
var noteName = mappings_1.midiToNote.get(midiNum);
|
181
|
+
if (noteName == undefined)
|
182
|
+
return;
|
183
|
+
if (velocity === 0)
|
184
|
+
return;
|
185
|
+
var pname = noteName.slice(0, 1);
|
186
|
+
var accid = noteName.length === 3 ? noteName.slice(1, 2) : undefined;
|
187
|
+
var oct = noteName.match(/\d/g)[0].toString();
|
188
|
+
var newNote = this.createNewNote(pname, oct, { accid: accid });
|
189
|
+
if (newNote == undefined)
|
190
|
+
return;
|
191
|
+
this.processNewNote(newNote);
|
192
|
+
}
|
193
|
+
assignKeys(e) {
|
194
|
+
var b = false;
|
195
|
+
if (e.type === "keydown") {
|
196
|
+
b = true;
|
197
|
+
}
|
198
|
+
else if (e.type === "keyup") {
|
199
|
+
b = false;
|
200
|
+
}
|
201
|
+
switch (e.key) {
|
202
|
+
case "Shift":
|
203
|
+
this.shiftDown = b;
|
204
|
+
break;
|
205
|
+
}
|
206
|
+
}
|
207
|
+
/**
|
208
|
+
* create a newNote
|
209
|
+
* @param pname pitch name
|
210
|
+
* @param oct octave
|
211
|
+
* @param options
|
212
|
+
* @returns
|
213
|
+
*/
|
214
|
+
createNewNote(pname, oct, options) {
|
215
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
216
|
+
//get relevant staffinfo
|
217
|
+
// var nearestNodeId = this.scoreGraph.getCurrentNode()?.getId()
|
218
|
+
// if (nearestNodeId == undefined) return
|
219
|
+
if (!this.scoreGraph.getCurrentNode())
|
220
|
+
return;
|
221
|
+
function getLastActiveNode(cid, sg) {
|
222
|
+
var activeNotes = Array.from(cq.getContainer(cid).querySelectorAll(".activeLayer > .note")).reverse();
|
223
|
+
var hasNotes = activeNotes.length > 0;
|
224
|
+
var lastNode = cq.getContainer(cid).querySelector(".activeLayer > :is(.lastAdded, .rest, .mRest");
|
225
|
+
if (hasNotes) {
|
226
|
+
lastNode = activeNotes[0];
|
227
|
+
}
|
228
|
+
sg.setCurrentNodeById(lastNode.id);
|
229
|
+
return lastNode.id;
|
230
|
+
}
|
231
|
+
var nearestNodeId = this.scoreGraph.getCurrentNode().getDocElement().closest(".activeLayer") ? this.scoreGraph.getCurrentNode().getId() : getLastActiveNode(this.containerId, this.scoreGraph);
|
232
|
+
var closestStaff = ((_a = this.m2s.getCurrentMei().getElementById(nearestNodeId)) === null || _a === void 0 ? void 0 : _a.closest("staff")) || this.m2s.getCurrentMei().querySelector("measure > staff"); //asume first measure first staff
|
233
|
+
var closestMeasure = closestStaff.closest("measure");
|
234
|
+
var closestStaffIdx = parseInt(closestStaff.getAttribute("n")) - 1;
|
235
|
+
var closestMeasureIdx = parseInt(closestMeasure.getAttribute("n")) - 1;
|
236
|
+
var keysig = this.m2s.getMeasureMatrix().get(closestMeasureIdx, closestStaffIdx).keysig;
|
237
|
+
var accids = mappings_1.keysigToNotes.get(keysig);
|
238
|
+
var accid;
|
239
|
+
var artic;
|
240
|
+
if (!options) {
|
241
|
+
accid = mappings_1.accidButtonToAttr.get((_b = cq.getContainer(this.containerId).querySelector("#accidGroup > button.selected")) === null || _b === void 0 ? void 0 : _b.id); // try first to create a new accid based on the tabbar state
|
242
|
+
artic = mappings_1.articButtonToAttr.get((_c = cq.getContainer(this.containerId).querySelector("#articGroup > button.selected")) === null || _c === void 0 ? void 0 : _c.id);
|
243
|
+
if (!accid) {
|
244
|
+
accids = accids.filter((s) => { return s === pname; });
|
245
|
+
if (accids.length === 1) {
|
246
|
+
accid = keysig.charAt(1);
|
247
|
+
}
|
248
|
+
}
|
249
|
+
}
|
250
|
+
if (options === null || options === void 0 ? void 0 : options.accid) {
|
251
|
+
accid = options.accid;
|
252
|
+
//should the note be enharmonically swapped?
|
253
|
+
//midi inputs are only given as sharps
|
254
|
+
var increment = pname === "g" ? -6 : 1; //- 6 is for jumping back to a; oct stays the same
|
255
|
+
if (keysig.includes("f") && accids.includes(String.fromCharCode(pname.charCodeAt(0) + increment))) {
|
256
|
+
accid = "f";
|
257
|
+
pname = String.fromCharCode(pname.charCodeAt(0) + increment);
|
258
|
+
}
|
259
|
+
}
|
260
|
+
if (options === null || options === void 0 ? void 0 : options.artic) {
|
261
|
+
artic = options.artic; // TODO: Which format will be set?
|
262
|
+
}
|
263
|
+
var targetChord;
|
264
|
+
//if(this.container.querySelector("#chordButton")?.classList.contains("selected")){
|
265
|
+
if (this.shiftDown) {
|
266
|
+
targetChord = this.vrvSVG.querySelector("#" + nearestNodeId);
|
267
|
+
if ((targetChord === null || targetChord === void 0 ? void 0 : targetChord.closest(".chord")) !== null) {
|
268
|
+
targetChord = targetChord.closest(".chord");
|
269
|
+
}
|
270
|
+
}
|
271
|
+
this.setContainerId(this.containerId);
|
272
|
+
var newNote = {
|
273
|
+
pname: pname,
|
274
|
+
id: random_1.uuidv4(),
|
275
|
+
dur: this.m2s.getDurationNewNote(),
|
276
|
+
dots: this.m2s.getDotsNewNote(),
|
277
|
+
oct: oct,
|
278
|
+
keysig: keysig,
|
279
|
+
accid: accid,
|
280
|
+
artic: artic,
|
281
|
+
nearestNoteId: nearestNodeId,
|
282
|
+
relPosX: "right",
|
283
|
+
staffId: (_d = this.vrvSVG.querySelector("#" + nearestNodeId)) === null || _d === void 0 ? void 0 : _d.closest(".staff").id,
|
284
|
+
layerId: (_f = this.container.querySelector(`#${(_e = this.vrvSVG.querySelector("#" + nearestNodeId)) === null || _e === void 0 ? void 0 : _e.closest(".staff").id} .activeLayer`)) === null || _f === void 0 ? void 0 : _f.id,
|
285
|
+
chordElement: targetChord,
|
286
|
+
rest: (_g = this.container.querySelector("#pauseNote")) === null || _g === void 0 ? void 0 : _g.classList.contains("selected")
|
287
|
+
};
|
288
|
+
return newNote;
|
289
|
+
}
|
290
|
+
/**
|
291
|
+
* Navigate through Scoregraph with Arrow Keys
|
292
|
+
* @param direction Key Code for Arrows
|
293
|
+
*/
|
294
|
+
navigateCursor(direction) {
|
295
|
+
var _a, _b, _c;
|
296
|
+
var prevNode = this.scoreGraph.getCurrentNode();
|
297
|
+
switch (direction) {
|
298
|
+
case "ArrowLeft":
|
299
|
+
(_a = document.querySelectorAll(".lastAdded")) === null || _a === void 0 ? void 0 : _a.forEach(la => la.classList.remove("lastAdded"));
|
300
|
+
this.scoreGraph.nextLeft();
|
301
|
+
break;
|
302
|
+
case "ArrowRight":
|
303
|
+
(_b = document.querySelectorAll(".lastAdded")) === null || _b === void 0 ? void 0 : _b.forEach(la => la.classList.remove("lastAdded"));
|
304
|
+
this.scoreGraph.nextRight();
|
305
|
+
break;
|
306
|
+
default:
|
307
|
+
return;
|
308
|
+
}
|
309
|
+
if (this.scoreGraph.getCurrentNode() == undefined)
|
310
|
+
return;
|
311
|
+
this.container.querySelectorAll(".marked").forEach(m => m.classList.remove("marked"));
|
312
|
+
(_c = this.container.querySelector("#" + prevNode.getId())) === null || _c === void 0 ? void 0 : _c.classList.remove("lastAdded");
|
313
|
+
var currEl = this.container.querySelector("#" + this.scoreGraph.getCurrentNode().getId());
|
314
|
+
currEl.classList.add("marked");
|
315
|
+
if (currEl.closest(".chord") !== null) {
|
316
|
+
currEl.querySelectorAll(".note, .notehead").forEach(n => n.classList.add("marked"));
|
317
|
+
}
|
318
|
+
}
|
319
|
+
/**
|
320
|
+
* End selection in Keyboardmode
|
321
|
+
*/
|
322
|
+
endSelection() {
|
323
|
+
this.startSelect = undefined;
|
324
|
+
if (this.selectRect !== null && typeof this.selectRect !== "undefined") {
|
325
|
+
this.selectRect.remove();
|
326
|
+
this.vrvSVG.querySelectorAll(".marked").forEach(m => {
|
327
|
+
m.classList.remove("marked");
|
328
|
+
});
|
329
|
+
}
|
330
|
+
this.selectRect = undefined;
|
331
|
+
}
|
332
|
+
/**
|
333
|
+
*
|
334
|
+
* @param elementId Id of the current Element to be set in the ScoreGrap
|
335
|
+
*/
|
336
|
+
setCurrentNodeScoreGraph(elementId = null) {
|
337
|
+
this.scoreGraph.setCurrentNodeById(elementId);
|
338
|
+
return this;
|
339
|
+
}
|
340
|
+
/**
|
341
|
+
* Delete next element depending on Keyboad input (Backspace: left, Delete: right)
|
342
|
+
* @param key "Backspace" or "Delete"
|
343
|
+
*/
|
344
|
+
deleteByKey(key) {
|
345
|
+
var _a, _b;
|
346
|
+
var elementToDelete;
|
347
|
+
var currNodeId;
|
348
|
+
var isFocusedChord = ((_a = this.container.querySelector("#chordButton")) === null || _a === void 0 ? void 0 : _a.classList.contains("selected")) ? true : false;
|
349
|
+
if (isFocusedChord) {
|
350
|
+
key = "Backspace";
|
351
|
+
}
|
352
|
+
switch (key) {
|
353
|
+
case "Delete":
|
354
|
+
//elementToDelete = this.vrvSVG.querySelector("#" + this.scoreGraph.getCurrentNode().getRight().getId())
|
355
|
+
//break;
|
356
|
+
case "Backspace":
|
357
|
+
elementToDelete = this.vrvSVG.querySelector("#" + this.scoreGraph.getCurrentNode().getId());
|
358
|
+
if (this.scoreGraph.getCurrentNode().isLayer()) {
|
359
|
+
elementToDelete = this.vrvSVG.querySelector("#" + this.scoreGraph.getCurrentNode().getLeft().getId());
|
360
|
+
this.navigateCursor("ArrowLeft");
|
361
|
+
}
|
362
|
+
if (!((_b = this.scoreGraph.getCurrentNode().getLeft()) === null || _b === void 0 ? void 0 : _b.isBOL())) {
|
363
|
+
this.navigateCursor("ArrowLeft");
|
364
|
+
}
|
365
|
+
else {
|
366
|
+
this.navigateCursor("ArrowRight");
|
367
|
+
}
|
368
|
+
break;
|
369
|
+
}
|
370
|
+
currNodeId = this.scoreGraph.getCurrentNode().getId();
|
371
|
+
}
|
372
|
+
///// GETTER / SETTER////////////////
|
373
|
+
setm2s(m2s) {
|
374
|
+
this.m2s = m2s;
|
375
|
+
return this;
|
376
|
+
}
|
377
|
+
setMusicProcessor(musicPlayer) {
|
378
|
+
this.musicPlayer = musicPlayer;
|
379
|
+
return this;
|
380
|
+
}
|
381
|
+
setScoreGraph(scoreGraph) {
|
382
|
+
this.scoreGraph = scoreGraph;
|
383
|
+
return this;
|
384
|
+
}
|
385
|
+
setCurrentMEI(mei) {
|
386
|
+
this.currentMEI = mei;
|
387
|
+
return this;
|
388
|
+
}
|
389
|
+
setContainerId(id) {
|
390
|
+
this.containerId = id;
|
391
|
+
this.vrvSVG = cq.getVrvSVG(id);
|
392
|
+
this.interactionOverlay = cq.getInteractOverlay(id);
|
393
|
+
this.container = document.getElementById(id);
|
394
|
+
return this;
|
395
|
+
}
|
396
|
+
setInsertCallback(insertCallback) {
|
397
|
+
this.insertCallback = insertCallback;
|
398
|
+
return this;
|
399
|
+
}
|
400
|
+
setDeleteCallback(deleteCallback) {
|
401
|
+
this.deleteCallback = deleteCallback;
|
402
|
+
return this;
|
403
|
+
}
|
404
|
+
}
|
405
|
+
exports.default = KeyModeHandler;
|