abcjs 6.1.8 → 6.2.0

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 (132) hide show
  1. package/RELEASE.md +66 -0
  2. package/dist/abcjs-basic-min.js +2 -2
  3. package/dist/abcjs-basic.js +4373 -4424
  4. package/dist/abcjs-basic.js.map +1 -1
  5. package/dist/abcjs-plugin-min.js +2 -2
  6. package/index.js +1 -1
  7. package/package.json +6 -6
  8. package/plugin.js +1 -1
  9. package/src/api/abc_timing_callbacks.js +7 -3
  10. package/src/api/abc_tunebook_svg.js +1 -2
  11. package/src/data/abc_tune.js +2 -2
  12. package/src/midi/abc_midi_create.js +8 -2
  13. package/src/parse/abc_common.js +0 -47
  14. package/src/parse/abc_parse.js +16 -16
  15. package/src/parse/abc_parse_book.js +3 -3
  16. package/src/parse/abc_parse_directive.js +26 -7
  17. package/src/parse/abc_parse_header.js +11 -9
  18. package/src/parse/abc_parse_key_voice.js +17 -17
  19. package/src/parse/abc_parse_music.js +89 -106
  20. package/src/parse/abc_tokenizer.js +60 -60
  21. package/src/parse/abc_transpose.js +14 -3
  22. package/src/parse/tune-builder.js +19 -14
  23. package/src/synth/abc_midi_flattener.js +25 -9
  24. package/src/synth/abc_midi_sequencer.js +1 -1
  25. package/src/synth/create-synth.js +41 -0
  26. package/src/synth/note-to-midi.js +50 -0
  27. package/src/tablatures/instruments/guitar/tab-guitar.js +0 -2
  28. package/src/tablatures/instruments/string-patterns.js +46 -28
  29. package/src/tablatures/instruments/tab-note.js +26 -103
  30. package/src/tablatures/instruments/violin/tab-violin.js +0 -2
  31. package/src/tablatures/tab-absolute-elements.js +9 -31
  32. package/src/tablatures/tab-renderer.js +2 -2
  33. package/src/test/abc_parser_lint.js +8 -5
  34. package/src/write/README.md +31 -0
  35. package/src/write/creation/abstract-engraver.js +1036 -0
  36. package/src/write/creation/add-chord.js +102 -0
  37. package/src/write/{add-text-if.js → creation/add-text-if.js} +6 -6
  38. package/src/write/{calcHeight.js → creation/calc-height.js} +2 -2
  39. package/src/write/creation/create-clef.js +72 -0
  40. package/src/write/creation/create-key-signature.js +31 -0
  41. package/src/write/creation/create-note-head.js +107 -0
  42. package/src/write/creation/create-time-signature.js +55 -0
  43. package/src/write/creation/decoration.js +357 -0
  44. package/src/write/{abc_absolute_element.js → creation/elements/absolute-element.js} +14 -15
  45. package/src/write/creation/elements/beam-element.js +113 -0
  46. package/src/write/{bottom-text.js → creation/elements/bottom-text.js} +14 -15
  47. package/src/write/{abc_brace_element.js → creation/elements/brace-element.js} +5 -5
  48. package/src/write/creation/elements/free-text.js +41 -0
  49. package/src/write/{abc_relative_element.js → creation/elements/relative-element.js} +8 -7
  50. package/src/write/{separator.js → creation/elements/separator.js} +2 -2
  51. package/src/write/{abc_staff_group_element.js → creation/elements/staff-group-element.js} +4 -4
  52. package/src/write/{subtitle.js → creation/elements/subtitle.js} +3 -3
  53. package/src/write/creation/elements/tempo-element.js +63 -0
  54. package/src/write/{abc_tie_element.js → creation/elements/tie-element.js} +15 -11
  55. package/src/write/{top-text.js → creation/elements/top-text.js} +12 -12
  56. package/src/write/creation/elements/triplet-element.js +28 -0
  57. package/src/write/{abc_voice_element.js → creation/elements/voice-element.js} +3 -3
  58. package/src/write/creation/glyphs.js +226 -0
  59. package/src/write/creation/translate-chord.js +37 -0
  60. package/src/write/draw/absolute.js +5 -5
  61. package/src/write/draw/beam.js +8 -8
  62. package/src/write/draw/brace.js +33 -33
  63. package/src/write/draw/crescendo.js +4 -4
  64. package/src/write/draw/debug-box.js +1 -1
  65. package/src/write/draw/draw.js +7 -7
  66. package/src/write/draw/dynamics.js +2 -2
  67. package/src/write/draw/ending.js +6 -6
  68. package/src/write/draw/glissando.js +17 -17
  69. package/src/write/draw/group-elements.js +51 -51
  70. package/src/write/draw/horizontal-line.js +9 -9
  71. package/src/write/draw/non-music.js +1 -1
  72. package/src/write/draw/print-line.js +15 -16
  73. package/src/write/draw/print-stem.js +5 -5
  74. package/src/write/draw/print-symbol.js +12 -12
  75. package/src/write/draw/print-vertical-line.js +8 -8
  76. package/src/write/draw/relative.js +17 -16
  77. package/src/write/draw/selectables.js +5 -5
  78. package/src/write/draw/separator.js +4 -4
  79. package/src/write/draw/set-paper-size.js +2 -2
  80. package/src/write/draw/sprintf.js +31 -31
  81. package/src/write/draw/staff-group.js +36 -30
  82. package/src/write/draw/staff-line.js +2 -2
  83. package/src/write/draw/staff.js +4 -4
  84. package/src/write/draw/tab-line.js +26 -26
  85. package/src/write/draw/tempo.js +30 -30
  86. package/src/write/draw/text.js +5 -5
  87. package/src/write/draw/tie.js +18 -18
  88. package/src/write/draw/triplet.js +6 -6
  89. package/src/write/draw/voice.js +16 -17
  90. package/src/write/{abc_engraver_controller.js → engraver-controller.js} +58 -51
  91. package/src/write/{classes.js → helpers/classes.js} +6 -6
  92. package/src/write/{get-font-and-attr.js → helpers/get-font-and-attr.js} +9 -7
  93. package/src/write/{get-text-size.js → helpers/get-text-size.js} +5 -5
  94. package/src/write/{set-class.js → helpers/set-class.js} +1 -1
  95. package/src/write/{abc_spacing.js → helpers/spacing.js} +1 -1
  96. package/src/write/{highlight.js → interactive/highlight.js} +1 -1
  97. package/src/write/{selection.js → interactive/selection.js} +27 -27
  98. package/src/write/{unhighlight.js → interactive/unhighlight.js} +1 -1
  99. package/src/write/layout/beam.js +13 -13
  100. package/src/write/layout/get-left-edge-of-staff.js +4 -4
  101. package/src/write/layout/layout.js +74 -74
  102. package/src/write/layout/{setUpperAndLowerElements.js → set-upper-and-lower-elements.js} +8 -8
  103. package/src/write/layout/{staffGroup.js → staff-group.js} +32 -32
  104. package/src/write/layout/triplet.js +4 -4
  105. package/src/write/layout/{VoiceElements.js → voice-elements.js} +23 -23
  106. package/src/write/layout/voice.js +6 -6
  107. package/src/write/{abc_renderer.js → renderer.js} +35 -32
  108. package/src/write/svg.js +35 -35
  109. package/test.js +1 -1
  110. package/types/index.d.ts +99 -22
  111. package/version.js +1 -1
  112. package/src/tablatures/instruments/guitar/guitar-fonts.js +0 -19
  113. package/src/tablatures/instruments/violin/violin-fonts.js +0 -19
  114. package/src/tablatures/transposer.js +0 -110
  115. package/src/write/abc_abstract_engraver.js +0 -1026
  116. package/src/write/abc_beam_element.js +0 -113
  117. package/src/write/abc_create_clef.js +0 -72
  118. package/src/write/abc_create_key_signature.js +0 -33
  119. package/src/write/abc_create_note_head.js +0 -107
  120. package/src/write/abc_create_time_signature.js +0 -55
  121. package/src/write/abc_decoration.js +0 -341
  122. package/src/write/abc_glyphs.js +0 -224
  123. package/src/write/abc_tempo_element.js +0 -63
  124. package/src/write/abc_triplet_element.js +0 -28
  125. package/src/write/add-chord.js +0 -103
  126. package/src/write/format-jazz-chord.js +0 -15
  127. package/src/write/free-text.js +0 -41
  128. /package/src/write/{abc_crescendo_element.js → creation/elements/crescendo-element.js} +0 -0
  129. /package/src/write/{abc_dynamic_decoration.js → creation/elements/dynamic-decoration.js} +0 -0
  130. /package/src/write/{abc_ending_element.js → creation/elements/ending-element.js} +0 -0
  131. /package/src/write/{abc_glissando_element.js → creation/elements/glissando-element.js} +0 -0
  132. /package/src/write/layout/{getBarYAt.js → get-bar-y-at.js} +0 -0
