abcjs 6.0.0-beta.9 → 6.0.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.
Files changed (197) 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 +88 -7
  6. package/RELEASE.md +961 -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/index.js +27 -2
  16. package/{static-wrappers/license.js → license.js} +1 -1
  17. package/package.json +26 -29
  18. package/{src/plugin/abc_plugin.js → plugin.js} +31 -19
  19. package/src/api/abc_animation.js +1 -17
  20. package/src/api/abc_tablatures.js +144 -0
  21. package/src/api/abc_timing_callbacks.js +216 -117
  22. package/src/api/abc_tunebook.js +18 -67
  23. package/src/api/abc_tunebook_svg.js +40 -48
  24. package/src/data/abc_tune.js +232 -972
  25. package/src/data/deline-tune.js +199 -0
  26. package/src/edit/abc_editarea.js +112 -0
  27. package/src/edit/abc_editor.js +95 -221
  28. package/src/midi/abc_midi_create.js +48 -50
  29. package/src/parse/abc_common.js +0 -14
  30. package/src/parse/abc_parse.js +167 -1321
  31. package/src/parse/abc_parse_book.js +62 -0
  32. package/src/parse/abc_parse_directive.js +164 -41
  33. package/src/parse/abc_parse_header.js +116 -145
  34. package/src/parse/abc_parse_key_voice.js +26 -20
  35. package/src/parse/abc_parse_music.js +1337 -0
  36. package/src/parse/abc_tokenizer.js +21 -15
  37. package/src/parse/abc_transpose.js +3 -15
  38. package/src/parse/tune-builder.js +896 -0
  39. package/src/parse/wrap_lines.js +205 -453
  40. package/src/synth/abc_midi_flattener.js +1292 -0
  41. package/src/{midi → synth}/abc_midi_renderer.js +44 -17
  42. package/src/synth/abc_midi_sequencer.js +648 -0
  43. package/src/synth/active-audio-context.js +3 -14
  44. package/src/synth/cents-to-factor.js +10 -0
  45. package/src/synth/create-note-map.js +21 -32
  46. package/src/synth/create-synth-control.js +20 -103
  47. package/src/synth/create-synth.js +185 -77
  48. package/src/synth/download-buffer.js +7 -21
  49. package/src/synth/get-midi-file.js +13 -20
  50. package/src/synth/images/{loading.svg → loading.svg.js} +4 -0
  51. package/src/synth/images/loop.svg.js +65 -0
  52. package/src/synth/images/pause.svg.js +10 -0
  53. package/src/synth/images/play.svg.js +9 -0
  54. package/src/synth/images/{reset.svg → reset.svg.js} +5 -1
  55. package/src/synth/instrument-index-to-name.js +1 -16
  56. package/src/synth/load-note.js +37 -76
  57. package/src/synth/pitch-to-note-name.js +0 -15
  58. package/src/synth/pitches-to-perc.js +64 -0
  59. package/src/synth/place-note.js +78 -68
  60. package/src/synth/play-event.js +17 -18
  61. package/src/synth/register-audio-context.js +11 -23
  62. package/src/synth/sounds-cache.js +0 -15
  63. package/src/synth/supports-audio.js +9 -23
  64. package/src/synth/synth-controller.js +80 -49
  65. package/src/synth/synth-sequence.js +20 -34
  66. package/src/tablatures/instruments/guitar/guitar-fonts.js +19 -0
  67. package/src/tablatures/instruments/guitar/guitar-patterns.js +23 -0
  68. package/src/tablatures/instruments/guitar/tab-guitar.js +50 -0
  69. package/src/tablatures/instruments/string-patterns.js +277 -0
  70. package/src/tablatures/instruments/string-tablature.js +56 -0
  71. package/src/tablatures/instruments/tab-note.js +282 -0
  72. package/src/tablatures/instruments/tab-notes.js +41 -0
  73. package/src/tablatures/instruments/violin/tab-violin.js +47 -0
  74. package/src/tablatures/instruments/violin/violin-fonts.js +19 -0
  75. package/src/tablatures/instruments/violin/violin-patterns.js +23 -0
  76. package/src/tablatures/tab-absolute-elements.js +310 -0
  77. package/src/tablatures/tab-common.js +29 -0
  78. package/src/tablatures/tab-renderer.js +243 -0
  79. package/src/tablatures/transposer.js +110 -0
  80. package/src/test/abc_midi_lint.js +5 -22
  81. package/src/test/abc_midi_sequencer_lint.js +11 -14
  82. package/src/test/abc_parser_lint.js +136 -32
  83. package/src/test/abc_vertical_lint.js +94 -32
  84. package/src/test/rendering-lint.js +38 -5
  85. package/src/write/abc_absolute_element.js +112 -120
  86. package/src/write/abc_abstract_engraver.js +102 -253
  87. package/src/write/abc_beam_element.js +30 -290
  88. package/src/write/abc_brace_element.js +12 -121
  89. package/src/write/abc_create_clef.js +21 -32
  90. package/src/write/abc_create_key_signature.js +8 -26
  91. package/src/write/abc_create_note_head.js +107 -0
  92. package/src/write/abc_create_time_signature.js +2 -21
  93. package/src/write/abc_crescendo_element.js +3 -50
  94. package/src/write/abc_decoration.js +7 -30
  95. package/src/write/abc_dynamic_decoration.js +3 -37
  96. package/src/write/abc_ending_element.js +1 -57
  97. package/src/write/abc_engraver_controller.js +111 -234
  98. package/src/write/abc_glyphs.js +8 -18
  99. package/src/write/abc_relative_element.js +57 -97
  100. package/src/write/abc_renderer.js +10 -832
  101. package/src/write/abc_spacing.js +0 -15
  102. package/src/write/abc_staff_group_element.js +14 -349
  103. package/src/write/abc_tempo_element.js +9 -117
  104. package/src/write/abc_tie_element.js +5 -68
  105. package/src/write/abc_triplet_element.js +6 -124
  106. package/src/write/abc_voice_element.js +7 -222
  107. package/src/write/add-chord.js +103 -0
  108. package/src/write/add-text-if.js +33 -0
  109. package/src/write/bottom-text.js +79 -0
  110. package/src/write/calcHeight.js +17 -0
  111. package/src/write/classes.js +100 -0
  112. package/src/write/draw/absolute.js +68 -0
  113. package/src/write/draw/beam.js +56 -0
  114. package/src/write/draw/brace.js +106 -0
  115. package/src/write/draw/crescendo.js +38 -0
  116. package/src/write/draw/debug-box.js +8 -0
  117. package/src/write/draw/draw.js +56 -0
  118. package/src/write/draw/dynamics.js +20 -0
  119. package/src/write/draw/ending.js +46 -0
  120. package/src/write/draw/group-elements.js +66 -0
  121. package/src/write/draw/horizontal-line.js +25 -0
  122. package/src/write/draw/non-music.js +50 -0
  123. package/src/write/draw/print-line.js +24 -0
  124. package/src/write/draw/print-path.js +7 -0
  125. package/src/write/draw/print-stem.js +30 -0
  126. package/src/write/draw/print-symbol.js +59 -0
  127. package/src/write/draw/print-vertical-line.js +18 -0
  128. package/src/write/draw/relative.js +77 -0
  129. package/src/write/draw/round-number.js +5 -0
  130. package/src/write/draw/selectables.js +59 -0
  131. package/src/write/draw/separator.js +16 -0
  132. package/src/write/draw/set-paper-size.js +45 -0
  133. package/src/write/{sprintf.js → draw/sprintf.js} +0 -0
  134. package/src/write/draw/staff-group.js +226 -0
  135. package/src/write/draw/staff-line.js +9 -0
  136. package/src/write/draw/staff.js +33 -0
  137. package/src/write/draw/tab-line.js +40 -0
  138. package/src/write/draw/tempo.js +45 -0
  139. package/src/write/draw/text.js +71 -0
  140. package/src/write/draw/tie.js +97 -0
  141. package/src/write/draw/triplet.js +46 -0
  142. package/src/write/draw/voice.js +102 -0
  143. package/src/write/format-jazz-chord.js +15 -0
  144. package/src/write/free-text.js +41 -0
  145. package/src/write/get-font-and-attr.js +37 -0
  146. package/src/write/get-text-size.js +56 -0
  147. package/src/write/highlight.js +11 -0
  148. package/src/write/layout/VoiceElements.js +121 -0
  149. package/src/write/layout/beam.js +213 -0
  150. package/src/write/layout/get-left-edge-of-staff.js +56 -0
  151. package/src/write/layout/getBarYAt.js +6 -0
  152. package/src/write/layout/layout.js +94 -0
  153. package/src/write/layout/setUpperAndLowerElements.js +232 -0
  154. package/src/write/layout/staffGroup.js +146 -0
  155. package/src/write/layout/triplet.js +75 -0
  156. package/src/write/layout/voice.js +137 -0
  157. package/src/write/selection.js +188 -70
  158. package/src/write/separator.js +10 -0
  159. package/src/write/set-class.js +21 -0
  160. package/src/write/subtitle.js +12 -0
  161. package/src/write/svg.js +95 -43
  162. package/src/write/top-text.js +54 -0
  163. package/src/write/unhighlight.js +11 -0
  164. package/test.js +27 -64
  165. package/types/index.d.ts +1095 -0
  166. package/version.js +1 -1
  167. package/.babelrc +0 -5
  168. package/.eslintrc +0 -3
  169. package/.gitmodules +0 -3
  170. package/Dockerfile +0 -8
  171. package/abcjs-midi.css +0 -166
  172. package/build-utils/loadPresets.js +0 -14
  173. package/build-utils/presets/webpack.analyze.js +0 -6
  174. package/build-utils/presets/webpack.optimize.js +0 -30
  175. package/build-utils/webpack.development.js +0 -14
  176. package/build-utils/webpack.production.js +0 -35
  177. package/deploy-docs.sh +0 -25
  178. package/docker-compose.yml +0 -13
  179. package/docs/README.md +0 -33
  180. package/fix-versions.sh +0 -23
  181. package/midi.js +0 -62
  182. package/src/api/abc_tunebook_midi.js +0 -116
  183. package/src/midi/abc_midi_controls.js +0 -701
  184. package/src/midi/abc_midi_flattener.js +0 -1119
  185. package/src/midi/abc_midi_js_preparer.js +0 -243
  186. package/src/midi/abc_midi_sequencer.js +0 -401
  187. package/src/midi/abc_midi_ui_generator.js +0 -86
  188. package/src/plugin/abc_plugin_midi.js +0 -220
  189. package/src/synth/images/loop.svg +0 -61
  190. package/src/synth/images/pause.svg +0 -6
  191. package/src/synth/images/play.svg +0 -5
  192. package/src/transform/abc2abc_write.js +0 -395
  193. package/static-wrappers/basic.js +0 -2
  194. package/static-wrappers/midi.js +0 -2
  195. package/static-wrappers/plugin-midi.js +0 -6
  196. package/static-wrappers/plugin.js +0 -6
  197. package/webpack.config.js +0 -29
