abcjs 6.0.0-beta.35 → 6.0.0-beta.39

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 (73) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +15 -6
  3. package/RELEASE.md +74 -0
  4. package/dist/abcjs-basic-min.js +2 -2
  5. package/dist/abcjs-basic-min.js.LICENSE +2 -2
  6. package/dist/abcjs-basic.js +2599 -328
  7. package/dist/abcjs-basic.js.map +1 -1
  8. package/dist/abcjs-plugin-min.js +2 -2
  9. package/dist/abcjs-plugin-min.js.LICENSE +2 -2
  10. package/dist/report-basic.html +37 -0
  11. package/dist/report-before-glyph-compress.html +37 -0
  12. package/dist/report-brown-ts-target-es5.html +37 -0
  13. package/dist/report-dev-orig-no-babel.html +37 -0
  14. package/dist/report-synth.html +37 -0
  15. package/docker-build.sh +1 -0
  16. package/glyphs.json +1 -0
  17. package/index.js +23 -1
  18. package/license.js +1 -1
  19. package/package.json +2 -1
  20. package/plugin.js +23 -1
  21. package/src/api/abc_tablatures.js +144 -0
  22. package/src/api/abc_tunebook.js +10 -1
  23. package/src/api/abc_tunebook_svg.js +18 -6
  24. package/src/data/abc_tune.js +26 -24
  25. package/src/edit/abc_editor.js +29 -11
  26. package/src/parse/abc_parse.js +4 -2
  27. package/src/parse/abc_parse_directive.js +12 -6
  28. package/src/parse/tune-builder.js +1 -1
  29. package/src/synth/abc_midi_flattener.js +11 -2
  30. package/src/synth/abc_midi_sequencer.js +4 -1
  31. package/src/synth/create-synth.js +105 -34
  32. package/src/synth/load-note.js +34 -65
  33. package/src/synth/place-note.js +63 -59
  34. package/src/tablatures/instruments/guitar/guitar-fonts.js +19 -0
  35. package/src/tablatures/instruments/guitar/guitar-patterns.js +23 -0
  36. package/src/tablatures/instruments/guitar/tab-guitar.js +50 -0
  37. package/src/tablatures/instruments/string-patterns.js +277 -0
  38. package/src/tablatures/instruments/string-tablature.js +56 -0
  39. package/src/tablatures/instruments/tab-note.js +282 -0
  40. package/src/tablatures/instruments/tab-notes.js +41 -0
  41. package/src/tablatures/instruments/violin/tab-violin.js +47 -0
  42. package/src/tablatures/instruments/violin/violin-fonts.js +19 -0
  43. package/src/tablatures/instruments/violin/violin-patterns.js +23 -0
  44. package/src/tablatures/tab-absolute-elements.js +310 -0
  45. package/src/tablatures/tab-common.js +29 -0
  46. package/src/tablatures/tab-renderer.js +243 -0
  47. package/src/tablatures/transposer.js +110 -0
  48. package/src/test/abc_parser_lint.js +3 -0
  49. package/src/write/abc_absolute_element.js +2 -2
  50. package/src/write/abc_engraver_controller.js +19 -11
  51. package/src/write/abc_glyphs.js +2 -0
  52. package/src/write/abc_relative_element.js +5 -3
  53. package/src/write/abc_renderer.js +5 -1
  54. package/src/write/draw/absolute.js +5 -1
  55. package/src/write/draw/draw.js +5 -6
  56. package/src/write/draw/non-music.js +3 -1
  57. package/src/write/draw/print-line.js +24 -0
  58. package/src/write/draw/relative.js +14 -2
  59. package/src/write/draw/selectables.js +9 -6
  60. package/src/write/draw/staff-group.js +44 -8
  61. package/src/write/draw/staff-line.js +3 -19
  62. package/src/write/draw/staff.js +15 -2
  63. package/src/write/draw/tab-line.js +40 -0
  64. package/src/write/draw/text.js +3 -0
  65. package/src/write/draw/voice.js +9 -1
  66. package/src/write/format-jazz-chord.js +2 -2
  67. package/src/write/layout/staffGroup.js +23 -1
  68. package/src/write/layout/voice.js +2 -1
  69. package/src/write/svg.js +2 -1
  70. package/temp.txt +0 -0
  71. package/test.js +23 -0
  72. package/types/index.d.ts +73 -25
  73. package/version.js +1 -1
@@ -16,7 +16,7 @@ var Classes = require('./classes');
16
16
  var GetFontAndAttr = require('./get-font-and-attr');
17
17
  var GetTextSize = require('./get-text-size');
18
18
  var draw = require('./draw/draw');
19
- var calcHeight = require('./calcHeight');
19
+ var tablatures = require('../api/abc_tablatures');
20
20
 
21
21
  /**
22
22
  * @class
@@ -38,11 +38,11 @@ var EngraverController = function(paper, params) {
38
38
  this.selectTypes = params.selectTypes;
39
39
  this.responsive = params.responsive;
40
40
  this.space = 3*spacing.SPACE;
41
- this.initialClef = params.initialClef
41
+ this.initialClef = params.initialClef;
42
42
  this.scale = params.scale ? parseFloat(params.scale) : 0;
43
43
  this.classes = new Classes({ shouldAddClasses: params.add_classes });
44
44
  if (!(this.scale > 0.1))
45
- this.scale = undefined;
45
+ this.scale = undefined;
46
46
 
47
47
  if (params.staffwidth) {
48
48
  // Note: Normally all measurements to the engraver are in POINTS. However, if a person is formatting for the
@@ -88,18 +88,18 @@ EngraverController.prototype.reset = function() {
88
88
  /**
89
89
  * run the engraving process
90
90
  */