@@ -1,113 +0,0 @@
1
- // abc_beam_element.js: Definition of the BeamElem class.
2
-
3
- // Most elements on the page are related to a particular absolute element -- notes, rests, bars, etc. Beams, however, span multiple elements.
4
- // This means that beams can't be laid out until the absolute elements are placed. There is the further complication that the stems for beamed
5
- // notes can't be laid out until the beams are because we don't know how long they will be until we know the slope of the beam and the horizontal
6
- // spacing of the absolute elements.
7
- //
8
- // So, when a beam is detected, a BeamElem is created, then all notes belonging to that beam are added to it. These notes are not given stems at that time.
9
- // Then, after the horizontal layout is complete, all of the BeamElem are iterated to set the beam position, then all of the notes that are beamed are given
10
- // stems. After that, we are ready for the drawing step.
11
-
12
- // There are three phases: the setup phase, when new elements are being discovered, the layout phase, when everything is calculated, and the drawing phase,
13
- // when the object is not changed, but is used to put the elements on the page.
14
-
15
- //
16
- // Setup phase
17
- //
18
- var BeamElem = function BeamElem(stemHeight, type, flat, firstElement) {
19
- // type is "grace", "up", "down", or undefined. flat is used to force flat beams, as it commonly found in the grace notes of bagpipe music.
20
- this.type = "BeamElem";
21
- this.isflat = !!flat;
22
- this.isgrace = !!(type && type === "grace");
23
- this.forceup = !!(this.isgrace || (type && type === "up"));
24
- this.forcedown = !!(type && type === "down");
25
- this.elems = []; // all the AbsoluteElements that this beam touches. It may include embedded rests.
26
- this.total = 0;
27
- this.average = 6; // use middle line as start for average.
28
- this.allrests = true;
29
- this.stemHeight = stemHeight;
30
- this.beams = []; // During the layout phase, this will become a list of the beams that need to be drawn.
31
- if (firstElement && firstElement.duration) {
32
- this.duration = firstElement.duration;
33
- if (firstElement.startTriplet) {
34
- this.duration *= firstElement.tripletMultiplier;
35
- }
36
- this.duration = Math.round(this.duration*1000)/1000;
37
- } else
38
- this.duration = 0;
39
- };
40
-
41
- BeamElem.prototype.setHint = function () {
42
- this.hint = true;
43
- };
44
-
45
- BeamElem.prototype.runningDirection = function (abcelem) {
46
- var pitch = abcelem.averagepitch;
47
- if (pitch === undefined) return; // don't include elements like spacers in beams
48
- this.total = Math.round(this.total+pitch);
49
- if (!this.count)
50
- this.count = 0;
51
- this.count++
52
- };
53
-
54
- BeamElem.prototype.add = function(abselem) {
55
- var pitch = abselem.abcelem.averagepitch;
56
- if (pitch === undefined) return; // don't include elements like spacers in beams
57
- if (!abselem.abcelem.rest)
58
- this.allrests = false;
59
- abselem.beam = this;
60
- this.elems.push(abselem);
61
- this.total = Math.round(this.total+pitch);
62
- if (this.min === undefined || abselem.abcelem.minpitch < this.min) {
63
- this.min = abselem.abcelem.minpitch;
64
- }
65
- if (this.max === undefined || abselem.abcelem.maxpitch > this.max) {
66
- this.max = abselem.abcelem.maxpitch;
67
- }
68
- };
69
-
70
- BeamElem.prototype.addBeam = function(beam) {
71
- this.beams.push(beam);
72
- };
73
-
74
- BeamElem.prototype.setStemDirection = function() {
75
- // Have to figure this out before the notes are placed because placing the notes also places the decorations.
76
- this.average = calcAverage(this.total, this.count);
77
- if (this.forceup) {
78
- this.stemsUp = true;
79
- } else if (this.forcedown) {
80
- this.stemsUp = false;
81
- } else {
82
- var middleLine = 6; // hardcoded 6 is B
83
- this.stemsUp = this.average < middleLine; // true is up, false is down;
84
- }
85
- delete this.count;
86
- this.total = 0;
87
- };
88
-
89
- BeamElem.prototype.calcDir = function() {
90
- this.average = calcAverage(this.total, this.elems.length);
91
- if (this.forceup) {
92
- this.stemsUp = true;
93
- } else if (this.forcedown) {
94
- this.stemsUp = false;
95
- } else {
96
- var middleLine = 6; // hardcoded 6 is B
97
- this.stemsUp = this.average < middleLine; // true is up, false is down;
98
- }
99
- var dir = this.stemsUp ? 'up' : 'down';
100
- for (var i = 0; i < this.elems.length; i++) {
101
- for (var j = 0; j < this.elems[i].heads.length; j++) {
102
- this.elems[i].heads[j].stemDir = dir;
103
- }
104
- }
105
- };
106
-
107
- function calcAverage(total, numElements) {
108
- if (!numElements)
109
- return 0;
110
- return total / numElements;
111
- }
112
-
113
- module.exports = BeamElem;
@@ -1,72 +0,0 @@
1
- // abc_create_clef.js
2
-
3
- var AbsoluteElement = require('./abc_absolute_element');
4
- var glyphs = require('./abc_glyphs');
5
- var RelativeElement = require('./abc_relative_element');
6
-
7
- var createClef = function(elem, tuneNumber) {
8
- var clef;
9
- var octave = 0;
10
- elem.el_type = "clef";
11
- var abselem = new AbsoluteElement(elem,0,10, 'staff-extra clef', tuneNumber);
12
- abselem.isClef = true;
13
- switch (elem.type) {
14
- case "treble": clef = "clefs.G"; break;
15
- case "tenor": clef="clefs.C"; break;
16
- case "alto": clef="clefs.C"; break;
17
- case "bass": clef="clefs.F"; break;
18
- case 'treble+8': clef = "clefs.G"; octave = 1; break;
19
- case 'tenor+8':clef="clefs.C"; octave = 1; break;
20
- case 'bass+8': clef="clefs.F"; octave = 1; break;
21
- case 'alto+8': clef="clefs.C"; octave = 1; break;
22
- case 'treble-8': clef = "clefs.G"; octave = -1; break;
23
- case 'tenor-8':clef="clefs.C"; octave = -1; break;
24
- case 'bass-8': clef="clefs.F"; octave = -1; break;
25
- case 'alto-8': clef="clefs.C"; octave = -1; break;
26
- case 'none': return null;
27
- case 'perc': clef="clefs.perc"; break;
28
- default: abselem.addFixed(new RelativeElement("clef="+elem.type, 0, 0, undefined, {type:"debug"}));
29
- }
30
- // if (elem.verticalPos) {
31
- // pitch = elem.verticalPos;
32
- // }
33
- var dx =5;
34
- if (clef) {
35
- var height = glyphs.symbolHeightInPitches(clef);
36
- var ofs = clefOffsets(clef);
37
- abselem.addRight(new RelativeElement(clef, dx, glyphs.getSymbolWidth(clef), elem.clefPos, { top: height+elem.clefPos+ofs, bottom: elem.clefPos+ofs}));
38
-
39
- if (octave !== 0) {
40
- var scale = 2 / 3;
41
- var adjustspacing = (glyphs.getSymbolWidth(clef) - glyphs.getSymbolWidth("8") * scale) / 2;
42
- var pitch = (octave > 0) ? abselem.top + 3 : abselem.bottom - 1;
43
- var top = (octave > 0) ? abselem.top + 3 : abselem.bottom - 3;
44
- var bottom = top-2;
45
- if (elem.type === "bass-8") {
46
- // The placement for bass octave is a little different. It should hug the clef.
47
- pitch = 3;
48
- adjustspacing = 0;
49
- }
50
- abselem.addRight(new RelativeElement("8", dx + adjustspacing, glyphs.getSymbolWidth("8") * scale, pitch, {
51
- scalex: scale,
52
- scaley: scale,
53
- top: top,
54
- bottom: bottom
55
- }));
56
- //abselem.top += 2;
57
- }
58
- }
59
- return abselem;
60
- };
61
-
62
- function clefOffsets(clef) {
63
- switch (clef) {
64
- case "clefs.G": return -5;
65
- case "clefs.C": return -4;
66
- case "clefs.F": return -4;
67
- case "clefs.perc": return -2;
68
- default: return 0;
69
- }
70
- }
71
-
72
- module.exports = createClef;
@@ -1,33 +0,0 @@
1
- // abc_create_key_signature.js
2
-
3
- var AbsoluteElement = require('./abc_absolute_element');
4
- var glyphs = require('./abc_glyphs');
5
- var RelativeElement = require('./abc_relative_element');
6
-
7
- var parseCommon = require('../parse/abc_common');
8
-
9
- var createKeySignature = function(elem, tuneNumber) {
10
- elem.el_type = "keySignature";
11
- if (!elem.accidentals || elem.accidentals.length === 0)
12
- return null;
13
- var abselem = new AbsoluteElement(elem, 0, 10, 'staff-extra key-signature', tuneNumber);
14
- abselem.isKeySig = true;
15
- var dx = 0;
16
- parseCommon.each(elem.accidentals, function(acc) {
17
- var symbol;
18
- var fudge = 0;
19
- switch(acc.acc) {
20
- case "sharp": symbol = "accidentals.sharp"; fudge = -3; break;
21
- case "natural": symbol = "accidentals.nat"; break;
22
- case "flat": symbol = "accidentals.flat"; fudge = -1.2; break;
23
- case "quartersharp": symbol = "accidentals.halfsharp"; fudge = -2.5; break;
24
- case "quarterflat": symbol = "accidentals.halfflat"; fudge = -1.2; break;
25
- default: symbol = "accidentals.flat";
26
- }
27
- abselem.addRight(new RelativeElement(symbol, dx, glyphs.getSymbolWidth(symbol), acc.verticalPos, {thickness: glyphs.symbolHeightInPitches(symbol), top: acc.verticalPos+glyphs.symbolHeightInPitches(symbol)+fudge, bottom: acc.verticalPos+fudge }));
28
- dx += glyphs.getSymbolWidth(symbol) + 2;
29
- }, this);
30
- return abselem;
31
- };
32
-
33
- module.exports = createKeySignature;
@@ -1,107 +0,0 @@
1
- var glyphs = require('./abc_glyphs');
2
- var RelativeElement = require('./abc_relative_element');
3
-
4
- var createNoteHead = function(abselem, c, pitchelem, options) {
5
- if (!options) options = {};
6
- var dir = (options.dir !== undefined) ? options.dir : null;
7
- var headx = (options.headx !== undefined) ? options.headx : 0;
8
- var extrax = (options.extrax !== undefined) ? options.extrax : 0;
9
- var flag = (options.flag !== undefined) ? options.flag : null;
10
- var dot = (options.dot !== undefined) ? options.dot : 0;
11
- var dotshiftx = (options.dotshiftx !== undefined) ? options.dotshiftx : 0;
12
- var scale = (options.scale !== undefined) ? options.scale : 1;
13
- var accidentalSlot = (options.accidentalSlot !== undefined) ? options.accidentalSlot : [];
14
- var shouldExtendStem = (options.shouldExtendStem !== undefined) ? options.shouldExtendStem : false;
15
- var printAccidentals = (options.printAccidentals !== undefined) ? options.printAccidentals : true;
16
-
17
- // TODO scale the dot as well
18
- var pitch = pitchelem.verticalPos;
19
- var notehead;
20
- var accidentalshiftx = 0;
21
- var newDotShiftX = 0;
22
- var extraLeft = 0;
23
- if (c === undefined)
24
- abselem.addFixed(new RelativeElement("pitch is undefined", 0, 0, 0, {type:"debug"}));
25
- else if (c==="") {
26
- notehead = new RelativeElement(null, 0, 0, pitch);
27
- } else {
28
- var shiftheadx = headx;
29
- if (pitchelem.printer_shift) {
30
- var adjust = (pitchelem.printer_shift==="same")?1:0;
31
- shiftheadx = (dir==="down")?-glyphs.getSymbolWidth(c)*scale+adjust:glyphs.getSymbolWidth(c)*scale-adjust;
32
- }
33
- var opts = {scalex:scale, scaley: scale, thickness: glyphs.symbolHeightInPitches(c)*scale, name: pitchelem.name };
34
- notehead = new RelativeElement(c, shiftheadx, glyphs.getSymbolWidth(c)*scale, pitch, opts);
35
- notehead.stemDir = dir;
36
- if (flag) {
37
- var pos = pitch+((dir==="down")?-7:7)*scale;
38
- // if this is a regular note, (not grace or tempo indicator) then the stem will have been stretched to the middle line if it is far from the center.
39
- if (shouldExtendStem) {
40
- if (dir==="down" && pos > 6)
41
- pos = 6;
42
- if (dir==="up" && pos < 6)
43
- pos = 6;
44
- }
45
- //if (scale===1 && (dir==="down")?(pos>6):(pos<6)) pos=6;
46
- var xdelta = (dir==="down")?headx:headx+notehead.w-0.6;
47
- abselem.addRight(new RelativeElement(flag, xdelta, glyphs.getSymbolWidth(flag)*scale, pos, {scalex:scale, scaley: scale}));
48
- }
49
- newDotShiftX = notehead.w+dotshiftx-2+5*dot;
50
- for (;dot>0;dot--) {
51
- var dotadjusty = (1-Math.abs(pitch)%2); //PER: take abs value of the pitch. And the shift still happens on ledger lines.
52
- abselem.addRight(new RelativeElement("dots.dot", notehead.w+dotshiftx-2+5*dot, glyphs.getSymbolWidth("dots.dot"), pitch+dotadjusty));
53
- }
54
- }
55
- if (notehead)
56
- notehead.highestVert = pitchelem.highestVert;
57
-
58
- if (printAccidentals && pitchelem.accidental) {
59
- var symb;
60
- switch (pitchelem.accidental) {
61
- case "quartersharp":
62
- symb = "accidentals.halfsharp";
63
- break;
64
- case "dblsharp":
65
- symb = "accidentals.dblsharp";
66
- break;
67
- case "sharp":
68
- symb = "accidentals.sharp";
69
- break;
70
- case "quarterflat":
71
- symb = "accidentals.halfflat";
72
- break;
73
- case "flat":
74
- symb = "accidentals.flat";
75
- break;
76
- case "dblflat":
77
- symb = "accidentals.dblflat";
78
- break;
79
- case "natural":
80
- symb = "accidentals.nat";
81
- }
82
- // if a note is at least a sixth away, it can share a slot with another accidental
83
- var accSlotFound = false;
84
- var accPlace = extrax;
85
- for (var j = 0; j < accidentalSlot.length; j++) {
86
- if (pitch - accidentalSlot[j][0] >= 6) {
87
- accidentalSlot[j][0] = pitch;
88
- accPlace = accidentalSlot[j][1];
89
- accSlotFound = true;
90
- break;
91
- }
92
- }
93
- if (accSlotFound === false) {
94
- accPlace -= (glyphs.getSymbolWidth(symb)*scale+2);
95
- accidentalSlot.push([pitch,accPlace]);
96
- accidentalshiftx = (glyphs.getSymbolWidth(symb)*scale+2);
97
- }
98
- var h = glyphs.symbolHeightInPitches(symb);
99
- abselem.addExtra(new RelativeElement(symb, accPlace, glyphs.getSymbolWidth(symb), pitch, {scalex:scale, scaley: scale, top: pitch+h/2, bottom: pitch-h/2}));
100
- extraLeft = glyphs.getSymbolWidth(symb) / 2; // TODO-PER: We need a little extra width if there is an accidental, but I'm not sure why it isn't the full width of the accidental.
101
- }
102
-
103
- return { notehead: notehead, accidentalshiftx: accidentalshiftx, dotshiftx: newDotShiftX, extraLeft: extraLeft };
104
-
105
- };
106
-
107
- module.exports = createNoteHead;
@@ -1,55 +0,0 @@
1
- // abc_create_time_signature.js
2
-
3
- var AbsoluteElement = require('./abc_absolute_element');
4
- var glyphs = require('./abc_glyphs');
5
- var RelativeElement = require('./abc_relative_element');
6
-
7
- var createTimeSignature = function(elem, tuneNumber) {
8
- elem.el_type = "timeSignature";
9
- var abselem = new AbsoluteElement(elem,0,10, 'staff-extra time-signature', tuneNumber);
10
- if (elem.type === "specified") {
11
- var x = 0;
12
- for (var i = 0; i < elem.value.length; i++) {
13
- if (i !== 0) {
14
- abselem.addRight(new RelativeElement('+', x+1, glyphs.getSymbolWidth("+"), 6, {thickness: glyphs.symbolHeightInPitches("+")}));
15
- x += glyphs.getSymbolWidth("+")+2;
16
- }
17
- if (elem.value[i].den) {
18
- var numWidth = 0;
19
- for (var i2 = 0; i2 < elem.value[i].num.length; i2++)
20
- numWidth += glyphs.getSymbolWidth(elem.value[i].num.charAt(i2));
21
- var denWidth = 0;
22
- for (i2 = 0; i2 < elem.value[i].num.length; i2++)
23
- denWidth += glyphs.getSymbolWidth(elem.value[i].den.charAt(i2));
24
- var maxWidth = Math.max(numWidth, denWidth);
25
- abselem.addRight(new RelativeElement(elem.value[i].num, x+(maxWidth-numWidth)/2, numWidth, 8, { thickness: glyphs.symbolHeightInPitches(elem.value[i].num.charAt(0)) }));
26
- abselem.addRight(new RelativeElement(elem.value[i].den, x+(maxWidth-denWidth)/2, denWidth, 4, { thickness: glyphs.symbolHeightInPitches(elem.value[i].den.charAt(0)) }));
27
- x += maxWidth
28
- } else {
29
- var thisWidth = 0;
30
- for (var i3 = 0; i3 < elem.value[i].num.length; i3++)
31
- thisWidth += glyphs.getSymbolWidth(elem.value[i].num.charAt(i3));
32
- abselem.addRight(new RelativeElement(elem.value[i].num, x, thisWidth, 6, { thickness: glyphs.symbolHeightInPitches(elem.value[i].num.charAt(0)) }));
33
- x += thisWidth;
34
- }
35
- }
36
- } else if (elem.type === "common_time") {
37
- abselem.addRight(new RelativeElement("timesig.common", 0, glyphs.getSymbolWidth("timesig.common"), 6, { thickness: glyphs.symbolHeightInPitches("timesig.common") }));
38
-
39
- } else if (elem.type === "cut_time") {
40
- abselem.addRight(new RelativeElement("timesig.cut", 0, glyphs.getSymbolWidth("timesig.cut"), 6, { thickness: glyphs.symbolHeightInPitches("timesig.cut") }));
41
- } else if (elem.type === "tempus_imperfectum") {
42
- abselem.addRight(new RelativeElement("timesig.imperfectum", 0, glyphs.getSymbolWidth("timesig.imperfectum"), 6, { thickness: glyphs.symbolHeightInPitches("timesig.imperfectum") }));
43
- } else if (elem.type === "tempus_imperfectum_prolatio") {
44
- abselem.addRight(new RelativeElement("timesig.imperfectum2", 0, glyphs.getSymbolWidth("timesig.imperfectum2"), 6, { thickness: glyphs.symbolHeightInPitches("timesig.imperfectum2") }));
45
- } else if (elem.type === "tempus_perfectum") {
46
- abselem.addRight(new RelativeElement("timesig.perfectum", 0, glyphs.getSymbolWidth("timesig.perfectum"), 6, { thickness: glyphs.symbolHeightInPitches("timesig.perfectum") }));
47
- } else if (elem.type === "tempus_perfectum_prolatio") {
48
- abselem.addRight(new RelativeElement("timesig.perfectum2", 0, glyphs.getSymbolWidth("timesig.perfectum2"), 6, { thickness: glyphs.symbolHeightInPitches("timesig.perfectum2") }));
49
- } else {
50
- console.log("time signature:",elem);
51
- }
52
- return abselem;
53
- };
54
-
55
- module.exports = createTimeSignature;