abcjs 6.1.9 → 6.2.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 (135) hide show
  1. package/LICENSE.md +1 -1
  2. package/RELEASE.md +58 -0
  3. package/dist/abcjs-basic-min.js +2 -2
  4. package/dist/abcjs-basic-min.js.LICENSE +1 -1
  5. package/dist/abcjs-basic.js +4505 -4556
  6. package/dist/abcjs-basic.js.map +1 -1
  7. package/dist/abcjs-plugin-min.js +2 -2
  8. package/dist/abcjs-plugin-min.js.LICENSE +1 -1
  9. package/index.js +2 -2
  10. package/license.js +1 -1
  11. package/package.json +1 -1
  12. package/plugin.js +2 -2
  13. package/src/api/abc_timing_callbacks.js +8 -4
  14. package/src/api/abc_tunebook_svg.js +1 -2
  15. package/src/data/abc_tune.js +3 -3
  16. package/src/parse/abc_common.js +0 -47
  17. package/src/parse/abc_parse.js +16 -16
  18. package/src/parse/abc_parse_book.js +3 -3
  19. package/src/parse/abc_parse_directive.js +26 -7
  20. package/src/parse/abc_parse_header.js +11 -9
  21. package/src/parse/abc_parse_key_voice.js +17 -17
  22. package/src/parse/abc_parse_music.js +88 -105
  23. package/src/parse/abc_tokenizer.js +60 -60
  24. package/src/parse/tune-builder.js +19 -14
  25. package/src/synth/abc_midi_flattener.js +25 -9
  26. package/src/synth/create-synth.js +71 -4
  27. package/src/synth/load-note.js +1 -1
  28. package/src/synth/note-to-midi.js +50 -0
  29. package/src/synth/place-note.js +10 -2
  30. package/src/tablatures/instruments/guitar/tab-guitar.js +0 -2
  31. package/src/tablatures/instruments/string-patterns.js +47 -29
  32. package/src/tablatures/instruments/tab-note.js +26 -103
  33. package/src/tablatures/instruments/violin/tab-violin.js +0 -2
  34. package/src/tablatures/tab-absolute-elements.js +9 -31
  35. package/src/tablatures/tab-renderer.js +2 -2
  36. package/src/test/abc_parser_lint.js +7 -4
  37. package/src/write/README.md +31 -0
  38. package/src/write/creation/abstract-engraver.js +1036 -0
  39. package/src/write/creation/add-chord.js +102 -0
  40. package/src/write/{add-text-if.js → creation/add-text-if.js} +6 -6
  41. package/src/write/{calcHeight.js → creation/calc-height.js} +2 -2
  42. package/src/write/creation/create-clef.js +72 -0
  43. package/src/write/creation/create-key-signature.js +31 -0
  44. package/src/write/creation/create-note-head.js +107 -0
  45. package/src/write/creation/create-time-signature.js +55 -0
  46. package/src/write/creation/decoration.js +357 -0
  47. package/src/write/{abc_absolute_element.js → creation/elements/absolute-element.js} +14 -15
  48. package/src/write/creation/elements/beam-element.js +113 -0
  49. package/src/write/{bottom-text.js → creation/elements/bottom-text.js} +14 -15
  50. package/src/write/{abc_brace_element.js → creation/elements/brace-element.js} +5 -5
  51. package/src/write/creation/elements/free-text.js +41 -0
  52. package/src/write/{abc_relative_element.js → creation/elements/relative-element.js} +7 -7
  53. package/src/write/{separator.js → creation/elements/separator.js} +2 -2
  54. package/src/write/{abc_staff_group_element.js → creation/elements/staff-group-element.js} +4 -4
  55. package/src/write/{subtitle.js → creation/elements/subtitle.js} +3 -3
  56. package/src/write/creation/elements/tempo-element.js +63 -0
  57. package/src/write/{abc_tie_element.js → creation/elements/tie-element.js} +15 -11
  58. package/src/write/{top-text.js → creation/elements/top-text.js} +12 -12
  59. package/src/write/creation/elements/triplet-element.js +28 -0
  60. package/src/write/{abc_voice_element.js → creation/elements/voice-element.js} +3 -3
  61. package/src/write/creation/glyphs.js +226 -0
  62. package/src/write/creation/translate-chord.js +37 -0
  63. package/src/write/draw/absolute.js +5 -5
  64. package/src/write/draw/beam.js +8 -8
  65. package/src/write/draw/brace.js +33 -33
  66. package/src/write/draw/crescendo.js +4 -4
  67. package/src/write/draw/debug-box.js +1 -1
  68. package/src/write/draw/draw.js +7 -7
  69. package/src/write/draw/dynamics.js +2 -2
  70. package/src/write/draw/ending.js +6 -6
  71. package/src/write/draw/glissando.js +17 -17
  72. package/src/write/draw/group-elements.js +51 -51
  73. package/src/write/draw/horizontal-line.js +9 -9
  74. package/src/write/draw/non-music.js +1 -1
  75. package/src/write/draw/print-line.js +25 -16
  76. package/src/write/draw/print-stem.js +15 -5
  77. package/src/write/draw/print-symbol.js +12 -12
  78. package/src/write/draw/print-vertical-line.js +8 -8
  79. package/src/write/draw/relative.js +17 -16
  80. package/src/write/draw/selectables.js +5 -5
  81. package/src/write/draw/separator.js +4 -4
  82. package/src/write/draw/set-paper-size.js +2 -2
  83. package/src/write/draw/sprintf.js +31 -31
  84. package/src/write/draw/staff-group.js +36 -30
  85. package/src/write/draw/staff-line.js +2 -2
  86. package/src/write/draw/staff.js +4 -4
  87. package/src/write/draw/tab-line.js +26 -26
  88. package/src/write/draw/tempo.js +30 -30
  89. package/src/write/draw/text.js +5 -5
  90. package/src/write/draw/tie.js +18 -18
  91. package/src/write/draw/triplet.js +6 -6
  92. package/src/write/draw/voice.js +16 -17
  93. package/src/write/{abc_engraver_controller.js → engraver-controller.js} +58 -51
  94. package/src/write/{classes.js → helpers/classes.js} +6 -6
  95. package/src/write/{get-font-and-attr.js → helpers/get-font-and-attr.js} +9 -7
  96. package/src/write/{get-text-size.js → helpers/get-text-size.js} +5 -5
  97. package/src/write/{set-class.js → helpers/set-class.js} +1 -1
  98. package/src/write/{abc_spacing.js → helpers/spacing.js} +1 -1
  99. package/src/write/{highlight.js → interactive/highlight.js} +1 -1
  100. package/src/write/{selection.js → interactive/selection.js} +34 -31
  101. package/src/write/{unhighlight.js → interactive/unhighlight.js} +1 -1
  102. package/src/write/layout/beam.js +13 -13
  103. package/src/write/layout/get-left-edge-of-staff.js +4 -4
  104. package/src/write/layout/layout.js +74 -74
  105. package/src/write/layout/{setUpperAndLowerElements.js → set-upper-and-lower-elements.js} +8 -8
  106. package/src/write/layout/{staffGroup.js → staff-group.js} +32 -32
  107. package/src/write/layout/triplet.js +4 -4
  108. package/src/write/layout/{VoiceElements.js → voice-elements.js} +23 -23
  109. package/src/write/layout/voice.js +6 -6
  110. package/src/write/{abc_renderer.js → renderer.js} +36 -32
  111. package/src/write/svg.js +35 -35
  112. package/test.js +2 -2
  113. package/types/index.d.ts +37 -8
  114. package/version.js +1 -1
  115. package/src/tablatures/instruments/guitar/guitar-fonts.js +0 -19
  116. package/src/tablatures/instruments/violin/violin-fonts.js +0 -19
  117. package/src/tablatures/transposer.js +0 -110
  118. package/src/write/abc_abstract_engraver.js +0 -1026
  119. package/src/write/abc_beam_element.js +0 -113
  120. package/src/write/abc_create_clef.js +0 -72
  121. package/src/write/abc_create_key_signature.js +0 -33
  122. package/src/write/abc_create_note_head.js +0 -107
  123. package/src/write/abc_create_time_signature.js +0 -55
  124. package/src/write/abc_decoration.js +0 -357
  125. package/src/write/abc_glyphs.js +0 -224
  126. package/src/write/abc_tempo_element.js +0 -63
  127. package/src/write/abc_triplet_element.js +0 -28
  128. package/src/write/add-chord.js +0 -103
  129. package/src/write/format-jazz-chord.js +0 -15
  130. package/src/write/free-text.js +0 -41
  131. /package/src/write/{abc_crescendo_element.js → creation/elements/crescendo-element.js} +0 -0
  132. /package/src/write/{abc_dynamic_decoration.js → creation/elements/dynamic-decoration.js} +0 -0
  133. /package/src/write/{abc_ending_element.js → creation/elements/ending-element.js} +0 -0
  134. /package/src/write/{abc_glissando_element.js → creation/elements/glissando-element.js} +0 -0
  135. /package/src/write/layout/{getBarYAt.js → get-bar-y-at.js} +0 -0
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * Tablature Absolute elements factory
3
3
  */
