abcjs 6.4.1 → 6.4.3
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 +46 -0
- package/dist/abcjs-basic-min.js +2 -2
- package/dist/abcjs-basic-min.js.LICENSE +1 -1
- package/dist/abcjs-basic.js +1271 -1179
- 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 +1 -1
- package/license.js +1 -1
- package/package.json +1 -1
- package/plugin.js +1 -1
- package/src/api/abc_tunebook.js +1 -2
- package/src/api/abc_tunebook_svg.js +0 -1
- package/src/data/abc_tune.js +2 -0
- package/src/midi/abc_midi_create.js +22 -7
- package/src/parse/abc_common.js +3 -11
- package/src/parse/abc_parse.js +1 -1
- package/src/parse/abc_parse_directive.js +44 -3
- package/src/parse/abc_parse_header.js +6 -4
- package/src/parse/abc_parse_key_voice.js +10 -6
- package/src/parse/abc_parse_music.js +54 -22
- package/src/parse/tune-builder.js +675 -643
- package/src/synth/abc_midi_flattener.js +3 -1
- package/src/synth/abc_midi_sequencer.js +18 -3
- package/src/synth/chord-track.js +90 -18
- package/src/synth/create-synth-control.js +1 -2
- package/src/tablatures/abc_tablatures.js +184 -0
- package/src/tablatures/instruments/string-patterns.js +266 -268
- package/src/tablatures/instruments/string-tablature.js +38 -35
- package/src/tablatures/instruments/tab-note.js +186 -181
- package/src/tablatures/instruments/tab-notes.js +30 -35
- package/src/tablatures/instruments/tab-string.js +43 -25
- package/src/tablatures/render/tab-absolute-elements.js +303 -0
- package/src/tablatures/render/tab-renderer.js +244 -0
- package/src/test/abc_parser_lint.js +2 -3
- package/src/write/creation/abstract-engraver.js +1 -1
- package/src/write/creation/elements/tie-element.js +26 -0
- package/src/write/engraver-controller.js +1 -1
- package/src/write/layout/set-upper-and-lower-elements.js +8 -0
- package/test.js +1 -1
- package/types/index.d.ts +2 -2
- package/version.js +1 -1
- package/src/api/abc_tablatures.js +0 -184
- package/src/tablatures/instruments/tab-string-patterns.js +0 -23
- package/src/tablatures/tab-absolute-elements.js +0 -301
- package/src/tablatures/tab-common.js +0 -29
- package/src/tablatures/tab-renderer.js +0 -259
|
@@ -6,15 +6,16 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
function StringTablature(numLines, lineSpace) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
//console.log("INIT StringTablature constructor")
|
|
10
|
+
this.numLines = numLines;
|
|
11
|
+
this.lineSpace = lineSpace;
|
|
12
|
+
this.verticalSize = this.numLines * this.lineSpace;
|
|
13
|
+
var pitch = 3;
|
|
14
|
+
this.bar = {
|
|
15
|
+
pitch: pitch,
|
|
16
|
+
pitch2: lineSpace * numLines,
|
|
17
|
+
height: 5,
|
|
18
|
+
};
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -22,35 +23,37 @@ function StringTablature(numLines, lineSpace) {
|
|
|
22
23
|
* @param {} line
|
|
23
24
|
*/
|
|
24
25
|
StringTablature.prototype.bypass = function (line) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
//console.log("RENDER StringTablature bypass")
|
|
27
|
+
var voices = line.staffGroup.voices;
|
|
28
|
+
if (voices.length > 0) {
|
|
29
|
+
if (voices[0].isPercussion) return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
};
|
|
31
33
|
|
|
32
34
|
|
|
33
35
|
StringTablature.prototype.setRelative = function (child, relative, first) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
36
|
+
//console.log("RENDER StringTablature setRelative")
|
|
37
|
+
switch (child.type) {
|
|
38
|
+
case 'bar':
|
|
39
|
+
relative.pitch = this.bar.pitch;
|
|
40
|
+
relative.pitch2 = this.bar.pitch2;
|
|
41
|
+
relative.height = this.height;
|
|
42
|
+
break;
|
|
43
|
+
case 'symbol':
|
|
44
|
+
var top = this.bar.pitch2 / 2;
|
|
45
|
+
if (child.name == 'dots.dot') {
|
|
46
|
+
if (first) {
|
|
47
|
+
relative.pitch = top;
|
|
48
|
+
return false;
|
|
49
|
+
} else {
|
|
50
|
+
relative.pitch = top + this.lineSpace;
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
return first;
|
|
54
57
|
};
|
|
55
58
|
|
|
56
59
|
module.exports = StringTablature;
|
|
@@ -1,216 +1,221 @@
|
|
|
1
|
-
var {noteToMidi, midiToNote} = require('../../synth/note-to-midi');
|
|
1
|
+
var { noteToMidi, midiToNote } = require('../../synth/note-to-midi');
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
*
|
|
5
5
|
* Note structure for Tabs
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
|
-
var notes = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
|
|
9
8
|
|
|
10
9
|
|
|
11
10
|
function TabNote(note, clefTranspose) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
11
|
+
//console.log("INIT/RENDER TabNote constructor")
|
|
12
|
+
var pitch = noteToMidi(note)
|
|
13
|
+
if (clefTranspose)
|
|
14
|
+
pitch += clefTranspose
|
|
15
|
+
var newNote = midiToNote(pitch);
|
|
16
|
+
var isFlat = false;
|
|
17
|
+
var isSharp = false;
|
|
18
|
+
var isAltered = false;
|
|
19
|
+
var natural = null;
|
|
20
|
+
var quarter = null;
|
|
21
|
+
var isDouble = false;
|
|
22
|
+
var acc = 0;
|
|
23
|
+
|
|
24
|
+
if (note.startsWith('_')) {
|
|
25
|
+
isFlat = true;
|
|
26
|
+
acc = -1;
|
|
27
|
+
// check quarter flat
|
|
28
|
+
if (note[1] == '/') {
|
|
29
|
+
isFlat = false;
|
|
30
|
+
quarter = "v";
|
|
31
|
+
acc = 0;
|
|
32
|
+
} else if (note[1] == '_') {
|
|
33
|
+
// double flat
|
|
34
|
+
isDouble = true;
|
|
35
|
+
acc -= 1;
|
|
36
|
+
}
|
|
37
|
+
} else if (note.startsWith('^')) {
|
|
38
|
+
isSharp = true;
|
|
39
|
+
acc = +1;
|
|
40
|
+
// check quarter sharp
|
|
41
|
+
if (note[1] == '/') {
|
|
42
|
+
isSharp = false;
|
|
43
|
+
quarter = "^";
|
|
44
|
+
acc = 0;
|
|
45
|
+
} else if (note[1] == '^') {
|
|
46
|
+
// double sharp
|
|
47
|
+
isDouble = true;
|
|
48
|
+
acc += 1;
|
|
49
|
+
}
|
|
50
|
+
} else if (note.startsWith('=')) {
|
|
51
|
+
natural = true;
|
|
52
|
+
acc = 0;
|
|
53
|
+
}
|
|
54
|
+
isAltered = isFlat || isSharp || (quarter != null);
|
|
55
|
+
if (isAltered || natural) {
|
|
56
|
+
if ((quarter != null) || (isDouble)) {
|
|
57
|
+
newNote = note.slice(2);
|
|
58
|
+
} else {
|
|
59
|
+
newNote = note.slice(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
var hasComma = (newNote.match(/,/g) || []).length;
|
|
63
|
+
var hasQuote = (newNote.match(/'/g) || []).length;
|
|
64
|
+
|
|
65
|
+
this.pitch = pitch
|
|
66
|
+
this.pitchAltered = 0
|
|
67
|
+
this.name = newNote;
|
|
68
|
+
this.acc = acc;
|
|
69
|
+
this.isSharp = isSharp;
|
|
70
|
+
this.isKeySharp = false;
|
|
71
|
+
this.isDouble = isDouble;
|
|
72
|
+
this.isAltered = isAltered;
|
|
73
|
+
this.isFlat = isFlat;
|
|
74
|
+
this.isKeyFlat = false;
|
|
75
|
+
this.natural = natural;
|
|
76
|
+
this.quarter = quarter;
|
|
77
|
+
this.isLower = (this.name == this.name.toLowerCase());
|
|
78
|
+
this.name = this.name[0].toUpperCase();
|
|
79
|
+
this.hasComma = hasComma;
|
|
80
|
+
this.isQuoted = hasQuote;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
function cloneNote(self) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
84
|
+
var newNote = self.name;
|
|
85
|
+
var newTabNote = new TabNote(newNote);
|
|
86
|
+
newTabNote.pitch = self.pitch;
|
|
87
|
+
newTabNote.hasComma = self.hasComma;
|
|
88
|
+
newTabNote.isLower = self.isLower;
|
|
89
|
+
newTabNote.isQuoted = self.isQuoted;
|
|
90
|
+
newTabNote.isSharp = self.isSharp;
|
|
91
|
+
newTabNote.isKeySharp = self.isKeySharp;
|
|
92
|
+
newTabNote.isFlat = self.isFlat;
|
|
93
|
+
newTabNote.isKeyFlat = self.isKeyFlat;
|
|
94
|
+
return newTabNote;
|
|
95
|
+
}
|
|
96
96
|
TabNote.prototype.sameNoteAs = function (note) {
|
|
97
|
-
|
|
97
|
+
//console.log("INIT TabNote sameNoteAs")
|
|
98
|
+
return note.pitch === this.pitch
|
|
98
99
|
};
|
|
99
100
|
|
|
100
101
|
TabNote.prototype.isLowerThan = function (note) {
|
|
101
|
-
|
|
102
|
+
//console.log("INIT TabNote isLowerThan")
|
|
103
|
+
return note.pitch > this.pitch
|
|
102
104
|
};
|
|
103
105
|
|
|
104
|
-
TabNote.prototype.checkKeyAccidentals = function(accidentals, measureAccidentals) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
106
|
+
TabNote.prototype.checkKeyAccidentals = function (accidentals, measureAccidentals) {
|
|
107
|
+
//console.log("RENDER TabNote checkKeyAccidentals")
|
|
108
|
+
if (this.isAltered || this.natural)
|
|
109
|
+
return
|
|
110
|
+
if (measureAccidentals[this.name.toUpperCase()]) {
|
|
111
|
+
switch (measureAccidentals[this.name.toUpperCase()]) {
|
|
112
|
+
case "__": this.acc = -2; this.pitchAltered = -2; return;
|
|
113
|
+
case "_": this.acc = -1; this.pitchAltered = -1; return;
|
|
114
|
+
case "=": this.acc = 0; this.pitchAltered = 0; return;
|
|
115
|
+
case "^": this.acc = 1; this.pitchAltered = 1; return;
|
|
116
|
+
case "^^": this.acc = 2; this.pitchAltered = 2; return;
|
|
117
|
+
}
|
|
118
|
+
} else if (accidentals) {
|
|
119
|
+
var curNote = this.name;
|
|
120
|
+
for (var iii = 0; iii < accidentals.length; iii++) {
|
|
121
|
+
var curAccidentals = accidentals[iii];
|
|
122
|
+
if (curNote == curAccidentals.note.toUpperCase()) {
|
|
123
|
+
if (curAccidentals.acc == 'flat') {
|
|
124
|
+
this.acc = -1;
|
|
125
|
+
this.isKeyFlat = true;
|
|
126
|
+
this.pitchAltered = -1
|
|
127
|
+
}
|
|
128
|
+
if (curAccidentals.acc == 'sharp') {
|
|
129
|
+
this.acc = +1;
|
|
130
|
+
this.isKeySharp = true;
|
|
131
|
+
this.pitchAltered = 1
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
133
136
|
};
|
|
134
137
|
|
|
135
138
|
TabNote.prototype.getAccidentalEquiv = function () {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
139
|
+
//console.log("TabNote getAccidentalEquiv")
|
|
140
|
+
var cloned = cloneNote(this);
|
|
141
|
+
if (cloned.isSharp || cloned.isKeySharp) {
|
|
142
|
+
cloned = cloned.nextNote();
|
|
143
|
+
cloned.isFlat = true;
|
|
144
|
+
cloned.isSharp = false;
|
|
145
|
+
cloned.isKeySharp = false;
|
|
146
|
+
} else if (cloned.isFlat || cloned.isKeyFlat) {
|
|
147
|
+
cloned = cloned.prevNote();
|
|
148
|
+
cloned.isSharp = true;
|
|
149
|
+
cloned.isFlat = false;
|
|
150
|
+
cloned.isKeyFlat = false;
|
|
151
|
+
}
|
|
152
|
+
return cloned;
|
|
149
153
|
};
|
|
150
154
|
|
|
151
155
|
|
|
152
156
|
TabNote.prototype.nextNote = function () {
|
|
153
|
-
|
|
154
|
-
|
|
157
|
+
//console.log("INIT TabNote nextNote")
|
|
158
|
+
var note = midiToNote(this.pitch + 1 + this.pitchAltered)
|
|
159
|
+
return new TabNote(note)
|
|
155
160
|
};
|
|
156
161
|
|
|
157
162
|
TabNote.prototype.prevNote = function () {
|
|
158
|
-
|
|
159
|
-
|
|
163
|
+
//console.log("TabNote prevNote")
|
|
164
|
+
var note = midiToNote(this.pitch - 1 + this.pitchAltered)
|
|
165
|
+
return new TabNote(note)
|
|
160
166
|
};
|
|
161
167
|
|
|
162
|
-
TabNote.prototype.emitNoAccidentals = function (
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
168
|
+
TabNote.prototype.emitNoAccidentals = function () {
|
|
169
|
+
//console.log("TabNote emitNoAccidentals")
|
|
170
|
+
var returned = this.name;
|
|
171
|
+
if (this.isLower) {
|
|
172
|
+
returned = returned.toLowerCase();
|
|
173
|
+
}
|
|
174
|
+
for (var ii = 0; ii < this.isQuoted; ii++) {
|
|
175
|
+
returned += "'";
|
|
176
|
+
}
|
|
177
|
+
for (var jj = 0; jj < this.hasComma; jj++) {
|
|
178
|
+
returned += ",";
|
|
179
|
+
}
|
|
180
|
+
return returned;
|
|
174
181
|
};
|
|
175
182
|
|
|
176
183
|
TabNote.prototype.emit = function () {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
184
|
+
//console.log("INIT/RENDER TabNote emit")
|
|
185
|
+
var returned = this.name;
|
|
186
|
+
if (this.isSharp || this.isKeySharp) {
|
|
187
|
+
returned = '^' + returned;
|
|
188
|
+
if (this.isDouble) {
|
|
189
|
+
returned = '^' + returned;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (this.isFlat || this.isKeyFlat) {
|
|
193
|
+
returned = '_' + returned;
|
|
194
|
+
if (this.isDouble) {
|
|
195
|
+
returned = '_' + returned;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (this.quarter) {
|
|
199
|
+
if (this.quarter == "^") {
|
|
200
|
+
returned = "^/" + returned;
|
|
201
|
+
} else {
|
|
202
|
+
returned = "_/" + returned;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (this.natural) {
|
|
206
|
+
returned = '=' + returned;
|
|
207
|
+
}
|
|
208
|
+
for (var ii = 1; ii <= this.hasComma; ii++) {
|
|
209
|
+
returned += ',';
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (this.isLower) {
|
|
213
|
+
returned = returned.toLowerCase();
|
|
214
|
+
for (var jj = 1; jj <= this.isQuoted; jj++) {
|
|
215
|
+
returned += "'";
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return returned;
|
|
211
219
|
};
|
|
212
220
|
|
|
213
|
-
module.exports =
|
|
214
|
-
'TabNote': TabNote,
|
|
215
|
-
'notes': notes
|
|
216
|
-
};
|
|
221
|
+
module.exports = TabNote
|
|
@@ -1,41 +1,36 @@
|
|
|
1
1
|
|
|
2
2
|
var TabNote = require('./tab-note');
|
|
3
3
|
|
|
4
|
-
var notes =
|
|
4
|
+
var notes = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
|
|
5
5
|
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
function tabNotes(fromNote, toNote) {
|
|
7
|
+
//console.log("INIT TabNotes")
|
|
8
|
+
var fromN = new TabNote(fromNote);
|
|
9
|
+
var toN = new TabNote(toNote);
|
|
10
|
+
// check that toN is not lower than fromN
|
|
11
|
+
if (toN.isLowerThan(fromN)) {
|
|
12
|
+
var from = fromN.emit();
|
|
13
|
+
var tn = toN.emit();
|
|
14
|
+
return {
|
|
15
|
+
error: 'Invalid string Instrument tuning : ' +
|
|
16
|
+
tn + ' string lower than ' + from + ' string'
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
var buildReturned = [];
|
|
20
|
+
var startIndex = notes.indexOf(fromN.name);
|
|
21
|
+
var toIndex = notes.indexOf(toN.name);
|
|
22
|
+
if ((startIndex == -1) || (toIndex == -1)) {
|
|
23
|
+
return buildReturned;
|
|
24
|
+
}
|
|
25
|
+
var finished = false;
|
|
26
|
+
while (!finished) {
|
|
27
|
+
buildReturned.push(fromN.emit());
|
|
28
|
+
fromN = fromN.nextNote();
|
|
29
|
+
if (fromN.sameNoteAs(toN)) {
|
|
30
|
+
finished = true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return buildReturned;
|
|
9
34
|
}
|
|
10
35
|
|
|
11
|
-
|
|
12
|
-
TabNotes.prototype.build = function () {
|
|
13
|
-
var fromN = this.fromN;
|
|
14
|
-
var toN = this.toN;
|
|
15
|
-
// check that toN is not lower than fromN
|
|
16
|
-
if (toN.isLowerThan(fromN)) {
|
|
17
|
-
var from = fromN.emit();
|
|
18
|
-
var tn = toN.emit();
|
|
19
|
-
return {
|
|
20
|
-
error: 'Invalid string Instrument tuning : ' +
|
|
21
|
-
tn + ' string lower than ' + from + ' string'
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
var buildReturned = [];
|
|
25
|
-
var startIndex = notes.indexOf(fromN.name);
|
|
26
|
-
var toIndex = notes.indexOf(toN.name);
|
|
27
|
-
if ((startIndex == -1) || (toIndex == -1)) {
|
|
28
|
-
return buildReturned;
|
|
29
|
-
}
|
|
30
|
-
var finished = false;
|
|
31
|
-
while (!finished) {
|
|
32
|
-
buildReturned.push(fromN.emit());
|
|
33
|
-
fromN = fromN.nextNote();
|
|
34
|
-
if (fromN.sameNoteAs(toN)) {
|
|
35
|
-
finished = true;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return buildReturned;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
module.exports = TabNotes;
|
|
36
|
+
module.exports = tabNotes;
|
|
@@ -1,47 +1,65 @@
|
|
|
1
1
|
|
|
2
2
|
var StringTablature = require('./string-tablature');
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var TabStringPatterns = require('./tab-string-patterns');
|
|
3
|
+
var tabRenderer = require('../render/tab-renderer');
|
|
4
|
+
var StringPatterns = require('./string-patterns');
|
|
6
5
|
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* upon init mainly store provided instances for later usage
|
|
10
9
|
* @param {*} abcTune the parsed tune AST tree
|
|
11
|
-
*
|
|
10
|
+
* @param {*} tuneNumber the parsed tune AST tree
|
|
12
11
|
* @param {*} params complementary args provided to Tablature Plugin
|
|
13
12
|
*/
|
|
14
|
-
Plugin.prototype.init = function (abcTune, tuneNumber, params,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
13
|
+
Plugin.prototype.init = function (abcTune, tuneNumber, params, tabSettings) {
|
|
14
|
+
//console.log("INIT AbcStringTab Plugin.init")
|
|
15
|
+
this.tune = abcTune;
|
|
16
|
+
this.params = params;
|
|
17
|
+
this.tuneNumber = tuneNumber;
|
|
18
|
+
this.inError = false;
|
|
19
|
+
this.abcTune = abcTune;
|
|
20
|
+
this.linePitch = 3;
|
|
21
|
+
this.nbLines = tabSettings.defaultTuning.length;
|
|
22
|
+
this.isTabBig = tabSettings.isTabBig;
|
|
23
|
+
this.tabSymbolOffset = tabSettings.tabSymbolOffset;
|
|
24
|
+
this.capo = params.capo;
|
|
25
|
+
this.transpose = params.visualTranspose;
|
|
26
|
+
this.hideTabSymbol = params.hideTabSymbol;
|
|
27
|
+
this.tablature = new StringTablature(this.nbLines, this.linePitch);
|
|
28
|
+
var tuning = params.tuning;
|
|
29
|
+
if (!tuning) {
|
|
30
|
+
tuning = tabSettings.defaultTuning;
|
|
31
|
+
}
|
|
32
|
+
this.tuning = tuning;
|
|
33
|
+
this.semantics = new StringPatterns(this);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
Plugin.prototype.setError = function (error) {
|
|
37
|
+
//console.log("Plugin setError")
|
|
38
|
+
if (error) {
|
|
39
|
+
this.error = error;
|
|
40
|
+
this.inError = true;
|
|
41
|
+
if (this.tune.warnings) {
|
|
42
|
+
this.tune.warnings.push(error);
|
|
43
|
+
} else {
|
|
44
|
+
this.tune.warnings = [error];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
29
47
|
};
|
|
30
48
|
|
|
31
49
|
Plugin.prototype.render = function (renderer, line, staffIndex) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
50
|
+
//console.log("RENDER AbcStringTab Plugin.render")
|
|
51
|
+
if (this.inError) return;
|
|
52
|
+
if (this.tablature.bypass(line)) return;
|
|
53
|
+
tabRenderer(this, renderer, line, staffIndex);
|
|
36
54
|
};
|
|
37
55
|
|
|
38
|
-
function Plugin() {}
|
|
56
|
+
function Plugin() { }
|
|
39
57
|
|
|
40
58
|
//
|
|
41
59
|
// Tablature plugin definition
|
|
42
60
|
//
|
|
43
61
|
var AbcStringTab = function () {
|
|
44
|
-
|
|
62
|
+
return { name: 'StringTab', tablature: Plugin };
|
|
45
63
|
};
|
|
46
64
|
|
|
47
65
|
module.exports = AbcStringTab;
|