abcjs 6.0.3 → 6.0.4

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.
@@ -3232,6 +3232,7 @@ var Parse = function Parse() {
3232
3232
 
3233
3233
  var addWord = function addWord(i) {
3234
3234
  var word = parseCommon.strip(words.substring(last_divider, i));
3235
+ word = word.replace(/\\([-_*|~])/g, '$1');
3235
3236
  last_divider = i + 1;
3236
3237
 
3237
3238
  if (word.length > 0) {
@@ -3249,15 +3250,17 @@ var Parse = function Parse() {
3249
3250
  return false;
3250
3251
  };
3251
3252
 
3253
+ var escNext = false;
3254
+
3252
3255
  for (var i = 0; i < words.length; i++) {
3253
- switch (words.charAt(i)) {
3256
+ switch (words[i]) {
3254
3257
  case ' ':
3255
3258
  case '\x12':
3256
3259
  addWord(i);
3257
3260
  break;
3258
3261
 
3259
3262
  case '-':
3260
- if (!addWord(i) && word_list.length > 0) {
3263
+ if (!escNext && !addWord(i) && word_list.length > 0) {
3261
3264
  parseCommon.last(word_list).divider = '-';
3262
3265
  word_list.push({
3263
3266
  skip: true,
@@ -3268,33 +3271,47 @@ var Parse = function Parse() {
3268
3271
  break;
3269
3272
 
3270
3273
  case '_':
3271
- addWord(i);
3272
- word_list.push({
3273
- skip: true,
3274
- to: 'slur'
3275
- });
3274
+ if (!escNext) {
3275
+ addWord(i);
3276
+ word_list.push({
3277
+ skip: true,
3278
+ to: 'slur'
3279
+ });
3280
+ }
3281
+
3276
3282
  break;
3277
3283
 
3278
3284
  case '*':
3279
- addWord(i);
3280
- word_list.push({
3281
- skip: true,
3282
- to: 'next'
3283
- });
3285
+ if (!escNext) {
3286
+ addWord(i);
3287
+ word_list.push({
3288
+ skip: true,
3289
+ to: 'next'
3290
+ });
3291
+ }
3292
+
3284
3293
  break;
3285
3294
 
3286
3295
  case '|':
3287
- addWord(i);
3288
- word_list.push({
3289
- skip: true,
3290
- to: 'bar'
3291
- });
3296
+ if (!escNext) {
3297
+ addWord(i);
3298
+ word_list.push({
3299
+ skip: true,
3300
+ to: 'bar'
3301
+ });
3302
+ }
3303
+
3292
3304
  break;
3293
3305
 
3294
3306
  case '~':
3295
- replace = true;
3307
+ if (!escNext) {
3308
+ replace = true;
3309
+ }
3310
+
3296
3311
  break;
3297
3312
  }
3313
+
3314
+ escNext = words[i] === '\\';
3298
3315
  }
3299
3316
 
3300
3317
  var inSlur = false;
@@ -7985,7 +8002,7 @@ function durationOfMeasure(multilineVars) {
7985
8002
 
7986
8003
  var legalAccents = ["trill", "lowermordent", "uppermordent", "mordent", "pralltriller", "accent", "fermata", "invertedfermata", "tenuto", "0", "1", "2", "3", "4", "5", "+", "wedge", "open", "thumb", "snap", "turn", "roll", "breath", "shortphrase", "mediumphrase", "longphrase", "segno", "coda", "D.S.", "D.C.", "fine", "beambr1", "beambr2", "slide", "marcato", "upbow", "downbow", "/", "//", "///", "////", "trem1", "trem2", "trem3", "trem4", "turnx", "invertedturn", "invertedturnx", "trill(", "trill)", "arpeggio", "xstem", "mark", "umarcato", "style=normal", "style=harmonic", "style=rhythm", "style=x", "style=triangle"];
7987
8004
  var volumeDecorations = ["p", "pp", "f", "ff", "mf", "mp", "ppp", "pppp", "fff", "ffff", "sfz"];
7988
- var dynamicDecorations = ["crescendo(", "crescendo)", "diminuendo(", "diminuendo)"];
8005
+ var dynamicDecorations = ["crescendo(", "crescendo)", "diminuendo(", "diminuendo)", "glissando(", "glissando)"];
7989
8006
  var accentPseudonyms = [["<", "accent"], [">", "accent"], ["tr", "trill"], ["plus", "+"], ["emphasis", "accent"], ["^", "umarcato"], ["marcato", "umarcato"]];
7990
8007
  var accentDynamicPseudonyms = [["<(", "crescendo("], ["<)", "crescendo)"], [">(", "diminuendo("], [">)", "diminuendo)"]];
7991
8008
 
@@ -12771,7 +12788,9 @@ var pitchesToPerc = __webpack_require__(/*! ./pitches-to-perc */ "./src/synth/pi
12771
12788
  volume: velocity,
12772
12789
  start: timeToRealTime(elem.time),
12773
12790
  duration: durationRounded(note.duration),
12774
- instrument: currentInstrument
12791
+ instrument: currentInstrument,
12792
+ startChar: elem.elem.startChar,
12793
+ endChar: elem.elem.endChar
12775
12794
  };
12776
12795
  p = adjustForMicroTone(p);
12777
12796
 
@@ -14844,6 +14863,8 @@ var createNoteMap = function createNoteMap(sequence) {
14844
14863
  end: Math.round((ev.start + len - gap) * 1000000) / 1000000,
14845
14864
  volume: ev.volume
14846
14865
  };
14866
+ if (ev.startChar) obj.startChar = ev.startChar;
14867
+ if (ev.endChar) obj.endChar = ev.endChar;
14847
14868
  if (ev.style) obj.style = ev.style;
14848
14869
  if (ev.cents) obj.cents = ev.cents;
14849
14870
  map[i].push(obj);
@@ -19354,6 +19375,15 @@ AbstractEngraver.prototype.createBeam = function (isSingleLineStaff, voice, elem
19354
19375
  if (hint) beamelem.setHint();
19355
19376
 
19356
19377
  for (var i = 0; i < elems.length; i++) {
19378
+ // Do a first pass to figure out the stem direction before creating the notes, so that staccatos and other decorations can be placed correctly.
19379
+ beamelem.runningDirection(elems[i]);
19380
+ }
19381
+
19382
+ beamelem.setStemDirection();
19383
+ var tempStemDir = this.stemdir;
19384
+ this.stemdir = beamelem.stemsUp ? 'up' : 'down';
19385
+
19386
+ for (i = 0; i < elems.length; i++) {
19357
19387
  var elem = elems[i];
19358
19388
  var abselem = this.createNote(elem, true, isSingleLineStaff, voice);
19359
19389
  abselemset.push(abselem);
@@ -19368,6 +19398,7 @@ AbstractEngraver.prototype.createBeam = function (isSingleLineStaff, voice, elem
19368
19398
 
19369
19399
  beamelem.calcDir();
19370
19400
  voice.addBeam(beamelem);
19401
+ this.stemdir = tempStemDir;
19371
19402
  return abselemset;
19372
19403
  };
19373
19404
 
@@ -20113,6 +20144,11 @@ AbstractEngraver.prototype.createBarLine = function (voice, elem, isFirstStaff)
20113
20144
 
20114
20145
 
20115
20146
  abselem.extraw -= 5;
20147
+
20148
+ if (elem.chord !== undefined) {
20149
+ var ret3 = addChord(this.getTextSize, abselem, elem, 0, 0, 0, false);
20150
+ }
20151
+
20116
20152
  return abselem;
20117
20153
  };
20118
20154
 
@@ -20171,6 +20207,15 @@ BeamElem.prototype.setHint = function () {
20171
20207
  this.hint = true;
20172
20208
  };
20173
20209
 
20210
+ BeamElem.prototype.runningDirection = function (abcelem) {
20211
+ var pitch = abcelem.averagepitch;
20212
+ if (pitch === undefined) return; // don't include elements like spacers in beams
20213
+
20214
+ this.total = Math.round(this.total + pitch);
20215
+ if (!this.count) this.count = 0;
20216
+ this.count++;
20217
+ };
20218
+
20174
20219
  BeamElem.prototype.add = function (abselem) {
20175
20220
  var pitch = abselem.abcelem.averagepitch;
20176
20221
  if (pitch === undefined) return; // don't include elements like spacers in beams
@@ -20193,6 +20238,24 @@ BeamElem.prototype.addBeam = function (beam) {
20193
20238
  this.beams.push(beam);
20194
20239
  };
20195
20240
 
20241
+ BeamElem.prototype.setStemDirection = function () {
20242
+ // Have to figure this out before the notes are placed because placing the notes also places the decorations.
20243
+ this.average = calcAverage(this.total, this.count);
20244
+
20245
+ if (this.forceup) {
20246
+ this.stemsUp = true;
20247
+ } else if (this.forcedown) {
20248
+ this.stemsUp = false;
20249
+ } else {
20250
+ var middleLine = 6; // hardcoded 6 is B
20251
+
20252
+ this.stemsUp = this.average < middleLine; // true is up, false is down;
20253
+ }
20254
+
20255
+ delete this.count;
20256
+ this.total = 0;
20257
+ };
20258
+
20196
20259
  BeamElem.prototype.calcDir = function () {
20197
20260
  this.average = calcAverage(this.total, this.elems.length);
20198
20261
 
@@ -20761,6 +20824,8 @@ var DynamicDecoration = __webpack_require__(/*! ./abc_dynamic_decoration */ "./s
20761
20824
 
20762
20825
  var CrescendoElem = __webpack_require__(/*! ./abc_crescendo_element */ "./src/write/abc_crescendo_element.js");
20763
20826
 
20827
+ var GlissandoElem = __webpack_require__(/*! ./abc_glissando_element */ "./src/write/abc_glissando_element.js");
20828
+
20764
20829
  var glyphs = __webpack_require__(/*! ./abc_glyphs */ "./src/write/abc_glyphs.js");
20765
20830
 
20766
20831
  var RelativeElement = __webpack_require__(/*! ./abc_relative_element */ "./src/write/abc_relative_element.js");
@@ -21077,6 +21142,7 @@ function leftDecoration(decoration, abselem, roomtaken) {
21077
21142
  Decoration.prototype.dynamicDecoration = function (voice, decoration, abselem, positioning) {
21078
21143
  var diminuendo;
21079
21144
  var crescendo;
21145
+ var glissando;
21080
21146
 
21081
21147
  for (var i = 0; i < decoration.length; i++) {
21082
21148
  switch (decoration[i]) {
@@ -21105,6 +21171,19 @@ Decoration.prototype.dynamicDecoration = function (voice, decoration, abselem, p
21105
21171
  };
21106
21172
  this.startCrescendoX = undefined;
21107
21173
  break;
21174
+
21175
+ case "glissando(":
21176
+ this.startGlissandoX = abselem;
21177
+ glissando = undefined;
21178
+ break;
21179
+
21180
+ case "glissando)":
21181
+ glissando = {
21182
+ start: this.startGlissandoX,
21183
+ stop: abselem
21184
+ };
21185
+ this.startGlissandoX = undefined;
21186
+ break;
21108
21187
  }
21109
21188
  }
21110
21189
 
@@ -21115,6 +21194,10 @@ Decoration.prototype.dynamicDecoration = function (voice, decoration, abselem, p
21115
21194
  if (crescendo) {
21116
21195
  voice.addOther(new CrescendoElem(crescendo.start, crescendo.stop, "<", positioning));
21117
21196
  }
21197
+
21198
+ if (glissando) {
21199
+ voice.addOther(new GlissandoElem(glissando.start, glissando.stop));
21200
+ }
21118
21201
  };
21119
21202
 
21120
21203
  Decoration.prototype.createDecoration = function (voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch, positioning, hasVocals) {
@@ -21481,6 +21564,23 @@ module.exports = EngraverController;
21481
21564
 
21482
21565
  /***/ }),
21483
21566
 
21567
+ /***/ "./src/write/abc_glissando_element.js":
21568
+ /*!********************************************!*\
21569
+ !*** ./src/write/abc_glissando_element.js ***!
21570
+ \********************************************/
21571
+ /***/ (function(module) {
21572
+
21573
+ var GlissandoElem = function GlissandoElem(anchor1, anchor2) {
21574
+ this.type = "GlissandoElem";
21575
+ this.anchor1 = anchor1; // must have a .x and a .parent property or be null (means starts at the "beginning" of the line - after keysig)
21576
+
21577
+ this.anchor2 = anchor2; // must have a .x property or be null (means ends at the end of the line)
21578
+ };
21579
+
21580
+ module.exports = GlissandoElem;
21581
+
21582
+ /***/ }),
21583
+
21484
21584
  /***/ "./src/write/abc_glyphs.js":
21485
21585
  /*!*********************************!*\
21486
21586
  !*** ./src/write/abc_glyphs.js ***!
@@ -23965,6 +24065,107 @@ module.exports = drawEnding;
23965
24065
 
23966
24066
  /***/ }),
23967
24067
 
24068
+ /***/ "./src/write/draw/glissando.js":
24069
+ /*!*************************************!*\
24070
+ !*** ./src/write/draw/glissando.js ***!
24071
+ \*************************************/
24072
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
24073
+
24074
+ var sprintf = __webpack_require__(/*! ./sprintf */ "./src/write/draw/sprintf.js");
24075
+
24076
+ var printPath = __webpack_require__(/*! ./print-path */ "./src/write/draw/print-path.js");
24077
+
24078
+ var roundNumber = __webpack_require__(/*! ./round-number */ "./src/write/draw/round-number.js");
24079
+
24080
+ function drawGlissando(renderer, params, selectables) {
24081
+ if (!params.anchor1 || !params.anchor2 || !params.anchor1.heads || !params.anchor2.heads || params.anchor1.heads.length === 0 || params.anchor2.heads.length === 0) window.console.error("Glissando Element not set.");
24082
+ var margin = 4;
24083
+ var leftY = renderer.calcY(params.anchor1.heads[0].pitch);
24084
+ var rightY = renderer.calcY(params.anchor2.heads[0].pitch);
24085
+ var leftX = params.anchor1.x + params.anchor1.w / 2;
24086
+ var rightX = params.anchor2.x + params.anchor2.w / 2;
24087
+ var len = lineLength(leftX, leftY, rightX, rightY);
24088
+ var marginLeft = params.anchor1.w / 2 + margin;
24089
+ var marginRight = params.anchor2.w / 2 + margin;
24090
+ var s = slope(leftX, leftY, rightX, rightY);
24091
+ var leftYAdj = getY(leftY, s, marginLeft);
24092
+ var rightYAdj = getY(rightY, s, -marginRight);
24093
+ var num = numSquigglies(len - marginLeft - marginRight);
24094
+ var el = drawSquiggly(renderer, leftX + marginLeft, leftYAdj, num, s);
24095
+ selectables.wrapSvgEl({
24096
+ el_type: "glissando",
24097
+ startChar: -1,
24098
+ endChar: -1
24099
+ }, el);
24100
+ return [el];
24101
+ }
24102
+
24103
+ function lineLength(leftX, leftY, rightX, rightY) {
24104
+ // The length from notehead center to notehead center.
24105
+ var w = rightX - leftX;
24106
+ var h = rightY - leftY;
24107
+ return Math.sqrt(w * w + h * h);
24108
+ }
24109
+
24110
+ function slope(leftX, leftY, rightX, rightY) {
24111
+ return (rightY - leftY) / (rightX - leftX);
24112
+ }
24113
+
24114
+ function getY(y, slope, xOfs) {
24115
+ return roundNumber(y + xOfs * slope);
24116
+ }
24117
+
24118
+ function numSquigglies(length) {
24119
+ var endLen = 5; // The width of the end - that is, the non repeating part
24120
+
24121
+ return Math.max(2, Math.floor((length - endLen * 2) / 6));
24122
+ }
24123
+
24124
+ var leftStart = [[3.5, -4.8]];
24125
+ var right = [[1.5, -1], [.3, -.3], [-3.5, 3.8]];
24126
+ var leftEnd = [[-1.5, 2]];
24127
+ var top = [[3, 4], [3, -4]];
24128
+ var bottom = [[-3, 4], [-3, -4]];
24129
+
24130
+ function segment(arr, slope) {
24131
+ var ret = "";
24132
+
24133
+ for (var i = 0; i < arr.length; i++) {
24134
+ ret += 'l' + arr[i][0] + ' ' + getY(arr[i][1], slope, arr[i][0]);
24135
+ }
24136
+
24137
+ return ret;
24138
+ }
24139
+
24140
+ var drawSquiggly = function drawSquiggly(renderer, x, y, num, slope) {
24141
+ var p = sprintf("M %f %f", x, y);
24142
+ p += segment(leftStart, slope);
24143
+ var i;
24144
+
24145
+ for (i = 0; i < num; i++) {
24146
+ p += segment(top, slope);
24147
+ }
24148
+
24149
+ p += segment(right, slope);
24150
+
24151
+ for (i = 0; i < num; i++) {
24152
+ p += segment(bottom, slope);
24153
+ }
24154
+
24155
+ p += segment(leftEnd, slope) + 'z';
24156
+ return printPath(renderer, {
24157
+ path: p,
24158
+ highlight: "stroke",
24159
+ stroke: renderer.foregroundColor,
24160
+ 'class': renderer.controller.classes.generate('decoration'),
24161
+ "data-name": "glissando"
24162
+ });
24163
+ };
24164
+
24165
+ module.exports = drawGlissando;
24166
+
24167
+ /***/ }),
24168
+
23968
24169
  /***/ "./src/write/draw/group-elements.js":
23969
24170
  /*!******************************************!*\
23970
24171
  !*** ./src/write/draw/group-elements.js ***!
@@ -25502,6 +25703,8 @@ module.exports = drawTriplet;
25502
25703
  \*********************************/
25503
25704
  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
25504
25705
 
25706
+ var drawGlissando = __webpack_require__(/*! ./glissando */ "./src/write/draw/glissando.js");
25707
+
25505
25708
  var drawCrescendo = __webpack_require__(/*! ./crescendo */ "./src/write/draw/crescendo.js");
25506
25709
 
25507
25710
  var drawDynamics = __webpack_require__(/*! ./dynamics */ "./src/write/draw/dynamics.js");
@@ -25601,6 +25804,10 @@ function drawVoice(renderer, params, bartop, selectables, staffPos) {
25601
25804
  renderer.controller.classes.incrMeasure();
25602
25805
  } else {
25603
25806
  switch (child.type) {
25807
+ case "GlissandoElem":
25808
+ child.elemset = drawGlissando(renderer, child, selectables);
25809
+ break;
25810
+
25604
25811
  case "CrescendoElem":
25605
25812
  child.elemset = drawCrescendo(renderer, child, selectables);
25606
25813
  break;
@@ -28175,7 +28382,7 @@ function TopText(metaText, metaTextInfo, formatting, lines, width, isPrint, padd
28175
28382
  font: 'infofont',
28176
28383
  klass: 'meta-top rhythm',
28177
28384
  absElemType: "rhythm",
28178
- noMove: true,
28385
+ noMove: noMove,
28179
28386
  info: metaTextInfo.rhythm,
28180
28387
  name: "rhythm"
28181
28388
  }, getTextSize);
@@ -28253,7 +28460,7 @@ module.exports = unhighlight;
28253
28460
  \********************/
28254
28461
  /***/ (function(module) {
28255
28462
 
28256
- var version = '6.0.3';
28463
+ var version = '6.0.4';
28257
28464
  module.exports = version;
28258
28465
 
28259
28466
  /***/ })