vibe-editor 0.0.0 → 0.0.1-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +12 -9
  3. package/package.json +11 -5
  4. package/src/scripts/js/Core.js +212 -186
  5. package/src/scripts/js/MusicProcessor.js +286 -128
  6. package/src/scripts/js/{VerovioScoreEditor.js → VIBE.js} +62 -28
  7. package/src/scripts/js/assets/mei_template.js +5 -1
  8. package/src/scripts/js/datastructures/MeasureMatrix.js +6 -85
  9. package/src/scripts/js/datastructures/ScoreGraph.js +1 -1
  10. package/src/scripts/js/entry.js +3 -2
  11. package/src/scripts/js/gui/Annotations.js +188 -111
  12. package/src/scripts/js/gui/HarmonyLabel.js +26 -2
  13. package/src/scripts/js/gui/ScoreManipulator.js +61 -31
  14. package/src/scripts/js/gui/Tabbar.js +41 -21
  15. package/src/scripts/js/gui/Toolbar.js +4 -4
  16. package/src/scripts/js/handlers/AnnotationChangeHandler.js +131 -60
  17. package/src/scripts/js/handlers/ClickModeHandler.js +406 -143
  18. package/src/scripts/js/handlers/CustomToolbarHandler.js +26 -24
  19. package/src/scripts/js/handlers/GlobalKeyboardHandler.js +12 -7
  20. package/src/scripts/js/handlers/InsertModeHandler.js +26 -32
  21. package/src/scripts/js/handlers/KeyModeHandler.js +12 -86
  22. package/src/scripts/js/handlers/LabelHandler.js +3 -2
  23. package/src/scripts/js/handlers/PhantomElementHandler.js +1 -1
  24. package/src/scripts/js/handlers/ScoreManipulatorHandler.js +101 -14
  25. package/src/scripts/js/handlers/SelectionHandler.js +80 -36
  26. package/src/scripts/js/handlers/SideBarHandler.js +10 -3
  27. package/src/scripts/js/handlers/WindowHandler.js +25 -4
  28. package/src/scripts/js/utils/DOMCreator.js +1 -1
  29. package/src/scripts/js/utils/MEIConverter.js +13 -1
  30. package/src/scripts/js/utils/MEIOperations.js +180 -187
  31. package/src/scripts/js/utils/Mouse2SVG.js +200 -43
  32. package/src/scripts/js/utils/ReactWrapper.js +46 -0
  33. package/src/scripts/js/utils/RectWrapper.js +10 -0
  34. package/src/scripts/js/utils/SVGEditor.js +94 -3
  35. package/src/scripts/js/utils/VerovioWrapper.js +6 -1
  36. package/src/scripts/js/utils/convenienceQueries.js +2 -0
  37. package/src/scripts/js/utils/mappings.js +322 -56
  38. package/src/styles/VerovioScoreEditor.css +0 -694
