abcjs 6.0.0-beta.8 → 6.0.1

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 (204) hide show
  1. package/.github/workflows/tests.yml +29 -0
  2. package/CODE_OF_CONDUCT.md +76 -0
  3. package/CONTRIBUTING.md +1 -0
  4. package/LICENSE.md +1 -1
  5. package/README.md +92 -3
  6. package/RELEASE.md +959 -1
  7. package/abcjs-audio.css +14 -5
  8. package/dist/.gitignore +1 -2
  9. package/dist/abcjs-basic-min.js +3 -0
  10. package/dist/abcjs-basic-min.js.LICENSE +23 -0
  11. package/dist/abcjs-basic.js +28232 -0
  12. package/dist/abcjs-basic.js.map +1 -0
  13. package/dist/abcjs-plugin-min.js +3 -0
  14. package/dist/abcjs-plugin-min.js.LICENSE +23 -0
  15. package/dist/report-basic.html +37 -0
  16. package/dist/report-before-glyph-compress.html +37 -0
  17. package/dist/report-brown-ts-target-es5.html +37 -0
  18. package/dist/report-dev-orig-no-babel.html +37 -0
  19. package/dist/report-synth.html +37 -0
  20. package/docker-build.sh +1 -0
  21. package/glyphs.json +1 -0
  22. package/index.js +27 -2
  23. package/{static-wrappers/license.js → license.js} +1 -1
  24. package/package.json +26 -29
  25. package/{src/plugin/abc_plugin.js → plugin.js} +31 -19
  26. package/src/api/abc_animation.js +1 -17
  27. package/src/api/abc_tablatures.js +144 -0
  28. package/src/api/abc_timing_callbacks.js +239 -116
  29. package/src/api/abc_tunebook.js +18 -67
  30. package/src/api/abc_tunebook_svg.js +38 -46
  31. package/src/data/abc_tune.js +232 -972
  32. package/src/data/deline-tune.js +199 -0
  33. package/src/edit/abc_editarea.js +112 -0
  34. package/src/edit/abc_editor.js +95 -221
  35. package/src/midi/abc_midi_create.js +48 -50
  36. package/src/parse/abc_common.js +0 -14
  37. package/src/parse/abc_parse.js +167 -1321
  38. package/src/parse/abc_parse_book.js +62 -0
  39. package/src/parse/abc_parse_directive.js +164 -41
  40. package/src/parse/abc_parse_header.js +116 -145
  41. package/src/parse/abc_parse_key_voice.js +26 -20
  42. package/src/parse/abc_parse_music.js +1337 -0
  43. package/src/parse/abc_tokenizer.js +21 -15
  44. package/src/parse/abc_transpose.js +3 -15
  45. package/src/parse/tune-builder.js +896 -0
  46. package/src/parse/wrap_lines.js +205 -453
  47. package/src/synth/abc_midi_flattener.js +1292 -0
  48. package/src/{midi → synth}/abc_midi_renderer.js +44 -17
  49. package/src/synth/abc_midi_sequencer.js +648 -0
  50. package/src/synth/active-audio-context.js +3 -14
  51. package/src/synth/cents-to-factor.js +10 -0
  52. package/src/synth/create-note-map.js +21 -32
  53. package/src/synth/create-synth-control.js +20 -103
  54. package/src/synth/create-synth.js +185 -77
  55. package/src/synth/download-buffer.js +7 -21
  56. package/src/synth/get-midi-file.js +13 -20
  57. package/src/synth/images/{loading.svg → loading.svg.js} +4 -0
  58. package/src/synth/images/loop.svg.js +65 -0
  59. package/src/synth/images/pause.svg.js +10 -0
  60. package/src/synth/images/play.svg.js +9 -0
  61. package/src/synth/images/{reset.svg → reset.svg.js} +5 -1
  62. package/src/synth/instrument-index-to-name.js +1 -16
  63. package/src/synth/load-note.js +37 -76
  64. package/src/synth/pitch-to-note-name.js +0 -15
  65. package/src/synth/pitches-to-perc.js +64 -0
  66. package/src/synth/place-note.js +78 -68
  67. package/src/synth/play-event.js +17 -18
  68. package/src/synth/register-audio-context.js +11 -23
  69. package/src/synth/sounds-cache.js +0 -15
  70. package/src/synth/supports-audio.js +9 -23
  71. package/src/synth/synth-controller.js +80 -49
  72. package/src/synth/synth-sequence.js +20 -34
  73. package/src/tablatures/instruments/guitar/guitar-fonts.js +19 -0
  74. package/src/tablatures/instruments/guitar/guitar-patterns.js +23 -0
  75. package/src/tablatures/instruments/guitar/tab-guitar.js +50 -0
  76. package/src/tablatures/instruments/string-patterns.js +277 -0
  77. package/src/tablatures/instruments/string-tablature.js +56 -0
  78. package/src/tablatures/instruments/tab-note.js +282 -0
  79. package/src/tablatures/instruments/tab-notes.js +41 -0
  80. package/src/tablatures/instruments/violin/tab-violin.js +47 -0
  81. package/src/tablatures/instruments/violin/violin-fonts.js +19 -0
  82. package/src/tablatures/instruments/violin/violin-patterns.js +23 -0
  83. package/src/tablatures/tab-absolute-elements.js +310 -0
  84. package/src/tablatures/tab-common.js +29 -0
  85. package/src/tablatures/tab-renderer.js +243 -0
  86. package/src/tablatures/transposer.js +110 -0
  87. package/src/test/abc_midi_lint.js +5 -22
  88. package/src/test/abc_midi_sequencer_lint.js +11 -14
  89. package/src/test/abc_parser_lint.js +136 -32
  90. package/src/test/abc_vertical_lint.js +94 -32
  91. package/src/test/rendering-lint.js +38 -5
  92. package/src/write/abc_absolute_element.js +112 -120
  93. package/src/write/abc_abstract_engraver.js +102 -253
  94. package/src/write/abc_beam_element.js +30 -290
  95. package/src/write/abc_brace_element.js +12 -121
  96. package/src/write/abc_create_clef.js +21 -32
  97. package/src/write/abc_create_key_signature.js +8 -26
  98. package/src/write/abc_create_note_head.js +107 -0
  99. package/src/write/abc_create_time_signature.js +2 -21
  100. package/src/write/abc_crescendo_element.js +3 -50
  101. package/src/write/abc_decoration.js +7 -30
  102. package/src/write/abc_dynamic_decoration.js +3 -37
  103. package/src/write/abc_ending_element.js +1 -57
  104. package/src/write/abc_engraver_controller.js +111 -234
  105. package/src/write/abc_glyphs.js +8 -18
  106. package/src/write/abc_relative_element.js +57 -97
  107. package/src/write/abc_renderer.js +10 -832
  108. package/src/write/abc_spacing.js +0 -15
  109. package/src/write/abc_staff_group_element.js +14 -349
  110. package/src/write/abc_tempo_element.js +9 -117
  111. package/src/write/abc_tie_element.js +5 -68
  112. package/src/write/abc_triplet_element.js +6 -124
  113. package/src/write/abc_voice_element.js +7 -222
  114. package/src/write/add-chord.js +103 -0
  115. package/src/write/add-text-if.js +33 -0
  116. package/src/write/bottom-text.js +79 -0
  117. package/src/write/calcHeight.js +17 -0
  118. package/src/write/classes.js +100 -0
  119. package/src/write/draw/absolute.js +68 -0
  120. package/src/write/draw/beam.js +56 -0
  121. package/src/write/draw/brace.js +106 -0
  122. package/src/write/draw/crescendo.js +38 -0
  123. package/src/write/draw/debug-box.js +8 -0
  124. package/src/write/draw/draw.js +56 -0
  125. package/src/write/draw/dynamics.js +20 -0
  126. package/src/write/draw/ending.js +46 -0
  127. package/src/write/draw/group-elements.js +66 -0
  128. package/src/write/draw/horizontal-line.js +25 -0
  129. package/src/write/draw/non-music.js +50 -0
  130. package/src/write/draw/print-line.js +24 -0
  131. package/src/write/draw/print-path.js +7 -0
  132. package/src/write/draw/print-stem.js +30 -0
  133. package/src/write/draw/print-symbol.js +59 -0
  134. package/src/write/draw/print-vertical-line.js +18 -0
  135. package/src/write/draw/relative.js +77 -0
  136. package/src/write/draw/round-number.js +5 -0
  137. package/src/write/draw/selectables.js +59 -0
  138. package/src/write/draw/separator.js +16 -0
  139. package/src/write/draw/set-paper-size.js +45 -0
  140. package/src/write/{sprintf.js → draw/sprintf.js} +0 -0
  141. package/src/write/draw/staff-group.js +226 -0
  142. package/src/write/draw/staff-line.js +9 -0
  143. package/src/write/draw/staff.js +33 -0
  144. package/src/write/draw/tab-line.js +40 -0
  145. package/src/write/draw/tempo.js +45 -0
  146. package/src/write/draw/text.js +71 -0
  147. package/src/write/draw/tie.js +97 -0
  148. package/src/write/draw/triplet.js +46 -0
  149. package/src/write/draw/voice.js +102 -0
  150. package/src/write/format-jazz-chord.js +15 -0
  151. package/src/write/free-text.js +41 -0
  152. package/src/write/get-font-and-attr.js +37 -0
  153. package/src/write/get-text-size.js +56 -0
  154. package/src/write/highlight.js +11 -0
  155. package/src/write/layout/VoiceElements.js +121 -0
  156. package/src/write/layout/beam.js +213 -0
  157. package/src/write/layout/get-left-edge-of-staff.js +56 -0
  158. package/src/write/layout/getBarYAt.js +6 -0
  159. package/src/write/layout/layout.js +94 -0
  160. package/src/write/layout/setUpperAndLowerElements.js +232 -0
  161. package/src/write/layout/staffGroup.js +146 -0
  162. package/src/write/layout/triplet.js +75 -0
  163. package/src/write/layout/voice.js +137 -0
  164. package/src/write/selection.js +188 -70
  165. package/src/write/separator.js +10 -0
  166. package/src/write/set-class.js +21 -0
  167. package/src/write/subtitle.js +12 -0
  168. package/src/write/svg.js +95 -43
  169. package/src/write/top-text.js +54 -0
  170. package/src/write/unhighlight.js +11 -0
  171. package/temp.txt +15256 -0
  172. package/test.js +27 -64
  173. package/types/index.d.ts +1095 -0
  174. package/version.js +1 -1
  175. package/.babelrc +0 -5
  176. package/.eslintrc +0 -3
  177. package/.gitmodules +0 -3
  178. package/abcjs-midi.css +0 -166
  179. package/build-utils/loadPresets.js +0 -14
  180. package/build-utils/presets/webpack.analyze.js +0 -6
  181. package/build-utils/presets/webpack.optimize.js +0 -30
  182. package/build-utils/webpack.development.js +0 -14
  183. package/build-utils/webpack.production.js +0 -35
  184. package/deploy-docs.sh +0 -25
  185. package/docs/README.md +0 -33
  186. package/fix-versions.sh +0 -23
  187. package/mei.js +0 -43
  188. package/midi.js +0 -62
  189. package/src/api/abc_tunebook_midi.js +0 -116
  190. package/src/midi/abc_midi_controls.js +0 -701
  191. package/src/midi/abc_midi_flattener.js +0 -1119
  192. package/src/midi/abc_midi_js_preparer.js +0 -243
  193. package/src/midi/abc_midi_sequencer.js +0 -401
  194. package/src/midi/abc_midi_ui_generator.js +0 -86
  195. package/src/plugin/abc_plugin_midi.js +0 -220
  196. package/src/synth/images/loop.svg +0 -61
  197. package/src/synth/images/pause.svg +0 -6
  198. package/src/synth/images/play.svg +0 -5
  199. package/src/transform/abc2abc_write.js +0 -395
  200. package/static-wrappers/basic.js +0 -2
  201. package/static-wrappers/midi.js +0 -2
  202. package/static-wrappers/plugin-midi.js +0 -6
  203. package/static-wrappers/plugin.js +0 -6
  204. package/webpack.config.js +0 -29