91
- EngraverController.prototype.engraveABC = function(abctunes, tuneNumber) {
91
+ EngraverController.prototype.engraveABC = function(abctunes, tuneNumber, lineOffset) {
92
92
  if (abctunes[0]===undefined) {
93
93
  abctunes = [abctunes];
94
94
  }
95
95
  this.reset();
96
96
 
97
97
  for (var i = 0; i < abctunes.length; i++) {
98
- if (tuneNumber === undefined)
99
- tuneNumber = i;
100
- this.getFontAndAttr = new GetFontAndAttr(abctunes[i].formatting, this.classes);
101
- this.getTextSize = new GetTextSize(this.getFontAndAttr, this.renderer.paper);
102
- this.engraveTune(abctunes[i], tuneNumber);
98
+ if (tuneNumber === undefined)
99
+ tuneNumber = i;
100
+ this.getFontAndAttr = new GetFontAndAttr(abctunes[i].formatting, this.classes);
101
+ this.getTextSize = new GetTextSize(this.getFontAndAttr, this.renderer.paper);
102
+ this.engraveTune(abctunes[i], tuneNumber, lineOffset);
103
103
  }
104
104
  };
105
105
 
@@ -168,6 +168,9 @@ EngraverController.prototype.getMeasureWidths = function(abcTune) {
168
168
  EngraverController.prototype.setupTune = function (abcTune, tuneNumber) {
169
169
  this.classes.reset();
170
170
 
171
+ if (abcTune.formatting.jazzchords !== undefined)
172
+ this.jazzchords = abcTune.formatting.jazzchords;
173
+
171
174
  this.renderer.newTune(abcTune);
172
175
  this.engraver = new AbstractEngraver(this.getTextSize, tuneNumber, {
173
176
  bagpipes: abcTune.formatting.bagpipes,
@@ -224,7 +227,7 @@ EngraverController.prototype.constructTuneElements = function (abcTune) {
224
227
  abcTune.bottomText = new BottomText(abcTune.metaText, this.width, this.renderer.isPrint, this.renderer.padding.left, this.renderer.spacing, this.getTextSize);
225
228
  };
226
229
 
227
- EngraverController.prototype.engraveTune = function (abcTune, tuneNumber) {
230
+ EngraverController.prototype.engraveTune = function (abcTune, tuneNumber, lineOffset) {
228
231
  var scale = this.setupTune(abcTune, tuneNumber);
229
232
 
230
233
  // Create all of the element objects that will appear on the page.
@@ -233,8 +236,13 @@ EngraverController.prototype.engraveTune = function (abcTune, tuneNumber) {
233
236
  // Do all the positioning, both horizontally and vertically
234
237
  var maxWidth = layout(this.renderer, abcTune, this.width, this.space);
235
238
 
239
+ // Deal with tablature for staff
240
+ if (abcTune.tablatures) {
241
+ tablatures.layoutTablatures(this.renderer, abcTune);
242
+ }
243
+
236
244
  // Do all the writing to the SVG
237
- var ret = draw(this.renderer, this.classes, abcTune, this.width, maxWidth, this.responsive, scale, this.selectTypes, tuneNumber);
245
+ var ret = draw(this.renderer, this.classes, abcTune, this.width, maxWidth, this.responsive, scale, this.selectTypes, tuneNumber, lineOffset);
238
246
  this.staffgroups = ret.staffgroups;
239
247
  this.selectables = ret.selectables;
240
248
 
@@ -70,6 +70,8 @@ var spacing = require('./abc_spacing');
70
70
  'clefs.F':{d:[['M',6.30,-7.80],['c',0.36,-0.03,1.65,0.00,2.13,0.03],['c',3.60,0.42,6.03,2.10,6.93,4.86],['c',0.27,0.84,0.36,1.50,0.36,2.58],['c',0.00,0.90,-0.03,1.35,-0.18,2.16],['c',-0.78,3.78,-3.54,7.08,-8.37,9.96],['c',-1.74,1.05,-3.87,2.13,-6.18,3.12],['c',-0.39,0.18,-0.75,0.33,-0.81,0.36],['c',-0.06,0.03,-0.15,0.06,-0.18,0.06],['c',-0.15,0.00,-0.33,-0.18,-0.33,-0.33],['c',0.00,-0.15,0.06,-0.21,0.51,-0.48],['c',3.00,-1.77,5.13,-3.21,6.84,-4.74],['c',0.51,-0.45,1.59,-1.50,1.95,-1.95],['c',1.89,-2.19,2.88,-4.32,3.15,-6.78],['c',0.06,-0.42,0.06,-1.77,0.00,-2.19],['c',-0.24,-2.01,-0.93,-3.63,-2.04,-4.71],['c',-0.63,-0.63,-1.29,-1.02,-2.07,-1.20],['c',-1.62,-0.39,-3.36,0.15,-4.56,1.44],['c',-0.54,0.60,-1.05,1.47,-1.32,2.22],['l',-0.09,0.21],['l',0.24,-0.12],['c',0.39,-0.21,0.63,-0.24,1.11,-0.24],['c',0.30,0.00,0.45,0.00,0.66,0.06],['c',1.92,0.48,2.85,2.55,1.95,4.38],['c',-0.45,0.99,-1.41,1.62,-2.46,1.71],['c',-1.47,0.09,-2.91,-0.87,-3.39,-2.25],['c',-0.18,-0.57,-0.21,-1.32,-0.03,-2.28],['c',0.39,-2.25,1.83,-4.20,3.81,-5.19],['c',0.69,-0.36,1.59,-0.60,2.37,-0.69],['z'],['m',11.58,2.52],['c',0.84,-0.21,1.71,0.30,1.89,1.14],['c',0.30,1.17,-0.72,2.19,-1.89,1.89],['c',-0.99,-0.21,-1.50,-1.32,-1.02,-2.25],['c',0.18,-0.39,0.60,-0.69,1.02,-0.78],['z'],['m',0.00,7.50],['c',0.84,-0.21,1.71,0.30,1.89,1.14],['c',0.21,0.87,-0.30,1.71,-1.14,1.89],['c',-0.87,0.21,-1.71,-0.30,-1.89,-1.14],['c',-0.21,-0.84,0.30,-1.71,1.14,-1.89],['z']],w:20.153,h:23.142},
71
71
  'clefs.G':{d:[['M',9.69,-37.41],['c',0.09,-0.09,0.24,-0.06,0.36,0.00],['c',0.12,0.09,0.57,0.60,0.96,1.11],['c',1.77,2.34,3.21,5.85,3.57,8.73],['c',0.21,1.56,0.03,3.27,-0.45,4.86],['c',-0.69,2.31,-1.92,4.47,-4.23,7.44],['c',-0.30,0.39,-0.57,0.72,-0.60,0.75],['c',-0.03,0.06,0.00,0.15,0.18,0.78],['c',0.54,1.68,1.38,4.44,1.68,5.49],['l',0.09,0.42],['l',0.39,0.00],['c',1.47,0.09,2.76,0.51,3.96,1.29],['c',1.83,1.23,3.06,3.21,3.39,5.52],['c',0.09,0.45,0.12,1.29,0.06,1.74],['c',-0.09,1.02,-0.33,1.83,-0.75,2.73],['c',-0.84,1.71,-2.28,3.06,-4.02,3.72],['l',-0.33,0.12],['l',0.03,1.26],['c',0.00,1.74,-0.06,3.63,-0.21,4.62],['c',-0.45,3.06,-2.19,5.49,-4.47,6.21],['c',-0.57,0.18,-0.90,0.21,-1.59,0.21],['c',-0.69,0.00,-1.02,-0.03,-1.65,-0.21],['c',-1.14,-0.27,-2.13,-0.84,-2.94,-1.65],['c',-0.99,-0.99,-1.56,-2.16,-1.71,-3.54],['c',-0.09,-0.81,0.06,-1.53,0.45,-2.13],['c',0.63,-0.99,1.83,-1.56,3.00,-1.53],['c',1.50,0.09,2.64,1.32,2.73,2.94],['c',0.06,1.47,-0.93,2.70,-2.37,2.97],['c',-0.45,0.06,-0.84,0.03,-1.29,-0.09],['l',-0.21,-0.09],['l',0.09,0.12],['c',0.39,0.54,0.78,0.93,1.32,1.26],['c',1.35,0.87,3.06,1.02,4.35,0.36],['c',1.44,-0.72,2.52,-2.28,2.97,-4.35],['c',0.15,-0.66,0.24,-1.50,0.30,-3.03],['c',0.03,-0.84,0.03,-2.94,0.00,-3.00],['c',-0.03,0.00,-0.18,0.00,-0.36,0.03],['c',-0.66,0.12,-0.99,0.12,-1.83,0.12],['c',-1.05,0.00,-1.71,-0.06,-2.61,-0.30],['c',-4.02,-0.99,-7.11,-4.35,-7.80,-8.46],['c',-0.12,-0.66,-0.12,-0.99,-0.12,-1.83],['c',0.00,-0.84,0.00,-1.14,0.15,-1.92],['c',0.36,-2.28,1.41,-4.62,3.30,-7.29],['l',2.79,-3.60],['c',0.54,-0.66,0.96,-1.20,0.96,-1.23],['c',0.00,-0.03,-0.09,-0.33,-0.18,-0.69],['c',-0.96,-3.21,-1.41,-5.28,-1.59,-7.68],['c',-0.12,-1.38,-0.15,-3.09,-0.06,-3.96],['c',0.33,-2.67,1.38,-5.07,3.12,-7.08],['c',0.36,-0.42,0.99,-1.05,1.17,-1.14],['z'],['m',2.01,4.71],['c',-0.15,-0.30,-0.30,-0.54,-0.30,-0.54],['c',-0.03,0.00,-0.18,0.09,-0.30,0.21],['c',-2.40,1.74,-3.87,4.20,-4.26,7.11],['c',-0.06,0.54,-0.06,1.41,-0.03,1.89],['c',0.09,1.29,0.48,3.12,1.08,5.22],['c',0.15,0.42,0.24,0.78,0.24,0.81],['c',0.00,0.03,0.84,-1.11,1.23,-1.68],['c',1.89,-2.73,2.88,-5.07,3.15,-7.53],['c',0.09,-0.57,0.12,-1.74,0.06,-2.37],['c',-0.09,-1.23,-0.27,-1.92,-0.87,-3.12],['z'],['m',-2.94,20.70],['c',-0.21,-0.72,-0.39,-1.32,-0.42,-1.32],['c',0.00,0.00,-1.20,1.47,-1.86,2.37],['c',-2.79,3.63,-4.02,6.30,-4.35,9.30],['c',-0.03,0.21,-0.03,0.69,-0.03,1.08],['c',0.00,0.69,0.00,0.75,0.06,1.11],['c',0.12,0.54,0.27,0.99,0.51,1.47],['c',0.69,1.38,1.83,2.55,3.42,3.42],['c',0.96,0.54,2.07,0.90,3.21,1.08],['c',0.78,0.12,2.04,0.12,2.94,-0.03],['c',0.51,-0.06,0.45,-0.03,0.42,-0.30],['c',-0.24,-3.33,-0.72,-6.33,-1.62,-10.08],['c',-0.09,-0.39,-0.18,-0.75,-0.18,-0.78],['c',-0.03,-0.03,-0.42,0.00,-0.81,0.09],['c',-0.90,0.18,-1.65,0.57,-2.22,1.14],['c',-0.72,0.72,-1.08,1.65,-1.05,2.64],['c',0.06,0.96,0.48,1.83,1.23,2.58],['c',0.36,0.36,0.72,0.63,1.17,0.90],['c',0.33,0.18,0.36,0.21,0.42,0.33],['c',0.18,0.42,-0.18,0.90,-0.60,0.87],['c',-0.18,-0.03,-0.84,-0.36,-1.26,-0.63],['c',-0.78,-0.51,-1.38,-1.11,-1.86,-1.83],['c',-1.77,-2.70,-0.99,-6.42,1.71,-8.19],['c',0.30,-0.21,0.81,-0.48,1.17,-0.63],['c',0.30,-0.09,1.02,-0.30,1.14,-0.30],['c',0.06,0.00,0.09,0.00,0.09,-0.03],['c',0.03,-0.03,-0.51,-1.92,-1.23,-4.26],['z'],['m',3.78,7.41],['c',-0.18,-0.03,-0.36,-0.06,-0.39,-0.06],['c',-0.03,0.00,0.00,0.21,0.18,1.02],['c',0.75,3.18,1.26,6.30,1.50,9.09],['c',0.06,0.72,0.00,0.69,0.51,0.42],['c',0.78,-0.36,1.44,-0.96,1.98,-1.77],['c',1.08,-1.62,1.20,-3.69,0.30,-5.55],['c',-0.81,-1.62,-2.31,-2.79,-4.08,-3.15],['z']],w:19.051,h:57.057},
72
72
  'clefs.perc':{d:[['M',5.07,-7.44],['l',0.09,-0.06],['l',1.53,0.00],['l',1.53,0.00],['l',0.09,0.06],['l',0.06,0.09],['l',0.00,7.35],['l',0.00,7.32],['l',-0.06,0.09],['l',-0.09,0.06],['l',-1.53,0.00],['l',-1.53,0.00],['l',-0.09,-0.06],['l',-0.06,-0.09],['l',0.00,-7.32],['l',0.00,-7.35],['z'],['m',6.63,0.00],['l',0.09,-0.06],['l',1.53,0.00],['l',1.53,0.00],['l',0.09,0.06],['l',0.06,0.09],['l',0.00,7.35],['l',0.00,7.32],['l',-0.06,0.09],['l',-0.09,0.06],['l',-1.53,0.00],['l',-1.53,0.00],['l',-0.09,-0.06],['l',-0.06,-0.09],['l',0.00,-7.32],['l',0.00,-7.35],['z']],w:21,h:14.97},
73
+ 'tab.big': { d: [['M', 20.16, -21.66], ['c', 0.24, -0.09, 0.66, 0.09, 0.78, 0.36], ['c', 0.09, 0.21, 0.09, 0.24, -0.18, 0.54], ['c', -0.78, 0.81, -1.86, 1.44, -2.94, 1.71], ['c', -0.87, 0.24, -1.71, 0.24, -2.55, 0.03], ['l', -0.06, -0.03], ['l', -0.18, 0.99], ['c', -0.33, 1.98, -0.75, 4.26, -0.96, 5.04], ['c', -0.42, 1.65, -1.26, 3.18, -2.28, 4.14], ['c', -0.57, 0.57, -1.17, 0.90, -1.86, 1.08], ['c', -0.18, 0.06, -0.33, 0.06, -0.66, 0.06], ['c', -0.54, 0.00, -0.78, -0.03, -1.23, -0.27], ['c', -0.39, -0.18, -0.66, -0.39, -1.38, -0.99], ['c', -0.30, -0.24, -0.66, -0.51, -0.75, -0.57], ['c', -0.21, -0.15, -0.27, -0.24, -0.24, -0.45], ['c', 0.06, -0.27, 0.36, -0.60, 0.60, -0.66], ['c', 0.18, -0.03, 0.33, 0.06, 0.90, 0.57], ['c', 0.48, 0.42, 0.72, 0.57, 0.93, 0.69], ['c', 0.66, 0.33, 1.38, 0.21, 1.95, -0.36], ['c', 0.63, -0.60, 1.05, -1.62, 1.23, -3.00], ['c', 0.03, -0.18, 0.09, -0.66, 0.09, -1.11], ['c', 0.09, -1.56, 0.33, -3.81, 0.57, -5.49], ['c', 0.06, -0.33, 0.09, -0.63, 0.09, -0.63], ['c', -0.03, -0.03, -0.81, -0.12, -1.02, -0.12], ['c', -0.57, 0.00, -1.32, 0.12, -1.80, 0.33], ['c', -0.87, 0.30, -1.35, 0.78, -1.50, 1.41], ['c', -0.18, 0.63, 0.09, 1.26, 0.66, 1.65], ['c', 0.12, 0.06, 0.15, 0.12, 0.18, 0.24], ['c', 0.09, 0.27, 0.06, 0.57, -0.09, 0.75], ['c', -0.03, 0.06, -0.12, 0.09, -0.27, 0.15], ['c', -0.72, 0.21, -1.44, 0.15, -2.10, -0.18], ['c', -0.54, -0.27, -0.96, -0.66, -1.20, -1.14], ['c', -0.39, -0.75, -0.33, -1.74, 0.15, -2.52], ['c', 0.27, -0.42, 0.84, -0.93, 1.41, -1.23], ['c', 1.17, -0.57, 2.88, -0.90, 4.80, -0.90], ['c', 0.69, 0.00, 0.78, 0.00, 1.08, 0.06], ['c', 0.45, 0.09, 1.11, 0.30, 2.07, 0.60], ['c', 1.47, 0.48, 1.83, 0.57, 2.55, 0.54], ['c', 1.02, -0.06, 2.04, -0.45, 2.94, -1.11], ['c', 0.12, -0.09, 0.24, -0.18, 0.27, -0.18], ['z'], ['m', -5.88, 13.05], ['c', 0.21, -0.03, 0.81, 0.00, 1.08, 0.06], ['c', 0.48, 0.12, 0.90, 0.42, 0.99, 0.69], ['c', 0.03, 0.09, 0.03, 0.15, 0.00, 0.27], ['c', 0.00, 0.09, -0.03, 0.57, -0.06, 1.08], ['c', -0.09, 2.19, -0.24, 5.76, -0.39, 8.28], ['c', -0.06, 1.53, -0.06, 1.77, 0.03, 2.01], ['c', 0.09, 0.18, 0.15, 0.24, 0.30, 0.30], ['c', 0.24, 0.12, 0.54, 0.06, 1.23, -0.27], ['c', 0.57, -0.27, 0.66, -0.30, 0.75, -0.24], ['c', 0.09, 0.06, 0.18, 0.30, 0.18, 0.45], ['c', 0.00, 0.33, -0.15, 0.51, -0.45, 0.63], ['c', -0.12, 0.03, -0.39, 0.15, -0.60, 0.27], ['c', -1.17, 0.60, -1.38, 0.69, -1.80, 0.72], ['c', -0.45, 0.03, -0.78, -0.09, -1.08, -0.39], ['c', -0.39, -0.42, -0.66, -1.20, -1.02, -3.12], ['c', -0.24, -1.23, -0.36, -2.07, -0.54, -3.75], ['l', 0.00, -0.18], ['l', -0.36, 0.45], ['c', -0.60, 0.75, -1.32, 1.59, -1.95, 2.25], ['c', -0.15, 0.18, -0.27, 0.30, -0.27, 0.33], ['c', 0.00, 0.00, 0.06, 0.09, 0.15, 0.18], ['c', 0.24, 0.33, 0.60, 0.57, 1.05, 0.69], ['c', 0.18, 0.06, 0.30, 0.06, 0.69, 0.06], ['l', 0.48, 0.03], ['l', 0.06, 0.12], ['c', 0.15, 0.27, 0.03, 0.72, -0.21, 0.90], ['c', -0.18, 0.12, -0.93, 0.27, -1.41, 0.27], ['c', -0.84, 0.00, -1.59, -0.30, -1.98, -0.84], ['l', -0.12, -0.15], ['l', -0.45, 0.42], ['c', -0.99, 0.87, -1.53, 1.32, -2.16, 1.74], ['c', -0.78, 0.51, -1.50, 0.84, -2.10, 0.93], ['c', -0.69, 0.12, -1.20, 0.03, -1.95, -0.42], ['c', -0.21, -0.12, -0.51, -0.27, -0.66, -0.36], ['c', -0.24, -0.12, -0.30, -0.18, -0.33, -0.24], ['c', -0.12, -0.27, 0.15, -0.78, 0.45, -0.93], ['c', 0.24, -0.12, 0.33, -0.09, 0.90, 0.18], ['c', 0.60, 0.30, 0.84, 0.39, 1.20, 0.36], ['c', 0.87, -0.09, 1.77, -0.69, 3.24, -2.31], ['c', 2.67, -2.85, 4.59, -5.94, 5.70, -9.15], ['c', 0.15, -0.45, 0.24, -0.63, 0.42, -0.81], ['c', 0.21, -0.24, 0.60, -0.45, 0.99, -0.51], ['z'], ['m', -3.99, 16.05], ['c', 0.18, 0.00, 0.69, -0.03, 1.17, 0.00], ['c', 3.27, 0.03, 5.37, 0.75, 6.00, 2.07], ['c', 0.45, 0.99, 0.12, 2.40, -0.81, 3.42], ['c', -0.24, 0.27, -0.57, 0.57, -0.84, 0.75], ['c', -0.09, 0.06, -0.18, 0.09, -0.18, 0.12], ['c', 0.00, 0.00, 0.18, 0.03, 0.42, 0.09], ['c', 1.23, 0.30, 2.01, 0.81, 2.37, 1.59], ['c', 0.27, 0.54, 0.30, 1.32, 0.09, 2.10], ['c', -0.12, 0.36, -0.45, 1.05, -0.69, 1.35], ['c', -0.87, 1.17, -2.10, 1.92, -3.54, 2.25], ['c', -0.36, 0.06, -0.48, 0.06, -0.96, 0.06], ['c', -0.45, 0.00, -0.66, 0.00, -0.84, -0.03], ['c', -0.84, -0.18, -1.47, -0.51, -2.07, -1.11], ['c', -0.33, -0.33, -0.45, -0.51, -0.45, -0.63], ['c', 0.00, -0.06, 0.03, -0.15, 0.06, -0.24], ['c', 0.18, -0.33, 0.69, -0.60, 0.93, -0.48], ['c', 0.03, 0.03, 0.15, 0.12, 0.27, 0.24], ['c', 0.39, 0.42, 0.99, 0.57, 1.62, 0.45], ['c', 1.05, -0.21, 1.98, -1.02, 2.31, -2.01], ['c', 0.48, -1.53, -0.48, -2.55, -2.58, -2.67], ['c', -0.21, 0.00, -0.36, -0.03, -0.42, -0.06], ['c', -0.15, -0.09, -0.21, -0.51, -0.06, -0.78], ['c', 0.12, -0.27, 0.24, -0.33, 0.60, -0.36], ['c', 0.57, -0.06, 1.11, -0.42, 1.50, -0.99], ['c', 0.48, -0.72, 0.54, -1.59, 0.18, -2.31], ['c', -0.12, -0.21, -0.45, -0.54, -0.69, -0.69], ['c', -0.33, -0.21, -0.93, -0.45, -1.35, -0.51], ['l', -0.12, -0.03], ['l', -0.06, 0.48], ['c', -0.54, 2.94, -1.14, 6.24, -1.29, 6.75], ['c', -0.33, 1.35, -0.93, 2.61, -1.65, 3.60], ['c', -0.30, 0.36, -0.81, 0.90, -1.14, 1.14], ['c', -0.30, 0.24, -0.84, 0.48, -1.14, 0.57], ['c', -0.33, 0.09, -0.96, 0.09, -1.26, 0.03], ['c', -0.45, -0.12, -0.87, -0.39, -1.53, -0.96], ['c', -0.24, -0.15, -0.51, -0.39, -0.63, -0.48], ['c', -0.30, -0.21, -0.33, -0.33, -0.21, -0.63], ['c', 0.12, -0.18, 0.27, -0.36, 0.42, -0.45], ['c', 0.27, -0.12, 0.36, -0.09, 0.87, 0.33], ['c', 0.78, 0.60, 1.08, 0.75, 1.65, 0.72], ['c', 0.45, -0.03, 0.81, -0.21, 1.17, -0.54], ['c', 0.87, -0.90, 1.38, -2.85, 1.38, -5.37], ['c', 0.00, -0.60, 0.03, -1.11, 0.12, -2.04], ['c', 0.06, -0.69, 0.24, -2.01, 0.33, -2.58], ['c', 0.06, -0.24, 0.06, -0.42, 0.06, -0.42], ['c', 0.00, 0.00, -0.12, 0.03, -0.21, 0.09], ['c', -1.44, 0.57, -2.16, 1.65, -1.74, 2.55], ['c', 0.09, 0.15, 0.18, 0.24, 0.27, 0.33], ['c', 0.24, 0.21, 0.30, 0.27, 0.33, 0.39], ['c', 0.06, 0.24, 0.00, 0.63, -0.15, 0.78], ['c', -0.09, 0.12, -0.54, 0.21, -0.96, 0.24], ['c', -1.02, 0.03, -2.01, -0.48, -2.43, -1.32], ['c', -0.21, -0.45, -0.27, -0.90, -0.15, -1.44], ['c', 0.06, -0.27, 0.21, -0.66, 0.39, -0.93], ['c', 0.87, -1.29, 3.00, -2.22, 5.64, -2.43], ['z']], w: 19.643, h: 43.325 },
74
+ 'tab.tiny': { d: [['M', 16.02, -17.25], ['c', 0.12, -0.09, 0.15, -0.09, 0.27, -0.09], ['c', 0.21, 0.03, 0.51, 0.30, 0.51, 0.45], ['c', 0.00, 0.06, -0.12, 0.18, -0.30, 0.36], ['c', -1.11, 1.08, -2.55, 1.59, -3.84, 1.41], ['c', -0.15, -0.03, -0.33, -0.06, -0.39, -0.09], ['c', -0.06, -0.03, -0.09, -0.03, -0.12, -0.03], ['c', 0.00, 0.00, -0.06, 0.42, -0.15, 0.93], ['c', -0.33, 2.01, -0.66, 3.69, -0.84, 4.26], ['c', -0.42, 1.41, -1.23, 2.67, -2.16, 3.33], ['c', -0.27, 0.18, -0.75, 0.42, -0.99, 0.48], ['c', -0.30, 0.09, -0.72, 0.09, -1.02, 0.06], ['c', -0.45, -0.09, -0.84, -0.33, -1.53, -0.90], ['c', -0.21, -0.18, -0.51, -0.39, -0.63, -0.48], ['c', -0.27, -0.21, -0.30, -0.24, -0.30, -0.36], ['c', 0.00, -0.12, 0.09, -0.36, 0.18, -0.45], ['c', 0.09, -0.09, 0.27, -0.18, 0.36, -0.18], ['c', 0.12, 0.00, 0.30, 0.12, 0.66, 0.45], ['c', 0.57, 0.51, 0.87, 0.69, 1.23, 0.72], ['c', 0.93, 0.06, 1.68, -0.78, 1.98, -2.37], ['c', 0.09, -0.39, 0.15, -0.75, 0.18, -1.53], ['c', 0.06, -0.99, 0.24, -2.79, 0.42, -4.05], ['c', 0.03, -0.30, 0.06, -0.57, 0.06, -0.60], ['c', 0.00, -0.06, -0.03, -0.09, -0.15, -0.12], ['c', -0.90, -0.18, -2.13, 0.06, -2.76, 0.57], ['c', -0.36, 0.30, -0.51, 0.60, -0.51, 1.02], ['c', 0.00, 0.45, 0.15, 0.75, 0.48, 0.99], ['c', 0.06, 0.06, 0.15, 0.18, 0.18, 0.24], ['c', 0.12, 0.24, 0.03, 0.63, -0.15, 0.69], ['c', -0.24, 0.12, -0.60, 0.15, -0.90, 0.15], ['c', -0.36, -0.03, -0.57, -0.09, -0.87, -0.24], ['c', -0.78, -0.36, -1.23, -1.11, -1.20, -1.92], ['c', 0.12, -1.53, 1.74, -2.49, 4.62, -2.70], ['c', 1.20, -0.09, 1.47, -0.03, 3.33, 0.57], ['c', 0.90, 0.30, 1.14, 0.36, 1.56, 0.39], ['c', 0.45, 0.00, 0.93, -0.06, 1.38, -0.21], ['c', 0.51, -0.18, 0.81, -0.33, 1.41, -0.75], ['z'], ['m', -4.68, 10.38], ['c', 0.39, -0.06, 0.84, 0.00, 1.20, 0.15], ['c', 0.24, 0.12, 0.36, 0.21, 0.45, 0.36], ['l', 0.09, 0.09], ['l', -0.06, 1.41], ['c', -0.09, 2.19, -0.18, 3.96, -0.27, 5.49], ['c', -0.03, 0.78, -0.06, 1.59, -0.06, 1.86], ['c', 0.00, 0.42, 0.00, 0.48, 0.06, 0.57], ['c', 0.06, 0.18, 0.18, 0.24, 0.36, 0.27], ['c', 0.18, 0.00, 0.39, -0.06, 0.84, -0.27], ['c', 0.45, -0.21, 0.54, -0.24, 0.63, -0.18], ['c', 0.12, 0.12, 0.15, 0.54, 0.03, 0.69], ['c', -0.03, 0.03, -0.15, 0.12, -0.27, 0.18], ['c', -0.15, 0.03, -0.30, 0.12, -0.36, 0.15], ['c', -0.87, 0.45, -1.02, 0.51, -1.26, 0.57], ['c', -0.33, 0.09, -0.60, 0.06, -0.84, -0.06], ['c', -0.42, -0.18, -0.63, -0.60, -0.87, -1.44], ['c', -0.30, -1.23, -0.57, -2.97, -0.66, -4.08], ['c', 0.00, -0.18, -0.03, -0.30, -0.03, -0.33], ['l', -0.06, 0.06], ['c', -0.18, 0.27, -1.11, 1.38, -1.68, 2.01], ['l', -0.33, 0.33], ['l', 0.06, 0.09], ['c', 0.06, 0.15, 0.27, 0.33, 0.48, 0.42], ['c', 0.27, 0.18, 0.51, 0.24, 0.96, 0.27], ['l', 0.39, 0.00], ['l', 0.03, 0.12], ['c', 0.12, 0.21, 0.03, 0.57, -0.15, 0.69], ['c', -0.03, 0.03, -0.21, 0.09, -0.36, 0.15], ['c', -0.27, 0.06, -0.39, 0.06, -0.75, 0.06], ['c', -0.48, 0.00, -0.75, -0.03, -1.08, -0.21], ['c', -0.21, -0.12, -0.51, -0.36, -0.57, -0.48], ['l', -0.03, -0.09], ['l', -0.39, 0.36], ['c', -1.47, 1.35, -2.49, 1.98, -3.42, 2.13], ['c', -0.54, 0.09, -0.96, -0.03, -1.62, -0.39], ['c', -0.21, -0.15, -0.45, -0.27, -0.54, -0.30], ['c', -0.18, -0.09, -0.21, -0.21, -0.12, -0.45], ['c', 0.06, -0.27, 0.33, -0.48, 0.54, -0.48], ['c', 0.03, 0.00, 0.27, 0.09, 0.48, 0.21], ['c', 0.48, 0.24, 0.69, 0.27, 0.99, 0.27], ['c', 0.60, -0.06, 1.17, -0.42, 2.10, -1.35], ['c', 2.22, -2.22, 4.02, -4.98, 4.95, -7.59], ['c', 0.21, -0.57, 0.30, -0.78, 0.48, -0.93], ['c', 0.15, -0.15, 0.42, -0.27, 0.66, -0.33], ['z'], ['m', -3.06, 12.84], ['c', 0.27, -0.03, 1.68, 0.00, 2.01, 0.03], ['c', 1.92, 0.18, 3.15, 0.69, 3.63, 1.50], ['c', 0.18, 0.33, 0.24, 0.51, 0.21, 0.93], ['c', 0.00, 0.45, -0.06, 0.72, -0.24, 1.11], ['c', -0.24, 0.51, -0.69, 1.02, -1.17, 1.35], ['c', -0.21, 0.15, -0.21, 0.15, -0.12, 0.18], ['c', 0.72, 0.15, 1.11, 0.30, 1.50, 0.57], ['c', 0.39, 0.24, 0.63, 0.57, 0.75, 0.96], ['c', 0.09, 0.30, 0.09, 0.96, 0.00, 1.29], ['c', -0.15, 0.57, -0.39, 1.05, -0.78, 1.50], ['c', -0.66, 0.75, -1.62, 1.32, -2.61, 1.53], ['c', -0.27, 0.06, -0.42, 0.06, -0.84, 0.06], ['c', -0.48, 0.00, -0.57, 0.00, -0.81, -0.06], ['c', -0.60, -0.18, -1.05, -0.42, -1.47, -0.81], ['c', -0.36, -0.39, -0.42, -0.51, -0.30, -0.75], ['c', 0.12, -0.21, 0.39, -0.39, 0.60, -0.39], ['c', 0.09, 0.00, 0.15, 0.03, 0.33, 0.18], ['c', 0.12, 0.12, 0.27, 0.24, 0.36, 0.27], ['c', 0.96, 0.48, 2.46, -0.33, 2.82, -1.50], ['c', 0.24, -0.81, -0.03, -1.44, -0.69, -1.77], ['c', -0.39, -0.21, -1.02, -0.33, -1.53, -0.33], ['c', -0.18, 0.00, -0.21, 0.00, -0.27, -0.09], ['c', -0.06, -0.09, -0.06, -0.30, -0.03, -0.48], ['c', 0.06, -0.18, 0.18, -0.36, 0.33, -0.36], ['c', 0.39, -0.06, 0.51, -0.09, 0.72, -0.18], ['c', 0.69, -0.36, 1.11, -1.23, 0.99, -2.01], ['c', -0.09, -0.51, -0.42, -0.90, -0.93, -1.17], ['c', -0.24, -0.12, -0.60, -0.27, -0.87, -0.30], ['c', -0.09, -0.03, -0.09, -0.03, -0.12, 0.12], ['c', 0.00, 0.09, -0.21, 1.11, -0.42, 2.25], ['c', -0.66, 3.75, -0.72, 3.99, -1.26, 5.07], ['c', -0.90, 1.89, -2.25, 2.85, -3.48, 2.61], ['c', -0.39, -0.09, -0.69, -0.27, -1.38, -0.84], ['c', -0.63, -0.51, -0.63, -0.48, -0.63, -0.60], ['c', 0.00, -0.18, 0.18, -0.48, 0.39, -0.57], ['c', 0.21, -0.12, 0.30, -0.09, 0.81, 0.33], ['c', 0.15, 0.15, 0.39, 0.30, 0.54, 0.36], ['c', 0.18, 0.12, 0.27, 0.12, 0.48, 0.15], ['c', 0.99, 0.06, 1.71, -0.78, 2.04, -2.46], ['c', 0.12, -0.66, 0.18, -1.14, 0.21, -2.22], ['c', 0.03, -1.23, 0.12, -2.25, 0.36, -3.63], ['c', 0.03, -0.24, 0.06, -0.45, 0.06, -0.48], ['c', -0.06, -0.03, -0.66, 0.27, -0.90, 0.42], ['c', -0.06, 0.06, -0.21, 0.18, -0.33, 0.30], ['c', -0.57, 0.57, -0.60, 1.35, -0.06, 1.74], ['c', 0.18, 0.12, 0.24, 0.24, 0.21, 0.51], ['c', -0.03, 0.30, -0.15, 0.42, -0.57, 0.48], ['c', -1.11, 0.24, -2.22, -0.42, -2.43, -1.38], ['c', -0.09, -0.45, 0.03, -1.02, 0.30, -1.47], ['c', 0.18, -0.24, 0.60, -0.63, 0.90, -0.84], ['c', 0.90, -0.60, 2.28, -1.02, 3.69, -1.11], ['z']], w: 15.709, h: 34.656 },
73
75
  'timesig.common':{d:[['M',6.66,-7.83],['c',0.72,-0.06,1.41,-0.03,1.98,0.09],['c',1.20,0.27,2.34,0.96,3.09,1.92],['c',0.63,0.81,1.08,1.86,1.14,2.73],['c',0.06,1.02,-0.51,1.92,-1.44,2.22],['c',-0.24,0.09,-0.30,0.09,-0.63,0.09],['c',-0.33,0.00,-0.42,0.00,-0.63,-0.06],['c',-0.66,-0.24,-1.14,-0.63,-1.41,-1.20],['c',-0.15,-0.30,-0.21,-0.51,-0.24,-0.90],['c',-0.06,-1.08,0.57,-2.04,1.56,-2.37],['c',0.18,-0.06,0.27,-0.06,0.63,-0.06],['l',0.45,0.00],['c',0.06,0.03,0.09,0.03,0.09,0.00],['c',0.00,0.00,-0.09,-0.12,-0.24,-0.27],['c',-1.02,-1.11,-2.55,-1.68,-4.08,-1.50],['c',-1.29,0.15,-2.04,0.69,-2.40,1.74],['c',-0.36,0.93,-0.42,1.89,-0.42,5.37],['c',0.00,2.97,0.06,3.96,0.24,4.77],['c',0.24,1.08,0.63,1.68,1.41,2.07],['c',0.81,0.39,2.16,0.45,3.18,0.09],['c',1.29,-0.45,2.37,-1.53,3.03,-2.97],['c',0.15,-0.33,0.33,-0.87,0.39,-1.17],['c',0.09,-0.24,0.15,-0.36,0.30,-0.39],['c',0.21,-0.03,0.42,0.15,0.39,0.36],['c',-0.06,0.39,-0.42,1.38,-0.69,1.89],['c',-0.96,1.80,-2.49,2.94,-4.23,3.18],['c',-0.99,0.12,-2.58,-0.06,-3.63,-0.45],['c',-0.96,-0.36,-1.71,-0.84,-2.40,-1.50],['c',-1.11,-1.11,-1.80,-2.61,-2.04,-4.56],['c',-0.06,-0.60,-0.06,-2.01,0.00,-2.61],['c',0.24,-1.95,0.90,-3.45,2.01,-4.56],['c',0.69,-0.66,1.44,-1.11,2.37,-1.47],['c',0.63,-0.24,1.47,-0.42,2.22,-0.48],['z']],w:13.038,h:15.689},
74
76
  'timesig.cut':{d:[['M',6.24,-10.44],['c',0.09,-0.06,0.09,-0.06,0.48,-0.06],['c',0.36,0.00,0.36,0.00,0.45,0.06],['l',0.06,0.09],['l',0.00,1.23],['l',0.00,1.26],['l',0.27,0.00],['c',1.26,0.00,2.49,0.45,3.48,1.29],['c',1.05,0.87,1.80,2.28,1.89,3.48],['c',0.06,1.02,-0.51,1.92,-1.44,2.22],['c',-0.24,0.09,-0.30,0.09,-0.63,0.09],['c',-0.33,0.00,-0.42,0.00,-0.63,-0.06],['c',-0.66,-0.24,-1.14,-0.63,-1.41,-1.20],['c',-0.15,-0.30,-0.21,-0.51,-0.24,-0.90],['c',-0.06,-1.08,0.57,-2.04,1.56,-2.37],['c',0.18,-0.06,0.27,-0.06,0.63,-0.06],['l',0.45,0.00],['c',0.06,0.03,0.09,0.03,0.09,0.00],['c',0.00,-0.03,-0.45,-0.51,-0.66,-0.69],['c',-0.87,-0.69,-1.83,-1.05,-2.94,-1.11],['l',-0.42,0.00],['l',0.00,7.17],['l',0.00,7.14],['l',0.42,0.00],['c',0.69,-0.03,1.23,-0.18,1.86,-0.51],['c',1.05,-0.51,1.89,-1.47,2.46,-2.70],['c',0.15,-0.33,0.33,-0.87,0.39,-1.17],['c',0.09,-0.24,0.15,-0.36,0.30,-0.39],['c',0.21,-0.03,0.42,0.15,0.39,0.36],['c',-0.03,0.24,-0.21,0.78,-0.39,1.20],['c',-0.96,2.37,-2.94,3.90,-5.13,3.90],['l',-0.30,0.00],['l',0.00,1.26],['l',0.00,1.23],['l',-0.06,0.09],['c',-0.09,0.06,-0.09,0.06,-0.45,0.06],['c',-0.39,0.00,-0.39,0.00,-0.48,-0.06],['l',-0.06,-0.09],['l',0.00,-1.29],['l',0.00,-1.29],['l',-0.21,-0.03],['c',-1.23,-0.21,-2.31,-0.63,-3.21,-1.29],['c',-0.15,-0.09,-0.45,-0.36,-0.66,-0.57],['c',-1.11,-1.11,-1.80,-2.61,-2.04,-4.56],['c',-0.06,-0.60,-0.06,-2.01,0.00,-2.61],['c',0.24,-1.95,0.93,-3.45,2.04,-4.59],['c',0.42,-0.39,0.78,-0.66,1.26,-0.93],['c',0.75,-0.45,1.65,-0.75,2.61,-0.90],['l',0.21,-0.03],['l',0.00,-1.29],['l',0.00,-1.29],['z'],['m',-0.06,10.44],['c',0.00,-5.58,0.00,-6.99,-0.03,-6.99],['c',-0.15,0.00,-0.63,0.27,-0.87,0.45],['c',-0.45,0.36,-0.75,0.93,-0.93,1.77],['c',-0.18,0.81,-0.24,1.80,-0.24,4.74],['c',0.00,2.97,0.06,3.96,0.24,4.77],['c',0.24,1.08,0.66,1.68,1.41,2.07],['c',0.12,0.06,0.30,0.12,0.33,0.15],['l',0.09,0.00],['l',0.00,-6.96],['z']],w:13.038,h:20.97},
75
77
  'timesig.imperfectum':{d:[['M',13,-5],['a',8,8,0,1,0,0,10]],w:13.038,h:20.97},
@@ -82,11 +82,13 @@ RelativeElement.prototype.getChordDim = function () {
82
82
  if (!this.chordHeightAbove && !this.chordHeightBelow)
83
83
  return null;
84
84
  // Chords are centered, annotations are left justified.
85
+ // NOTE: the font reports extra space to the left and right anyway, so there is a built in margin.
85
86
  // We add a little margin so that items can't touch - we use half the font size as the margin, so that is 1/4 on each side.
86
87
  // if there is only one character that we're printing, use half of that margin.
87
- var margin = this.dim.font.size/4;
88
- if (this.c.length === 1)
89
- margin = margin / 2;
88
+ // var margin = this.dim.font.size/4;
89
+ // if (this.c.length === 1)
90
+ // margin = margin / 2;
91
+ var margin = 0;
90
92
 
91
93
  var offset = this.type === "chord" ? this.realWidth/2 : 0;
92
94
  var left = this.x - offset - margin;
@@ -174,7 +174,11 @@ Renderer.prototype.calcY = function(ofs) {
174
174
 
175
175
  Renderer.prototype.moveY = function (em, numLines) {
176
176
  if (numLines === undefined) numLines = 1;
177
- this.y += em*numLines;
177
+ this.y += em * numLines;
178
+ };
179
+
180
+ Renderer.prototype.absolutemoveY = function (y) {
181
+ this.y = y;
178
182
  };
179
183
 
180
184
  module.exports = Renderer;
@@ -38,7 +38,11 @@ function drawAbsolute(renderer, params, bartop, selectables, staffPos) {
38
38
  selectables.add(params, g, false, staffPos);
39
39
  } else {
40
40
  params.elemset.push(g);
41
- selectables.add(params, g, params.type === 'note', staffPos);
41
+ var isSelectable = false;
42
+ if (params.type === 'note' || params.type === 'tabNumber') {
43
+ isSelectable = true;
44
+ }
45
+ selectables.add(params, g, isSelectable, staffPos);
42
46
  }
43
47
  } else if (params.elemset.length > 0)
44
48
  selectables.add(params, params.elemset[0], params.type === 'note', staffPos);
@@ -4,12 +4,11 @@ var nonMusic = require('./non-music');
4
4
  var spacing = require('../abc_spacing');
5
5
  var Selectables = require('./selectables');
6
6
 
7
- function draw(renderer, classes, abcTune, width, maxWidth, responsive, scale, selectTypes, tuneNumber) {
7
+ function draw(renderer, classes, abcTune, width, maxWidth, responsive, scale, selectTypes, tuneNumber, lineOffset) {
8
8
  var selectables = new Selectables(renderer.paper, selectTypes, tuneNumber);
9
9
  renderer.moveY(renderer.padding.top);
10
10
  nonMusic(renderer, abcTune.topText, selectables);
11
11
  renderer.moveY(renderer.spacing.music);
12
-
13
12
  var staffgroups = [];
14
13
  for (var line = 0; line < abcTune.lines.length; line++) {
15
14
  classes.incrLine();
@@ -20,8 +19,8 @@ function draw(renderer, classes, abcTune, width, maxWidth, responsive, scale, se
20
19
  }
21
20
  if (staffgroups.length >= 1)
22
21
  addStaffPadding(renderer, renderer.spacing.staffSeparation, staffgroups[staffgroups.length - 1], abcLine.staffGroup);
23
- var staffgroup = engraveStaffLine(renderer, abcLine.staffGroup, selectables);
24
- staffgroup.line = line; // If there are non-music lines then the staffgroup array won't line up with the line array, so this keeps track.
22
+ var staffgroup = engraveStaffLine(renderer, abcLine.staffGroup, selectables,line);
23
+ staffgroup.line = lineOffset+line; // If there are non-music lines then the staffgroup array won't line up with the line array, so this keeps track.
25
24
  staffgroups.push(staffgroup);
26
25
  } else if (abcLine.nonMusic) {
27
26
  nonMusic(renderer, abcLine.nonMusic, selectables);
@@ -35,8 +34,8 @@ function draw(renderer, classes, abcTune, width, maxWidth, responsive, scale, se
35
34
  return { staffgroups: staffgroups, selectables: selectables.getElements() };
36
35
  }
37
36
 
38
- function engraveStaffLine(renderer, staffGroup, selectables) {
39
- drawStaffGroup(renderer, staffGroup, selectables);
37
+ function engraveStaffLine(renderer, staffGroup, selectables,lineNumber) {
38
+ drawStaffGroup(renderer, staffGroup, selectables,lineNumber);
40
39
  var height = staffGroup.height * spacing.STEP;
41
40
  renderer.y += height;
42
41
  return staffGroup;
@@ -4,7 +4,9 @@ var renderText = require('./text');
4
4
  function nonMusic(renderer, obj, selectables) {
5
5
  for (var i = 0; i < obj.rows.length; i++) {
6
6
  var row = obj.rows[i];
7
- if (row.move) {
7
+ if (row.absmove) {
8
+ renderer.absolutemoveY(row.absmove);
9
+ } else if (row.move) {
8
10
  renderer.moveY(row.move);
9
11
  } else if (row.text) {
10
12
  var x = row.left ? row.left : 0;
@@ -0,0 +1,24 @@
1
+ var sprintf = require('./sprintf');
2
+ var roundNumber = require("./round-number");
3
+
4
+ function printLine(renderer, x1, x2, y , klass, name ,dy ) {
5
+ if (!dy ) dy = 0.35;
6
+ var fill = renderer.foregroundColor;
7
+ x1 = roundNumber(x1);
8
+ x2 = roundNumber(x2);
9
+ var y1 = roundNumber(y - dy);
10
+ var y2 = roundNumber(y + dy);
11
+ var pathString = sprintf("M %f %f L %f %f L %f %f L %f %f z", x1, y1, x2, y1,
12
+ x2, y2, x1, y2);
13
+ var options = { path: pathString, stroke: "none", fill: fill };
14
+ if (name)
15
+ options['data-name'] = name;
16
+ if (klass)
17
+ options['class'] = klass;
18
+ var ret = renderer.paper.pathToBack(options);
19
+
20
+ return ret;
21
+ }
22
+
23
+ module.exports = printLine;
24
+
@@ -9,7 +9,7 @@ function drawRelativeElement(renderer, params, bartop) {
9
9
  var y = renderer.calcY(params.pitch);
10
10
  switch(params.type) {
11
11
  case "symbol":
12
- if (params.c===null) return null;
12
+ if (params.c === null) return null;
13
13
  var klass = "symbol";
14
14
  if (params.klass) klass += " " + params.klass;
15
15
  params.graphelem = printSymbol(renderer, params.x, params.pitch, params.c, {
@@ -22,7 +22,19 @@ function drawRelativeElement(renderer, params, bartop) {
22
22
  });
23
23
  break;
24
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); break;
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;
26
38
  case "barNumber":
27
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);
28
40
  break;
@@ -10,9 +10,9 @@ function Selectables(paper, selectTypes, tuneNumber) {
10
10
 
11
11
  Selectables.prototype.getElements = function () {
12
12
  return this.elements;
13
- }
13
+ };
14
14
 
15
- Selectables.prototype.add = function (absEl, svgEl, isNote, staffPos) {
15
+ Selectables.prototype.add = function (absEl, svgEl, isNoteOrTabNumber, staffPos) {
16
16
  if (!this.canSelect(absEl))
17
17
  return;
18
18
  var params;
@@ -21,7 +21,7 @@ Selectables.prototype.add = function (absEl, svgEl, isNote, staffPos) {
21
21
  else
22
22
  params = { selectable: true, tabindex: 0, "data-index": this.elements.length};
23
23
  this.paper.setAttributeOnElement(svgEl, params);
24
- var sel = { absEl: absEl, svgEl: svgEl, isDraggable: isNote };
24
+ var sel = { absEl: absEl, svgEl: svgEl, isDraggable: isNoteOrTabNumber };
25
25
  if (staffPos !== undefined)
26
26
  sel.staffPos = staffPos;
27
27
  this.elements.push(sel);
@@ -36,8 +36,11 @@ Selectables.prototype.canSelect = function (absEl) {
36
36
  if (this.selectTypes === true)
37
37
  return true;
38
38
  if (this.selectTypes === undefined) {
39
- // by default, only notes can be clicked.
40
- return absEl.abcelem.el_type === 'note';
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;
41
44
  }
42
45
  return this.selectTypes.indexOf(absEl.abcelem.el_type) >= 0;
43
46
  };
@@ -49,7 +52,7 @@ Selectables.prototype.wrapSvgEl = function(abcelem, el) {
49
52
  elemset: [el],
50
53
  highlight: highlight,
51
54
  unhighlight: unhighlight
52
- }
55
+ };
53
56
  this.add(absEl, el, false);
54
57
  };
55
58
 
@@ -4,8 +4,9 @@ var drawVoice = require('./voice');
4
4
  var printStaff = require('./staff');
5
5
  var printDebugBox = require('./debug-box');
6
6
  var printStem = require('./print-stem');
7
+ var nonMusic = require('./non-music');
7
8
 
8
- function drawStaffGroup(renderer, params, selectables) {
9
+ function drawStaffGroup(renderer, params, selectables,lineNumber) {
9
10
  // We enter this method with renderer.y pointing to the topmost coordinate that we're allowed to draw.
10
11
  // All of the children that will be drawn have a relative "pitch" set, where zero is the first ledger line below the staff.
11
12
  // renderer.y will be offset at the beginning of each staff by the amount required to make the relative pitch work.
@@ -14,7 +15,7 @@ function drawStaffGroup(renderer, params, selectables) {
14
15
  var colorIndex;
15
16
 
16
17
  // An invisible marker is useful to be able to find where each system starts.
17
- addInvisibleMarker(renderer,"abcjs-top-of-system");
18
+ addInvisibleMarker(renderer, "abcjs-top-of-system");
18
19
 
19
20
  var startY = renderer.y; // So that it can be restored after we're done.
20
21
  // Set the absolute Y position for each staff here, so the voice drawing below can just use if.
@@ -28,7 +29,7 @@ function drawStaffGroup(renderer, params, selectables) {
28
29
  boxAllElements(renderer, params.voices, staff1.voices);
29
30
  }
30
31
  if (renderer.showDebug.indexOf("grid") >= 0) {
31
- renderer.paper.dottedLine({x1: renderer.padding.left, x2: renderer.padding.left+renderer.controller.width, y1: startY, y2: startY, stroke: "#0000ff"})
32
+ renderer.paper.dottedLine({x1: renderer.padding.left, x2: renderer.padding.left+renderer.controller.width, y1: startY, y2: startY, stroke: "#0000ff"});
32
33
  printDebugBox(renderer,
33
34
  { x: renderer.padding.left,
34
35
  y: renderer.calcY(staff1.originalTop),
@@ -68,20 +69,40 @@ function drawStaffGroup(renderer, params, selectables) {
68
69
  var topLine; // these are to connect multiple staves. We need to remember where they are.
69
70
  var bottomLine;
70
71
 
72
+ var linePitch = 2;
71
73
  var bartop = 0;
72
74
  for (var i=0;i<params.voices.length;i++) {
73
75
  var staff = params.voices[i].staff;
74
- renderer.y = staff.absoluteY;
76
+ var tabName = params.voices[i].tabNameInfos;
77
+ renderer.y = staff.absoluteY ;
75
78
  renderer.controller.classes.incrVoice();
76
79
  //renderer.y = staff.y;
77
80
  // offset for starting the counting at middle C
78
81
  if (!params.voices[i].duplicate) {
79
82
  // renderer.moveY(spacing.STEP, staff.top);
80
83
  if (!topLine) topLine = renderer.calcY(10);
81
- bottomLine = renderer.calcY(2);
84
+ bottomLine = renderer.calcY(linePitch);
82
85
  if (staff.lines !== 0) {
86
+ if (staff.linePitch) {
87
+ linePitch = staff.linePitch;
88
+ }
83
89
  renderer.controller.classes.newMeasure();
84
- printStaff(renderer, params.startx, params.w, staff.lines);
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
+
85
106
  }
86
107
  printBrace(renderer, staff.absoluteY, params.brace, i, selectables);
87
108
  printBrace(renderer, staff.absoluteY, params.bracket, i, selectables);
@@ -91,9 +112,21 @@ function drawStaffGroup(renderer, params, selectables) {
91
112
  zero: renderer.y,
92
113
  height: params.height*spacing.STEP
93
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
+
94
127
  renderer.controller.classes.newMeasure();
95
128
  if (!params.voices[i].duplicate) {
96
- bartop = renderer.calcY(2); // This connects the bar lines between two different staves.
129
+ bartop = renderer.calcY(2 + tabNameHeight); // This connects the bar lines between two different staves.
97
130
  // if (staff.bottom < 0)
98
131
  // renderer.moveY(spacing.STEP, -staff.bottom);
99
132
  }
@@ -101,7 +134,10 @@ function drawStaffGroup(renderer, params, selectables) {
101
134
  renderer.controller.classes.newMeasure();
102
135
 
103
136
  // connect all the staves together with a vertical line
104
- if (params.staffs.length>1) {
137
+ var staffSize = params.staffs.length;
138
+ if (staffSize > 1) {
139
+ topLine = params.staffs[0].topLine;
140
+ bottomLine = params.staffs[staffSize - 1].bottomLine;
105
141
  printStem(renderer, params.startx, 0.6, topLine, bottomLine, null);
106
142
  }
107
143
  renderer.y = startY;
@@ -1,24 +1,8 @@
1
- var sprintf = require('./sprintf');
2
- var roundNumber = require("./round-number");
1
+ var printLine = require('./print-line');
3
2
 
4
- function printStaffLine(renderer, x1,x2, pitch, klass, name) {
5
- var dy = 0.35;
6
- var fill = renderer.foregroundColor;
3
+ function printStaffLine(renderer, x1,x2, pitch, klass, name , dy) {
7
4
  var y = renderer.calcY(pitch);
8
- x1 = roundNumber(x1);
9
- x2 = roundNumber(x2);
10
- var y1 = roundNumber(y-dy);
11
- var y2 = roundNumber(y+dy);
12
- var pathString = sprintf("M %f %f L %f %f L %f %f L %f %f z", x1, y1, x2, y1,
13
- x2, y2, x1, y2);
14
- var options = {path:pathString, stroke:"none", fill:fill};
15
- if (name)
16
- options['data-name'] = name;
17
- if (klass)
18
- options['class'] = klass;
19
- var ret = renderer.paper.pathToBack(options);
20
-
21
- return ret;
5
+ return printLine(renderer,x1,x2,y,klass,name,dy);
22
6
  }
23
7
 
24
8
  module.exports = printStaffLine;
@@ -1,18 +1,31 @@
1
1
  var printStaffLine = require('./staff-line');
2
2
 
3
- function printStaff(renderer, startx, endx, numLines) {
3
+ function printStaff(renderer, startx, endx, numLines , linePitch , dy) {
4
4
  var klass = "abcjs-top-line";
5
+ var pitch = 2;
6
+ if (linePitch) {
7
+ pitch = linePitch;
8
+ }
5
9
  renderer.paper.openGroup({ prepend: true, klass: renderer.controller.classes.generate("abcjs-staff") });
6
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;
7
13
  if (numLines === 1) {
8
14
  printStaffLine(renderer, startx,endx,6, klass);
9
15
  } else {
16
+
10
17
  for (var i = numLines - 1; i >= 0; i--) {
11
- printStaffLine(renderer, startx, endx, (i + 1) * 2, klass);
18
+ var curpitch = (i + 1) * pitch;
19
+ lastYLine = renderer.calcY(curpitch);
20
+ if (firstYLine == 0) {
21
+ firstYLine = lastYLine;
22
+ }
23
+ printStaffLine(renderer, startx, endx, curpitch, klass , null , dy) ;
12
24
  klass = undefined;
13
25
  }
14
26
  }
15
27
  renderer.paper.closeGroup();
28
+ return [firstYLine,lastYLine];
16
29
  }
17
30
 
18
31
  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
+
@@ -23,6 +23,9 @@ function renderText(renderer, params, alreadyInGroup) {
23
23
  console.log("Debug msg: " + params.text);
24
24
  hash.attr.stroke = "#ff0000";
25
25
  }
26
+ if (params.cursor) {
27
+ hash.attr.cursor = params.cursor;
28
+ }
26
29
 
27
30
  var text = params.text.replace(/\n\n/g, "\n \n");
28
31
  text = text.replace(/^\n/, "\xA0\n");
@@ -33,6 +33,14 @@ function drawVoice(renderer, params, bartop, selectables, staffPos) {
33
33
  // child.elemset = drawTempo(renderer, child);
34
34
  // break;
35
35
  default:
36
+ if (params.staff.isTabStaff) {
37
+ child.invisible = false;
38
+ if ( child.type == 'bar' ) {
39
+ if (child.abcelem.lastBar) {
40
+ bartop = params.topLine;
41
+ }
42
+ }
43
+ }
36
44
  drawAbsolute(renderer, child,(params.barto || i === params.children.length - 1) ? bartop : 0, selectables, staffPos);
37
45
  }
38
46
  if (child.type === 'note' || isNonSpacerRest(child))
@@ -75,7 +83,7 @@ function drawVoice(renderer, params, bartop, selectables, staffPos) {
75
83
  child.elemset = drawTie(renderer, child, params.startx + 10, width, selectables);
76
84
  break;
77
85
  default:
78
- console.log(child)
86
+ console.log(child);
79
87
  drawAbsolute(renderer, child, params.startx + 10, width, selectables, staffPos);
80
88
  }
81
89
  }
@@ -5,9 +5,9 @@ function formatJazzChord(chordString) {
5
5
  for (var i = 0; i < lines.length; i++) {
6
6
  var chord = lines[i];
7
7
  // If the chord isn't in a recognizable format then just skip the formatting.
8
- var reg = chord.match(/([ABCDEFG][♯♭]?)([^\/]+)?(\/[ABCDEFG][#b]?)?/);
8
+ var reg = chord.match(/^([ABCDEFG][♯♭]?)?([^\/]+)?(\/[ABCDEFG][#b]?)?/);
9
9
  if (reg)
10
- lines[i] = reg[1] + "\x03" + (reg[2]?reg[2]:'') + "\x03" + (reg[3]?reg[3]:'');
10
+ lines[i] = (reg[1]?reg[1]:'') + "\x03" + (reg[2]?reg[2]:'') + "\x03" + (reg[3]?reg[3]:'');
11
11
  }
12
12
  return lines.join("\n");
13
13
  }
@@ -1,5 +1,24 @@
1
1
  var layoutVoiceElements = require('./VoiceElements');
2
2
 
3
+ function checkLastBarX(voices) {
4
+ var maxX = 0;
5
+ for (var i = 0; i < voices.length; i++) {
6
+ var curVoice = voices[i];
7
+ if (curVoice.children.length > 0) {
8
+ var lastChild = curVoice.children.length - 1;
9
+ var maxChild = curVoice.children[lastChild];
10
+ if (maxChild.abcelem.el_type === 'bar') {
11
+ var barX = maxChild.children[0].x;
12
+ if (barX > maxX) {
13
+ maxX = barX;
14
+ } else {
15
+ maxChild.children[0].x = maxX;
16
+ }
17
+ }
18
+ }
19
+ }
20
+ }
21
+
3
22
  var layoutStaffGroup = function(spacing, renderer, debug, staffGroup, leftEdge) {
4
23
  var epsilon = 0.0000001; // Fudging for inexactness of floating point math.
5
24
  var spacingunits = 0; // number of times we will have ended up using the spacing distance (as opposed to fixed width distances)
@@ -94,6 +113,9 @@ var layoutStaffGroup = function(spacing, renderer, debug, staffGroup, leftEdge)
94
113
  spacingunit=layoutVoiceElements.getSpacingUnits(staffGroup.voices[i]);
95
114
  }
96
115
  }
116
+
117
+ // adjust lastBar when needed (multi staves)
118
+ checkLastBarX(staffGroup.voices);
97
119
  //console.log("greatest remaining",spacingunit,x);
98
120
  spacingunits+=spacingunit;
99
121
  staffGroup.setWidth(x);
@@ -118,7 +140,7 @@ function isSameStaff(voice1, voice2) {
118
140
  return false;
119
141
  if (!voice2 || !voice2.staff || !voice2.staff.voices || voice2.staff.voices.length === 0)
120
142
  return false;
121
- return (voice1.staff.voices[0] === voice2.staff.voices[0])
143
+ return (voice1.staff.voices[0] === voice2.staff.voices[0]);
122
144
  }
123
145
 
124
146
  module.exports = layoutStaffGroup;
@@ -51,7 +51,8 @@ function moveDecorations(beam) {
51
51
  }
52
52
 
53
53
  function placeInLane(rightMost, relElem) {
54
- // These items are centered so figure the coordinates accordingly and add a little margin.
54
+ // These items are centered so figure the coordinates accordingly.
55
+ // The font reports some extra space so the margin is built in.
55
56
  var xCoords = relElem.getChordDim();
56
57
  if (xCoords) {
57
58
  for (var i = 0; i < rightMost.length; i++) {