@coderline/alphatab 1.4.0-alpha.1313 → 1.4.0-alpha.1322

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/dist/alphaTab.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * alphaTab v1.4.0-alpha.1313 (develop, build 1313)
2
+ * alphaTab v1.4.0-alpha.1322 (develop, build 1322)
3
3
  *
4
4
  * Copyright © 2025, Daniel Kuschny and Contributors, All rights reserved.
5
5
  *
@@ -2143,6 +2143,7 @@
2143
2143
  var MusicFontSymbol;
2144
2144
  (function (MusicFontSymbol) {
2145
2145
  MusicFontSymbol[MusicFontSymbol["None"] = -1] = "None";
2146
+ MusicFontSymbol[MusicFontSymbol["Space"] = 32] = "Space";
2146
2147
  MusicFontSymbol[MusicFontSymbol["Brace"] = 57344] = "Brace";
2147
2148
  MusicFontSymbol[MusicFontSymbol["BracketTop"] = 57347] = "BracketTop";
2148
2149
  MusicFontSymbol[MusicFontSymbol["BracketBottom"] = 57348] = "BracketBottom";
@@ -2192,6 +2193,17 @@
2192
2193
  MusicFontSymbol[MusicFontSymbol["NoteheadSlashWhiteHalf"] = 57603] = "NoteheadSlashWhiteHalf";
2193
2194
  MusicFontSymbol[MusicFontSymbol["NoteQuarterUp"] = 57813] = "NoteQuarterUp";
2194
2195
  MusicFontSymbol[MusicFontSymbol["NoteEighthUp"] = 57815] = "NoteEighthUp";
2196
+ MusicFontSymbol[MusicFontSymbol["TextBlackNoteLongStem"] = 57841] = "TextBlackNoteLongStem";
2197
+ MusicFontSymbol[MusicFontSymbol["TextBlackNoteFrac8thLongStem"] = 57843] = "TextBlackNoteFrac8thLongStem";
2198
+ MusicFontSymbol[MusicFontSymbol["TextBlackNoteFrac16thLongStem"] = 57845] = "TextBlackNoteFrac16thLongStem";
2199
+ MusicFontSymbol[MusicFontSymbol["TextBlackNoteFrac32ndLongStem"] = 57846] = "TextBlackNoteFrac32ndLongStem";
2200
+ MusicFontSymbol[MusicFontSymbol["TextCont8thBeamLongStem"] = 57848] = "TextCont8thBeamLongStem";
2201
+ MusicFontSymbol[MusicFontSymbol["TextCont16thBeamLongStem"] = 57850] = "TextCont16thBeamLongStem";
2202
+ MusicFontSymbol[MusicFontSymbol["TextCont32ndBeamLongStem"] = 57851] = "TextCont32ndBeamLongStem";
2203
+ MusicFontSymbol[MusicFontSymbol["TextAugmentationDot"] = 57852] = "TextAugmentationDot";
2204
+ MusicFontSymbol[MusicFontSymbol["TextTupletBracketStartLongStem"] = 57857] = "TextTupletBracketStartLongStem";
2205
+ MusicFontSymbol[MusicFontSymbol["TextTuplet3LongStem"] = 57858] = "TextTuplet3LongStem";
2206
+ MusicFontSymbol[MusicFontSymbol["TextTupletBracketEndLongStem"] = 57859] = "TextTupletBracketEndLongStem";
2195
2207
  MusicFontSymbol[MusicFontSymbol["Tremolo3"] = 57890] = "Tremolo3";
2196
2208
  MusicFontSymbol[MusicFontSymbol["Tremolo2"] = 57889] = "Tremolo2";
2197
2209
  MusicFontSymbol[MusicFontSymbol["Tremolo1"] = 57888] = "Tremolo1";
@@ -23053,7 +23065,7 @@
23053
23065
  const idx = partWordCache[ch][entryIdx][dimensionIdx];
23054
23066
  if ((this._cascade[idx] & (1 << stage)) != 0) {
23055
23067
  const book = this._books[idx][stage];
23056
- if (book != null) {
23068
+ if (book) {
23057
23069
  if (this.writeVectors(book, packet, buffer, ch, offset, this._partitionSize)) {
23058
23070
  // bad packet... exit now and try to use what we already have
23059
23071
  partitionIdx = partitionCount;
@@ -24677,16 +24689,16 @@
24677
24689
  // EG times need to be converted from timecents to seconds.
24678
24690
  // Pin very short EG segments. Timecents don't get to zero, and our EG is
24679
24691
  // happier with zero values.
24680
- this.delay = this.delay < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.delay);
24681
- this.attack = this.attack < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.attack);
24682
- this.release = this.release < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.release);
24692
+ this.delay = this.delay < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.delay);
24693
+ this.attack = this.attack < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.attack);
24694
+ this.release = this.release < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.release);
24683
24695
  // If we have dynamic hold or decay times depending on key number we need
24684
24696
  // to keep the values in timecents so we can calculate it during startNote
24685
24697
  if (this.keynumToHold === 0) {
24686
- this.hold = this.hold < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.hold);
24698
+ this.hold = this.hold < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.hold);
24687
24699
  }
24688
24700
  if (this.keynumToDecay === 0) {
24689
- this.decay = this.decay < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.decay);
24701
+ this.decay = this.decay < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.decay);
24690
24702
  }
24691
24703
  if (this.sustain < 0.0) {
24692
24704
  this.sustain = 0.0;
@@ -24875,19 +24887,19 @@
24875
24887
  this.pitchKeyTrack = 100;
24876
24888
  this.pitchKeyCenter = -1;
24877
24889
  // SF2 defaults in timecents.
24878
- this.ampEnv.delay = -12000.0;
24879
- this.ampEnv.attack = -12000.0;
24880
- this.ampEnv.hold = -12000.0;
24881
- this.ampEnv.decay = -12000.0;
24882
- this.ampEnv.release = -12000.0;
24883
- this.modEnv.delay = -12000.0;
24884
- this.modEnv.attack = -12000.0;
24885
- this.modEnv.hold = -12000.0;
24886
- this.modEnv.decay = -12000.0;
24887
- this.modEnv.release = -12000.0;
24890
+ this.ampEnv.delay = -12e3;
24891
+ this.ampEnv.attack = -12e3;
24892
+ this.ampEnv.hold = -12e3;
24893
+ this.ampEnv.decay = -12e3;
24894
+ this.ampEnv.release = -12e3;
24895
+ this.modEnv.delay = -12e3;
24896
+ this.modEnv.attack = -12e3;
24897
+ this.modEnv.hold = -12e3;
24898
+ this.modEnv.decay = -12e3;
24899
+ this.modEnv.release = -12e3;
24888
24900
  this.initialFilterFc = 13500;
24889
- this.delayModLFO = -12000.0;
24890
- this.delayVibLFO = -12000.0;
24901
+ this.delayModLFO = -12e3;
24902
+ this.delayVibLFO = -12e3;
24891
24903
  }
24892
24904
  operator(genOper, amount) {
24893
24905
  switch (genOper) {
@@ -25131,7 +25143,7 @@
25131
25143
  }
25132
25144
  }