@@ -1,694 +0,0 @@
1
- @import '~bootstrap/dist/css/bootstrap.min.css';
2
-
3
- @font-face {
4
- font-family: "Bravura";
5
- src: url('../fonts/bravura/svg/Bravura.svg#7377dd80c36b825ad2214a14c2421925') format('svg');
6
- font-weight: normal;
7
- font-style: normal;
8
- }
9
-
10
- @font-face {
11
- font-family: "BravuraText";
12
- src: url('../fonts/bravura/svg/BravuraText.svg#f678e10c1f5609a8428c245cc86aa255') format('svg');
13
- font-weight: normal;
14
- font-style: normal;}
15
-
16
- .dropdown button{
17
- height: 100%;
18
- }
19
-
20
- .vse-container{
21
- position: absolute;
22
- width: 100%;
23
- height: 100%;
24
- background: white;
25
- /* overflow: scroll; */
26
- }
27
-
28
- body.waiting * {
29
- cursor: wait !important;
30
- }
31
- /*
32
- .textmode * {
33
- cursor: text;
34
- } */
35
-
36
-
37
- #scoreRects > :is(.notehead, .clef, .meterSig, .keySig, .rest, .harm, .manipulator, .slur, .tie, .tupletNum, .tupletBracket):hover{
38
- cursor: pointer;
39
- }
40
-
41
- #scoreRects .notehead:hover{
42
- cursor: ns-resize !important;
43
- }
44
-
45
- .clickmode{
46
- cursor: crosshair
47
- }
48
-
49
- #vrvSVG{
50
- top: 0px;
51
- width: 100%;
52
- height: auto;
53
- position: absolute;
54
- display: flex;
55
- flex-direction: column;
56
- }
57
-
58
- .page{
59
- translate: 0 10%;
60
- }
61
-
62
- #vrvSVG .systemLine{
63
- stroke: black;
64
- stroke-dasharray: 10rem;
65
- stroke-width: 1rem;
66
- }
67
-
68
- #interactionOverlay{
69
- position: absolute;
70
- top: 0px;
71
- width: 100%;
72
- z-index: 100;
73
- }
74
-
75
- /* This one is for Debugging.
76
- Change fill-opacity and stroke-opacity to display boundsing boxes*/
77
- .debug #scoreRects *, #scoreRects .moving{
78
- stroke-width: 1px;
79
- stroke: black;
80
- fill: gray;
81
- fill-opacity: 0.1;
82
- stroke-opacity: 1;
83
- }
84
-
85
- #scoreRects *{
86
- stroke-width: 1px;
87
- stroke: black;
88
- fill: gray;
89
- fill-opacity: 0;
90
- stroke-opacity: 0;
91
- }
92
-
93
-
94
- text{
95
- cursor: text;
96
- }
97
-
98
-
99
- /*
100
- #svgContainer, .annotLinkedText, .annotLinkedText *{
101
- white-space: pre;
102
- }
103
- */
104
-
105
- #svgContainer{
106
- position: relative;
107
- height: 100%;
108
- overflow: scroll;
109
- }
110
-
111
- .staff.lastEntered > .staffLine:first-of-type, .staff.lastEntered > .staffLine:last-of-type, .staff.lastEntered ~ .barLine{
112
- filter: drop-shadow(5px 16px 15px black)
113
- }
114
-
115
- /* .note, .note *, .rest, .rest *, .staff, .measure, .manipulator, .slur, .tie *{
116
- cursor: pointer !important;
117
- } */
118
-
119
- /*
120
- * TOOLBAR
121
- */
122
-
123
- .verticalLine{
124
- border-left: 1px solid black;
125
- height: auto;
126
- position: absolute;
127
- }
128
-
129
- #insertMode.empty{
130
- background-image: url(../images/GUI/edit-solid.svg);
131
- background-position-x: 10%;
132
- }
133
-
134
-
135
- #insertMode{
136
- background-color: white;
137
- color: black;
138
- }
139
-
140
- .smufl{
141
- font-family: "BravuraText";
142
- font-size: xx-large;
143
- }
144
-
145
- .harm *{
146
- font-family: "BravuraText";
147
- }
148
-
149
- #playBtn{
150
- background-image: url(../images/GUI/play-solid.svg);
151
- background-size: 80%;
152
- }
153
-
154
- #pauseBtn{
155
- background-image: url(../images/GUI/pause-solid.svg);
156
- background-size: 80%;
157
- }
158
-
159
- #rewindBtn{
160
- background-image: url(../images/GUI/backward-fast-solid.svg);
161
- background-size: 80%;
162
- }
163
-
164
- #zoomInBtn{
165
- background-image: url(../images/GUI/zoomin.svg);
166
- background-size: 80%;
167
- }
168
-
169
- #zoomOutBtn{
170
- background-image: url(../images/GUI/zoomout.svg);
171
- background-size: 80%;
172
- }
173
-
174
- #tupletBtn{
175
- background-image: url(../images/GUI/triplet.svg);
176
- background-size: 80%;
177
- color: rgba(0, 0, 0, 0.0)
178
- }
179
-
180
- .btn{
181
- background-repeat: no-repeat;
182
- background-position-x: center;
183
- background-position-y: center;
184
- outline: none;
185
- font-family: Bravura;
186
- font-size: small;
187
- }
188
-
189
- .articulationGroup .btn{
190
- font-size: larger;
191
- }
192
-
193
- .btn-group-sm{
194
- display: flex;
195
- }
196
-
197
- /* .btn:hover, .btn.selected {
198
- filter: invert();
199
- color: black;
200
- background-color: white;
201
- } */
202
-
203
- .btn:hover{
204
- background-color: lightgray;
205
- color: #ffffff;
206
-
207
- }
208
-
209
- .btn.selected {
210
- background-color: black;
211
- color: #ffffff;
212
-
213
- }
214
-
215
- #btnToolbar{
216
- top: 0px;
217
- transition: 0.5s;
218
- /*height: 5%;*/
219
- }
220
-
221
- #customToolbar :first-child{
222
- margin-left: 0.25em;
223
- }
224
-
225
- #customToolbar{
226
- box-shadow: 0px 1px 3px lightgray;
227
- }
228
-
229
- #btnToolbar{
230
- box-shadow: inset 0px -3px 3px lightgray;
231
- }
232
-
233
- .dropdown-item.selected{
234
- background-color: antiquewhite;
235
- font-weight: bold;
236
- }
237
-
238
- .accordion-item, .accordion-header{
239
- border-bottom-style: solid;
240
- border-bottom-color: black;
241
- border-bottom-width: 1.5px;
242
- }
243
-
244
- #midiDeviceSelect{
245
- width: 100%;
246
- }
247
-
248
- #toggleSidebar{
249
- border-bottom-left-radius: 0;
250
- border-top-left-radius: 0;
251
- }
252
-
253
- #toggleSidebar.closedSidebar{
254
- background-image: url(../images/GUI/bars-solid.svg);
255
- background-size: 80%;
256
- }
257
-
258
- #toggleSidebar.openSidebar{
259
- background-image: url(../images/GUI/bars-solid.svg);
260
- background-size: 80%;
261
- }
262
-
263
- #insertDropdownKM .hide{
264
- display: none;
265
- }
266
-
267
- #insertToggleDiv{
268
- display: none;
269
- }
270
-
271
- #fileSelectGroup{
272
- align-self: flex-end;
273
- margin-left: auto;
274
- display:flex;
275
- }
276
-
277
- /* #midiSelectGroup{
278
- align-self:baseline;
279
- margin-left: auto;
280
- display:flex
281
- } */
282
-
283
- #handlerGroup{
284
- display: none
285
- }
286
-
287
- #importXML, #importAudioFile{
288
- display: none;
289
- }
290
-
291
- #sidebarContainer{
292
- position: absolute;
293
- left: 0;
294
- top: 0;
295
- height: 100%;
296
- border-color: black;
297
- border-style: solid;
298
- border-width: 1px;
299
- background-color: white;
300
- transition: 0.5s;
301
- border-top-left-radius: 5px;
302
- border-bottom-left-radius: 5px;
303
- overflow: visible;
304
- display: flex;
305
- flex-direction: column;
306
- }
307
-
308
- #sidebarContainer a{
309
- display: block;
310
- padding-left: 10px;
311
- }
312
-
313
- /* #sidebarContainer *{
314
- font-size: 10pt;
315
- } */
316
-
317
- #sidebarContainer.closedSidebar{
318
- visibility: hidden;
319
- width: 0
320
- }
321
-
322
- #sidebarContainer.openSidebar{
323
- visibility: visible;
324
- width: 10%;
325
- }
326
-
327
- #sidebarContainer.openSidebar ~ div {
328
- margin-left: 10%;
329
- width: 90%;
330
- flex-wrap: wrap;
331
- display: flex;
332
- transition: 0.5s;
333
- }
334
-
335
- #sidebarContainer.closedSidebar ~ div{
336
- margin-left: 0;
337
- width: 100%;
338
- transition: 0.5s;
339
- }
340
-
341
- #sidebarList{
342
- position: relative;
343
- overflow: scroll;
344
- width: 100%;
345
- resize: vertical;
346
- }
347
-
348
- .dropKey, .dropClef, .dropTime, .dropTempo{
349
- fill: orange;
350
- color: orange;
351
- }
352
-
353
- #timeDiv{
354
- cursor:pointer !important;
355
- }
356
-
357
- #annotList{
358
- width: 100%;
359
- position: relative;
360
- background-color: white;
361
- border-top-color: black;
362
- border-left-color: white;
363
- border-right-color: white;
364
- border-bottom-color: white;
365
- border-style: double;
366
- overflow: scroll;
367
- order: 2;
368
- resize: vertical;
369
- }
370
-
371
- #annotList > a{
372
- white-space: pre-line;
373
- overflow: unset;
374
- }
375
-
376
-
377
- .list-group{
378
- display: block;
379
- }
380
-
381
- #btnToolbar{
382
- display: flex;
383
- }
384
-
385
- .btn-toolbar:not(:empty){
386
- border-top-color: rgba(0, 0, 0, 0);
387
- border-right-color: rgba(0, 0, 0, 0);
388
- border-left-color: rgba(0, 0, 0, 0);
389
- border-bottom-color: black;
390
- border-bottom-style: solid;
391
- border-bottom-width: 3px;
392
- }
393
-
394
- .tabBtn{
395
- border-bottom-color: rgba(0, 0, 0, 0.0);
396
- border-bottom-left-radius: 0% !important;
397
- border-bottom-right-radius: 0% !important;
398
- margin-bottom: -3px;
399
- }
400
- [role="group"]{
401
- margin-top: 3px;
402
- margin-bottom: 3px;
403
- }
404
-
405
- [role="group"] button:first-of-type{
406
- border-bottom-left-radius: .2rem;
407
- border-top-left-radius: .2rem;
408
- }
409
-
410
- [role="group"] button:last-of-type{
411
- border-bottom-right-radius: .2rem;
412
- border-top-right-radius: .2rem;
413
- }
414
-
415
- .btn-group-sm>.btn, .btn-sm{
416
- border-radius: 0%;
417
- }
418
-
419
-
420
- /*
421
- * ANNOTATIONS
422
- */
423
-
424
- /*
425
- #annotationCanvas.back *{
426
- opacity: 0.5;
427
- }*/
428
-
429
- #annotationCanvas.front *{
430
- opacity: 1;
431
- }
432
-
433
- .annotLinkedText .annotFO{
434
- background-color: rgba(255, 255, 153, 0.8);
435
- border-radius: 0px 10px 10px 10px;
436
- }
437
-
438
-
439
- .annotStaticText .annotFO div{
440
- background-color: white;
441
- border: 1px solid black;
442
- }
443
-
444
- .annotDiv{
445
- height: 100%;
446
- width: 100%;
447
- }
448
-
449
- .annotLine{
450
- stroke-width: 2px;
451
- stroke: lightskyblue;
452
- stroke-dasharray: 2px;
453
- }
454
-
455
-
456
- .lineDragRect{
457
- stroke-width: 1px;
458
- stroke: black;
459
- fill: whitesmoke;
460
- height: 7px;
461
- width: 7px;
462
- transform: translate(-3.5, -3.5);
463
- }
464
-
465
- .highlightAnnotation, .highlightChord{
466
- fill-opacity: 0.2;
467
- outline-style: dotted;
468
- outline-width: 0.5px;
469
- outline-color: black;
470
- }
471
-
472
- .layer[n="1"] .highlighted{
473
- /**fill: rgb(255, 71, 255)*/
474
- filter: drop-shadow(30px 10px 4px rgb(255, 71, 255));
475
- }
476
-
477
- #phantomNote.l1{
478
- fill: rgb(255, 71, 255)
479
- }
480
-
481
-
482
- .layer[n="2"] .highlighted, #phantomNote.l2{
483
- /**fill: green*/
484
- filter: drop-shadow(30px 10px 4px green);
485
- }
486
-
487
- .layer[n="3"] .highlighted, #phantomNote.l3{
488
- /*fill: blue*/
489
- filter: drop-shadow(30px 10px 4px blue);
490
- }
491
-
492
- .layer[n="4"] .highlighted, #phantomNote.l4{
493
- /*fill: orange*/
494
- filter: drop-shadow(30px 10px 4px orange);
495
- }
496
-
497
- .customAnnotShape{
498
- fill: orange;
499
- fill-opacity: 0.2;
500
- outline-style: dotted;
501
- outline-width: 0.5px;
502
- outline-color: black;
503
- }
504
-
505
- .customAnnotShape.selected{
506
- outline-style: dashed;
507
- outline-color:cornflowerblue;
508
- outline-width: 1;
509
- }
510
-
511
-
512
- .annotLinkedText.selected > .annotFO, .annotStaticText.selected > .annotFO{
513
- border-color:cornflowerblue;
514
- border-width: 1;
515
- border-style: dashed;
516
- }
517
-
518
-
519
- [contentEditable=false]:empty:not(:focus):before{
520
- content:attr(data-text);
521
- color: lightgray;
522
- }
523
-
524
- .currentlyPlaying{
525
- fill:red;
526
- fill-opacity: 1;
527
- }
528
-
529
- #followerRect{
530
- fill: red;
531
- fill-opacity: 0.3;
532
- outline-style: none;
533
- }
534
-
535
- .marked, .lastAdded{
536
- fill: red
537
- }
538
-
539
- /* .lastAdded{
540
- fill: rgb(16, 100, 16)
541
- } */
542
-
543
- .playing{
544
- fill: red
545
- }
546
-
547
- /* LABELS */
548
-
549
- .labelDiv{
550
- border: 2px solid black;
551
- border-radius: 10px;
552
- height: fit-content;
553
- width: fit-content;
554
- min-width: 50px;
555
- background-color: beige;
556
- font-size: 40px;
557
- font-family: 'Times New Roman', Times, serif;
558
- }
559
-
560
- /* KEYMODE */
561
-
562
- #keyModeSelectRect{
563
- stroke: black;
564
- stroke-opacity: 1;
565
- stroke-width: 2px;
566
- fill: lightskyblue;
567
- fill-opacity: 0.4;
568
- }
569
-
570
- /* #manipulatorCanvas > #cursor{
571
- display: none
572
- } */
573
-
574
- /* CLICK MODE */
575
-
576
-
577
- /* #phantomNote{
578
- transform: skew(-20deg);
579
- } */
580
-
581
-
582
- .phantomLine, .phantomMarker{
583
- stroke-width: 2px;
584
- stroke:black;
585
- opacity: 0.5;
586
- }
587
-
588
-
589
- /*StatusBar*/
590
-
591
- #statusBar{
592
- position: absolute;
593
- height: 5%;
594
- width: 100%;
595
- bottom: 0;
596
- background-color: lightskyblue;
597
- border-style: outset;
598
- z-index: 100;
599
- }
600
-
601
-
602
- /*Score Manipulator*/
603
-
604
- #manipulatorCanvas{
605
- z-index: 101;
606
- }
607
-
608
- .signElement{
609
- stroke: black;
610
- stroke-width: 10%;
611
- }
612
-
613
- #measureAdder, #measureRemover{
614
- height: 10%;
615
- width: 10%;
616
- }
617
-
618
- #manipulationButton{
619
- stroke:black;
620
- stroke-width: 5%;
621
- fill: antiquewhite;
622
- }
623
-
624
- .manipulator:hover * {
625
- filter: invert();
626
- }
627
-
628
-
629
- .tooltip.show{
630
- display:contents;
631
- background: skyblue;
632
- color: #643045;
633
- font-weight: bold;
634
- padding: 5px 10px;
635
- font-size: 13px;
636
- border-radius: 4px;
637
- border-color: maroon;
638
- display: block;
639
- opacity: 1;
640
- position: absolute;
641
- }
642
-
643
- /* .tooltip{
644
- inset: !important;
645
- } */
646
-
647
- .tooltip.hide{
648
- display: none
649
- }
650
-
651
- .overfillMark{
652
- color:rgba(0, 0, 0, 0.5);
653
- font-size: 12em;
654
- font-weight: bolder;
655
- z-index: 100;
656
-
657
- }
658
-
659
- /*Disable interaction*/
660
-
661
- #ff_warning{
662
- background: rgba(0, 0, 0, 0.25);
663
- width: 100%;
664
- margin: auto;
665
- height: 100%;
666
- text-align: center;
667
- font-size: xx-large;
668
- color:crimson;
669
- text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
670
- }
671
-
672
- .hideUI{
673
- display: none !important;
674
- }
675
-
676
- #pauseNote{
677
- display: none;
678
- }
679
-
680
- #interactionOverlay, #vrvSVG > svg{
681
- transform-origin: top left
682
- }
683
-
684
- .indexBase{
685
- font-size: 0.7em;
686
- }
687
-
688
- foreignObject > [contenteditable]{
689
- font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
690
- }
691
-
692
- button{
693
- box-shadow: none !important;
694
- }