@@ -1,24 +1,12 @@
1
- // Copyright (C) 2015-2020 Paul Rosen (paul at paulrosen dot net)
2
- //
3
- // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
- // documentation files (the "Software"), to deal in the Software without restriction, including without limitation
5
- // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
6
- // to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7
- //
8
- // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9
- //
10
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
11
- // BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
12
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
13
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
14
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
-
16
1
  var tunebook = require('./abc_tunebook');
17
2
  var Tune = require('../data/abc_tune');
18
3
 
19
4
  var EngraverController = require('../write/abc_engraver_controller');
20
5
  var Parse = require('../parse/abc_parse');
21
6
  var wrap = require('../parse/wrap_lines');
7
+ var parseCommon = require("../parse/abc_common");
8
+ // var tablatures = require('./abc_tablatures');
9
+
22
10
 
23
11
  var resizeDivs = {};
24
12
  function resizeOuter() {
@@ -40,7 +28,7 @@ try {
40
28
  // if we aren't in a browser, this code will crash, but it is not needed then either.
41
29
  }
42
30
 
43
- function renderOne(div, tune, params, tuneNumber) {
31
+ function renderOne(div, tune, params, tuneNumber, lineOffset) {
44
32
  if (params.viewportHorizontal) {
45
33
  // Create an inner div that holds the music, so that the passed in div will be the viewport.
46
34
  div.innerHTML = '<div class="abcjs-inner"></div>';
@@ -62,7 +50,7 @@ function renderOne(div, tune, params, tuneNumber) {
62
50
  else
63
51
  div.innerHTML = "";
64
52
  var engraver_controller = new EngraverController(div, params);
65
- engraver_controller.engraveABC(tune, tuneNumber);
53
+ engraver_controller.engraveABC(tune, tuneNumber, lineOffset);
66
54
  tune.engraver = engraver_controller;
67
55
  if (params.viewportVertical || params.viewportHorizontal) {
68
56
  // If we added a wrapper around the div, then we need to size the wrapper, too.
@@ -77,8 +65,6 @@ function renderEachLineSeparately(div, tune, params, tuneNumber) {
77
65
  obj.formatting = tune.formatting;
78
66
  obj.media = tune.media;
79
67
  obj.version = tune.version;
80
- obj.metaText = {};
81
- obj.lines = [];
82
68
  return obj;
83
69
  }
84
70
 
@@ -94,14 +80,7 @@ function renderEachLineSeparately(div, tune, params, tuneNumber) {
94
80
 
95
81
  if (i === 0) {
96
82
  // These items go on top of the music
97
- tuneLine.metaText.tempo = tune.metaText.tempo;
98
- tuneLine.metaText.title = tune.metaText.title;
99
- tuneLine.metaText.header = tune.metaText.header;
100
- tuneLine.metaText.rhythm = tune.metaText.rhythm;
101
- tuneLine.metaText.origin = tune.metaText.origin;
102
- tuneLine.metaText.composer = tune.metaText.composer;
103
- tuneLine.metaText.author = tune.metaText.author;
104
- tuneLine.metaText.partOrder = tune.metaText.partOrder;
83
+ tuneLine.copyTopInfo(tune);
105
84
  }
106
85
 
107
86
  // push the lines until we get to a music line
@@ -120,17 +99,7 @@ function renderEachLineSeparately(div, tune, params, tuneNumber) {
120
99
 
121
100
  // These items go below the music
122
101
  tuneLine = tunes[tunes.length-1];
123
- tuneLine.metaText.unalignedWords = tune.metaText.unalignedWords;
124
- tuneLine.metaText.book = tune.metaText.book;
125
- tuneLine.metaText.source = tune.metaText.source;
126
- tuneLine.metaText.discography = tune.metaText.discography;
127
- tuneLine.metaText.notes = tune.metaText.notes;
128
- tuneLine.metaText.transcription = tune.metaText.transcription;
129
- tuneLine.metaText.history = tune.metaText.history;
130
- tuneLine.metaText['abc-copyright'] = tune.metaText['abc-copyright'];
131
- tuneLine.metaText['abc-creator'] = tune.metaText['abc-creator'];
132
- tuneLine.metaText['abc-edited-by'] = tune.metaText['abc-edited-by'];
133
- tuneLine.metaText.footer = tune.metaText.footer;
102
+ tuneLine.copyBottomInfo(tune);
134
103
 
135
104
  // Now create sub-divs and render each line. Need to copy the params to change the padding for the interior slices.
136
105
  var ep = {};
@@ -141,22 +110,31 @@ function renderEachLineSeparately(div, tune, params, tuneNumber) {
141
110
  }
142
111
  var origPaddingTop = ep.paddingtop;
143
112
  var origPaddingBottom = ep.paddingbottom;
113
+ var currentScrollY = div.parentNode.scrollTop; // If there is scrolling it will be lost during the redraw so remember it.
114
+ var currentScrollX = div.parentNode.scrollLeft;
144
115
  div.innerHTML = "";
116
+ var lineCount = 0;
145
117
  for (var k = 0; k < tunes.length; k++) {
146
118
  var lineEl = document.createElement("div");
147
119
  div.appendChild(lineEl);
148
120
 
149
121
  if (k === 0) {
150
122
  ep.paddingtop = origPaddingTop;
151
- ep.paddingbottom = -20;
123
+ ep.paddingbottom = 0;
152
124
  } else if (k === tunes.length-1) {
153
125
  ep.paddingtop = 10;
154
126
  ep.paddingbottom = origPaddingBottom;
155
127
  } else {
156
128
  ep.paddingtop = 10;
157
- ep.paddingbottom = -20;
129
+ ep.paddingbottom = 0;
158
130
  }
159
- renderOne(lineEl, tunes[k], ep, tuneNumber);
131
+ if (k < tunes.length-1) {
132
+ // If it is not the last line, force stretchlast. If it is, stretchlast might have been set by the input parameters.
133
+ tunes[k].formatting = parseCommon.clone(tunes[k].formatting);
134
+ tunes[k].formatting.stretchlast = true;
135
+ }
136
+ renderOne(lineEl, tunes[k], ep, tuneNumber, lineCount);
137
+ lineCount += tunes[k].lines.length;
160
138
  if (k === 0)
161
139
  tune.engraver = tunes[k].engraver;
162
140
  else {
@@ -166,6 +144,9 @@ function renderEachLineSeparately(div, tune, params, tuneNumber) {
166
144
  tune.engraver.staffgroups.push(tunes[k].engraver.staffgroups[0]);
167
145
  }
168
146
  }
147
+ if (currentScrollX || currentScrollY) {
148
+ div.parentNode.scrollTo(currentScrollX, currentScrollY);
149
+ }
169
150
  }
170
151
 
171
152
  // A quick way to render a tune from javascript when interactivity is not required.
@@ -195,6 +176,9 @@ var renderAbc = function(output, abc, parserParams, engraverParams, renderParams
195
176
  params[key] = parserParams[key];
196
177
  }
197
178
  }
179
+ if (params.warnings_id && params.tablature) {
180
+ params.tablature.warning_id = params.warnings_id;
181
+ }
198
182
  }
199
183
  if (engraverParams) {
200
184
  for (key in engraverParams) {
@@ -231,7 +215,7 @@ var renderAbc = function(output, abc, parserParams, engraverParams, renderParams
231
215
  return tune;
232
216
  }
233
217
  else if (removeDiv || !params.oneSvgPerLine || tune.lines.length < 2)
234
- renderOne(div, tune, params, tuneNumber);
218
+ renderOne(div, tune, params, tuneNumber, 0);
235
219
  else
236
220
  renderEachLineSeparately(div, tune, params, tuneNumber);
237
221
  if (removeDiv)
@@ -246,13 +230,21 @@ function doLineWrapping(div, tune, tuneNumber, abcString, params) {
246
230
  var engraver_controller = new EngraverController(div, params);
247
231
  var widths = engraver_controller.getMeasureWidths(tune);
248
232
 
249
- var ret = wrap.calcLineWraps(tune, widths, abcString, params, Parse, engraver_controller);
250
- if (!params.oneSvgPerLine || ret.tune.lines.length < 2)
251
- renderOne(div, ret.tune, ret.revisedParams, tuneNumber);
233
+ var ret = wrap.calcLineWraps(tune, widths, params);
234
+ if (ret.reParse) {
235
+ var abcParser = new Parse();
236
+ abcParser.parse(abcString, ret.revisedParams);
237
+ tune = abcParser.getTune();
238
+ var warnings = abcParser.getWarnings();
239
+ if (warnings)
240
+ tune.warnings = warnings;
241
+ }
242
+ if (!params.oneSvgPerLine || tune.lines.length < 2)
243
+ renderOne(div, tune, ret.revisedParams, tuneNumber, 0);
252
244
  else
253
- renderEachLineSeparately(div, ret.tune, ret.revisedParams, tuneNumber);
254
- ret.tune.explanation = ret.explanation;
255
- return ret.tune;
245
+ renderEachLineSeparately(div, tune, ret.revisedParams, tuneNumber);
246
+ tune.explanation = ret.explanation;
247
+ return tune;
256
248
  }
257
249
 
258
250
  module.exports = renderAbc;