25133
25145
  else {
25134
- this.slope = -1.0 / this.samplesUntilNextSegment;
25146
+ this.slope = -1 / this.samplesUntilNextSegment;
25135
25147
  this.samplesUntilNextSegment =
25136
25148
  (this.parameters.decay * (1.0 - this.parameters.sustain) * outSampleRate) | 0;
25137
25149
  this.segmentIsExponential = false;
@@ -25179,12 +25191,12 @@
25179
25191
  if (this.parameters.keynumToHold > 0) {
25180
25192
  this.parameters.hold += this.parameters.keynumToHold * (60.0 - midiNoteNumber);
25181
25193
  this.parameters.hold =
25182
- this.parameters.hold < -10000.0 ? 0.0 : SynthHelper.timecents2Secs(this.parameters.hold);
25194
+ this.parameters.hold < -1e4 ? 0.0 : SynthHelper.timecents2Secs(this.parameters.hold);
25183
25195
  }
25184
25196
  if (this.parameters.keynumToDecay > 0) {
25185
25197
  this.parameters.decay += this.parameters.keynumToDecay * (60.0 - midiNoteNumber);
25186
25198
  this.parameters.decay =
25187
- this.parameters.decay < -10000.0 ? 0.0 : SynthHelper.timecents2Secs(this.parameters.decay);
25199
+ this.parameters.decay < -1e4 ? 0.0 : SynthHelper.timecents2Secs(this.parameters.decay);
25188
25200
  }
25189
25201
  this.midiVelocity = midiVelocity | 0;
25190
25202
  this.isAmpEnv = isAmpEnv;
@@ -25232,9 +25244,9 @@
25232
25244
  this.delta = -this.delta;
25233
25245
  this.level = 2.0 - this.level;
25234
25246
  }
25235
- else if (this.level < -1.0) {
25247
+ else if (this.level < -1) {
25236
25248
  this.delta = -this.delta;
25237
- this.level = -2.0 - this.level;
25249
+ this.level = -2 - this.level;
25238
25250
  }
25239
25251
  }
25240
25252
  }
@@ -26835,11 +26847,11 @@
26835
26847
  zoneRegion.modEnv.envToSecs(false);
26836
26848
  // LFO times need to be converted from timecents to seconds.
26837
26849
  zoneRegion.delayModLFO =
26838
- zoneRegion.delayModLFO < -11950.0
26850
+ zoneRegion.delayModLFO < -11950
26839
26851
  ? 0.0
26840
26852
  : SynthHelper.timecents2Secs(zoneRegion.delayModLFO);
26841
26853
  zoneRegion.delayVibLFO =
26842
- zoneRegion.delayVibLFO < -11950.0
26854
+ zoneRegion.delayVibLFO < -11950
26843
26855
  ? 0.0
26844
26856
  : SynthHelper.timecents2Secs(zoneRegion.delayVibLFO);
26845
26857
  // Pin values to their ranges.
@@ -27976,6 +27988,11 @@
27976
27988
  */