4
- var AbsoluteElement = require('../write/abc_absolute_element');
5
- var RelativeElement = require('../write/abc_relative_element');
6
- var Transposer = require('./transposer');
4
+ var AbsoluteElement = require('../write/creation/elements/absolute-element');
5
+ var RelativeElement = require('../write/creation/elements/relative-element');
7
6
 
8
7
  function isObject(a) { return a != null && a.constructor === Object; }
9
8
  function cloneObject(dest, src) {
@@ -144,20 +143,6 @@ function graceInRest( absElem ) {
144
143
  return null;
145
144
  }
146
145
 
147
- function checkTransposition(plugin, transposer ,pitches, graceNotes) {
148
- if (plugin.transpose) {
149
- //transposer.transpose(plugin.transpose);
150
- for (var jj = 0; jj < pitches.length; jj++) {
151
- pitches[jj] = transposer.transposeNote(pitches[jj]);
152
- }
153
- if (graceNotes) {
154
- for (var kk = 0; kk < graceNotes.length; kk++) {
155
- graceNotes[kk] = transposer.transposeNote(graceNotes[kk]);
156
- }
157
- }
158
- }
159
- }
160
-
161
146
  function convertToNumber(plugin, pitches, graceNotes) {
162
147
  var tabPos = plugin.semantics.notesToNumber(pitches, graceNotes);
163
148
  if (tabPos.error) {
@@ -196,7 +181,6 @@ TabAbsoluteElements.prototype.build = function (plugin,
196
181
  var staffSize = getInitialStaffSize(staffAbsolute);
197
182
  var source = staffAbsolute[staffIndex+voiceIndex];
198
183
  var dest = staffAbsolute[staffSize+staffIndex+voiceIndex];
199
- var transposer = null;
200
184
  var tabPos = null;
201
185
  var defNote = null;
202
186
  if (source.children[0].abcelem.el_type != 'clef') {
@@ -214,18 +198,14 @@ TabAbsoluteElements.prototype.build = function (plugin,
214
198
  // }
215
199
  if ( (absChild.isClef) ) {
216
200
  dest.children.push(buildTabAbsolute(plugin, absX, relX));
201
+ if (absChild.abcelem.type.indexOf('-8') >= 0) plugin.semantics.strings.clefTranspose = -12
202
+ if (absChild.abcelem.type.indexOf('+8') >= 0) plugin.semantics.strings.clefTranspose = 12
217
203
  }
218
204
  switch (absChild.type) {
219
205
  case 'staff-extra key-signature':
220
206
  // refresh key accidentals
221
207
  this.accidentals = absChild.abcelem.accidentals;
222
208
  plugin.semantics.strings.accidentals = this.accidentals;
223
- if (plugin.transpose) {
224
- transposer = new Transposer(
225
- absChild.abcelem.accidentals,
226
- plugin.transpose
227
- );
228
- }
229
209
  break;
230
210
  case 'bar':
231
211
  plugin.semantics.strings.measureAccidentals = {}
@@ -258,8 +238,6 @@ TabAbsoluteElements.prototype.build = function (plugin,
258
238
  case 'rest':
259
239
  var restGraces = graceInRest(absChild);
260
240
  if (restGraces) {
261
- // check transpose
262
- checkTransposition(plugin, transposer, null, restGraces);
263
241
  // to number conversion
264
242
  tabPos = convertToNumber(plugin, null, restGraces);
265
243
  if (tabPos.error) return;
@@ -274,9 +252,7 @@ TabAbsoluteElements.prototype.build = function (plugin,
274
252
  abs.lyricDim = lyricsDim(absChild);
275
253
  var pitches = absChild.abcelem.pitches;
276
254
  var graceNotes = absChild.abcelem.gracenotes;
277
- // check transpose
278
255
  abs.type = 'tabNumber';
279
- checkTransposition(plugin, transposer, pitches, graceNotes);
280
256
  // to number conversion
281
257
  tabPos = convertToNumber(plugin, pitches, graceNotes);
282
258
  if (tabPos.error) return;
@@ -302,9 +278,11 @@ TabAbsoluteElements.prototype.build = function (plugin,
302
278
  var tabNoteRelative = buildRelativeTabNote(plugin, abs.x+absChild.heads[ll].dx, defNote, curNote, false);
303
279
  abs.children.push(tabNoteRelative);
304
280
  }
305
- defNote.abselem = abs;
306
- tabVoice.push(defNote);
307
- dest.children.push(abs);
281
+ if (defNote.notes.length > 0) {
282
+ defNote.abselem = abs;
283
+ tabVoice.push(defNote);
284
+ dest.children.push(abs);
285
+ }
308
286
  break;
309
287
  }
310
288
  }
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable no-debugger */
2
- var VoiceElement = require('../write/abc_voice_element');
2
+ var VoiceElement = require('../write/creation/elements/voice-element');
3
3
  var TabAbsoluteElements = require('./tab-absolute-elements');
4
- var spacing = require('../write/abc_spacing');
4
+ var spacing = require('../write/helpers/spacing');
5
5
 
6
6
  function initSpecialY() {
7
7
  return {
@@ -318,7 +318,7 @@ var ParserLint = function() {
318
318
  var midiProperties = {
319
319
  cmd: { type: 'string', Enum: [
320
320
  "nobarlines", "barlines", "beataccents", "nobeataccents", "droneon", "droneoff", "noportamento", "channel", "c",
321
- "drumon", "drumoff", "fermatafixed", "fermataproportional", "gchordon", "gchordoff", "bassvol", "chordvol",
321
+ "drumon", "drumoff", "fermatafixed", "fermataproportional", "gchordon", "gchordoff", "bassvol", "chordvol", "bassprog", "chordprog",
322
322
  "controlcombo", "temperamentnormal", "gchord", "ptstress", "beatmod", "deltaloudness", "drumbars", "pitchbend",
323
323
  "gracedivider", "makechordchannels", "randomchordattack", "chordattack", "stressmodel", "transpose",
324
324
  "rtranspose", "volinc", "program", "ratio", "snt", "bendvelocity", "control", "temperamentlinear", "beat", "beatstring",
@@ -335,6 +335,7 @@ var ParserLint = function() {
335
335
  field: "el_type",
336
336
  types: [
337
337
  { value: "clef", properties: appendPositioning(clefProperties) },
338
+ { value: "color", properties: { color: {type: "string", optional: true } } },
338
339
  { value: "bar", properties: prependPositioning(barProperties) },
339
340
  { value: "gap", properties: { type: "number", optional: true } }, // staffbreak
340
341
  { value: "key", properties: appendPositioning(keyProperties) },
@@ -462,9 +463,11 @@ var ParserLint = function() {
462
463
  infospace: { type: "number", optional: true },
463
464
  // landscape: { type: "boolean", optional: true },
464
465
  jazzchords: { type: "boolean", optional: true },
466
+ germanAlphabet: { type: "boolean", optional: true },
465
467
  leftmargin: { type: "number", optional: true },
466
468
  linesep: { type: "number", optional: true },
467
469
  lineskipfac: { type: "number", optional: true },
470
+ lineThickness: { type: "number", optional: true },
468
471
  map: { type: "string", optional: true },
469
472
  maxshrink: { type: "number", optional: true },
470
473
  maxstaffsep: { type: "number", optional: true },
@@ -741,14 +744,14 @@ var ParserLint = function() {
741
744
  this.lint = function(tune, warnings) {
742
745
  var ret = JSONSchema.validate(tune, musicSchema);
743
746
  var err = "";
744
- parseCommon.each(ret.errors, function(e) {
747
+ ret.errors.forEach(function(e) {
745
748
  err += e.property + ": " + e.message + "\n";
746
749
  });
747
750
  var out = ret.output.join("\n");
748
751
 
749
752
  var warn = warnings === undefined ? "No errors" : warnings.join('\n');
750
- warn = parseCommon.gsub(warn, '<span style="text-decoration:underline;font-size:1.3em;font-weight:bold;">', '$$$$');
751
- warn = parseCommon.gsub(warn, '</span>', '$$$$');
753
+ warn = warn.replace(/<span style="text-decoration:underline;font-size:1.3em;font-weight:bold;">/g, '$$$$$$$$');
754
+ warn = warn.replace(/<\/span>/g, '$$$$$$$$');
752
755
  return "Error:------\n" + err + "\nObj:-------\n" + out + "\nWarn:------\n" + warn;
753
756
  };
754
757
  };
@@ -0,0 +1,31 @@
1
+ # Architecture of the engraver
2
+
3
+ The engraver code is handled here. This accepts the output of the parser and does three things:
4
+
5
+ * Creates an SVG
6
+ * Adds data to the parser input
7
+ * Makes the visual elements interactive
8
+
9
+ ## Steps
10
+
11
+ There are separate passes and sub-passes to the processing. The separate passes match the subfolder organization here.
12
+
13
+ They are:
14
+
15
+ ### Element Creation
16
+
17
+ The structure passed in from the parser is traversed and all elements are created. An element consists of two parts:
18
+
19
+ * The Absolute Element: a visual piece of music that is always moved together. For instance, in the key signature of D, the absolute element is an object that contains two sharp symbols. The absolute element has an X- and Y- position in the SVG, and an array of Relative Elements.
20
+
21
+ * Relative Element: These are always attached to an absolute element. They have a relative position to the absolute element and consist of all the glyphs needed. For instance, a dotted eighth note of Bb that is trilled is an absolute element that contains an array of relative elements consisting of a trill, a flat sign, a filled note head, a stem, a flag, and a dot.
22
+
23
+ Each of these elements is a separate object, created with `new` and placed in the structure passed in from the parser.
24
+
25
+ ### Layout
26
+
27
+ After all the elements are created the size of all of them are known, so the layout process begins. There are separate layout algorithms for the horizontal and the vertical positioning.
28
+
29
+ ### Drawing
30
+
31
+ After the layout is finished, it is a rote process to draw the music. All decisions have been made. The structure is then traversed and each element is created in the SVG.