@@ -0,0 +1,30 @@
1
+ var elementGroup = require('./group-elements');
2
+ var roundNumber = require("./round-number");
3
+
4
+ function printStem(renderer, x, dx, y1, y2, klass, name) {
5
+ if (dx<0 || y1<y2) { // correct path "handedness" for intersection with other elements
6
+ var tmp = roundNumber(y2);
7
+ y2 = roundNumber(y1);
8
+ y1 = tmp;
9
+ } else {
10
+ y1 = roundNumber(y1);
11
+ y2 = roundNumber(y2);
12
+ }
13
+ x = roundNumber(x);
14
+ var x2 = roundNumber(x+dx);
15
+ var pathArray = [["M",x,y1],["L", x, y2],["L", x2, y2],["L",x2,y1],["z"]];
16
+ var attr = { path: ""};
17
+ for (var i = 0; i < pathArray.length; i++)
18
+ attr.path += pathArray[i].join(" ");
19
+ if (klass)
20
+ attr['class'] = klass;
21
+ if (name)
22
+ attr['data-name'] = name;
23
+ if (!elementGroup.isInGroup()) {
24
+ attr.stroke ="none";
25
+ attr.fill = renderer.foregroundColor;
26
+ }
27
+ return renderer.paper.pathToBack(attr);
28
+ }
29
+
30
+ module.exports = printStem;
@@ -0,0 +1,59 @@
1
+ var renderText = require('./text');
2
+ var glyphs = require('../abc_glyphs');
3
+ var elementGroup = require('./group-elements');
4
+
5
+ /**
6
+ * assumes this.y is set appropriately
7
+ * if symbol is a multichar string without a . (as in scripts.staccato) 1 symbol per char is assumed
8
+ * not scaled if not in printgroup
9
+ */
10
+ function printSymbol(renderer, x, offset, symbol, options) {
11
+ // TODO-PER: what happened to scalex, and scaley? That might have been a bug introduced in refactoring
12
+ var el;
13
+ var ycorr;
14
+ if (!symbol) return null;
15
+ if (symbol.length > 1 && symbol.indexOf(".") < 0) {
16
+ var groupClass = elementGroup.isInGroup() ? '' : options.klass // If this is already in a group then don't repeat the classes for the sub-group)
17
+ renderer.paper.openGroup({"data-name": options.name, klass: groupClass});
18
+ var dx = 0;
19
+ for (var i = 0; i < symbol.length; i++) {
20
+ var s = symbol.charAt(i);
21
+ ycorr = glyphs.getYCorr(s);
22
+ el = glyphs.printSymbol(x + dx, renderer.calcY(offset + ycorr), s, renderer.paper, {stroke: options.stroke, fill: options.fill});
23
+ if (el) {
24
+ if (i < symbol.length - 1)
25
+ dx += kernSymbols(s, symbol.charAt(i + 1), glyphs.getSymbolWidth(s));
26
+ } else {
27
+ renderText(renderer, { x: x, y: renderer.y, text: "no symbol:" + symbol, type: "debugfont", klass: 'debug-msg', anchor: 'start'}, false);
28
+ }
29
+ }
30
+ var g = renderer.paper.closeGroup();
31
+ return g;
32
+ } else {
33
+ ycorr = glyphs.getYCorr(symbol);
34
+ if (elementGroup.isInGroup()) {
35
+ el = glyphs.printSymbol(x, renderer.calcY(offset + ycorr), symbol, renderer.paper, {"data-name": options.name});
36
+ } else {
37
+ el = glyphs.printSymbol(x, renderer.calcY(offset + ycorr), symbol, renderer.paper, {klass: options.klass, stroke: options.stroke, fill: options.fill, "data-name": options.name});
38
+ }
39
+ if (el) {
40
+ return el;
41
+ }
42
+ renderText(renderer, { x: x, y: renderer.y, text: "no symbol:" + symbol, type: "debugfont", klass: 'debug-msg', anchor: 'start'}, false);
43
+ return null;
44
+ }
45
+ }
46
+
47
+ function kernSymbols(lastSymbol, thisSymbol, lastSymbolWidth) {
48
+ // This is just some adjustments to make it look better.
49
+ var width = lastSymbolWidth;
50
+ if (lastSymbol === 'f' && thisSymbol === 'f')
51
+ width = width*2/3;
52
+ if (lastSymbol === 'p' && thisSymbol === 'p')
53
+ width = width*5/6;
54
+ if (lastSymbol === 'f' && thisSymbol === 'z')
55
+ width = width*5/8;
56
+ return width;
57
+ }
58
+
59
+ module.exports = printSymbol;
@@ -0,0 +1,18 @@
1
+ var sprintf = require("./sprintf");
2
+
3
+ function printVerticalLine (renderer, x, y1, y2) {
4
+ var dy = 0.35;
5
+ var fill = "#00aaaa";
6
+ var pathString = sprintf("M %f %f L %f %f L %f %f L %f %f z", x - dy, y1, x - dy, y2,
7
+ x + dy, y1, x + dy, y2);
8
+ renderer.paper.pathToBack({path: pathString, stroke: "none", fill: fill, 'class': renderer.controller.classes.generate('staff')});
9
+ pathString = sprintf("M %f %f L %f %f L %f %f L %f %f z", x - 20, y1, x - 20, y1+3,
10
+ x, y1, x, y1+3);
11
+ renderer.paper.pathToBack({path: pathString, stroke: "none", fill: fill, 'class': renderer.controller.classes.generate('staff')});
12
+ pathString = sprintf("M %f %f L %f %f L %f %f L %f %f z", x + 20, y2, x + 20, y2+3,
13
+ x, y2, x, y2+3);
14
+ renderer.paper.pathToBack({path: pathString, stroke: "none", fill: fill, 'class': renderer.controller.classes.generate('staff')});
15
+
16
+ }
17
+
18
+ module.exports = printVerticalLine;
@@ -0,0 +1,77 @@
1
+ var renderText = require('./text');
2
+ var printStem = require('./print-stem');
3
+ var printStaffLine = require('./staff-line');
4
+ var printSymbol = require('./print-symbol');
5
+
6
+ function drawRelativeElement(renderer, params, bartop) {
7
+ if (params.pitch === undefined)
8
+ window.console.error(params.type + " Relative Element y-coordinate not set.");
9
+ var y = renderer.calcY(params.pitch);
10
+ switch(params.type) {
11
+ case "symbol":
12
+ if (params.c === null) return null;
13
+ var klass = "symbol";
14
+ if (params.klass) klass += " " + params.klass;
15
+ params.graphelem = printSymbol(renderer, params.x, params.pitch, params.c, {
16
+ scalex: params.scalex,
17
+ scaley: params.scaley,
18
+ klass: renderer.controller.classes.generate(klass),
19
+ // fill:"none",
20
+ // stroke: renderer.foregroundColor,
21
+ name: params.name
22
+ });
23
+ break;
24
+ case "debug":
25
+ params.graphelem = renderText(renderer, { x: params.x, y: renderer.calcY(15), text: "" + params.c, type: "debugfont", klass: renderer.controller.classes.generate('debug-msg'), anchor: 'start', centerVertically: false, dim: params.dim }, false);
26
+ break;
27
+ case "tabNumber":
28
+ var hAnchor = "middle";
29
+ var tabFont = "tabnumberfont";
30
+ var tabClass = 'tab-number';
31
+ if (params.isGrace) {
32
+ tabFont = "tabgracefont";
33
+ y += 2.5;
34
+ tabClass = 'tab-grace'
35
+ }
36
+ params.graphelem = renderText(renderer, { x: params.x, y: y, text: "" + params.c, type: tabFont, klass: renderer.controller.classes.generate(tabClass), anchor: hAnchor, centerVertically: false, dim: params.dim , cursor: 'default'}, false);
37
+ break;
38
+ case "barNumber":
39
+ params.graphelem = renderText(renderer, { x: params.x, y: y, text: ""+params.c, type: "measurefont", klass: renderer.controller.classes.generate('bar-number'), anchor: "middle", dim: params.dim, name: "bar-number"}, true);
40
+ break;
41
+ case "lyric":
42
+ params.graphelem = renderText(renderer, { x: params.x, y: y, text: params.c, type: "vocalfont", klass: renderer.controller.classes.generate('lyric'), anchor: "middle", dim: params.dim, name: "lyric"}, false);
43
+ break;
44
+ case "chord":
45
+ params.graphelem = renderText(renderer, { x: params.x, y: y, text: params.c, type: 'gchordfont', klass: renderer.controller.classes.generate("chord"), anchor: "middle", dim: params.dim, lane: params.getLane(), name: "chord"}, false);
46
+ break;
47
+ case "decoration":
48
+ // The +6 is to compensate for the placement of text in svg: to be on the same row as symbols, the y-coord needs to compensate for the center line.
49
+ params.graphelem = renderText(renderer, { x: params.x, y: y+6, text: params.c, type: 'annotationfont', klass: renderer.controller.classes.generate("annotation"), anchor: "middle", centerVertically: true, dim: params.dim}, false);
50
+ break;
51
+ case "text":
52
+ params.graphelem = renderText(renderer, { x: params.x, y: y, text: params.c, type: 'annotationfont', klass: renderer.controller.classes.generate("annotation"), anchor: "start", centerVertically: params.centerVertically, dim: params.dim, lane: params.getLane(), name: "annotation"}, false);
53
+ break;
54
+ case "multimeasure-text":
55
+ params.graphelem = renderText(renderer, { x: params.x+params.w/2, y: y, text: params.c, type: 'tempofont', klass: renderer.controller.classes.generate("rest"), anchor: "middle", centerVertically: false, dim: params.dim}, false);
56
+ break;
57
+ case "part":
58
+ params.graphelem = renderText(renderer, { x: params.x, y: y, text: params.c, type: 'partsfont', klass: renderer.controller.classes.generate("part"), anchor: "start", dim: params.dim, name: params.c}, true);
59
+ break;
60
+ case "bar":
61
+ params.graphelem = printStem(renderer, params.x, params.linewidth, y, (bartop)?bartop:renderer.calcY(params.pitch2), null, "bar"); break; // bartop can't be 0
62
+ case "stem":
63
+ params.graphelem = printStem(renderer, params.x, params.linewidth, y, renderer.calcY(params.pitch2), 'abcjs-stem', 'stem'); break;
64
+ case "ledger":
65
+ params.graphelem = printStaffLine(renderer, params.x, params.x+params.w, params.pitch, "abcjs-ledger", "ledger"); break;
66
+ }
67
+ if (params.scalex!==1 && params.graphelem) {
68
+ scaleExistingElem(renderer.paper, params.graphelem, params.scalex, params.scaley, params.x, y);
69
+ }
70
+ return params.graphelem;
71
+ }
72
+
73
+ function scaleExistingElem(paper, elem, scaleX, scaleY, x, y) {
74
+ paper.setAttributeOnElement(elem, { style: "transform:scale("+scaleX+","+scaleY + ");transform-origin:" + x + "px " + y + "px;"});
75
+ }
76
+
77
+ module.exports = drawRelativeElement;
@@ -0,0 +1,5 @@
1
+ function roundNumber(x) {
2
+ return parseFloat(x.toFixed(2));
3
+ }
4
+
5
+ module.exports = roundNumber;
@@ -0,0 +1,59 @@
1
+ var highlight = require('../highlight');
2
+ var unhighlight = require('../unhighlight');
3
+
4
+ function Selectables(paper, selectTypes, tuneNumber) {
5
+ this.elements = [];
6
+ this.paper = paper;
7
+ this.tuneNumber = tuneNumber;
8
+ this.selectTypes = selectTypes;
9
+ }
10
+
11
+ Selectables.prototype.getElements = function () {
12
+ return this.elements;
13
+ };
14
+
15
+ Selectables.prototype.add = function (absEl, svgEl, isNoteOrTabNumber, staffPos) {
16
+ if (!this.canSelect(absEl))
17
+ return;
18
+ var params;
19
+ if (this.selectTypes === undefined)
20
+ params = { selectable: false, "data-index": this.elements.length}; // This is the old behavior.
21
+ else
22
+ params = { selectable: true, tabindex: 0, "data-index": this.elements.length};
23
+ this.paper.setAttributeOnElement(svgEl, params);
24
+ var sel = { absEl: absEl, svgEl: svgEl, isDraggable: isNoteOrTabNumber };
25
+ if (staffPos !== undefined)
26
+ sel.staffPos = staffPos;
27
+ this.elements.push(sel);
28
+
29
+ };
30
+
31
+ Selectables.prototype.canSelect = function (absEl) {
32
+ if (this.selectTypes === false)
33
+ return false;
34
+ if (!absEl || !absEl.abcelem)
35
+ return false;
36
+ if (this.selectTypes === true)
37
+ return true;
38
+ if (this.selectTypes === undefined) {
39
+ // by default, only notes and tab numbers can be clicked.
40
+ if (absEl.abcelem.el_type === 'note' || absEl.abcelem.el_type === 'tabNumber') {
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ return this.selectTypes.indexOf(absEl.abcelem.el_type) >= 0;
46
+ };
47
+
48
+ Selectables.prototype.wrapSvgEl = function(abcelem, el) {
49
+ var absEl = {
50
+ tuneNumber: this.tuneNumber,
51
+ abcelem: abcelem,
52
+ elemset: [el],
53
+ highlight: highlight,
54
+ unhighlight: unhighlight
55
+ };
56
+ this.add(absEl, el, false);
57
+ };
58
+
59
+ module.exports = Selectables;
@@ -0,0 +1,16 @@
1
+ function drawSeparator(renderer, width) {
2
+ var fill = "rgba(0,0,0,255)";
3
+ var stroke = "rgba(0,0,0,0)";
4
+ var y = Math.round(renderer.y);
5
+ var staffWidth = renderer.controller.width;
6
+ var x1 = (staffWidth - width)/2;
7
+ var x2 = x1 + width;
8
+ var pathString = 'M ' + x1 + ' ' + y +
9
+ ' L ' + x2 + ' ' + y +
10
+ ' L ' + x2 + ' ' + (y+1) +
11
+ ' L ' + x1 + ' ' + (y+1) +
12
+ ' L ' + x1 + ' ' + y + ' z';
13
+ renderer.paper.pathToBack({path:pathString, stroke:stroke, fill:fill, 'class': renderer.controller.classes.generate('defined-text')});
14
+ }
15
+
16
+ module.exports = drawSeparator;
@@ -0,0 +1,45 @@
1
+ function setPaperSize(renderer, maxwidth, scale, responsive) {
2
+ var w = (maxwidth+renderer.padding.right)*scale;
3
+ var h = (renderer.y)*scale;
4
+ if (renderer.isPrint)
5
+ h = Math.max(h, 1056); // 11in x 72pt/in x 1.33px/pt
6
+ // TODO-PER: We are letting the page get as long as it needs now, but eventually that should go to a second page.
7
+
8
+ // for accessibility
9
+ if (renderer.ariaLabel !== '') {
10
+ var text = "Sheet Music";
11
+ if (renderer.abctune && renderer.abctune.metaText && renderer.abctune.metaText.title)
12
+ text += " for \"" + renderer.abctune.metaText.title + '"';
13
+ renderer.paper.setTitle(text);
14
+ var label = renderer.ariaLabel ? renderer.ariaLabel : text;
15
+ renderer.paper.setAttribute("aria-label", label);
16
+ }
17
+
18
+ // for dragging - don't select during drag
19
+ var styles = [
20
+ "-webkit-touch-callout: none;",
21
+ "-webkit-user-select: none;",
22
+ "-khtml-user-select: none;",
23
+ "-moz-user-select: none;",
24
+ "-ms-user-select: none;",
25
+ "user-select: none;"
26
+ ];
27
+ renderer.paper.insertStyles(".abcjs-dragging-in-progress text, .abcjs-dragging-in-progress tspan {" + styles.join(" ") + "}");
28
+
29
+ var parentStyles = { overflow: "hidden" };
30
+ if (responsive === 'resize') {
31
+ renderer.paper.setResponsiveWidth(w, h);
32
+ } else {
33
+ parentStyles.width = "";
34
+ parentStyles.height = h + "px";
35
+ if (scale < 1) {
36
+ parentStyles.width = w + "px";
37
+ renderer.paper.setSize(w / scale, h / scale);
38
+ } else
39
+ renderer.paper.setSize(w, h);
40
+ }
41
+ renderer.paper.setScale(scale);
42
+ renderer.paper.setParentStyles(parentStyles);
43
+ }
44
+
45
+ module.exports = setPaperSize;
File without changes
@@ -0,0 +1,226 @@
1
+ var spacing = require('../abc_spacing');
2
+ var drawBrace = require('./brace');
3
+ var drawVoice = require('./voice');
4
+ var printStaff = require('./staff');
5
+ var printDebugBox = require('./debug-box');
6
+ var printStem = require('./print-stem');
7
+ var nonMusic = require('./non-music');
8
+
9
+ function drawStaffGroup(renderer, params, selectables,lineNumber) {
10
+ // We enter this method with renderer.y pointing to the topmost coordinate that we're allowed to draw.
11
+ // All of the children that will be drawn have a relative "pitch" set, where zero is the first ledger line below the staff.
12
+ // renderer.y will be offset at the beginning of each staff by the amount required to make the relative pitch work.
13
+ // If there are multiple staves, then renderer.y will be incremented for each new staff.
14
+
15
+ var colorIndex;
16
+
17
+ // An invisible marker is useful to be able to find where each system starts.
18
+ addInvisibleMarker(renderer, "abcjs-top-of-system");
19
+
20
+ var startY = renderer.y; // So that it can be restored after we're done.
21
+ // Set the absolute Y position for each staff here, so the voice drawing below can just use if.
22
+ for (var j = 0; j < params.staffs.length; j++) {
23
+ var staff1 = params.staffs[j];
24
+ //renderer.printHorizontalLine(50, renderer.y, "start");
25
+ renderer.moveY(spacing.STEP, staff1.top);
26
+ staff1.absoluteY = renderer.y;
27
+ if (renderer.showDebug) {
28
+ if (renderer.showDebug.indexOf("box") >= 0) {
29
+ boxAllElements(renderer, params.voices, staff1.voices);
30
+ }
31
+ if (renderer.showDebug.indexOf("grid") >= 0) {
32
+ renderer.paper.dottedLine({x1: renderer.padding.left, x2: renderer.padding.left+renderer.controller.width, y1: startY, y2: startY, stroke: "#0000ff"});
33
+ printDebugBox(renderer,
34
+ { x: renderer.padding.left,
35
+ y: renderer.calcY(staff1.originalTop),
36
+ width: renderer.controller.width,
37
+ height: renderer.calcY(staff1.originalBottom) - renderer.calcY(staff1.originalTop),
38
+ fill: renderer.foregroundColor,
39
+ stroke: renderer.foregroundColor,
40
+ "fill-opacity": 0.1,
41
+ "stroke-opacity": 0.1 });
42
+ colorIndex = 0;
43
+ debugPrintGridItem(staff1, 'chordHeightAbove');
44
+ debugPrintGridItem(staff1, 'chordHeightBelow');
45
+ debugPrintGridItem(staff1, 'dynamicHeightAbove');
46
+ debugPrintGridItem(staff1, 'dynamicHeightBelow');
47
+ debugPrintGridItem(staff1, 'endingHeightAbove');
48
+ debugPrintGridItem(staff1, 'lyricHeightAbove');
49
+ debugPrintGridItem(staff1, 'lyricHeightBelow');
50
+ debugPrintGridItem(staff1, 'partHeightAbove');
51
+ debugPrintGridItem(staff1, 'tempoHeightAbove');
52
+ debugPrintGridItem(staff1, 'volumeHeightAbove');
53
+ debugPrintGridItem(staff1, 'volumeHeightBelow');
54
+ }
55
+ }
56
+ renderer.moveY(spacing.STEP, -staff1.bottom);
57
+ if (renderer.showDebug) {
58
+ if (renderer.showDebug.indexOf("grid") >= 0) {
59
+ renderer.paper.dottedLine({
60
+ x1: renderer.padding.left,
61
+ x2: renderer.padding.left + renderer.controller.width,
62
+ y1: renderer.y,
63
+ y2: renderer.y,
64
+ stroke: "#0000aa"
65
+ });
66
+ }
67
+ }
68
+ }
69
+ var topLine; // these are to connect multiple staves. We need to remember where they are.
70
+ var bottomLine;
71
+
72
+ var linePitch = 2;
73
+ var bartop = 0;
74
+ for (var i=0;i<params.voices.length;i++) {
75
+ var staff = params.voices[i].staff;
76
+ var tabName = params.voices[i].tabNameInfos;
77
+ renderer.y = staff.absoluteY ;
78
+ renderer.controller.classes.incrVoice();
79
+ //renderer.y = staff.y;
80
+ // offset for starting the counting at middle C
81
+ if (!params.voices[i].duplicate) {
82
+ // renderer.moveY(spacing.STEP, staff.top);
83
+ if (!topLine) topLine = renderer.calcY(10);
84
+ bottomLine = renderer.calcY(linePitch);
85
+ if (staff.lines !== 0) {
86
+ if (staff.linePitch) {
87
+ linePitch = staff.linePitch;
88
+ }
89
+ renderer.controller.classes.newMeasure();
90
+ var lines = printStaff(renderer, params.startx, params.w, staff.lines, staff.linePitch, staff.dy);
91
+ bottomLine = lines[1];
92
+ staff.bottomLine = bottomLine;
93
+ staff.topLine = lines[0];
94
+ // rework bartop when tabs are present with current staff
95
+ if (staff.hasTab) {
96
+ // do not link to staff above (ugly looking)
97
+ bartop = staff.topLine;
98
+ }
99
+ if (staff.hasStaff) {
100
+ // this is a tab
101
+ bartop = staff.hasStaff.topLine;
102
+ params.voices[i].barto = true;
103
+ params.voices[i].topLine = topLine;
104
+ }
105
+
106
+ }
107
+ printBrace(renderer, staff.absoluteY, params.brace, i, selectables);
108
+ printBrace(renderer, staff.absoluteY, params.bracket, i, selectables);
109
+ }
110
+ drawVoice(renderer, params.voices[i], bartop, selectables, {
111
+ top: startY,
112
+ zero: renderer.y,
113
+ height: params.height*spacing.STEP
114
+ });
115
+ var tabNameHeight = 0;
116
+ if (tabName) {
117
+ // print tab infos on staffBottom
118
+ var r = { rows: [] };
119
+ r.rows.push({ absmove: bottomLine + 2 });
120
+ var leftMargin = 8;
121
+ r.rows.push({ left: params.startx+leftMargin, text: tabName.name, font: 'tablabelfont', klass: 'text instrument-name', anchor: 'start' });
122
+ r.rows.push({ move: tabName.textSize.height });
123
+ nonMusic(renderer, r);
124
+ tabNameHeight = tabName.textSize.height;
125
+ }
126
+
127
+ renderer.controller.classes.newMeasure();
128
+ if (!params.voices[i].duplicate) {
129
+ bartop = renderer.calcY(2 + tabNameHeight); // This connects the bar lines between two different staves.
130
+ // if (staff.bottom < 0)
131
+ // renderer.moveY(spacing.STEP, -staff.bottom);
132
+ }
133
+ }
134
+ renderer.controller.classes.newMeasure();
135
+
136
+ // connect all the staves together with a vertical line
137
+ var staffSize = params.staffs.length;
138
+ if (staffSize > 1) {
139
+ topLine = params.staffs[0].topLine;
140
+ bottomLine = params.staffs[staffSize - 1].bottomLine;
141
+ printStem(renderer, params.startx, 0.6, topLine, bottomLine, null);
142
+ }
143
+ renderer.y = startY;
144
+
145
+ function debugPrintGridItem(staff, key) {
146
+ var colors = [ "rgb(207,27,36)", "rgb(168,214,80)", "rgb(110,161,224)", "rgb(191,119,218)", "rgb(195,30,151)",
147
+ "rgb(31,170,177)", "rgb(220,166,142)" ];
148
+ if (staff.positionY[key]) {
149
+ var height = staff.specialY[key] * spacing.STEP;
150
+ if (key === "chordHeightAbove" && staff.specialY.chordLines && staff.specialY.chordLines.above)
151
+ height *= staff.specialY.chordLines.above;
152
+ if (key === "chordHeightBelow" && staff.specialY.chordLines && staff.specialY.chordLines.below)
153
+ height *= staff.specialY.chordLines.below;
154
+ printDebugBox(renderer,
155
+ { x: renderer.padding.left,
156
+ y: renderer.calcY(staff.positionY[key]),
157
+ width: renderer.controller.width,
158
+ height: height,
159
+ fill: colors[colorIndex],
160
+ stroke: colors[colorIndex],
161
+ "fill-opacity": 0.4,
162
+ "stroke-opacity": 0.4 },
163
+ key.substr(0, 4));
164
+ colorIndex += 1; if (colorIndex > 6) colorIndex = 0;
165
+ }
166
+ }
167
+ }
168
+
169
+ function printBrace(renderer, absoluteY, brace, index, selectables) {
170
+ if (brace) {
171
+ for (var i = 0; i < brace.length; i++) {
172
+ if (brace[i].isStartVoice(index)) {
173
+ brace[i].startY = absoluteY - spacing.STEP * 10;
174
+ brace[i].elemset = drawBrace(renderer, brace[i], selectables);
175
+ }
176
+ }
177
+ }
178
+ }
179
+
180
+ function addInvisibleMarker(renderer, className) {
181
+ var y = Math.round(renderer.y);
182
+ renderer.paper.pathToBack({path:"M 0 " + y + " L 0 0", stroke:"none", fill:"none", "stroke-opacity": 0, "fill-opacity": 0, 'class': renderer.controller.classes.generate(className), 'data-vertical': y });
183
+ }
184
+
185
+ function boxAllElements(renderer, voices, which) {
186
+ for (var i = 0; i < which.length; i++) {
187
+ var children = voices[which[i]].children;
188
+ for (var j = 0; j < children.length; j++) {
189
+ var elem = children[j];
190
+ var coords = elem.getFixedCoords();
191
+ if (elem.invisible || coords.t === undefined || coords.b === undefined)
192
+ continue;
193
+ var height = (coords.t - coords.b)*spacing.STEP;
194
+ printDebugBox(renderer,
195
+ { x: coords.x,
196
+ y: renderer.calcY(coords.t),
197
+ width: coords.w,
198
+ height: height,
199
+ fill: "#88e888",
200
+ "fill-opacity": 0.4,
201
+ stroke: "#4aa93d",
202
+ "stroke-opacity": 0.8
203
+ });
204
+
205
+ for (var k = 0; k < elem.children.length; k++) {
206
+ var relElem = elem.children[k];
207
+ var chord = relElem.getChordDim();
208
+ if (chord) {
209
+ var y = renderer.calcY(relElem.pitch);
210
+ y += relElem.dim.font.size*relElem.getLane();
211
+ printDebugBox(renderer,
212
+ { x: chord.left,
213
+ y: y,
214
+ width: chord.right-chord.left,
215
+ height: relElem.dim.font.size,
216
+ fill: "none",
217
+ stroke: "#4aa93d",
218
+ "stroke-opacity": 0.8
219
+ });
220
+ }
221
+ }
222
+ }
223
+ }
224
+ }
225
+
226
+ module.exports = drawStaffGroup;
@@ -0,0 +1,9 @@
1
+ var printLine = require('./print-line');
2
+
3
+ function printStaffLine(renderer, x1,x2, pitch, klass, name , dy) {
4
+ var y = renderer.calcY(pitch);
5
+ return printLine(renderer,x1,x2,y,klass,name,dy);
6
+ }
7
+
8
+ module.exports = printStaffLine;
9
+
@@ -0,0 +1,33 @@
1
+ var printStaffLine = require('./staff-line');
2
+
3
+ function printStaff(renderer, startx, endx, numLines , linePitch , dy) {
4
+ var klass = "abcjs-top-line";
5
+ var pitch = 2;
6
+ if (linePitch) {
7
+ pitch = linePitch;
8
+ }
9
+ renderer.paper.openGroup({ prepend: true, klass: renderer.controller.classes.generate("abcjs-staff") });
10
+ // If there is one line, it is the B line. Otherwise, the bottom line is the E line.
11
+ var firstYLine = 0;
12
+ var lastYLine = 0;
13
+ if (numLines === 1) {
14
+ printStaffLine(renderer, startx,endx,6, klass);
15
+ firstYLine = renderer.calcY(10);
16
+ lastYLine = renderer.calcY(2);
17
+ } else {
18
+
19
+ for (var i = numLines - 1; i >= 0; i--) {
20
+ var curpitch = (i + 1) * pitch;
21
+ lastYLine = renderer.calcY(curpitch);
22
+ if (firstYLine === 0) {
23
+ firstYLine = lastYLine;
24
+ }
25
+ printStaffLine(renderer, startx, endx, curpitch, klass , null , dy) ;
26
+ klass = undefined;
27
+ }
28
+ }
29
+ renderer.paper.closeGroup();
30
+ return [firstYLine,lastYLine];
31
+ }
32
+
33
+ module.exports = printStaff;
@@ -0,0 +1,40 @@
1
+ var sprintf = require('./sprintf');
2
+ var roundNumber = require('./round-number');
3
+ var printStem = require('./print-stem');
4
+
5
+ function TabLine(renderer , klass , dx , name) {
6
+ this.renderer = renderer;
7
+ if (!dx) dx = 0.35; // default
8
+ this.dx = dx;
9
+ this.klass = klass;
10
+ this.name = name;
11
+ var fill = renderer.foregroundColor;
12
+ this.options = { stroke: "none", fill: fill };
13
+ if (name)
14
+ this.options['data-name'] = name;
15
+ if (klass)
16
+ this.options['class'] = klass;
17
+ }
18
+
19
+ TabLine.prototype.printVertical = function (y1, y2, x) {
20
+ return printStem(this.renderer,
21
+ x,
22
+ this.dx,
23
+ y1,
24
+ y2,
25
+ this.options.klass,
26
+ this.options.name);
27
+ }
28
+
29
+ TabLine.prototype.printHorizontal = function (x1, x2, y) {
30
+ x1 = roundNumber(x1);
31
+ x2 = roundNumber(x2);
32
+ var y1 = roundNumber(y - this.dx);
33
+ var y2 = roundNumber(y + this.dx);
34
+ this.options.path = sprintf("M %f %f L %f %f L %f %f L %f %f z", x1, y1, x2, y1,
35
+ x2, y2, x1, y2);
36
+ return this.renderer.paper.pathToBack(this.options);
37
+ }
38
+
39
+ module.exports = TabLine;
40
+
@@ -0,0 +1,45 @@
1
+ var drawRelativeElement = require('./relative');
2
+ var renderText = require('./text');
3
+
4
+ function drawTempo(renderer, params) {
5
+ var x = params.x;
6
+ if (params.pitch === undefined)
7
+ window.console.error("Tempo Element y-coordinate not set.");
8
+
9
+ //var tempoGroup;
10
+ params.tempo.el_type = "tempo";
11
+ // renderer.wrapInAbsElem(params.tempo, "abcjs-tempo", function () {
12
+ //renderer.paper.openGroup({klass: renderer.controller.classes.generate("tempo wha")});
13
+ // The text is aligned with extra room for descenders but numbers look like they are a little too high, so bump it a little.
14
+ var descenderHeight = 2;
15
+ var y = renderer.calcY(params.pitch) + 2;
16
+ var text;
17
+ var size;
18
+ if (params.tempo.preString) {
19
+ text = renderText(renderer, {x:x, y: y, text: params.tempo.preString, type: 'tempofont', klass: 'abcjs-tempo', anchor: "start", noClass: true, "dominant-baseline": "ideographic", name: "pre"}, true);
20
+ size = renderer.controller.getTextSize.calc(params.tempo.preString, 'tempofont', 'tempo', text);
21
+ var preWidth = size.width;
22
+ var charWidth = preWidth / params.tempo.preString.length; // Just get some average number to increase the spacing.
23
+ x += preWidth + charWidth;
24
+ }
25
+ if (params.note) {
26
+ params.note.setX(x);
27
+ for (var i = 0; i < params.note.children.length; i++)
28
+ drawRelativeElement(renderer, params.note.children[i], x);
29
+ x += (params.note.w + 5);
30
+ var str = "= " + params.tempo.bpm;
31
+ text = renderText(renderer, {x:x, y: y, text: str, type: 'tempofont', klass: 'abcjs-tempo', anchor: "start", noClass: true, name: "beats"});
32
+ size = renderer.controller.getTextSize.calc(str, 'tempofont', 'tempo', text);
33
+ var postWidth = size.width;
34
+ var charWidth2 = postWidth / str.length; // Just get some average number to increase the spacing.
35
+ x += postWidth + charWidth2;
36
+ }
37
+ if (params.tempo.postString) {
38
+ renderText(renderer, {x:x, y: y, text: params.tempo.postString, type: 'tempofont', klass: 'abcjs-tempo', anchor: "start", noClass: true, name: "post"}, true);
39
+ }
40
+ //tempoGroup = renderer.paper.closeGroup();
41
+ // });
42
+ //return [tempoGroup];
43
+ }
44
+
45
+ module.exports = drawTempo;