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