abcjs 6.0.4 → 6.1.2
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/README.md +8 -0
- package/RELEASE.md +37 -0
- package/SECURITY.md +9 -0
- package/abcjs-audio.css +1 -0
- package/dist/abcjs-basic-min.js +2 -2
- package/dist/abcjs-basic.js +1069 -378
- package/dist/abcjs-basic.js.map +1 -1
- package/dist/abcjs-plugin-min.js +2 -2
- package/index.js +2 -0
- package/package.json +2 -2
- package/src/api/abc_tunebook_svg.js +2 -98
- package/src/const/key-accidentals.js +53 -0
- package/src/const/relative-major.js +92 -0
- package/src/parse/abc_parse_book.js +3 -2
- package/src/parse/abc_parse_key_voice.js +1 -148
- package/src/parse/abc_parse_music.js +1 -1
- package/src/parse/abc_transpose.js +9 -68
- package/src/parse/transpose-chord.js +80 -0
- package/src/str/output.js +433 -0
- package/src/write/abc_engraver_controller.js +72 -1
- package/src/write/draw/draw.js +8 -0
- package/src/write/draw/staff-group.js +5 -5
- package/src/write/selection.js +48 -12
- package/types/index.d.ts +44 -0
- package/version.js +1 -1
package/src/write/selection.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var spacing = require('./abc_spacing');
|
|
2
2
|
|
|
3
|
-
function setupSelection(engraver) {
|
|
3
|
+
function setupSelection(engraver, svgs) {
|
|
4
4
|
engraver.rangeHighlight = rangeHighlight;
|
|
5
5
|
if (engraver.dragging) {
|
|
6
6
|
for (var h = 0; h < engraver.selectables.length; h++) {
|
|
@@ -14,14 +14,21 @@ function setupSelection(engraver) {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
for (var i = 0; i < svgs.length; i++) {
|
|
18
|
+
svgs[i].addEventListener('touchstart', mouseDown.bind(engraver));
|
|
19
|
+
svgs[i].addEventListener('touchmove', mouseMove.bind(engraver));
|
|
20
|
+
svgs[i].addEventListener('touchend', mouseUp.bind(engraver));
|
|
21
|
+
svgs[i].addEventListener('mousedown', mouseDown.bind(engraver));
|
|
22
|
+
svgs[i].addEventListener('mousemove', mouseMove.bind(engraver));
|
|
23
|
+
svgs[i].addEventListener('mouseup', mouseUp.bind(engraver));
|
|
24
|
+
}
|
|
20
25
|
}
|
|
21
26
|
|
|
22
|
-
function getCoord(ev
|
|
27
|
+
function getCoord(ev) {
|
|
23
28
|
var scaleX = 1;
|
|
24
29
|
var scaleY = 1;
|
|
30
|
+
var svg = ev.target.closest('svg')
|
|
31
|
+
var yOffset = 0
|
|
25
32
|
|
|
26
33
|
// when renderer.options.responsive === 'resize' the click coords are in relation to the HTML
|
|
27
34
|
// element, we need to convert to the SVG viewBox coords
|
|
@@ -31,6 +38,7 @@ function getCoord(ev, svg) {
|
|
|
31
38
|
scaleX = svg.viewBox.baseVal.width / svg.clientWidth
|
|
32
39
|
if (svg.viewBox.baseVal.height !== 0)
|
|
33
40
|
scaleY = svg.viewBox.baseVal.height / svg.clientHeight
|
|
41
|
+
yOffset = svg.viewBox.baseVal.y
|
|
34
42
|
}
|
|
35
43
|
|
|
36
44
|
var svgClicked = ev.target.tagName === "svg";
|
|
@@ -48,7 +56,7 @@ function getCoord(ev, svg) {
|
|
|
48
56
|
y = y * scaleY;
|
|
49
57
|
//console.log(x, y)
|
|
50
58
|
|
|
51
|
-
return [x, y];
|
|
59
|
+
return [x, y+yOffset];
|
|
52
60
|
}
|
|
53
61
|
|
|
54
62
|
function elementFocused(ev) {
|
|
@@ -120,7 +128,7 @@ function keyboardSelection(ev) {
|
|
|
120
128
|
|
|
121
129
|
function findElementInHistory(selectables, el) {
|
|
122
130
|
for (var i = 0; i < selectables.length; i++) {
|
|
123
|
-
if (el === selectables[i].svgEl)
|
|
131
|
+
if (el.dataset.index === selectables[i].svgEl.dataset.index)
|
|
124
132
|
return i;
|
|
125
133
|
}
|
|
126
134
|
return -1;
|
|
@@ -216,7 +224,7 @@ function getMousePosition(self, ev) {
|
|
|
216
224
|
//console.log("clicked on", clickedOn, x, y, self.selectables[clickedOn].svgEl.getBBox(), ev.target.getBBox());
|
|
217
225
|
} else {
|
|
218
226
|
// See if they clicked close to an element.
|
|
219
|
-
box = getCoord(ev
|
|
227
|
+
box = getCoord(ev);
|
|
220
228
|
x = box[0];
|
|
221
229
|
y = box[1];
|
|
222
230
|
clickedOn = findElementByCoord(self, x, y);
|
|
@@ -225,13 +233,30 @@ function getMousePosition(self, ev) {
|
|
|
225
233
|
return { x: x, y: y, clickedOn: clickedOn };
|
|
226
234
|
}
|
|
227
235
|
|
|
236
|
+
function attachMissingTouchEventAttributes(touchEv) {
|
|
237
|
+
var rect = touchEv.target.getBoundingClientRect();
|
|
238
|
+
var offsetX = touchEv.touches[0].pageX - rect.left;
|
|
239
|
+
var offsetY = touchEv.touches[0].pageY - rect.top;
|
|
240
|
+
|
|
241
|
+
touchEv.touches[0].offsetX = offsetX;
|
|
242
|
+
touchEv.touches[0].offsetY = offsetY;
|
|
243
|
+
|
|
244
|
+
touchEv.touches[0].layerX = touchEv.touches[0].pageX;
|
|
245
|
+
touchEv.touches[0].layerY = touchEv.touches[0].pageY;
|
|
246
|
+
}
|
|
247
|
+
|
|
228
248
|
function mouseDown(ev) {
|
|
229
249
|
// "this" is the EngraverController because of the bind(this) when setting the event listener.
|
|
250
|
+
var _ev = ev;
|
|
251
|
+
if (ev.type === 'touchstart') {
|
|
252
|
+
attachMissingTouchEventAttributes(ev);
|
|
253
|
+
_ev = ev.touches[0];
|
|
254
|
+
}
|
|
230
255
|
|
|
231
|
-
var positioning = getMousePosition(this,
|
|
256
|
+
var positioning = getMousePosition(this, _ev);
|
|
232
257
|
|
|
233
258
|
// Only start dragging if the user clicked close enough to an element and clicked with the main mouse button.
|
|
234
|
-
if (positioning.clickedOn >= 0 && ev.button === 0) {
|
|
259
|
+
if (positioning.clickedOn >= 0 && (ev.type === 'touchstart' || ev.button === 0)) {
|
|
235
260
|
this.dragTarget = this.selectables[positioning.clickedOn];
|
|
236
261
|
this.dragIndex = positioning.clickedOn;
|
|
237
262
|
this.dragMechanism = "mouse";
|
|
@@ -244,12 +269,18 @@ function mouseDown(ev) {
|
|
|
244
269
|
}
|
|
245
270
|
|
|
246
271
|
function mouseMove(ev) {
|
|
272
|
+
var _ev = ev;
|
|
273
|
+
if (ev.type === 'touchmove') {
|
|
274
|
+
attachMissingTouchEventAttributes(ev);
|
|
275
|
+
_ev = ev.touches[0];
|
|
276
|
+
}
|
|
277
|
+
this.lastTouchMove = ev;
|
|
247
278
|
// "this" is the EngraverController because of the bind(this) when setting the event listener.
|
|
248
279
|
|
|
249
280
|
if (!this.dragTarget || !this.dragging || !this.dragTarget.isDraggable || this.dragMechanism !== 'mouse')
|
|
250
281
|
return;
|
|
251
282
|
|
|
252
|
-
var positioning = getMousePosition(this,
|
|
283
|
+
var positioning = getMousePosition(this, _ev);
|
|
253
284
|
|
|
254
285
|
var yDist = Math.round((positioning.y - this.dragMouseStart.y)/spacing.STEP);
|
|
255
286
|
if (yDist !== this.dragYStep) {
|
|
@@ -260,6 +291,11 @@ function mouseMove(ev) {
|
|
|
260
291
|
|
|
261
292
|
function mouseUp(ev) {
|
|
262
293
|
// "this" is the EngraverController because of the bind(this) when setting the event listener.
|
|
294
|
+
var _ev = ev;
|
|
295
|
+
if (ev.type === 'touchend') {
|
|
296
|
+
attachMissingTouchEventAttributes(this.lastTouchMove);
|
|
297
|
+
_ev = this.lastTouchMove.touches[0];
|
|
298
|
+
}
|
|
263
299
|
|
|
264
300
|
if (!this.dragTarget)
|
|
265
301
|
return;
|
|
@@ -270,7 +306,7 @@ function mouseUp(ev) {
|
|
|
270
306
|
this.dragTarget.absEl.highlight(undefined, this.selectionColor);
|
|
271
307
|
}
|
|
272
308
|
|
|
273
|
-
notifySelect.bind(this)(this.dragTarget, this.dragYStep, this.selectables.length, this.dragIndex,
|
|
309
|
+
notifySelect.bind(this)(this.dragTarget, this.dragYStep, this.selectables.length, this.dragIndex, _ev);
|
|
274
310
|
if (this.dragTarget.svgEl && this.dragTarget.svgEl.focus) {
|
|
275
311
|
this.dragTarget.svgEl.focus();
|
|
276
312
|
this.dragTarget = null;
|
package/types/index.d.ts
CHANGED
|
@@ -171,6 +171,8 @@ declare module 'abcjs' {
|
|
|
171
171
|
|
|
172
172
|
export type AbsoluteElement = any; // TODO
|
|
173
173
|
|
|
174
|
+
export type AbstractEngraver = any;
|
|
175
|
+
|
|
174
176
|
export type NoteProperties = any; // TODO
|
|
175
177
|
|
|
176
178
|
export type AudioTrackCommand = 'program' | 'text' | 'note';
|
|
@@ -504,6 +506,34 @@ declare module 'abcjs' {
|
|
|
504
506
|
wordsfont: Font;
|
|
505
507
|
}
|
|
506
508
|
|
|
509
|
+
export interface EngraverController {
|
|
510
|
+
classes: any;
|
|
511
|
+
dragColor: string;
|
|
512
|
+
dragIndex: number;
|
|
513
|
+
dragMouseStart: { x: number, y: number; };
|
|
514
|
+
dragTarget: null | any;
|
|
515
|
+
dragYStep: number;
|
|
516
|
+
dragging: boolean;
|
|
517
|
+
engraver: AbstractEngraver;
|
|
518
|
+
getFontAndAttr: any;
|
|
519
|
+
getTextSize: any;
|
|
520
|
+
listeners: [ClickListener];
|
|
521
|
+
rangeHighlight: any;
|
|
522
|
+
renderer: any;
|
|
523
|
+
responsive?: boolean;
|
|
524
|
+
scale: number;
|
|
525
|
+
initialClef?: any;
|
|
526
|
+
selectTypes: boolean | Array<DragTypes>;
|
|
527
|
+
selectables: Array<Selectable>;
|
|
528
|
+
selected: Array<any>;
|
|
529
|
+
selectionColor: string;
|
|
530
|
+
space: number;
|
|
531
|
+
staffgroups: [any];
|
|
532
|
+
staffwidthPrint: number;
|
|
533
|
+
staffwidthScreen: number;
|
|
534
|
+
width: number;
|
|
535
|
+
}
|
|
536
|
+
|
|
507
537
|
export interface MetaText {
|
|
508
538
|
"abc-copyright"?: string;
|
|
509
539
|
"abc-creator"?: string;
|
|
@@ -712,6 +742,7 @@ declare module 'abcjs' {
|
|
|
712
742
|
|
|
713
743
|
export interface TuneObject {
|
|
714
744
|
formatting: Formatting;
|
|
745
|
+
engraver?: EngraverController;
|
|
715
746
|
lines: Array<TuneLine>;
|
|
716
747
|
media: Media;
|
|
717
748
|
metaText: MetaText;
|
|
@@ -732,12 +763,23 @@ declare module 'abcjs' {
|
|
|
732
763
|
millisecondsPerMeasure: NumberFunction;
|
|
733
764
|
setTiming: (bpm?: number, measuresOfDelay? : number) => void;
|
|
734
765
|
setUpAudio: (options: SynthOptions) => AudioTracks;
|
|
766
|
+
makeVoicesArray: () => Array<Selectable[]>
|
|
735
767
|
lineBreaks?: Array<number>;
|
|
736
768
|
visualTranspose?: number;
|
|
737
769
|
}
|
|
738
770
|
|
|
739
771
|
export type TuneObjectArray = [TuneObject]
|
|
740
772
|
|
|
773
|
+
export interface Selectable {
|
|
774
|
+
absEl: AbsoluteElement;
|
|
775
|
+
isDraggable: boolean;
|
|
776
|
+
staffPos: {
|
|
777
|
+
height: number;
|
|
778
|
+
top: number;
|
|
779
|
+
zero: number;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
741
783
|
export interface AbcElem {
|
|
742
784
|
el_type: string //TODO enumerate these
|
|
743
785
|
abselem: any;
|
|
@@ -1091,6 +1133,8 @@ declare module 'abcjs' {
|
|
|
1091
1133
|
|
|
1092
1134
|
export function numberOfTunes(abc: string) : number;
|
|
1093
1135
|
export function extractMeasures(abc: string) : Array<MeasureList>;
|
|
1136
|
+
|
|
1137
|
+
export function strTranspose(originalAbc: string, visualObj: TuneObject, steps: number): string;
|
|
1094
1138
|
|
|
1095
1139
|
//
|
|
1096
1140
|
// Glyph
|
package/version.js
CHANGED