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,341 +0,0 @@
1
- // abc_decoration.js: Creates a data structure suitable for printing a line of abc
2
-
3
- var DynamicDecoration = require('./abc_dynamic_decoration');
4
- var CrescendoElem = require('./abc_crescendo_element');
5
- var GlissandoElem = require('./abc_glissando_element');
6
- var glyphs = require('./abc_glyphs');
7
- var RelativeElement = require('./abc_relative_element');
8
- var TieElem = require('./abc_tie_element');
9
-
10
- var Decoration = function Decoration() {
11
- this.startDiminuendoX = undefined;
12
- this.startCrescendoX = undefined;
13
- this.minTop = 12; // TODO-PER: this is assuming a 5-line staff. Pass that info in.
14
- this.minBottom = 0;
15
- };
16
-
17
- var closeDecoration = function(voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch) {
18
- var yPos;
19
- for (var i=0;i<decoration.length; i++) {
20
- if (decoration[i]==="staccato" || decoration[i]==="tenuto" || decoration[i] === "accent") {
21
- var symbol = "scripts." + decoration[i];
22
- if (decoration[i] === "accent") symbol = "scripts.sforzato";
23
- if (yPos === undefined)
24
- yPos = (dir==="down") ? pitch+2:minPitch-2;
25
- else
26
- yPos = (dir==="down") ? yPos+2:yPos-2;
27
- if (decoration[i] === "accent") {
28
- // Always place the accent three pitches away, no matter whether that is a line or space.
29
- if (dir === "up") yPos--;
30
- else yPos++;
31
- } else {
32
- // don't place on a stave line. The stave lines are 2,4,6,8,10
33
- switch (yPos) {
34
- case 2:
35
- case 4:
36
- case 6:
37
- case 8:
38
- case 10:
39
- if (dir === "up") yPos--;
40
- else yPos++;
41
- break;
42
- }
43
- }
44
- if (pitch>9) yPos++; // take up some room of those that are above
45
- var deltaX = width/2;
46
- if (glyphs.getSymbolAlign(symbol)!=="center") {
47
- deltaX -= (glyphs.getSymbolWidth(symbol)/2);
48
- }
49
- abselem.addFixedX(new RelativeElement(symbol, deltaX, glyphs.getSymbolWidth(symbol), yPos));
50
- }
51
- if (decoration[i]==="slide" && abselem.heads[0]) {
52
- var yPos2 = abselem.heads[0].pitch;
53
- yPos2 -= 2; // TODO-PER: not sure what this fudge factor is.
54
- var blank1 = new RelativeElement("", -roomtaken-15, 0, yPos2-1);
55
- var blank2 = new RelativeElement("", -roomtaken-5, 0, yPos2+1);
56
- abselem.addFixedX(blank1);
57
- abselem.addFixedX(blank2);
58
- voice.addOther(new TieElem({ anchor1: blank1, anchor2: blank2, fixedY: true}));
59
- }
60
- }
61
- if (yPos === undefined)
62
- yPos = pitch;
63
-
64
- return { above: yPos, below: abselem.bottom };
65
- };
66
-
67
- var volumeDecoration = function(voice, decoration, abselem, positioning) {
68
- for (var i=0;i<decoration.length; i++) {
69
- switch(decoration[i]) {
70
- case "p":
71
- case "mp":
72
- case "pp":
73
- case "ppp":
74
- case "pppp":
75
- case "f":
76
- case "ff":
77
- case "fff":
78
- case "ffff":
79
- case "sfz":
80
- case "mf":
81
- var elem = new DynamicDecoration(abselem, decoration[i], positioning);
82
- voice.addOther(elem);
83
- }
84
- }
85
- };
86
-
87
- var compoundDecoration = function(decoration, pitch, width, abselem, dir) {
88
- function highestPitch() {
89
- if (abselem.heads.length === 0)
90
- return 10; // TODO-PER: I don't know if this can happen, but we'll return the top of the staff if so.
91
- var pitch = abselem.heads[0].pitch;
92
- for (var i = 1; i < abselem.heads.length; i++)
93
- pitch = Math.max(pitch, abselem.heads[i].pitch);
94
- return pitch;
95
- }
96
- function lowestPitch() {
97
- if (abselem.heads.length === 0)
98
- return 2; // TODO-PER: I don't know if this can happen, but we'll return the bottom of the staff if so.
99
- var pitch = abselem.heads[0].pitch;
100
- for (var i = 1; i < abselem.heads.length; i++)
101
- pitch = Math.min(pitch, abselem.heads[i].pitch);
102
- return pitch;
103
- }
104
- function compoundDecoration(symbol, count) {
105
- var placement = (dir === 'down') ? lowestPitch()+1:highestPitch()+9;
106
- if (dir !== 'down' && count === 1)
107
- placement--;
108
- var deltaX = width/2;
109
- deltaX += (dir === 'down') ? -5 : 3;
110
- for (var i = 0; i < count; i++) {
111
- placement -= 1;
112
- abselem.addFixedX(new RelativeElement(symbol, deltaX, glyphs.getSymbolWidth(symbol), placement));
113
- }
114
- }
115
-
116
- for (var i=0;i<decoration.length; i++) {
117
- switch(decoration[i]) {
118
- case "/": compoundDecoration("flags.ugrace", 1); break;
119
- case "//": compoundDecoration("flags.ugrace", 2); break;
120
- case "///": compoundDecoration("flags.ugrace", 3); break;
121
- case "////": compoundDecoration("flags.ugrace", 4); break;
122
- }
123
- }
124
- };
125
-
126
- var stackedDecoration = function(decoration, width, abselem, yPos, positioning, minTop, minBottom) {
127
- function incrementPlacement(placement, height) {
128
- if (placement === 'above')
129
- yPos.above += height;
130
- else
131
- yPos.below -= height;
132
- }
133
- function getPlacement(placement) {
134
- var y;
135
- if (placement === 'above') {
136
- y = yPos.above;
137
- if (y < minTop)
138
- y = minTop;
139
- } else {
140
- y = yPos.below;
141
- if (y > minBottom)
142
- y = minBottom;
143
- }
144
- return y;
145
- }
146
- function textDecoration(text, placement) {
147
- var y = getPlacement(placement);
148
- var textFudge = 2;
149
- var textHeight = 5;
150
- // TODO-PER: Get the height of the current font and use that for the thickness.
151
- abselem.addFixedX(new RelativeElement(text, width/2, 0, y+textFudge, {type:"decoration", klass: 'ornament', thickness: 3}));
152
-
153
- incrementPlacement(placement, textHeight);
154
- }
155
- function symbolDecoration(symbol, placement) {
156
- var deltaX = width/2;
157
- if (glyphs.getSymbolAlign(symbol) !== "center") {
158
- deltaX -= (glyphs.getSymbolWidth(symbol) / 2);
159
- }
160
- var height = glyphs.symbolHeightInPitches(symbol) + 1; // adding a little padding so nothing touches.
161
- var y = getPlacement(placement);
162
- y = (placement === 'above') ? y + height/2 : y - height/2;// Center the element vertically.
163
- abselem.addFixedX(new RelativeElement(symbol, deltaX, glyphs.getSymbolWidth(symbol), y, { klass: 'ornament', thickness: glyphs.symbolHeightInPitches(symbol) }));
164
-
165
- incrementPlacement(placement, height);
166
- }
167
-
168
- var symbolList = {
169
- "+": "scripts.stopped",
170
- "open": "scripts.open",
171
- "snap": "scripts.snap",
172
- "wedge": "scripts.wedge",
173
- "thumb": "scripts.thumb",
174
- "shortphrase": "scripts.shortphrase",
175
- "mediumphrase": "scripts.mediumphrase",
176
- "longphrase": "scripts.longphrase",
177
- "trill": "scripts.trill",
178
- "roll": "scripts.roll",
179
- "irishroll": "scripts.roll",
180
- "marcato": "scripts.umarcato",
181
- "dmarcato": "scripts.dmarcato",
182
- "umarcato": "scripts.umarcato",
183
- "turn": "scripts.turn",
184
- "uppermordent": "scripts.prall",
185
- "pralltriller": "scripts.prall",
186
- "mordent": "scripts.mordent",
187
- "lowermordent": "scripts.mordent",
188
- "downbow": "scripts.downbow",
189
- "upbow": "scripts.upbow",
190
- "fermata": "scripts.ufermata",
191
- "invertedfermata": "scripts.dfermata",
192
- "breath": ",",
193
- "coda": "scripts.coda",
194
- "segno": "scripts.segno"
195
- };
196
-
197
- var hasOne = false;
198
- for (var i=0;i<decoration.length; i++) {
199
- switch(decoration[i]) {
200
- case "0":
201
- case "1":
202
- case "2":
203
- case "3":
204
- case "4":
205
- case "5":
206
- case "D.C.":
207
- case "D.S.":
208
- textDecoration(decoration[i], positioning);
209
- hasOne = true;
210
- break;
211
- case "fine":
212
- textDecoration("FINE", positioning);
213
- hasOne = true;
214
- break;
215
- case "+":
216
- case "open":
217
- case "snap":
218
- case "wedge":
219
- case "thumb":
220
- case "shortphrase":
221
- case "mediumphrase":
222
- case "longphrase":
223
- case "trill":
224
- case "roll":
225
- case "irishroll":
226
- case "marcato":
227
- case "dmarcato":
228
- case "turn":
229
- case "uppermordent":
230
- case "pralltriller":
231
- case "mordent":
232
- case "lowermordent":
233
- case "downbow":
234
- case "upbow":
235
- case "fermata":
236
- case "breath":
237
- case "umarcato":
238
- case "coda":
239
- case "segno":
240
- symbolDecoration(symbolList[decoration[i]], positioning);
241
- hasOne = true;
242
- break;
243
- case "invertedfermata":
244
- symbolDecoration(symbolList[decoration[i]], 'below');
245
- hasOne = true;
246
- break;
247
- case "mark":
248
- abselem.klass = "mark";
249
- break;
250
- }
251
- }
252
- return hasOne;
253
- };
254
-
255
- function leftDecoration(decoration, abselem, roomtaken) {
256
- for (var i=0;i<decoration.length; i++) {
257
- switch (decoration[i]) {
258
- case "arpeggio":
259
- // The arpeggio symbol is the height of a note (that is, two Y units). This stacks as many as we need to go from the
260
- // top note to the bottom note. The arpeggio should also be a little taller than the stacked notes, so there is an extra
261
- // one drawn and it is offset by half of a note height (that is, one Y unit).
262
- for (var j = abselem.abcelem.minpitch - 1; j <= abselem.abcelem.maxpitch; j += 2) {
263
- abselem.addExtra(
264
- new RelativeElement(
265
- "scripts.arpeggio",
266
- -glyphs.getSymbolWidth("scripts.arpeggio")*2 - roomtaken,
267
- 0,
268
- j+2,
269
- {klass: 'ornament', thickness: glyphs.symbolHeightInPitches("scripts.arpeggio")}
270
- )
271
- );
272
- }
273
- break;
274
- }
275
- }
276
- }
277
-
278
- Decoration.prototype.dynamicDecoration = function(voice, decoration, abselem, positioning) {
279
- var diminuendo;
280
- var crescendo;
281
- var glissando;
282
- for (var i=0;i<decoration.length; i++) {
283
- switch(decoration[i]) {
284
- case "diminuendo(":
285
- this.startDiminuendoX = abselem;
286
- diminuendo = undefined;
287
- break;
288
- case "diminuendo)":
289
- diminuendo = { start: this.startDiminuendoX, stop: abselem};
290
- this.startDiminuendoX = undefined;
291
- break;
292
- case "crescendo(":
293
- this.startCrescendoX = abselem;
294
- crescendo = undefined;
295
- break;
296
- case "crescendo)":
297
- crescendo = { start: this.startCrescendoX, stop: abselem};
298
- this.startCrescendoX = undefined;
299
- break;
300
- case "glissando(":
301
- this.startGlissandoX = abselem;
302
- glissando = undefined;
303
- break;
304
- case "glissando)":
305
- glissando = { start: this.startGlissandoX, stop: abselem};
306
- this.startGlissandoX = undefined;
307
- break;
308
- }
309
- }
310
- if (diminuendo) {
311
- voice.addOther(new CrescendoElem(diminuendo.start, diminuendo.stop, ">", positioning));
312
- }
313
- if (crescendo) {
314
- voice.addOther(new CrescendoElem(crescendo.start, crescendo.stop, "<", positioning));
315
- }
316
- if (glissando) {
317
- voice.addOther(new GlissandoElem(glissando.start, glissando.stop));
318
- }
319
- };
320
-
321
- Decoration.prototype.createDecoration = function(voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch, positioning, hasVocals) {
322
- if (!positioning)
323
- positioning = { ornamentPosition: 'above', volumePosition: hasVocals ? 'above' :'below', dynamicPosition: hasVocals ? 'above' : 'below' };
324
- // These decorations don't affect the placement of other decorations
325
- volumeDecoration(voice, decoration, abselem, positioning.volumePosition);
326
- this.dynamicDecoration(voice, decoration, abselem, positioning.dynamicPosition);
327
- compoundDecoration(decoration, pitch, width, abselem, dir);
328
-
329
- // treat staccato, accent, and tenuto first (may need to shift other markers)
330
- var yPos = closeDecoration(voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch);
331
- // yPos is an object containing 'above' and 'below'. That is the placement of the next symbol on either side.
332
-
333
- yPos.above = Math.max(yPos.above, this.minTop);
334
- var hasOne = stackedDecoration(decoration, width, abselem, yPos, positioning.ornamentPosition, this.minTop, this.minBottom);
335
- if (hasOne) {
336
- // abselem.top = Math.max(yPos.above + 3, abselem.top); // TODO-PER: Not sure why we need this fudge factor.
337
- }
338
- leftDecoration(decoration, abselem, roomtaken);
339
- };
340
-
341
- module.exports = Decoration;