27977
27989
  class BeatBounds {
27978
27990
  constructor() {
27991
+ /**
27992
+ * Gets or sets x-position where the timely center of the notes for this beat is.
27993
+ * This is where the cursor should be at the time when this beat is played.
27994
+ */
27995
+ this.onNotesX = 0;
27979
27996
  /**
27980
27997
  * Gets or sets the individual note positions of this beat (if {@link CoreSettings.includeNoteBounds} was set to true).
27981
27998
  */
@@ -28229,6 +28246,7 @@
28229
28246
  let bb = {};
28230
28247
  bb.visualBounds = this.boundsToJson(beat.visualBounds);
28231
28248
  bb.realBounds = this.boundsToJson(beat.realBounds);
28249
+ bb.onNotesX = beat.onNotesX;
28232
28250
  let bbd = bb;
28233
28251
  bbd.beatIndex = beat.beat.index;
28234
28252
  bbd.voiceIndex = beat.beat.voice.index;
@@ -28283,6 +28301,7 @@
28283
28301
  let bb = new BeatBounds();
28284
28302
  bb.visualBounds = BoundsLookup.boundsFromJson(beat.visualBounds);
28285
28303
  bb.realBounds = BoundsLookup.boundsFromJson(beat.realBounds);
28304
+ bb.onNotesX = beat.onNotesX;
28286
28305
  let bd = beat;
28287
28306
  bb.beat =
28288
28307
  score.tracks[bd.trackIndex].staves[bd.staffIndex].bars[bd.barIndex].voices[bd.voiceIndex].beats[bd.beatIndex];
@@ -31855,39 +31874,31 @@
31855
31874
  }
31856
31875
  registerLayoutingInfo(layoutings) {
31857
31876
  let preBeatStretch = this.preNotes.computedWidth + this.onNotes.centerX;
31858
- if (this.beat.graceGroup && !this.beat.graceGroup.isComplete) {
31859
- preBeatStretch += BeatContainerGlyph.GraceBeatPadding;
31860
- }
31861
31877
  let postBeatStretch = this.onNotes.computedWidth - this.onNotes.centerX;
31862
31878
  // make space for flag
31863
31879
  const helper = this.renderer.helpers.getBeamingHelperForBeat(this.beat);
31864
- if ((helper && this.drawBeamHelperAsFlags(helper)) || this.beat.graceType !== GraceType.None) {
31865
- postBeatStretch +=
31866
- FlagGlyph.FlagWidth *
31867
- (this.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1);
31880
+ if (this.beat.graceType !== GraceType.None) {
31881
+ // flagged grace
31882
+ if (this.beat.graceGroup.beats.length === 1) {
31883
+ postBeatStretch += FlagGlyph.FlagWidth * NoteHeadGlyph.GraceScale;
31884
+ }
31885
+ // grace with bars, some space for bar unless last
31886
+ else if (this.beat.graceIndex < this.beat.graceGroup.beats.length - 1) {
31887
+ postBeatStretch += 7;
31888
+ }
31889
+ else {
31890
+ postBeatStretch += BeatContainerGlyph.GraceBeatPadding;
31891
+ }
31892
+ }
31893
+ else if (helper && this.drawBeamHelperAsFlags(helper)) {
31894
+ postBeatStretch += FlagGlyph.FlagWidth;
31868
31895
  }
31869
31896
  for (const tie of this.ties) {
31870
31897
  postBeatStretch += tie.width;
31871
31898
  }
31872
- // Add some further spacing to grace notes
31873
- if (this.beat.graceType !== GraceType.None) {
31874
- postBeatStretch += BeatContainerGlyph.GraceBeatPadding;
31875
- }
31876
31899
  layoutings.addBeatSpring(this.beat, preBeatStretch, postBeatStretch);
31877
- // store sizes for special renderers like the EffectBarRenderer
31878
- layoutings.setPreBeatSize(this.beat, this.preNotes.computedWidth);
31879
- layoutings.setOnBeatSize(this.beat, this.onNotes.computedWidth);
31880
- layoutings.setBeatCenterX(this.beat, this.onNotes.centerX);
31881
31900
  }
31882
31901
  applyLayoutingInfo(info) {
31883
- let offset = info.getBeatCenterX(this.beat) - this.onNotes.centerX;
31884
- if (this.beat.graceGroup && !this.beat.graceGroup.isComplete) {
31885
- offset += BeatContainerGlyph.GraceBeatPadding;
31886
- }
31887
- this.preNotes.x = offset;
31888
- this.preNotes.width = info.getPreBeatSize(this.beat);
31889
- this.onNotes.width = info.getOnBeatSize(this.beat);
31890
- this.onNotes.x = this.preNotes.x + this.preNotes.width;
31891
31902
  this.onNotes.updateBeamingHelper();
31892
31903
  this.updateWidth();
31893
31904
  }
@@ -31949,11 +31960,6 @@
31949
31960
  if (this.beat.voice.isEmpty) {
31950
31961
  return;
31951
31962
  }
31952
- let isEmptyGlyph = this.preNotes.isEmpty && this.onNotes.isEmpty && this.ties.length === 0;
31953
- if (isEmptyGlyph) {
31954
- return;
31955
- }
31956
- canvas.beginGroup(BeatContainerGlyph.getGroupId(this.beat));
31957
31963
  // var c = canvas.color;
31958
31964
  // var ta = canvas.textAlign;
31959
31965
  // canvas.color = new Color(255, 0, 0);
@@ -31972,21 +31978,25 @@
31972
31978
  // canvas.font = new Font("Arial", 10);
31973
31979
  // canvas.color = new Color(0, 0, 0);
31974
31980
  // canvas.fillText(this.beat.voice.index + ":" + this.beat.index, cx + this.x, cy + this.y + 15 * this.beat.voice.index);
31981
+ // const c = canvas.color;
31975
31982
  // if (this.beat.voice.index === 0) {
31983
+ // canvas.color = new Color(0, 0, 200, 100);
31984
+ // canvas.strokeRect(cx + this.x, cy + this.y, this.width, 10);
31976
31985
  // canvas.color = new Color(200, 0, 0, 100);
31977
- // canvas.strokeRect(cx + this.x, cy + this.y + this.preNotes.y + 30, this.width, 10);
31986
+ // canvas.strokeRect(cx + this.x + this.preNotes.x, cy + this.y + 10, this.preNotes.width, 10);
31987
+ // canvas.color = new Color(0, 200, 0, 100);
31988
+ // canvas.strokeRect(cx + this.x + this.onNotes.x, cy + this.y + 10, this.onNotes.width, 10);
31989
+ // canvas.color = new Color(0, 200, 200, 100);
31990
+ // canvas.strokeRect(cx + this.x + this.onNotes.x + this.onNotes.centerX, cy, 1, this.renderer.height);
31978
31991
  // }
31992
+ // canvas.color = c;
31993
+ let isEmptyGlyph = this.preNotes.isEmpty && this.onNotes.isEmpty && this.ties.length === 0;
31994
+ if (isEmptyGlyph) {
31995
+ return;
31996
+ }
31997
+ canvas.beginGroup(BeatContainerGlyph.getGroupId(this.beat));
31979
31998
  this.preNotes.paint(cx + this.x, cy + this.y, canvas);
31980
- // if (this.beat.voice.index === 0) {
31981
- // canvas.color = new Color(200, 0, 0, 100);
31982
- // canvas.strokeRect(cx + this.x + this.preNotes.x, cy + this.y + this.preNotes.y, this.preNotes.width, 10);
31983
- // }
31984
31999
  this.onNotes.paint(cx + this.x, cy + this.y, canvas);
31985
- // if (this.beat.voice.index === 0) {
31986
- // canvas.color = new Color(0, 200, 0, 100);
31987
- // canvas.strokeRect(cx + this.x + this.onNotes.x, cy + this.y + this.onNotes.y - 10, this.onNotes.width, 10);
31988
- // }
31989
- // paint the ties relative to the whole staff,
31990
32000
  // reason: we have possibly multiple staves involved and need to calculate the correct positions.
31991
32001
  let staffX = cx - this.voiceContainer.x - this.renderer.x;
31992
32002
  let staffY = cy - this.voiceContainer.y - this.renderer.y;
@@ -32000,19 +32010,55 @@
32000
32010
  buildBoundingsLookup(barBounds, cx, cy, isEmptyBar) {
32001
32011
  let beatBoundings = new BeatBounds();
32002
32012
  beatBoundings.beat = this.beat;
32003
- beatBoundings.visualBounds = new Bounds();
32004
- beatBoundings.visualBounds.x = cx + this.x + this.onNotes.x;
32005
- beatBoundings.visualBounds.y = barBounds.visualBounds.y;
32006
- beatBoundings.visualBounds.w = this.onNotes.width;
32007
- beatBoundings.visualBounds.h = barBounds.visualBounds.h;
32008
- beatBoundings.realBounds = new Bounds();
32009
- beatBoundings.realBounds.x = cx + this.x;
32010
- beatBoundings.realBounds.y = barBounds.realBounds.y;
32011
- beatBoundings.realBounds.w = this.width;
32012
- beatBoundings.realBounds.h = barBounds.realBounds.h;
32013
- if (isEmptyBar) {
32013
+ if (this.beat.isEmpty) {
32014
+ beatBoundings.visualBounds = new Bounds();
32014
32015
  beatBoundings.visualBounds.x = cx + this.x;
32015
- beatBoundings.realBounds.x = beatBoundings.visualBounds.x;
32016
+ beatBoundings.visualBounds.y = barBounds.visualBounds.y;
32017
+ beatBoundings.visualBounds.w = this.width;
32018
+ beatBoundings.visualBounds.h = barBounds.visualBounds.h;
32019
+ beatBoundings.realBounds = new Bounds();
32020
+ beatBoundings.realBounds.x = cx + this.x;
32021
+ beatBoundings.realBounds.y = barBounds.realBounds.y;
32022
+ beatBoundings.realBounds.w = this.width;
32023
+ beatBoundings.realBounds.h = barBounds.realBounds.h;
32024
+ beatBoundings.onNotesX = cx + this.x + this.onNotes.centerX;
32025
+ }
32026
+ else {
32027
+ beatBoundings.visualBounds = new Bounds();
32028
+ beatBoundings.visualBounds.x = cx + this.x;
32029
+ if (!this.preNotes.isEmpty) {
32030
+ beatBoundings.visualBounds.x = cx + this.x + this.preNotes.x;
32031
+ }
32032
+ else if (!this.onNotes.isEmpty) {
32033
+ beatBoundings.visualBounds.x = cx + this.x + this.onNotes.x;
32034
+ }
32035
+ else {
32036
+ beatBoundings.visualBounds.x = cx + this.x;
32037
+ }
32038
+ let visualEndX = 0;
32039
+ if (!this.onNotes.isEmpty) {
32040
+ visualEndX = cx + this.x + this.onNotes.x + this.onNotes.width;
32041
+ }
32042
+ else if (!this.preNotes.isEmpty) {
32043
+ visualEndX = cx + this.x + this.preNotes.x + this.preNotes.width;
32044
+ }
32045
+ else {
32046
+ visualEndX = cx + this.x + this.width;
32047
+ }
32048
+ beatBoundings.visualBounds.w = visualEndX - beatBoundings.visualBounds.x;
32049
+ const helper = this.renderer.helpers.getBeamingHelperForBeat(this.beat);
32050
+ if ((helper && this.drawBeamHelperAsFlags(helper)) || this.beat.graceType !== GraceType.None) {
32051
+ beatBoundings.visualBounds.w +=
32052
+ FlagGlyph.FlagWidth * (this.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1);
32053
+ }
32054
+ beatBoundings.visualBounds.y = barBounds.visualBounds.y;
32055
+ beatBoundings.visualBounds.h = barBounds.visualBounds.h;
32056
+ beatBoundings.realBounds = new Bounds();
32057
+ beatBoundings.realBounds.x = cx + this.x;
32058
+ beatBoundings.realBounds.y = barBounds.realBounds.y;
32059
+ beatBoundings.realBounds.w = this.width;
32060
+ beatBoundings.realBounds.h = barBounds.realBounds.h;
32061
+ beatBoundings.onNotesX = cx + this.x + this.onNotes.x + this.onNotes.centerX;
32016
32062
  }
32017
32063
  barBounds.addBeat(beatBoundings);
32018
32064
  if (this.renderer.settings.core.includeNoteBounds) {
@@ -32916,7 +32962,7 @@
32916
32962
  if (this.settings.player.enableAnimatedBeatCursor) {
32917
32963
  beatCursor.stopAnimation();
32918
32964
  }
32919
- beatCursor.setBounds(beatBoundings.visualBounds.x, barBounds.y, 1, barBounds.h);
32965
+ beatCursor.setBounds(beatBoundings.onNotesX, barBounds.y, 1, barBounds.h);
32920
32966
  }
32921
32967
  // if playing, animate the cursor to the next beat
32922
32968
  if (this.settings.player.enableElementHighlighting) {
@@ -32940,7 +32986,7 @@
32940
32986
  let nextBeatBoundings = cache.findBeat(nextBeat);
32941
32987
  if (nextBeatBoundings &&
32942
32988
  nextBeatBoundings.barBounds.masterBarBounds.staffSystemBounds === barBoundings.staffSystemBounds) {
32943
- nextBeatX = nextBeatBoundings.visualBounds.x;
32989
+ nextBeatX = nextBeatBoundings.onNotesX;
32944
32990
  }
32945
32991
  }
32946
32992
  // we need to put the transition to an own animation frame
@@ -36193,7 +36239,6 @@
36193
36239
  }
36194
36240
  }
36195
36241
  registerLayoutingInfo(info) {
36196
- info.updateVoiceSize(this.width);
36197
36242
  let beatGlyphs = this.beatGlyphs;
36198
36243
  for (let b of beatGlyphs) {
36199
36244
  b.registerLayoutingInfo(info);
@@ -36237,8 +36282,8 @@
36237
36282
 
36238
36283
  class BeatLines {
36239
36284
  constructor() {
36240
- this.maxLine = -1000;
36241
- this.minLine = -1000;
36285
+ this.maxLine = -1e3;
36286
+ this.minLine = -1e3;
36242
36287
  }
36243
36288
  }
36244
36289
  /**
@@ -36265,11 +36310,11 @@
36265
36310
  /**
36266
36311
  * The line of the highest note added to this helper.
36267
36312
  */
36268
- this.maxLine = -1000;
36313
+ this.maxLine = -1e3;
36269
36314
  /**
36270
36315
  * The line of the lowest note added to this helper.
36271
36316
  */
36272
- this.minLine = -1000;
36317
+ this.minLine = -1e3;
36273
36318
  this._barRenderer = barRenderer;
36274
36319
  this._bar = barRenderer.bar;
36275
36320
  }
@@ -36475,11 +36520,11 @@
36475
36520
  else {
36476
36521
  this._appliedScoreLinesByValue.set(noteValue, line);
36477
36522
  }
36478
- if (this.minLine === -1000 || this.minLine < line) {
36523
+ if (this.minLine === -1e3 || this.minLine < line) {
36479
36524
  this.minLine = line;
36480
36525
  this.minLineBeat = relatedBeat;
36481
36526
  }
36482
- if (this.maxLine === -1000 || this.maxLine > line) {
36527
+ if (this.maxLine === -1e3 || this.maxLine > line) {
36483
36528
  this.maxLine = line;
36484
36529
  this.maxLineBeat = relatedBeat;
36485
36530
  }
@@ -36497,10 +36542,10 @@
36497
36542
  lines = new BeatLines();
36498
36543
  this._beatLines.set(relatedBeat.id, lines);
36499
36544
  }
36500
- if (lines.minLine === -1000 || line < lines.minLine) {
36545
+ if (lines.minLine === -1e3 || line < lines.minLine) {
36501
36546
  lines.minLine = line;
36502
36547
  }
36503
- if (lines.minLine === -1000 || line > lines.maxLine) {
36548
+ if (lines.minLine === -1e3 || line > lines.maxLine) {
36504
36549
  lines.maxLine = line;
36505
36550
  }
36506
36551
  }
@@ -37023,14 +37068,14 @@
37023
37068
  }
37024
37069
  class ReservedLayoutArea {
37025
37070
  constructor(beat) {
37026
- this.topY = -1000;
37027
- this.bottomY = -1000;
37071
+ this.topY = -1e3;
37072
+ this.bottomY = -1e3;
37028
37073
  this.slots = [];
37029
37074
  this.beat = beat;
37030
37075
  }
37031
37076
  addSlot(topY, bottomY) {
37032
37077
  this.slots.push(new ReservedLayoutAreaSlot(topY, bottomY));
37033
- if (this.topY === -1000) {
37078
+ if (this.topY === -1e3) {
37034
37079
  this.topY = topY;
37035
37080
  this.bottomY = bottomY;
37036
37081
  }
@@ -37052,10 +37097,10 @@
37052
37097
  this.restDurationsByDisplayTime = new Map();
37053
37098
  }
37054
37099
  getBeatMinMaxY() {
37055
- let minY = -1000;
37056
- let maxY = -1000;
37100
+ let minY = -1e3;
37101
+ let maxY = -1e3;
37057
37102
  for (const v of this.reservedLayoutAreasByDisplayTime.values()) {
37058
- if (minY === -1000) {
37103
+ if (minY === -1e3) {
37059
37104
  minY = v.topY;
37060
37105
  maxY = v.bottomY;
37061
37106
  }
@@ -37068,7 +37113,7 @@
37068
37113
  }
37069
37114
  }
37070
37115
  }
37071
- if (minY === -1000) {
37116
+ if (minY === -1e3) {
37072
37117
  return [0, 0];
37073
37118
  }
37074
37119
  return [minY, maxY];
@@ -37733,12 +37778,8 @@
37733
37778
  * an internal version number that increments whenever a change was made.
37734
37779
  */
37735
37780
  this.version = 0;
37736
- this.preBeatSizes = new Map();
37737
- this.onBeatSizes = new Map();
37738
- this.onBeatCenterX = new Map();
37739
37781
  this.preBeatSize = 0;
37740
37782
  this.postBeatSize = 0;
37741
- this.voiceSize = 0;
37742
37783
  this.minStretchForce = 0;
37743
37784
  this.totalSpringConstant = 0;
37744
37785
  this.incompleteGraceRods = new Map();
@@ -37746,51 +37787,37 @@
37746
37787
  this.springs = new Map();
37747
37788
  this.height = 0;
37748
37789
  }
37749
- updateVoiceSize(size) {
37750
- if (size > this.voiceSize) {
37751
- this.voiceSize = size;
37752
- this.version++;
37753
- }
37754
- }
37755
- setPreBeatSize(beat, size) {
37756
- if (!this.preBeatSizes.has(beat.id) || this.preBeatSizes.get(beat.id) < size) {
37757
- this.preBeatSizes.set(beat.id, size);
37758
- this.version++;
37790
+ updateMinStretchForce(force) {
37791
+ if (this.minStretchForce < force) {
37792
+ this.minStretchForce = force;
37759
37793
  }
37760
37794
  }
37761
37795
  getPreBeatSize(beat) {
37762
- if (this.preBeatSizes.has(beat.id)) {
37763
- return this.preBeatSizes.get(beat.id);
37764
- }
37765
- return 0;
37766
- }
37767
- setOnBeatSize(beat, size) {
37768
- if (!this.onBeatSizes.has(beat.id) || this.onBeatSizes.get(beat.id) < size) {
37769
- this.onBeatSizes.set(beat.id, size);
37770
- this.version++;
37771
- }
37772
- }
37773
- getOnBeatSize(beat) {
37774
- if (this.onBeatSizes.has(beat.id)) {
37775
- return this.onBeatSizes.get(beat.id);
37796
+ if (beat.graceType !== GraceType.None) {
37797
+ const groupId = beat.graceGroup.id;
37798
+ const graceRod = this.allGraceRods.get(groupId)[beat.graceIndex];
37799
+ return graceRod.preBeatWidth;
37776
37800
  }
37777
- return 0;
37778
- }
37779
- getBeatCenterX(beat) {
37780
- if (this.onBeatCenterX.has(beat.id)) {
37781
- return this.onBeatCenterX.get(beat.id);
37801
+ else {
37802
+ const start = beat.absoluteDisplayStart;
37803
+ if (!this.springs.has(start)) {
37804
+ return 0;
37805
+ }
37806
+ return this.springs.get(start).preBeatWidth;
37782
37807
  }
37783
- return 0;
37784
37808
  }
37785
- setBeatCenterX(beat, x) {
37786
- if (!this.onBeatCenterX.has(beat.id) || this.onBeatCenterX.get(beat.id) < x) {
37787
- this.onBeatCenterX.set(beat.id, x);
37788
- this.version++;
37809
+ getPostBeatSize(beat) {
37810
+ if (beat.graceType !== GraceType.None) {
37811
+ const groupId = beat.graceGroup.id;
37812
+ const graceRod = this.allGraceRods.get(groupId)[beat.graceIndex];
37813
+ return graceRod.postSpringWidth;
37789
37814
  }
37790
- }
37791
- updateMinStretchForce(force) {
37792
- if (this.minStretchForce < force) {
37793
- this.minStretchForce = force;
37815
+ else {
37816
+ const start = beat.absoluteDisplayStart;
37817
+ if (!this.springs.has(start)) {
37818
+ return 0;
37819
+ }
37820
+ return this.springs.get(start).postSpringWidth;
37794
37821
  }
37795
37822
  }
37796
37823
  addSpring(start, duration, graceBeatWidth, preBeatWidth, postSpringSize) {
@@ -37848,7 +37875,7 @@
37848
37875
  let start = beat.absoluteDisplayStart;
37849
37876
  if (beat.graceType !== GraceType.None) {
37850
37877
  // For grace beats we just remember the the sizes required for them
37851
- // these sizes are then considered when the target beat is added.
37878
+ // these sizes are then considered when the target beat is added.
37852
37879
  const groupId = beat.graceGroup.id;
37853
37880
  if (!this.allGraceRods.has(groupId)) {
37854
37881
  this.allGraceRods.set(groupId, new Array(beat.graceGroup.beats.length));
@@ -37887,23 +37914,15 @@
37887
37914
  }
37888
37915
  }
37889
37916
  finish() {
37890
- for (const [k, s] of this.allGraceRods) {
37891
- let offset = 0;
37892
- if (this.incompleteGraceRods.has(k)) {
37893
- for (const sp of s) {
37894
- offset += sp.preBeatWidth;
37895
- sp.graceBeatWidth = offset;
37896
- offset += sp.postSpringWidth;
37897
- }
37898
- }
37899
- else {
37900
- for (let i = s.length - 1; i >= 0; i--) {
37901
- // for grace beats we store the offset
37902
- // in the 'graceBeatWidth' for later use during applying
37903
- // beat positions
37904
- s[i].graceBeatWidth = offset;
37905
- offset -= (s[i].preBeatWidth + s[i].postSpringWidth);
37906
- }
37917
+ for (const [_, s] of this.allGraceRods) {
37918
+ // for grace beats we store the offset
37919
+ // in the 'graceBeatWidth' for later use during applying
37920
+ // beat positions
37921
+ let x = 0;
37922
+ for (const sp of s) {
37923
+ x += sp.preBeatWidth;
37924
+ sp.graceBeatWidth = x;
37925
+ x += sp.postSpringWidth;
37907
37926
  }
37908
37927
  }
37909
37928
  this._incompleteGraceRodsWidth = 0;
@@ -37959,7 +37978,7 @@
37959
37978
  let nextSpring = sortedSprings[i + 1];
37960
37979
  requiredSpace = currentSpring.postSpringWidth + nextSpring.preSpringWidth;
37961
37980
  }
37962
- // for the first spring we need to ensure we take the initial
37981
+ // for the first spring we need to ensure we take the initial
37963
37982
  // pre-spring width into account
37964
37983
  if (i === 0) {
37965
37984
  requiredSpace += currentSpring.preSpringWidth;
@@ -38649,12 +38668,12 @@
38649
38668
  let x = this.x + _firstStaffInBrackets.x;
38650
38669
  let staffSystemBounds = new StaffSystemBounds();
38651
38670
  staffSystemBounds.visualBounds = new Bounds();
38652
- staffSystemBounds.visualBounds.x = cx;
38671
+ staffSystemBounds.visualBounds.x = cx + this.x;
38653
38672
  staffSystemBounds.visualBounds.y = cy + this.y;
38654
38673
  staffSystemBounds.visualBounds.w = this.width;
38655
38674
  staffSystemBounds.visualBounds.h = this.height - this.topPadding - this.bottomPadding;
38656
38675
  staffSystemBounds.realBounds = new Bounds();
38657
- staffSystemBounds.realBounds.x = cx;
38676
+ staffSystemBounds.realBounds.x = cx + this.x;
38658
38677
  staffSystemBounds.realBounds.y = cy + this.y;
38659
38678
  staffSystemBounds.realBounds.w = this.width;
38660
38679
  staffSystemBounds.realBounds.h = this.height;
@@ -39699,29 +39718,28 @@
39699
39718
  }
39700
39719
  alignGlyph(sizing, beat) {
39701
39720
  let g = this._effectGlyphs[beat.voice.index].get(beat.index);
39702
- let pos;
39703
39721
  let container = this.renderer.getBeatContainer(beat);
39722
+ // container is aligned with the "onTimeX" position of the beat in effect renders
39704
39723
  switch (sizing) {
39705
39724
  case EffectBarGlyphSizing.SinglePreBeat:
39706
- pos = container.preNotes;
39707
- g.x = this.renderer.beatGlyphsStart + pos.x + container.x;
39708
- g.width = pos.width;
39725
+ // shift to the start using the biggest pre-beat size of the respective beat
39726
+ const offsetToBegin = this.renderer.layoutingInfo.getPreBeatSize(beat);
39727
+ g.x = this.renderer.beatGlyphsStart + container.x - offsetToBegin;
39709
39728
  break;
39710
39729
  case EffectBarGlyphSizing.SingleOnBeat:
39711
39730
  case EffectBarGlyphSizing.GroupedOnBeat:
39712
- pos = container.onNotes;
39713
- g.x = this.renderer.beatGlyphsStart + pos.x + container.x;
39714
- g.width = pos.width;
39731
+ g.x = this.renderer.beatGlyphsStart + container.x;
39715
39732
  break;
39716
39733
  case EffectBarGlyphSizing.SingleOnBeatToEnd:
39717
39734
  case EffectBarGlyphSizing.GroupedOnBeatToEnd:
39718
- pos = container.onNotes;
39719
- g.x = this.renderer.beatGlyphsStart + pos.x + container.x;
39735
+ g.x = this.renderer.beatGlyphsStart + container.x;
39720
39736
  if (container.beat.isLastOfVoice) {
39721
39737
  g.width = this.renderer.width - g.x;
39722
39738
  }
39723
39739
  else {
39724
- g.width = container.width - container.preNotes.width - container.preNotes.x;
39740
+ // shift to the start using the biggest post-beat size of the respective beat
39741
+ const offsetToEnd = this.renderer.layoutingInfo.getPostBeatSize(beat);
39742
+ g.width = offsetToEnd;
39725
39743
  }
39726
39744
  break;
39727
39745
  case EffectBarGlyphSizing.FullBar:
@@ -41235,116 +41253,134 @@
41235
41253
  cx += this.x;
41236
41254
  cy += this.y;
41237
41255
  let noteY = cy + this.height * NoteHeadGlyph.GraceScale;
41256
+ let tupletY = noteY + 8;
41238
41257
  canvas.font = this.renderer.resources.effectFont;
41239
41258
  canvas.fillText('(', cx, cy + this.height * 0.3);
41240
41259
  let leftNoteX = cx + 10;
41241
41260
  let rightNoteX = cx + 40;
41261
+ let leftNoteSymbols = [];
41262
+ let rightAugmentationSymbols = [];
41263
+ let rightNoteSymbols = [];
41264
+ let rightTupletSymbols = [];
41242
41265
  switch (this._tripletFeel) {
41243
41266
  case TripletFeel.NoTripletFeel:
41244
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41245
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41267
+ leftNoteSymbols = [
41268
+ MusicFontSymbol.TextBlackNoteLongStem,
41269
+ MusicFontSymbol.TextCont8thBeamLongStem,
41270
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41271
+ ];
41272
+ rightNoteSymbols = [
41273
+ MusicFontSymbol.TextBlackNoteLongStem,
41274
+ MusicFontSymbol.TextCont8thBeamLongStem,
41275
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41276
+ ];
41246
41277
  break;
41247
41278
  case TripletFeel.Triplet8th:
41248
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41249
- canvas.fillMusicFontSymbol(rightNoteX, noteY, TripletFeelGlyph.NoteScale, MusicFontSymbol.NoteQuarterUp, false);
41250
- canvas.fillMusicFontSymbol(rightNoteX + TripletFeelGlyph.NoteSeparation, noteY, TripletFeelGlyph.NoteScale, MusicFontSymbol.NoteEighthUp, false);
41251
- this.renderTriplet(rightNoteX, cy, canvas);
41279
+ leftNoteSymbols = [
41280
+ MusicFontSymbol.TextBlackNoteLongStem,
41281
+ MusicFontSymbol.TextCont8thBeamLongStem,
41282
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41283
+ ];
41284
+ rightNoteSymbols = [
41285
+ MusicFontSymbol.TextBlackNoteLongStem,
41286
+ MusicFontSymbol.Space,
41287
+ MusicFontSymbol.NoteEighthUp
41288
+ ];
41289
+ rightTupletSymbols = [
41290
+ MusicFontSymbol.TextTupletBracketStartLongStem,
41291
+ MusicFontSymbol.TextTuplet3LongStem,
41292
+ MusicFontSymbol.TextTupletBracketEndLongStem
41293
+ ];
41252
41294
  break;
41253
41295
  case TripletFeel.Triplet16th:
41254
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41255
- TripletFeelGlyphBarType.Full,
41256
- TripletFeelGlyphBarType.Full
41257
- ]);
41258
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41259
- TripletFeelGlyphBarType.Full,
41260
- TripletFeelGlyphBarType.PartialRight
41261
- ]);
41262
- this.renderTriplet(rightNoteX, cy, canvas);
41296
+ leftNoteSymbols = [
41297
+ MusicFontSymbol.TextBlackNoteLongStem,
41298
+ MusicFontSymbol.TextCont8thBeamLongStem,
41299
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41300
+ ];
41301
+ rightNoteSymbols = [
41302
+ MusicFontSymbol.TextBlackNoteLongStem,
41303
+ MusicFontSymbol.TextCont8thBeamLongStem,
41304
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem
41305
+ ];
41306
+ rightTupletSymbols = [
41307
+ MusicFontSymbol.TextTupletBracketStartLongStem,
41308
+ MusicFontSymbol.TextTuplet3LongStem,
41309
+ MusicFontSymbol.TextTupletBracketEndLongStem
41310
+ ];
41263
41311
  break;
41264
41312
  case TripletFeel.Dotted8th:
41265
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41266
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41267
- TripletFeelGlyphBarType.Full,
41268
- TripletFeelGlyphBarType.PartialRight
41269
- ]);
41270
- canvas.fillCircle(rightNoteX + 9, noteY, 1);
41313
+ leftNoteSymbols = [
41314
+ MusicFontSymbol.TextBlackNoteLongStem,
41315
+ MusicFontSymbol.TextCont8thBeamLongStem,
41316
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41317
+ ];
41318
+ rightAugmentationSymbols = [
41319
+ MusicFontSymbol.TextAugmentationDot,
41320
+ ];
41321
+ rightNoteSymbols = [
41322
+ MusicFontSymbol.TextBlackNoteLongStem,
41323
+ MusicFontSymbol.TextCont8thBeamLongStem,
41324
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem
41325
+ ];
41271
41326
  break;
41272
41327
  case TripletFeel.Dotted16th:
41273
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41274
- TripletFeelGlyphBarType.Full,
41275
- TripletFeelGlyphBarType.Full
41276
- ]);
41277
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41278
- TripletFeelGlyphBarType.Full,
41279
- TripletFeelGlyphBarType.Full,
41280
- TripletFeelGlyphBarType.PartialRight
41281
- ]);
41328
+ leftNoteSymbols = [
41329
+ MusicFontSymbol.TextBlackNoteLongStem,
41330
+ MusicFontSymbol.TextCont16thBeamLongStem,
41331
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem
41332
+ ];
41333
+ rightAugmentationSymbols = [
41334
+ MusicFontSymbol.TextAugmentationDot,
41335
+ ];
41336
+ rightNoteSymbols = [
41337
+ MusicFontSymbol.TextBlackNoteLongStem,
41338
+ MusicFontSymbol.TextCont16thBeamLongStem,
41339
+ MusicFontSymbol.TextBlackNoteFrac32ndLongStem
41340
+ ];
41282
41341
  canvas.fillCircle(rightNoteX + 9, noteY, 1);
41283
41342
  break;
41284
41343
  case TripletFeel.Scottish8th:
41285
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41286
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41287
- TripletFeelGlyphBarType.Full,
41288
- TripletFeelGlyphBarType.PartialLeft
41289
- ]);
41290
- canvas.fillCircle(rightNoteX + TripletFeelGlyph.NoteSeparation + 8, noteY, 1);
41344
+ leftNoteSymbols = [
41345
+ MusicFontSymbol.TextBlackNoteLongStem,
41346
+ MusicFontSymbol.TextCont8thBeamLongStem,
41347
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41348
+ ];
41349
+ rightNoteSymbols = [
41350
+ MusicFontSymbol.TextBlackNoteLongStem,
41351
+ MusicFontSymbol.TextCont16thBeamLongStem,
41352
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem,
41353
+ MusicFontSymbol.TextAugmentationDot,
41354
+ ];
41291
41355
  break;
41292
41356
  case TripletFeel.Scottish16th:
41293
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41294
- TripletFeelGlyphBarType.Full,
41295
- TripletFeelGlyphBarType.Full
41296
- ]);
41297
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41298
- TripletFeelGlyphBarType.Full,
41299
- TripletFeelGlyphBarType.Full,
41300
- TripletFeelGlyphBarType.PartialLeft
41301
- ]);
41302
- canvas.fillCircle(rightNoteX + TripletFeelGlyph.NoteSeparation + 8, noteY, 1);
41303
- break;
41304
- }
41305
- canvas.fillText('=', cx + 30, cy + 5);
41306
- canvas.fillText(')', cx + 65, cy + this.height * 0.3);
41307
- }
41308
- renderBarNote(cx, noteY, noteScale, canvas, bars) {
41309
- canvas.fillMusicFontSymbol(cx, noteY, noteScale, MusicFontSymbol.NoteQuarterUp, false);
41310
- let partialBarWidth = (TripletFeelGlyph.NoteSeparation / 2);
41311
- for (let i = 0; i < bars.length; i++) {
41312
- switch (bars[i]) {
41313
- case TripletFeelGlyphBarType.Full:
41314
- canvas.fillRect(cx + 4, noteY - TripletFeelGlyph.NoteHeight + TripletFeelGlyph.BarSeparation * i, TripletFeelGlyph.NoteSeparation, TripletFeelGlyph.BarHeight);
41315
- break;
41316
- case TripletFeelGlyphBarType.PartialLeft:
41317
- canvas.fillRect(cx + 4, noteY - TripletFeelGlyph.NoteHeight + TripletFeelGlyph.BarSeparation * i, partialBarWidth, TripletFeelGlyph.BarHeight);
41318
- break;
41319
- case TripletFeelGlyphBarType.PartialRight:
41320
- canvas.fillRect(cx + 4 + partialBarWidth, noteY - TripletFeelGlyph.NoteHeight + TripletFeelGlyph.BarSeparation * i, partialBarWidth, TripletFeelGlyph.BarHeight);
41321
- break;
41322
- }
41357
+ leftNoteSymbols = [
41358
+ MusicFontSymbol.TextBlackNoteLongStem,
41359
+ MusicFontSymbol.TextCont16thBeamLongStem,
41360
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem
41361
+ ];
41362
+ rightNoteSymbols = [
41363
+ MusicFontSymbol.TextBlackNoteLongStem,
41364
+ MusicFontSymbol.TextCont32ndBeamLongStem,
41365
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem,
41366
+ MusicFontSymbol.TextAugmentationDot,
41367
+ ];
41368
+ break;
41323
41369
  }
41324
- canvas.fillMusicFontSymbol(cx + TripletFeelGlyph.NoteSeparation, noteY, noteScale, MusicFontSymbol.NoteQuarterUp, false);
41325
- }
41326
- renderTriplet(cx, cy, canvas) {
41327
- cy += 2;
41328
- let font = this.renderer.resources.effectFont;
41329
- canvas.font = Font.withFamilyList(font.families, font.size * 0.8, font.style);
41330
- let rightX = cx + TripletFeelGlyph.NoteSeparation + 3;
41331
- canvas.beginPath();
41332
- canvas.moveTo(cx, cy + 3);
41333
- canvas.lineTo(cx, cy);
41334
- canvas.lineTo(cx + 5, cy);
41335
- canvas.moveTo(rightX + 5, cy + 3);
41336
- canvas.lineTo(rightX + 5, cy);
41337
- canvas.lineTo(rightX, cy);
41338
- canvas.stroke();
41339
- canvas.fillText('3', cx + 7, cy - 10);
41340
- canvas.font = font;
41370
+ canvas.fillMusicFontSymbols(leftNoteX, noteY, TripletFeelGlyph.NoteScale, leftNoteSymbols, false);
41371
+ canvas.fillText('=', cx + 32, cy + 5);
41372
+ canvas.fillMusicFontSymbols(rightNoteX, noteY, TripletFeelGlyph.NoteScale, rightNoteSymbols, false);
41373
+ if (rightAugmentationSymbols.length > 0) {
41374
+ canvas.fillMusicFontSymbols(rightNoteX + 7, noteY, TripletFeelGlyph.NoteScale, rightAugmentationSymbols, false);
41375
+ }
41376
+ if (rightTupletSymbols.length > 0) {
41377
+ canvas.fillMusicFontSymbols(rightNoteX, tupletY, TripletFeelGlyph.TupletScale, rightTupletSymbols, false);
41378
+ }
41379
+ canvas.fillText(')', cx + 65, cy + this.height * 0.3);
41341
41380
  }
41342
41381
  }
41343
- TripletFeelGlyph.NoteScale = 0.4;
41344
- TripletFeelGlyph.NoteHeight = 12;
41345
- TripletFeelGlyph.NoteSeparation = 12;
41346
- TripletFeelGlyph.BarHeight = 2;
41347
- TripletFeelGlyph.BarSeparation = 3;
41382
+ TripletFeelGlyph.NoteScale = 0.5;
41383
+ TripletFeelGlyph.TupletScale = 0.7;
41348
41384
 
41349
41385
  class TripletFeelEffectInfo extends EffectBarRendererInfo {
41350
41386
  get notationElement() {
@@ -42983,7 +43019,7 @@
42983
43019
  class AccidentalColumnInfo {
42984
43020
  constructor() {
42985
43021
  this.x = 0;
42986
- this.y = -3000;
43022
+ this.y = -3e3;
42987
43023
  this.width = 0;
42988
43024
  }
42989
43025
  }
@@ -44295,7 +44331,7 @@
44295
44331
  class ScoreBeatGlyph extends BeatOnNoteGlyphBase {
44296
44332
  constructor() {
44297
44333
  super(...arguments);
44298
- this._collisionOffset = -1000;
44334
+ this._collisionOffset = -1e3;
44299
44335
  this._skipPaint = false;
44300
44336
  this.slash = null;
44301
44337
  this.noteHeads = null;
@@ -44318,7 +44354,7 @@
44318
44354
  }
44319
44355
  else if (this.restGlyph) {
44320
44356
  this.restGlyph.updateBeamingHelper(this.container.x + this.x);
44321
- if (this.renderer.bar.isMultiVoice && this._collisionOffset === -1000) {
44357
+ if (this.renderer.bar.isMultiVoice && this._collisionOffset === -1e3) {
44322
44358
  this._collisionOffset = this.renderer.helpers.collisionHelper.applyRestCollisionOffset(this.container.beat, this.restGlyph.y, this.renderer.getScoreHeight(1));
44323
44359
  this.y += this._collisionOffset;
44324
44360
  const existingRests = this.renderer.helpers.collisionHelper.restDurationsByDisplayTime;
@@ -44704,32 +44740,30 @@
44704
44740
  }
44705
44741
  if (!preBends.isEmpty) {
44706
44742
  this.addGlyph(preBends);
44707
- this.addGlyph(new SpacingGlyph(0, 0, 4 *
44708
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44743
+ this.addGlyph(new SpacingGlyph(0, 0, 4 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44709
44744
  }
44710
44745
  if (this.container.beat.brushType !== BrushType.None) {
44711
44746
  this.addGlyph(new ScoreBrushGlyph(this.container.beat));
44712
44747
  this.addGlyph(new SpacingGlyph(0, 0, 4));
44713
44748
  }
44714
44749
  if (!fingering.isEmpty) {
44715
- this.addGlyph(new SpacingGlyph(0, 0, 2 *
44716
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44750
+ if (!this.isEmpty) {
44751
+ this.addGlyph(new SpacingGlyph(0, 0, 2 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44752
+ }
44717
44753
  this.addGlyph(fingering);
44718
- this.addGlyph(new SpacingGlyph(0, 0, 2 *
44719
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44754
+ this.addGlyph(new SpacingGlyph(0, 0, 2 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44720
44755
  }
44721
44756
  if (!ghost.isEmpty) {
44722
44757
  this.addGlyph(ghost);
44723
- this.addGlyph(new SpacingGlyph(0, 0, 4 *
44724
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44758
+ this.addGlyph(new SpacingGlyph(0, 0, 4 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44725
44759
  }
44726
44760
  if (!accidentals.isEmpty) {
44727
44761
  this.accidentals = accidentals;
44728
- this.addGlyph(new SpacingGlyph(0, 0, 2 *
44729
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44762
+ if (!this.isEmpty) {
44763
+ this.addGlyph(new SpacingGlyph(0, 0, 2 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44764
+ }
44730
44765
  this.addGlyph(accidentals);
44731
- this.addGlyph(new SpacingGlyph(0, 0, 2 *
44732
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44766
+ this.addGlyph(new SpacingGlyph(0, 0, 2 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44733
44767
  }
44734
44768
  }
44735
44769
  super.doLayout();
@@ -45259,7 +45293,7 @@
45259
45293
  drawSlideOut(cx, cy, canvas) {
45260
45294
  let startNoteRenderer = this.renderer;
45261
45295
  let sizeX = 12;
45262
- let endOffsetX = 1;
45296
+ let offsetX = 2;
45263
45297
  let offsetY = 2;
45264
45298
  let startX = 0;
45265
45299
  let startY = 0;
@@ -45272,7 +45306,8 @@
45272
45306
  startX =
45273
45307
  cx +
45274
45308
  startNoteRenderer.x +
45275
- startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes);
45309
+ startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes) +
45310
+ offsetX;
45276
45311
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45277
45312
  if (this._startNote.slideTarget) {
45278
45313
  let endNoteRenderer = this.renderer.scoreRenderer.layout.getRendererForBar(this.renderer.staff.staveId, this._startNote.slideTarget.beat.voice.bar);
@@ -45285,7 +45320,7 @@
45285
45320
  cx +
45286
45321
  endNoteRenderer.x +
45287
45322
  endNoteRenderer.getBeatX(this._startNote.slideTarget.beat, BeatXPosition.PreNotes) -
45288
- endOffsetX;
45323
+ offsetX;
45289
45324
  endY = cy + endNoteRenderer.y + endNoteRenderer.getNoteY(this._startNote.slideTarget, NoteYPosition.Center);
45290
45325
  }
45291
45326
  if (this._startNote.slideTarget.realValue > this._startNote.realValue) {
@@ -45303,19 +45338,19 @@
45303
45338
  }
45304
45339
  break;
45305
45340
  case SlideOutType.OutUp:
45306
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
45341
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX;
45307
45342
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45308
45343
  endX = startX + sizeX;
45309
45344
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Top);
45310
45345
  break;
45311
45346
  case SlideOutType.OutDown:
45312
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
45347
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX;
45313
45348
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45314
45349
  endX = startX + sizeX;
45315
45350
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Bottom);
45316
45351
  break;
45317
45352
  case SlideOutType.PickSlideUp:
45318
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
45353
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX * 2;
45319
45354
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45320
45355
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Top);
45321
45356
  endX = cx + startNoteRenderer.x + startNoteRenderer.width;
@@ -45329,7 +45364,7 @@
45329
45364
  waves = true;
45330
45365
  break;
45331
45366
  case SlideOutType.PickSlideDown:
45332
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
45367
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX * 2;
45333
45368
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45334
45369
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Bottom);
45335
45370
  endX = cx + startNoteRenderer.x + startNoteRenderer.width;
@@ -46868,15 +46903,16 @@
46868
46903
  let startY = 0;
46869
46904
  let endX = 0;
46870
46905
  let endY = 0;
46906
+ const offsetX = 2;
46871
46907
  switch (this._inType) {
46872
46908
  case SlideInType.IntoFromBelow:
46873
- endX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Left);
46909
+ endX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Left) - offsetX;
46874
46910
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46875
46911
  startX = endX - sizeX;
46876
46912
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center) + sizeY;
46877
46913
  break;
46878
46914
  case SlideInType.IntoFromAbove:
46879
- endX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Left);
46915
+ endX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Left) - offsetX;
46880
46916
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46881
46917
  startX = endX - sizeX;
46882
46918
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center) - sizeY;
@@ -46895,14 +46931,15 @@
46895
46931
  let endX = 0;
46896
46932
  let endY = 0;
46897
46933
  let waves = false;
46898
- const endXOffset = 2;
46934
+ const offsetX = 2;
46899
46935
  switch (this._outType) {
46900
46936
  case SlideOutType.Shift:
46901
46937
  case SlideOutType.Legato:
46902
46938
  startX =
46903
46939
  cx +
46904
46940
  startNoteRenderer.x +
46905
- startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes);
46941
+ startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes)
46942
+ + offsetX;
46906
46943
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46907
46944
  if (this._startNote.slideTarget) {
46908
46945
  let endNoteRenderer = this.renderer.scoreRenderer.layout.getRendererForBar(this.renderer.staff.staveId, this._startNote.slideTarget.beat.voice.bar);
@@ -46915,7 +46952,7 @@
46915
46952
  cx +
46916
46953
  endNoteRenderer.x +
46917
46954
  endNoteRenderer.getBeatX(this._startNote.slideTarget.beat, BeatXPosition.OnNotes)
46918
- - endXOffset;
46955
+ - offsetX;
46919
46956
  endY =
46920
46957
  cy +
46921
46958
  endNoteRenderer.y +
@@ -46936,31 +46973,43 @@
46936
46973
  }
46937
46974
  break;
46938
46975
  case SlideOutType.OutUp:
46939
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
46976
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX;
46940
46977
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46941
- endX = startX + sizeX - endXOffset;
46978
+ endX = startX + sizeX;
46942
46979
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center) - sizeY;
46943
46980
  break;
46944
46981
  case SlideOutType.OutDown:
46945
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
46982
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX;
46946
46983
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46947
- endX = startX + sizeX - endXOffset;
46984
+ endX = startX + sizeX;
46948
46985
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center) + sizeY;
46949
46986
  break;
46950
46987
  case SlideOutType.PickSlideDown:
46951
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
46988
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX * 2;
46952
46989
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46953
- endX =
46954
- cx + startNoteRenderer.x + startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.EndBeat);
46990
+ endX = cx + startNoteRenderer.x + startNoteRenderer.width;
46955
46991
  endY = startY + sizeY * 3;
46992
+ if (this._startNote.beat.nextBeat &&
46993
+ this._startNote.beat.nextBeat.voice === this._startNote.beat.voice) {
46994
+ endX =
46995
+ cx +
46996
+ startNoteRenderer.x +
46997
+ startNoteRenderer.getBeatX(this._startNote.beat.nextBeat, BeatXPosition.PreNotes);
46998
+ }
46956
46999
  waves = true;
46957
47000
  break;
46958
47001
  case SlideOutType.PickSlideUp:
46959
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
47002
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX * 2;
46960
47003
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46961
- endX =
46962
- cx + startNoteRenderer.x + startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.EndBeat);
47004
+ endX = cx + startNoteRenderer.x + startNoteRenderer.width;
46963
47005
  endY = startY - sizeY * 3;
47006
+ if (this._startNote.beat.nextBeat &&
47007
+ this._startNote.beat.nextBeat.voice === this._startNote.beat.voice) {
47008
+ endX =
47009
+ cx +
47010
+ startNoteRenderer.x +
47011
+ startNoteRenderer.getBeatX(this._startNote.beat.nextBeat, BeatXPosition.PreNotes);
47012
+ }
46964
47013
  waves = true;
46965
47014
  break;
46966
47015
  default:
@@ -52078,8 +52127,8 @@
52078
52127
  // </auto-generated>
52079
52128
  class VersionInfo {
52080
52129
  }
52081
- VersionInfo.version = '1.4.0-alpha.1313';
52082
- VersionInfo.date = '2025-02-20T00:47:36.314Z';
52130
+ VersionInfo.version = '1.4.0-alpha.1322';
52131
+ VersionInfo.date = '2025-02-26T02:15:01.756Z';
52083
52132
 
52084
52133
  var index$4 = /*#__PURE__*/Object.freeze({
52085
52134
  __proto__: null,