@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.
@@ -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
  *
@@ -2137,6 +2137,7 @@ var PickStroke;
2137
2137
  var MusicFontSymbol;
2138
2138
  (function (MusicFontSymbol) {
2139
2139
  MusicFontSymbol[MusicFontSymbol["None"] = -1] = "None";
2140
+ MusicFontSymbol[MusicFontSymbol["Space"] = 32] = "Space";
2140
2141
  MusicFontSymbol[MusicFontSymbol["Brace"] = 57344] = "Brace";
2141
2142
  MusicFontSymbol[MusicFontSymbol["BracketTop"] = 57347] = "BracketTop";
2142
2143
  MusicFontSymbol[MusicFontSymbol["BracketBottom"] = 57348] = "BracketBottom";
@@ -2186,6 +2187,17 @@ var MusicFontSymbol;
2186
2187
  MusicFontSymbol[MusicFontSymbol["NoteheadSlashWhiteHalf"] = 57603] = "NoteheadSlashWhiteHalf";
2187
2188
  MusicFontSymbol[MusicFontSymbol["NoteQuarterUp"] = 57813] = "NoteQuarterUp";
2188
2189
  MusicFontSymbol[MusicFontSymbol["NoteEighthUp"] = 57815] = "NoteEighthUp";
2190
+ MusicFontSymbol[MusicFontSymbol["TextBlackNoteLongStem"] = 57841] = "TextBlackNoteLongStem";
2191
+ MusicFontSymbol[MusicFontSymbol["TextBlackNoteFrac8thLongStem"] = 57843] = "TextBlackNoteFrac8thLongStem";
2192
+ MusicFontSymbol[MusicFontSymbol["TextBlackNoteFrac16thLongStem"] = 57845] = "TextBlackNoteFrac16thLongStem";
2193
+ MusicFontSymbol[MusicFontSymbol["TextBlackNoteFrac32ndLongStem"] = 57846] = "TextBlackNoteFrac32ndLongStem";
2194
+ MusicFontSymbol[MusicFontSymbol["TextCont8thBeamLongStem"] = 57848] = "TextCont8thBeamLongStem";
2195
+ MusicFontSymbol[MusicFontSymbol["TextCont16thBeamLongStem"] = 57850] = "TextCont16thBeamLongStem";
2196
+ MusicFontSymbol[MusicFontSymbol["TextCont32ndBeamLongStem"] = 57851] = "TextCont32ndBeamLongStem";
2197
+ MusicFontSymbol[MusicFontSymbol["TextAugmentationDot"] = 57852] = "TextAugmentationDot";
2198
+ MusicFontSymbol[MusicFontSymbol["TextTupletBracketStartLongStem"] = 57857] = "TextTupletBracketStartLongStem";
2199
+ MusicFontSymbol[MusicFontSymbol["TextTuplet3LongStem"] = 57858] = "TextTuplet3LongStem";
2200
+ MusicFontSymbol[MusicFontSymbol["TextTupletBracketEndLongStem"] = 57859] = "TextTupletBracketEndLongStem";
2189
2201
  MusicFontSymbol[MusicFontSymbol["Tremolo3"] = 57890] = "Tremolo3";
2190
2202
  MusicFontSymbol[MusicFontSymbol["Tremolo2"] = 57889] = "Tremolo2";
2191
2203
  MusicFontSymbol[MusicFontSymbol["Tremolo1"] = 57888] = "Tremolo1";
@@ -23047,7 +23059,7 @@ class VorbisResidue0 {
23047
23059
  const idx = partWordCache[ch][entryIdx][dimensionIdx];
23048
23060
  if ((this._cascade[idx] & (1 << stage)) != 0) {
23049
23061
  const book = this._books[idx][stage];
23050
- if (book != null) {
23062
+ if (book) {
23051
23063
  if (this.writeVectors(book, packet, buffer, ch, offset, this._partitionSize)) {
23052
23064
  // bad packet... exit now and try to use what we already have
23053
23065
  partitionIdx = partitionCount;
@@ -24671,16 +24683,16 @@ class Envelope {
24671
24683
  // EG times need to be converted from timecents to seconds.
24672
24684
  // Pin very short EG segments. Timecents don't get to zero, and our EG is
24673
24685
  // happier with zero values.
24674
- this.delay = this.delay < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.delay);
24675
- this.attack = this.attack < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.attack);
24676
- this.release = this.release < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.release);
24686
+ this.delay = this.delay < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.delay);
24687
+ this.attack = this.attack < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.attack);
24688
+ this.release = this.release < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.release);
24677
24689
  // If we have dynamic hold or decay times depending on key number we need
24678
24690
  // to keep the values in timecents so we can calculate it during startNote
24679
24691
  if (this.keynumToHold === 0) {
24680
- this.hold = this.hold < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.hold);
24692
+ this.hold = this.hold < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.hold);
24681
24693
  }
24682
24694
  if (this.keynumToDecay === 0) {
24683
- this.decay = this.decay < -11950.0 ? 0.0 : SynthHelper.timecents2Secs(this.decay);
24695
+ this.decay = this.decay < -11950 ? 0.0 : SynthHelper.timecents2Secs(this.decay);
24684
24696
  }
24685
24697
  if (this.sustain < 0.0) {
24686
24698
  this.sustain = 0.0;
@@ -24869,19 +24881,19 @@ class Region {
24869
24881
  this.pitchKeyTrack = 100;
24870
24882
  this.pitchKeyCenter = -1;
24871
24883
  // SF2 defaults in timecents.
24872
- this.ampEnv.delay = -12000.0;
24873
- this.ampEnv.attack = -12000.0;
24874
- this.ampEnv.hold = -12000.0;
24875
- this.ampEnv.decay = -12000.0;
24876
- this.ampEnv.release = -12000.0;
24877
- this.modEnv.delay = -12000.0;
24878
- this.modEnv.attack = -12000.0;
24879
- this.modEnv.hold = -12000.0;
24880
- this.modEnv.decay = -12000.0;
24881
- this.modEnv.release = -12000.0;
24884
+ this.ampEnv.delay = -12e3;
24885
+ this.ampEnv.attack = -12e3;
24886
+ this.ampEnv.hold = -12e3;
24887
+ this.ampEnv.decay = -12e3;
24888
+ this.ampEnv.release = -12e3;
24889
+ this.modEnv.delay = -12e3;
24890
+ this.modEnv.attack = -12e3;
24891
+ this.modEnv.hold = -12e3;
24892
+ this.modEnv.decay = -12e3;
24893
+ this.modEnv.release = -12e3;
24882
24894
  this.initialFilterFc = 13500;
24883
- this.delayModLFO = -12000.0;
24884
- this.delayVibLFO = -12000.0;
24895
+ this.delayModLFO = -12e3;
24896
+ this.delayVibLFO = -12e3;
24885
24897
  }
24886
24898
  operator(genOper, amount) {
24887
24899
  switch (genOper) {
@@ -25125,7 +25137,7 @@ class VoiceEnvelope {
25125
25137
  }
25126
25138
  }
25127
25139
  else {
25128
- this.slope = -1.0 / this.samplesUntilNextSegment;
25140
+ this.slope = -1 / this.samplesUntilNextSegment;
25129
25141
  this.samplesUntilNextSegment =
25130
25142
  (this.parameters.decay * (1.0 - this.parameters.sustain) * outSampleRate) | 0;
25131
25143
  this.segmentIsExponential = false;
@@ -25173,12 +25185,12 @@ class VoiceEnvelope {
25173
25185
  if (this.parameters.keynumToHold > 0) {
25174
25186
  this.parameters.hold += this.parameters.keynumToHold * (60.0 - midiNoteNumber);
25175
25187
  this.parameters.hold =
25176
- this.parameters.hold < -10000.0 ? 0.0 : SynthHelper.timecents2Secs(this.parameters.hold);
25188
+ this.parameters.hold < -1e4 ? 0.0 : SynthHelper.timecents2Secs(this.parameters.hold);
25177
25189
  }
25178
25190
  if (this.parameters.keynumToDecay > 0) {
25179
25191
  this.parameters.decay += this.parameters.keynumToDecay * (60.0 - midiNoteNumber);
25180
25192
  this.parameters.decay =
25181
- this.parameters.decay < -10000.0 ? 0.0 : SynthHelper.timecents2Secs(this.parameters.decay);
25193
+ this.parameters.decay < -1e4 ? 0.0 : SynthHelper.timecents2Secs(this.parameters.decay);
25182
25194
  }
25183
25195
  this.midiVelocity = midiVelocity | 0;
25184
25196
  this.isAmpEnv = isAmpEnv;
@@ -25226,9 +25238,9 @@ class VoiceLfo {
25226
25238
  this.delta = -this.delta;
25227
25239
  this.level = 2.0 - this.level;
25228
25240
  }
25229
- else if (this.level < -1.0) {
25241
+ else if (this.level < -1) {
25230
25242
  this.delta = -this.delta;
25231
- this.level = -2.0 - this.level;
25243
+ this.level = -2 - this.level;
25232
25244
  }
25233
25245
  }
25234
25246
  }
@@ -26829,11 +26841,11 @@ class TinySoundFont {
26829
26841
  zoneRegion.modEnv.envToSecs(false);
26830
26842
  // LFO times need to be converted from timecents to seconds.
26831
26843
  zoneRegion.delayModLFO =
26832
- zoneRegion.delayModLFO < -11950.0
26844
+ zoneRegion.delayModLFO < -11950
26833
26845
  ? 0.0
26834
26846
  : SynthHelper.timecents2Secs(zoneRegion.delayModLFO);
26835
26847
  zoneRegion.delayVibLFO =
26836
- zoneRegion.delayVibLFO < -11950.0
26848
+ zoneRegion.delayVibLFO < -11950
26837
26849
  ? 0.0
26838
26850
  : SynthHelper.timecents2Secs(zoneRegion.delayVibLFO);
26839
26851
  // Pin values to their ranges.
@@ -27970,6 +27982,11 @@ class BarBounds {
27970
27982
  */
27971
27983
  class BeatBounds {
27972
27984
  constructor() {
27985
+ /**
27986
+ * Gets or sets x-position where the timely center of the notes for this beat is.
27987
+ * This is where the cursor should be at the time when this beat is played.
27988
+ */
27989
+ this.onNotesX = 0;
27973
27990
  /**
27974
27991
  * Gets or sets the individual note positions of this beat (if {@link CoreSettings.includeNoteBounds} was set to true).
27975
27992
  */
@@ -28223,6 +28240,7 @@ class BoundsLookup {
28223
28240
  let bb = {};
28224
28241
  bb.visualBounds = this.boundsToJson(beat.visualBounds);
28225
28242
  bb.realBounds = this.boundsToJson(beat.realBounds);
28243
+ bb.onNotesX = beat.onNotesX;
28226
28244
  let bbd = bb;
28227
28245
  bbd.beatIndex = beat.beat.index;
28228
28246
  bbd.voiceIndex = beat.beat.voice.index;
@@ -28277,6 +28295,7 @@ class BoundsLookup {
28277
28295
  let bb = new BeatBounds();
28278
28296
  bb.visualBounds = BoundsLookup.boundsFromJson(beat.visualBounds);
28279
28297
  bb.realBounds = BoundsLookup.boundsFromJson(beat.realBounds);
28298
+ bb.onNotesX = beat.onNotesX;
28280
28299
  let bd = beat;
28281
28300
  bb.beat =
28282
28301
  score.tracks[bd.trackIndex].staves[bd.staffIndex].bars[bd.barIndex].voices[bd.voiceIndex].beats[bd.beatIndex];
@@ -31849,39 +31868,31 @@ class BeatContainerGlyph extends Glyph {
31849
31868
  }
31850
31869
  registerLayoutingInfo(layoutings) {
31851
31870
  let preBeatStretch = this.preNotes.computedWidth + this.onNotes.centerX;
31852
- if (this.beat.graceGroup && !this.beat.graceGroup.isComplete) {
31853
- preBeatStretch += BeatContainerGlyph.GraceBeatPadding;
31854
- }
31855
31871
  let postBeatStretch = this.onNotes.computedWidth - this.onNotes.centerX;
31856
31872
  // make space for flag
31857
31873
  const helper = this.renderer.helpers.getBeamingHelperForBeat(this.beat);
31858
- if ((helper && this.drawBeamHelperAsFlags(helper)) || this.beat.graceType !== GraceType.None) {
31859
- postBeatStretch +=
31860
- FlagGlyph.FlagWidth *
31861
- (this.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1);
31874
+ if (this.beat.graceType !== GraceType.None) {
31875
+ // flagged grace
31876
+ if (this.beat.graceGroup.beats.length === 1) {
31877
+ postBeatStretch += FlagGlyph.FlagWidth * NoteHeadGlyph.GraceScale;
31878
+ }
31879
+ // grace with bars, some space for bar unless last
31880
+ else if (this.beat.graceIndex < this.beat.graceGroup.beats.length - 1) {
31881
+ postBeatStretch += 7;
31882
+ }
31883
+ else {
31884
+ postBeatStretch += BeatContainerGlyph.GraceBeatPadding;
31885
+ }
31886
+ }
31887
+ else if (helper && this.drawBeamHelperAsFlags(helper)) {
31888
+ postBeatStretch += FlagGlyph.FlagWidth;
31862
31889
  }
31863
31890
  for (const tie of this.ties) {
31864
31891
  postBeatStretch += tie.width;
31865
31892
  }
31866
- // Add some further spacing to grace notes
31867
- if (this.beat.graceType !== GraceType.None) {
31868
- postBeatStretch += BeatContainerGlyph.GraceBeatPadding;
31869
- }
31870
31893
  layoutings.addBeatSpring(this.beat, preBeatStretch, postBeatStretch);
31871
- // store sizes for special renderers like the EffectBarRenderer
31872
- layoutings.setPreBeatSize(this.beat, this.preNotes.computedWidth);
31873
- layoutings.setOnBeatSize(this.beat, this.onNotes.computedWidth);
31874
- layoutings.setBeatCenterX(this.beat, this.onNotes.centerX);
31875
31894
  }
31876
31895
  applyLayoutingInfo(info) {
31877
- let offset = info.getBeatCenterX(this.beat) - this.onNotes.centerX;
31878
- if (this.beat.graceGroup && !this.beat.graceGroup.isComplete) {
31879
- offset += BeatContainerGlyph.GraceBeatPadding;
31880
- }
31881
- this.preNotes.x = offset;
31882
- this.preNotes.width = info.getPreBeatSize(this.beat);
31883
- this.onNotes.width = info.getOnBeatSize(this.beat);
31884
- this.onNotes.x = this.preNotes.x + this.preNotes.width;
31885
31896
  this.onNotes.updateBeamingHelper();
31886
31897
  this.updateWidth();
31887
31898
  }
@@ -31943,11 +31954,6 @@ class BeatContainerGlyph extends Glyph {
31943
31954
  if (this.beat.voice.isEmpty) {
31944
31955
  return;
31945
31956
  }
31946
- let isEmptyGlyph = this.preNotes.isEmpty && this.onNotes.isEmpty && this.ties.length === 0;
31947
- if (isEmptyGlyph) {
31948
- return;
31949
- }
31950
- canvas.beginGroup(BeatContainerGlyph.getGroupId(this.beat));
31951
31957
  // var c = canvas.color;
31952
31958
  // var ta = canvas.textAlign;
31953
31959
  // canvas.color = new Color(255, 0, 0);
@@ -31966,21 +31972,25 @@ class BeatContainerGlyph extends Glyph {
31966
31972
  // canvas.font = new Font("Arial", 10);
31967
31973
  // canvas.color = new Color(0, 0, 0);
31968
31974
  // canvas.fillText(this.beat.voice.index + ":" + this.beat.index, cx + this.x, cy + this.y + 15 * this.beat.voice.index);
31975
+ // const c = canvas.color;
31969
31976
  // if (this.beat.voice.index === 0) {
31977
+ // canvas.color = new Color(0, 0, 200, 100);
31978
+ // canvas.strokeRect(cx + this.x, cy + this.y, this.width, 10);
31970
31979
  // canvas.color = new Color(200, 0, 0, 100);
31971
- // canvas.strokeRect(cx + this.x, cy + this.y + this.preNotes.y + 30, this.width, 10);
31980
+ // canvas.strokeRect(cx + this.x + this.preNotes.x, cy + this.y + 10, this.preNotes.width, 10);
31981
+ // canvas.color = new Color(0, 200, 0, 100);
31982
+ // canvas.strokeRect(cx + this.x + this.onNotes.x, cy + this.y + 10, this.onNotes.width, 10);
31983
+ // canvas.color = new Color(0, 200, 200, 100);
31984
+ // canvas.strokeRect(cx + this.x + this.onNotes.x + this.onNotes.centerX, cy, 1, this.renderer.height);
31972
31985
  // }
31986
+ // canvas.color = c;
31987
+ let isEmptyGlyph = this.preNotes.isEmpty && this.onNotes.isEmpty && this.ties.length === 0;
31988
+ if (isEmptyGlyph) {
31989
+ return;
31990
+ }
31991
+ canvas.beginGroup(BeatContainerGlyph.getGroupId(this.beat));
31973
31992
  this.preNotes.paint(cx + this.x, cy + this.y, canvas);
31974
- // if (this.beat.voice.index === 0) {
31975
- // canvas.color = new Color(200, 0, 0, 100);
31976
- // canvas.strokeRect(cx + this.x + this.preNotes.x, cy + this.y + this.preNotes.y, this.preNotes.width, 10);
31977
- // }
31978
31993
  this.onNotes.paint(cx + this.x, cy + this.y, canvas);
31979
- // if (this.beat.voice.index === 0) {
31980
- // canvas.color = new Color(0, 200, 0, 100);
31981
- // canvas.strokeRect(cx + this.x + this.onNotes.x, cy + this.y + this.onNotes.y - 10, this.onNotes.width, 10);
31982
- // }
31983
- // paint the ties relative to the whole staff,
31984
31994
  // reason: we have possibly multiple staves involved and need to calculate the correct positions.
31985
31995
  let staffX = cx - this.voiceContainer.x - this.renderer.x;
31986
31996
  let staffY = cy - this.voiceContainer.y - this.renderer.y;
@@ -31994,19 +32004,55 @@ class BeatContainerGlyph extends Glyph {
31994
32004
  buildBoundingsLookup(barBounds, cx, cy, isEmptyBar) {
31995
32005
  let beatBoundings = new BeatBounds();
31996
32006
  beatBoundings.beat = this.beat;
31997
- beatBoundings.visualBounds = new Bounds();
31998
- beatBoundings.visualBounds.x = cx + this.x + this.onNotes.x;
31999
- beatBoundings.visualBounds.y = barBounds.visualBounds.y;
32000
- beatBoundings.visualBounds.w = this.onNotes.width;
32001
- beatBoundings.visualBounds.h = barBounds.visualBounds.h;
32002
- beatBoundings.realBounds = new Bounds();
32003
- beatBoundings.realBounds.x = cx + this.x;
32004
- beatBoundings.realBounds.y = barBounds.realBounds.y;
32005
- beatBoundings.realBounds.w = this.width;
32006
- beatBoundings.realBounds.h = barBounds.realBounds.h;
32007
- if (isEmptyBar) {
32007
+ if (this.beat.isEmpty) {
32008
+ beatBoundings.visualBounds = new Bounds();
32008
32009
  beatBoundings.visualBounds.x = cx + this.x;
32009
- beatBoundings.realBounds.x = beatBoundings.visualBounds.x;
32010
+ beatBoundings.visualBounds.y = barBounds.visualBounds.y;
32011
+ beatBoundings.visualBounds.w = this.width;
32012
+ beatBoundings.visualBounds.h = barBounds.visualBounds.h;
32013
+ beatBoundings.realBounds = new Bounds();
32014
+ beatBoundings.realBounds.x = cx + this.x;
32015
+ beatBoundings.realBounds.y = barBounds.realBounds.y;
32016
+ beatBoundings.realBounds.w = this.width;
32017
+ beatBoundings.realBounds.h = barBounds.realBounds.h;
32018
+ beatBoundings.onNotesX = cx + this.x + this.onNotes.centerX;
32019
+ }
32020
+ else {
32021
+ beatBoundings.visualBounds = new Bounds();
32022
+ beatBoundings.visualBounds.x = cx + this.x;
32023
+ if (!this.preNotes.isEmpty) {
32024
+ beatBoundings.visualBounds.x = cx + this.x + this.preNotes.x;
32025
+ }
32026
+ else if (!this.onNotes.isEmpty) {
32027
+ beatBoundings.visualBounds.x = cx + this.x + this.onNotes.x;
32028
+ }
32029
+ else {
32030
+ beatBoundings.visualBounds.x = cx + this.x;
32031
+ }
32032
+ let visualEndX = 0;
32033
+ if (!this.onNotes.isEmpty) {
32034
+ visualEndX = cx + this.x + this.onNotes.x + this.onNotes.width;
32035
+ }
32036
+ else if (!this.preNotes.isEmpty) {
32037
+ visualEndX = cx + this.x + this.preNotes.x + this.preNotes.width;
32038
+ }
32039
+ else {
32040
+ visualEndX = cx + this.x + this.width;
32041
+ }
32042
+ beatBoundings.visualBounds.w = visualEndX - beatBoundings.visualBounds.x;
32043
+ const helper = this.renderer.helpers.getBeamingHelperForBeat(this.beat);
32044
+ if ((helper && this.drawBeamHelperAsFlags(helper)) || this.beat.graceType !== GraceType.None) {
32045
+ beatBoundings.visualBounds.w +=
32046
+ FlagGlyph.FlagWidth * (this.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1);
32047
+ }
32048
+ beatBoundings.visualBounds.y = barBounds.visualBounds.y;
32049
+ beatBoundings.visualBounds.h = barBounds.visualBounds.h;
32050
+ beatBoundings.realBounds = new Bounds();
32051
+ beatBoundings.realBounds.x = cx + this.x;
32052
+ beatBoundings.realBounds.y = barBounds.realBounds.y;
32053
+ beatBoundings.realBounds.w = this.width;
32054
+ beatBoundings.realBounds.h = barBounds.realBounds.h;
32055
+ beatBoundings.onNotesX = cx + this.x + this.onNotes.x + this.onNotes.centerX;
32010
32056
  }
32011
32057
  barBounds.addBeat(beatBoundings);
32012
32058
  if (this.renderer.settings.core.includeNoteBounds) {
@@ -32910,7 +32956,7 @@ class AlphaTabApiBase {
32910
32956
  if (this.settings.player.enableAnimatedBeatCursor) {
32911
32957
  beatCursor.stopAnimation();
32912
32958
  }
32913
- beatCursor.setBounds(beatBoundings.visualBounds.x, barBounds.y, 1, barBounds.h);
32959
+ beatCursor.setBounds(beatBoundings.onNotesX, barBounds.y, 1, barBounds.h);
32914
32960
  }
32915
32961
  // if playing, animate the cursor to the next beat
32916
32962
  if (this.settings.player.enableElementHighlighting) {
@@ -32934,7 +32980,7 @@ class AlphaTabApiBase {
32934
32980
  let nextBeatBoundings = cache.findBeat(nextBeat);
32935
32981
  if (nextBeatBoundings &&
32936
32982
  nextBeatBoundings.barBounds.masterBarBounds.staffSystemBounds === barBoundings.staffSystemBounds) {
32937
- nextBeatX = nextBeatBoundings.visualBounds.x;
32983
+ nextBeatX = nextBeatBoundings.onNotesX;
32938
32984
  }
32939
32985
  }
32940
32986
  // we need to put the transition to an own animation frame
@@ -36187,7 +36233,6 @@ class VoiceContainerGlyph extends GlyphGroup {
36187
36233
  }
36188
36234
  }
36189
36235
  registerLayoutingInfo(info) {
36190
- info.updateVoiceSize(this.width);
36191
36236
  let beatGlyphs = this.beatGlyphs;
36192
36237
  for (let b of beatGlyphs) {
36193
36238
  b.registerLayoutingInfo(info);
@@ -36231,8 +36276,8 @@ VoiceContainerGlyph.KeySizeBeat = 'Beat';
36231
36276
 
36232
36277
  class BeatLines {
36233
36278
  constructor() {
36234
- this.maxLine = -1000;
36235
- this.minLine = -1000;
36279
+ this.maxLine = -1e3;
36280
+ this.minLine = -1e3;
36236
36281
  }
36237
36282
  }
36238
36283
  /**
@@ -36259,11 +36304,11 @@ class AccidentalHelper {
36259
36304
  /**
36260
36305
  * The line of the highest note added to this helper.
36261
36306
  */
36262
- this.maxLine = -1000;
36307
+ this.maxLine = -1e3;
36263
36308
  /**
36264
36309
  * The line of the lowest note added to this helper.
36265
36310
  */
36266
- this.minLine = -1000;
36311
+ this.minLine = -1e3;
36267
36312
  this._barRenderer = barRenderer;
36268
36313
  this._bar = barRenderer.bar;
36269
36314
  }
@@ -36469,11 +36514,11 @@ class AccidentalHelper {
36469
36514
  else {
36470
36515
  this._appliedScoreLinesByValue.set(noteValue, line);
36471
36516
  }
36472
- if (this.minLine === -1000 || this.minLine < line) {
36517
+ if (this.minLine === -1e3 || this.minLine < line) {
36473
36518
  this.minLine = line;
36474
36519
  this.minLineBeat = relatedBeat;
36475
36520
  }
36476
- if (this.maxLine === -1000 || this.maxLine > line) {
36521
+ if (this.maxLine === -1e3 || this.maxLine > line) {
36477
36522
  this.maxLine = line;
36478
36523
  this.maxLineBeat = relatedBeat;
36479
36524
  }
@@ -36491,10 +36536,10 @@ class AccidentalHelper {
36491
36536
  lines = new BeatLines();
36492
36537
  this._beatLines.set(relatedBeat.id, lines);
36493
36538
  }
36494
- if (lines.minLine === -1000 || line < lines.minLine) {
36539
+ if (lines.minLine === -1e3 || line < lines.minLine) {
36495
36540
  lines.minLine = line;
36496
36541
  }
36497
- if (lines.minLine === -1000 || line > lines.maxLine) {
36542
+ if (lines.minLine === -1e3 || line > lines.maxLine) {
36498
36543
  lines.maxLine = line;
36499
36544
  }
36500
36545
  }
@@ -37017,14 +37062,14 @@ class ReservedLayoutAreaSlot {
37017
37062
  }
37018
37063
  class ReservedLayoutArea {
37019
37064
  constructor(beat) {
37020
- this.topY = -1000;
37021
- this.bottomY = -1000;
37065
+ this.topY = -1e3;
37066
+ this.bottomY = -1e3;
37022
37067
  this.slots = [];
37023
37068
  this.beat = beat;
37024
37069
  }
37025
37070
  addSlot(topY, bottomY) {
37026
37071
  this.slots.push(new ReservedLayoutAreaSlot(topY, bottomY));
37027
- if (this.topY === -1000) {
37072
+ if (this.topY === -1e3) {
37028
37073
  this.topY = topY;
37029
37074
  this.bottomY = bottomY;
37030
37075
  }
@@ -37046,10 +37091,10 @@ class BarCollisionHelper {
37046
37091
  this.restDurationsByDisplayTime = new Map();
37047
37092
  }
37048
37093
  getBeatMinMaxY() {
37049
- let minY = -1000;
37050
- let maxY = -1000;
37094
+ let minY = -1e3;
37095
+ let maxY = -1e3;
37051
37096
  for (const v of this.reservedLayoutAreasByDisplayTime.values()) {
37052
- if (minY === -1000) {
37097
+ if (minY === -1e3) {
37053
37098
  minY = v.topY;
37054
37099
  maxY = v.bottomY;
37055
37100
  }
@@ -37062,7 +37107,7 @@ class BarCollisionHelper {
37062
37107
  }
37063
37108
  }
37064
37109
  }
37065
- if (minY === -1000) {
37110
+ if (minY === -1e3) {
37066
37111
  return [0, 0];
37067
37112
  }
37068
37113
  return [minY, maxY];
@@ -37727,12 +37772,8 @@ class BarLayoutingInfo {
37727
37772
  * an internal version number that increments whenever a change was made.
37728
37773
  */
37729
37774
  this.version = 0;
37730
- this.preBeatSizes = new Map();
37731
- this.onBeatSizes = new Map();
37732
- this.onBeatCenterX = new Map();
37733
37775
  this.preBeatSize = 0;
37734
37776
  this.postBeatSize = 0;
37735
- this.voiceSize = 0;
37736
37777
  this.minStretchForce = 0;
37737
37778
  this.totalSpringConstant = 0;
37738
37779
  this.incompleteGraceRods = new Map();
@@ -37740,51 +37781,37 @@ class BarLayoutingInfo {
37740
37781
  this.springs = new Map();
37741
37782
  this.height = 0;
37742
37783
  }
37743
- updateVoiceSize(size) {
37744
- if (size > this.voiceSize) {
37745
- this.voiceSize = size;
37746
- this.version++;
37747
- }
37748
- }
37749
- setPreBeatSize(beat, size) {
37750
- if (!this.preBeatSizes.has(beat.id) || this.preBeatSizes.get(beat.id) < size) {
37751
- this.preBeatSizes.set(beat.id, size);
37752
- this.version++;
37784
+ updateMinStretchForce(force) {
37785
+ if (this.minStretchForce < force) {
37786
+ this.minStretchForce = force;
37753
37787
  }
37754
37788
  }
37755
37789
  getPreBeatSize(beat) {
37756
- if (this.preBeatSizes.has(beat.id)) {
37757
- return this.preBeatSizes.get(beat.id);
37758
- }
37759
- return 0;
37760
- }
37761
- setOnBeatSize(beat, size) {
37762
- if (!this.onBeatSizes.has(beat.id) || this.onBeatSizes.get(beat.id) < size) {
37763
- this.onBeatSizes.set(beat.id, size);
37764
- this.version++;
37765
- }
37766
- }
37767
- getOnBeatSize(beat) {
37768
- if (this.onBeatSizes.has(beat.id)) {
37769
- return this.onBeatSizes.get(beat.id);
37790
+ if (beat.graceType !== GraceType.None) {
37791
+ const groupId = beat.graceGroup.id;
37792
+ const graceRod = this.allGraceRods.get(groupId)[beat.graceIndex];
37793
+ return graceRod.preBeatWidth;
37770
37794
  }
37771
- return 0;
37772
- }
37773
- getBeatCenterX(beat) {
37774
- if (this.onBeatCenterX.has(beat.id)) {
37775
- return this.onBeatCenterX.get(beat.id);
37795
+ else {
37796
+ const start = beat.absoluteDisplayStart;
37797
+ if (!this.springs.has(start)) {
37798
+ return 0;
37799
+ }
37800
+ return this.springs.get(start).preBeatWidth;
37776
37801
  }
37777
- return 0;
37778
37802
  }
37779
- setBeatCenterX(beat, x) {
37780
- if (!this.onBeatCenterX.has(beat.id) || this.onBeatCenterX.get(beat.id) < x) {
37781
- this.onBeatCenterX.set(beat.id, x);
37782
- this.version++;
37803
+ getPostBeatSize(beat) {
37804
+ if (beat.graceType !== GraceType.None) {
37805
+ const groupId = beat.graceGroup.id;
37806
+ const graceRod = this.allGraceRods.get(groupId)[beat.graceIndex];
37807
+ return graceRod.postSpringWidth;
37783
37808
  }
37784
- }
37785
- updateMinStretchForce(force) {
37786
- if (this.minStretchForce < force) {
37787
- this.minStretchForce = force;
37809
+ else {
37810
+ const start = beat.absoluteDisplayStart;
37811
+ if (!this.springs.has(start)) {
37812
+ return 0;
37813
+ }
37814
+ return this.springs.get(start).postSpringWidth;
37788
37815
  }
37789
37816
  }
37790
37817
  addSpring(start, duration, graceBeatWidth, preBeatWidth, postSpringSize) {
@@ -37842,7 +37869,7 @@ class BarLayoutingInfo {
37842
37869
  let start = beat.absoluteDisplayStart;
37843
37870
  if (beat.graceType !== GraceType.None) {
37844
37871
  // For grace beats we just remember the the sizes required for them
37845
- // these sizes are then considered when the target beat is added.
37872
+ // these sizes are then considered when the target beat is added.
37846
37873
  const groupId = beat.graceGroup.id;
37847
37874
  if (!this.allGraceRods.has(groupId)) {
37848
37875
  this.allGraceRods.set(groupId, new Array(beat.graceGroup.beats.length));
@@ -37881,23 +37908,15 @@ class BarLayoutingInfo {
37881
37908
  }
37882
37909
  }
37883
37910
  finish() {
37884
- for (const [k, s] of this.allGraceRods) {
37885
- let offset = 0;
37886
- if (this.incompleteGraceRods.has(k)) {
37887
- for (const sp of s) {
37888
- offset += sp.preBeatWidth;
37889
- sp.graceBeatWidth = offset;
37890
- offset += sp.postSpringWidth;
37891
- }
37892
- }
37893
- else {
37894
- for (let i = s.length - 1; i >= 0; i--) {
37895
- // for grace beats we store the offset
37896
- // in the 'graceBeatWidth' for later use during applying
37897
- // beat positions
37898
- s[i].graceBeatWidth = offset;
37899
- offset -= (s[i].preBeatWidth + s[i].postSpringWidth);
37900
- }
37911
+ for (const [_, s] of this.allGraceRods) {
37912
+ // for grace beats we store the offset
37913
+ // in the 'graceBeatWidth' for later use during applying
37914
+ // beat positions
37915
+ let x = 0;
37916
+ for (const sp of s) {
37917
+ x += sp.preBeatWidth;
37918
+ sp.graceBeatWidth = x;
37919
+ x += sp.postSpringWidth;
37901
37920
  }
37902
37921
  }
37903
37922
  this._incompleteGraceRodsWidth = 0;
@@ -37953,7 +37972,7 @@ class BarLayoutingInfo {
37953
37972
  let nextSpring = sortedSprings[i + 1];
37954
37973
  requiredSpace = currentSpring.postSpringWidth + nextSpring.preSpringWidth;
37955
37974
  }
37956
- // for the first spring we need to ensure we take the initial
37975
+ // for the first spring we need to ensure we take the initial
37957
37976
  // pre-spring width into account
37958
37977
  if (i === 0) {
37959
37978
  requiredSpace += currentSpring.preSpringWidth;
@@ -38643,12 +38662,12 @@ class StaffSystem {
38643
38662
  let x = this.x + _firstStaffInBrackets.x;
38644
38663
  let staffSystemBounds = new StaffSystemBounds();
38645
38664
  staffSystemBounds.visualBounds = new Bounds();
38646
- staffSystemBounds.visualBounds.x = cx;
38665
+ staffSystemBounds.visualBounds.x = cx + this.x;
38647
38666
  staffSystemBounds.visualBounds.y = cy + this.y;
38648
38667
  staffSystemBounds.visualBounds.w = this.width;
38649
38668
  staffSystemBounds.visualBounds.h = this.height - this.topPadding - this.bottomPadding;
38650
38669
  staffSystemBounds.realBounds = new Bounds();
38651
- staffSystemBounds.realBounds.x = cx;
38670
+ staffSystemBounds.realBounds.x = cx + this.x;
38652
38671
  staffSystemBounds.realBounds.y = cy + this.y;
38653
38672
  staffSystemBounds.realBounds.w = this.width;
38654
38673
  staffSystemBounds.realBounds.h = this.height;
@@ -39693,29 +39712,28 @@ class EffectBand extends Glyph {
39693
39712
  }
39694
39713
  alignGlyph(sizing, beat) {
39695
39714
  let g = this._effectGlyphs[beat.voice.index].get(beat.index);
39696
- let pos;
39697
39715
  let container = this.renderer.getBeatContainer(beat);
39716
+ // container is aligned with the "onTimeX" position of the beat in effect renders
39698
39717
  switch (sizing) {
39699
39718
  case EffectBarGlyphSizing.SinglePreBeat:
39700
- pos = container.preNotes;
39701
- g.x = this.renderer.beatGlyphsStart + pos.x + container.x;
39702
- g.width = pos.width;
39719
+ // shift to the start using the biggest pre-beat size of the respective beat
39720
+ const offsetToBegin = this.renderer.layoutingInfo.getPreBeatSize(beat);
39721
+ g.x = this.renderer.beatGlyphsStart + container.x - offsetToBegin;
39703
39722
  break;
39704
39723
  case EffectBarGlyphSizing.SingleOnBeat:
39705
39724
  case EffectBarGlyphSizing.GroupedOnBeat:
39706
- pos = container.onNotes;
39707
- g.x = this.renderer.beatGlyphsStart + pos.x + container.x;
39708
- g.width = pos.width;
39725
+ g.x = this.renderer.beatGlyphsStart + container.x;
39709
39726
  break;
39710
39727
  case EffectBarGlyphSizing.SingleOnBeatToEnd:
39711
39728
  case EffectBarGlyphSizing.GroupedOnBeatToEnd:
39712
- pos = container.onNotes;
39713
- g.x = this.renderer.beatGlyphsStart + pos.x + container.x;
39729
+ g.x = this.renderer.beatGlyphsStart + container.x;
39714
39730
  if (container.beat.isLastOfVoice) {
39715
39731
  g.width = this.renderer.width - g.x;
39716
39732
  }
39717
39733
  else {
39718
- g.width = container.width - container.preNotes.width - container.preNotes.x;
39734
+ // shift to the start using the biggest post-beat size of the respective beat
39735
+ const offsetToEnd = this.renderer.layoutingInfo.getPostBeatSize(beat);
39736
+ g.width = offsetToEnd;
39719
39737
  }
39720
39738
  break;
39721
39739
  case EffectBarGlyphSizing.FullBar:
@@ -41229,116 +41247,134 @@ class TripletFeelGlyph extends EffectGlyph {
41229
41247
  cx += this.x;
41230
41248
  cy += this.y;
41231
41249
  let noteY = cy + this.height * NoteHeadGlyph.GraceScale;
41250
+ let tupletY = noteY + 8;
41232
41251
  canvas.font = this.renderer.resources.effectFont;
41233
41252
  canvas.fillText('(', cx, cy + this.height * 0.3);
41234
41253
  let leftNoteX = cx + 10;
41235
41254
  let rightNoteX = cx + 40;
41255
+ let leftNoteSymbols = [];
41256
+ let rightAugmentationSymbols = [];
41257
+ let rightNoteSymbols = [];
41258
+ let rightTupletSymbols = [];
41236
41259
  switch (this._tripletFeel) {
41237
41260
  case TripletFeel.NoTripletFeel:
41238
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41239
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41261
+ leftNoteSymbols = [
41262
+ MusicFontSymbol.TextBlackNoteLongStem,
41263
+ MusicFontSymbol.TextCont8thBeamLongStem,
41264
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41265
+ ];
41266
+ rightNoteSymbols = [
41267
+ MusicFontSymbol.TextBlackNoteLongStem,
41268
+ MusicFontSymbol.TextCont8thBeamLongStem,
41269
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41270
+ ];
41240
41271
  break;
41241
41272
  case TripletFeel.Triplet8th:
41242
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41243
- canvas.fillMusicFontSymbol(rightNoteX, noteY, TripletFeelGlyph.NoteScale, MusicFontSymbol.NoteQuarterUp, false);
41244
- canvas.fillMusicFontSymbol(rightNoteX + TripletFeelGlyph.NoteSeparation, noteY, TripletFeelGlyph.NoteScale, MusicFontSymbol.NoteEighthUp, false);
41245
- this.renderTriplet(rightNoteX, cy, canvas);
41273
+ leftNoteSymbols = [
41274
+ MusicFontSymbol.TextBlackNoteLongStem,
41275
+ MusicFontSymbol.TextCont8thBeamLongStem,
41276
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41277
+ ];
41278
+ rightNoteSymbols = [
41279
+ MusicFontSymbol.TextBlackNoteLongStem,
41280
+ MusicFontSymbol.Space,
41281
+ MusicFontSymbol.NoteEighthUp
41282
+ ];
41283
+ rightTupletSymbols = [
41284
+ MusicFontSymbol.TextTupletBracketStartLongStem,
41285
+ MusicFontSymbol.TextTuplet3LongStem,
41286
+ MusicFontSymbol.TextTupletBracketEndLongStem
41287
+ ];
41246
41288
  break;
41247
41289
  case TripletFeel.Triplet16th:
41248
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41249
- TripletFeelGlyphBarType.Full,
41250
- TripletFeelGlyphBarType.Full
41251
- ]);
41252
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41253
- TripletFeelGlyphBarType.Full,
41254
- TripletFeelGlyphBarType.PartialRight
41255
- ]);
41256
- this.renderTriplet(rightNoteX, cy, canvas);
41290
+ leftNoteSymbols = [
41291
+ MusicFontSymbol.TextBlackNoteLongStem,
41292
+ MusicFontSymbol.TextCont8thBeamLongStem,
41293
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41294
+ ];
41295
+ rightNoteSymbols = [
41296
+ MusicFontSymbol.TextBlackNoteLongStem,
41297
+ MusicFontSymbol.TextCont8thBeamLongStem,
41298
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem
41299
+ ];
41300
+ rightTupletSymbols = [
41301
+ MusicFontSymbol.TextTupletBracketStartLongStem,
41302
+ MusicFontSymbol.TextTuplet3LongStem,
41303
+ MusicFontSymbol.TextTupletBracketEndLongStem
41304
+ ];
41257
41305
  break;
41258
41306
  case TripletFeel.Dotted8th:
41259
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41260
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41261
- TripletFeelGlyphBarType.Full,
41262
- TripletFeelGlyphBarType.PartialRight
41263
- ]);
41264
- canvas.fillCircle(rightNoteX + 9, noteY, 1);
41307
+ leftNoteSymbols = [
41308
+ MusicFontSymbol.TextBlackNoteLongStem,
41309
+ MusicFontSymbol.TextCont8thBeamLongStem,
41310
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41311
+ ];
41312
+ rightAugmentationSymbols = [
41313
+ MusicFontSymbol.TextAugmentationDot,
41314
+ ];
41315
+ rightNoteSymbols = [
41316
+ MusicFontSymbol.TextBlackNoteLongStem,
41317
+ MusicFontSymbol.TextCont8thBeamLongStem,
41318
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem
41319
+ ];
41265
41320
  break;
41266
41321
  case TripletFeel.Dotted16th:
41267
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41268
- TripletFeelGlyphBarType.Full,
41269
- TripletFeelGlyphBarType.Full
41270
- ]);
41271
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41272
- TripletFeelGlyphBarType.Full,
41273
- TripletFeelGlyphBarType.Full,
41274
- TripletFeelGlyphBarType.PartialRight
41275
- ]);
41322
+ leftNoteSymbols = [
41323
+ MusicFontSymbol.TextBlackNoteLongStem,
41324
+ MusicFontSymbol.TextCont16thBeamLongStem,
41325
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem
41326
+ ];
41327
+ rightAugmentationSymbols = [
41328
+ MusicFontSymbol.TextAugmentationDot,
41329
+ ];
41330
+ rightNoteSymbols = [
41331
+ MusicFontSymbol.TextBlackNoteLongStem,
41332
+ MusicFontSymbol.TextCont16thBeamLongStem,
41333
+ MusicFontSymbol.TextBlackNoteFrac32ndLongStem
41334
+ ];
41276
41335
  canvas.fillCircle(rightNoteX + 9, noteY, 1);
41277
41336
  break;
41278
41337
  case TripletFeel.Scottish8th:
41279
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [TripletFeelGlyphBarType.Full]);
41280
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41281
- TripletFeelGlyphBarType.Full,
41282
- TripletFeelGlyphBarType.PartialLeft
41283
- ]);
41284
- canvas.fillCircle(rightNoteX + TripletFeelGlyph.NoteSeparation + 8, noteY, 1);
41338
+ leftNoteSymbols = [
41339
+ MusicFontSymbol.TextBlackNoteLongStem,
41340
+ MusicFontSymbol.TextCont8thBeamLongStem,
41341
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem
41342
+ ];
41343
+ rightNoteSymbols = [
41344
+ MusicFontSymbol.TextBlackNoteLongStem,
41345
+ MusicFontSymbol.TextCont16thBeamLongStem,
41346
+ MusicFontSymbol.TextBlackNoteFrac8thLongStem,
41347
+ MusicFontSymbol.TextAugmentationDot,
41348
+ ];
41285
41349
  break;
41286
41350
  case TripletFeel.Scottish16th:
41287
- this.renderBarNote(leftNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41288
- TripletFeelGlyphBarType.Full,
41289
- TripletFeelGlyphBarType.Full
41290
- ]);
41291
- this.renderBarNote(rightNoteX, noteY, TripletFeelGlyph.NoteScale, canvas, [
41292
- TripletFeelGlyphBarType.Full,
41293
- TripletFeelGlyphBarType.Full,
41294
- TripletFeelGlyphBarType.PartialLeft
41295
- ]);
41296
- canvas.fillCircle(rightNoteX + TripletFeelGlyph.NoteSeparation + 8, noteY, 1);
41297
- break;
41298
- }
41299
- canvas.fillText('=', cx + 30, cy + 5);
41300
- canvas.fillText(')', cx + 65, cy + this.height * 0.3);
41301
- }
41302
- renderBarNote(cx, noteY, noteScale, canvas, bars) {
41303
- canvas.fillMusicFontSymbol(cx, noteY, noteScale, MusicFontSymbol.NoteQuarterUp, false);
41304
- let partialBarWidth = (TripletFeelGlyph.NoteSeparation / 2);
41305
- for (let i = 0; i < bars.length; i++) {
41306
- switch (bars[i]) {
41307
- case TripletFeelGlyphBarType.Full:
41308
- canvas.fillRect(cx + 4, noteY - TripletFeelGlyph.NoteHeight + TripletFeelGlyph.BarSeparation * i, TripletFeelGlyph.NoteSeparation, TripletFeelGlyph.BarHeight);
41309
- break;
41310
- case TripletFeelGlyphBarType.PartialLeft:
41311
- canvas.fillRect(cx + 4, noteY - TripletFeelGlyph.NoteHeight + TripletFeelGlyph.BarSeparation * i, partialBarWidth, TripletFeelGlyph.BarHeight);
41312
- break;
41313
- case TripletFeelGlyphBarType.PartialRight:
41314
- canvas.fillRect(cx + 4 + partialBarWidth, noteY - TripletFeelGlyph.NoteHeight + TripletFeelGlyph.BarSeparation * i, partialBarWidth, TripletFeelGlyph.BarHeight);
41315
- break;
41316
- }
41351
+ leftNoteSymbols = [
41352
+ MusicFontSymbol.TextBlackNoteLongStem,
41353
+ MusicFontSymbol.TextCont16thBeamLongStem,
41354
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem
41355
+ ];
41356
+ rightNoteSymbols = [
41357
+ MusicFontSymbol.TextBlackNoteLongStem,
41358
+ MusicFontSymbol.TextCont32ndBeamLongStem,
41359
+ MusicFontSymbol.TextBlackNoteFrac16thLongStem,
41360
+ MusicFontSymbol.TextAugmentationDot,
41361
+ ];
41362
+ break;
41317
41363
  }
41318
- canvas.fillMusicFontSymbol(cx + TripletFeelGlyph.NoteSeparation, noteY, noteScale, MusicFontSymbol.NoteQuarterUp, false);
41319
- }
41320
- renderTriplet(cx, cy, canvas) {
41321
- cy += 2;
41322
- let font = this.renderer.resources.effectFont;
41323
- canvas.font = Font.withFamilyList(font.families, font.size * 0.8, font.style);
41324
- let rightX = cx + TripletFeelGlyph.NoteSeparation + 3;
41325
- canvas.beginPath();
41326
- canvas.moveTo(cx, cy + 3);
41327
- canvas.lineTo(cx, cy);
41328
- canvas.lineTo(cx + 5, cy);
41329
- canvas.moveTo(rightX + 5, cy + 3);
41330
- canvas.lineTo(rightX + 5, cy);
41331
- canvas.lineTo(rightX, cy);
41332
- canvas.stroke();
41333
- canvas.fillText('3', cx + 7, cy - 10);
41334
- canvas.font = font;
41364
+ canvas.fillMusicFontSymbols(leftNoteX, noteY, TripletFeelGlyph.NoteScale, leftNoteSymbols, false);
41365
+ canvas.fillText('=', cx + 32, cy + 5);
41366
+ canvas.fillMusicFontSymbols(rightNoteX, noteY, TripletFeelGlyph.NoteScale, rightNoteSymbols, false);
41367
+ if (rightAugmentationSymbols.length > 0) {
41368
+ canvas.fillMusicFontSymbols(rightNoteX + 7, noteY, TripletFeelGlyph.NoteScale, rightAugmentationSymbols, false);
41369
+ }
41370
+ if (rightTupletSymbols.length > 0) {
41371
+ canvas.fillMusicFontSymbols(rightNoteX, tupletY, TripletFeelGlyph.TupletScale, rightTupletSymbols, false);
41372
+ }
41373
+ canvas.fillText(')', cx + 65, cy + this.height * 0.3);
41335
41374
  }
41336
41375
  }
41337
- TripletFeelGlyph.NoteScale = 0.4;
41338
- TripletFeelGlyph.NoteHeight = 12;
41339
- TripletFeelGlyph.NoteSeparation = 12;
41340
- TripletFeelGlyph.BarHeight = 2;
41341
- TripletFeelGlyph.BarSeparation = 3;
41376
+ TripletFeelGlyph.NoteScale = 0.5;
41377
+ TripletFeelGlyph.TupletScale = 0.7;
41342
41378
 
41343
41379
  class TripletFeelEffectInfo extends EffectBarRendererInfo {
41344
41380
  get notationElement() {
@@ -42977,7 +43013,7 @@ class ScoreRestGlyph extends MusicFontGlyph {
42977
43013
  class AccidentalColumnInfo {
42978
43014
  constructor() {
42979
43015
  this.x = 0;
42980
- this.y = -3000;
43016
+ this.y = -3e3;
42981
43017
  this.width = 0;
42982
43018
  }
42983
43019
  }
@@ -44289,7 +44325,7 @@ SlashNoteHeadGlyph.WholeNoteHeadWidth = 32;
44289
44325
  class ScoreBeatGlyph extends BeatOnNoteGlyphBase {
44290
44326
  constructor() {
44291
44327
  super(...arguments);
44292
- this._collisionOffset = -1000;
44328
+ this._collisionOffset = -1e3;
44293
44329
  this._skipPaint = false;
44294
44330
  this.slash = null;
44295
44331
  this.noteHeads = null;
@@ -44312,7 +44348,7 @@ class ScoreBeatGlyph extends BeatOnNoteGlyphBase {
44312
44348
  }
44313
44349
  else if (this.restGlyph) {
44314
44350
  this.restGlyph.updateBeamingHelper(this.container.x + this.x);
44315
- if (this.renderer.bar.isMultiVoice && this._collisionOffset === -1000) {
44351
+ if (this.renderer.bar.isMultiVoice && this._collisionOffset === -1e3) {
44316
44352
  this._collisionOffset = this.renderer.helpers.collisionHelper.applyRestCollisionOffset(this.container.beat, this.restGlyph.y, this.renderer.getScoreHeight(1));
44317
44353
  this.y += this._collisionOffset;
44318
44354
  const existingRests = this.renderer.helpers.collisionHelper.restDurationsByDisplayTime;
@@ -44698,32 +44734,30 @@ class ScoreBeatPreNotesGlyph extends BeatGlyphBase {
44698
44734
  }
44699
44735
  if (!preBends.isEmpty) {
44700
44736
  this.addGlyph(preBends);
44701
- this.addGlyph(new SpacingGlyph(0, 0, 4 *
44702
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44737
+ this.addGlyph(new SpacingGlyph(0, 0, 4 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44703
44738
  }
44704
44739
  if (this.container.beat.brushType !== BrushType.None) {
44705
44740
  this.addGlyph(new ScoreBrushGlyph(this.container.beat));
44706
44741
  this.addGlyph(new SpacingGlyph(0, 0, 4));
44707
44742
  }
44708
44743
  if (!fingering.isEmpty) {
44709
- this.addGlyph(new SpacingGlyph(0, 0, 2 *
44710
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44744
+ if (!this.isEmpty) {
44745
+ this.addGlyph(new SpacingGlyph(0, 0, 2 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44746
+ }
44711
44747
  this.addGlyph(fingering);
44712
- this.addGlyph(new SpacingGlyph(0, 0, 2 *
44713
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44748
+ this.addGlyph(new SpacingGlyph(0, 0, 2 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44714
44749
  }
44715
44750
  if (!ghost.isEmpty) {
44716
44751
  this.addGlyph(ghost);
44717
- this.addGlyph(new SpacingGlyph(0, 0, 4 *
44718
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44752
+ this.addGlyph(new SpacingGlyph(0, 0, 4 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44719
44753
  }
44720
44754
  if (!accidentals.isEmpty) {
44721
44755
  this.accidentals = accidentals;
44722
- this.addGlyph(new SpacingGlyph(0, 0, 2 *
44723
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44756
+ if (!this.isEmpty) {
44757
+ this.addGlyph(new SpacingGlyph(0, 0, 2 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44758
+ }
44724
44759
  this.addGlyph(accidentals);
44725
- this.addGlyph(new SpacingGlyph(0, 0, 2 *
44726
- (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44760
+ this.addGlyph(new SpacingGlyph(0, 0, 2 * (this.container.beat.graceType !== GraceType.None ? NoteHeadGlyph.GraceScale : 1)));
44727
44761
  }
44728
44762
  }
44729
44763
  super.doLayout();
@@ -45253,7 +45287,7 @@ class ScoreSlideLineGlyph extends Glyph {
45253
45287
  drawSlideOut(cx, cy, canvas) {
45254
45288
  let startNoteRenderer = this.renderer;
45255
45289
  let sizeX = 12;
45256
- let endOffsetX = 1;
45290
+ let offsetX = 2;
45257
45291
  let offsetY = 2;
45258
45292
  let startX = 0;
45259
45293
  let startY = 0;
@@ -45266,7 +45300,8 @@ class ScoreSlideLineGlyph extends Glyph {
45266
45300
  startX =
45267
45301
  cx +
45268
45302
  startNoteRenderer.x +
45269
- startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes);
45303
+ startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes) +
45304
+ offsetX;
45270
45305
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45271
45306
  if (this._startNote.slideTarget) {
45272
45307
  let endNoteRenderer = this.renderer.scoreRenderer.layout.getRendererForBar(this.renderer.staff.staveId, this._startNote.slideTarget.beat.voice.bar);
@@ -45279,7 +45314,7 @@ class ScoreSlideLineGlyph extends Glyph {
45279
45314
  cx +
45280
45315
  endNoteRenderer.x +
45281
45316
  endNoteRenderer.getBeatX(this._startNote.slideTarget.beat, BeatXPosition.PreNotes) -
45282
- endOffsetX;
45317
+ offsetX;
45283
45318
  endY = cy + endNoteRenderer.y + endNoteRenderer.getNoteY(this._startNote.slideTarget, NoteYPosition.Center);
45284
45319
  }
45285
45320
  if (this._startNote.slideTarget.realValue > this._startNote.realValue) {
@@ -45297,19 +45332,19 @@ class ScoreSlideLineGlyph extends Glyph {
45297
45332
  }
45298
45333
  break;
45299
45334
  case SlideOutType.OutUp:
45300
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
45335
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX;
45301
45336
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45302
45337
  endX = startX + sizeX;
45303
45338
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Top);
45304
45339
  break;
45305
45340
  case SlideOutType.OutDown:
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.Bottom);
45310
45345
  break;
45311
45346
  case SlideOutType.PickSlideUp:
45312
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
45347
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX * 2;
45313
45348
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45314
45349
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Top);
45315
45350
  endX = cx + startNoteRenderer.x + startNoteRenderer.width;
@@ -45323,7 +45358,7 @@ class ScoreSlideLineGlyph extends Glyph {
45323
45358
  waves = true;
45324
45359
  break;
45325
45360
  case SlideOutType.PickSlideDown:
45326
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
45361
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX * 2;
45327
45362
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
45328
45363
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Bottom);
45329
45364
  endX = cx + startNoteRenderer.x + startNoteRenderer.width;
@@ -46862,15 +46897,16 @@ class TabSlideLineGlyph extends Glyph {
46862
46897
  let startY = 0;
46863
46898
  let endX = 0;
46864
46899
  let endY = 0;
46900
+ const offsetX = 2;
46865
46901
  switch (this._inType) {
46866
46902
  case SlideInType.IntoFromBelow:
46867
- endX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Left);
46903
+ endX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Left) - offsetX;
46868
46904
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46869
46905
  startX = endX - sizeX;
46870
46906
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center) + sizeY;
46871
46907
  break;
46872
46908
  case SlideInType.IntoFromAbove:
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;
@@ -46889,14 +46925,15 @@ class TabSlideLineGlyph extends Glyph {
46889
46925
  let endX = 0;
46890
46926
  let endY = 0;
46891
46927
  let waves = false;
46892
- const endXOffset = 2;
46928
+ const offsetX = 2;
46893
46929
  switch (this._outType) {
46894
46930
  case SlideOutType.Shift:
46895
46931
  case SlideOutType.Legato:
46896
46932
  startX =
46897
46933
  cx +
46898
46934
  startNoteRenderer.x +
46899
- startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes);
46935
+ startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.PostNotes)
46936
+ + offsetX;
46900
46937
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46901
46938
  if (this._startNote.slideTarget) {
46902
46939
  let endNoteRenderer = this.renderer.scoreRenderer.layout.getRendererForBar(this.renderer.staff.staveId, this._startNote.slideTarget.beat.voice.bar);
@@ -46909,7 +46946,7 @@ class TabSlideLineGlyph extends Glyph {
46909
46946
  cx +
46910
46947
  endNoteRenderer.x +
46911
46948
  endNoteRenderer.getBeatX(this._startNote.slideTarget.beat, BeatXPosition.OnNotes)
46912
- - endXOffset;
46949
+ - offsetX;
46913
46950
  endY =
46914
46951
  cy +
46915
46952
  endNoteRenderer.y +
@@ -46930,31 +46967,43 @@ class TabSlideLineGlyph extends Glyph {
46930
46967
  }
46931
46968
  break;
46932
46969
  case SlideOutType.OutUp:
46933
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
46970
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX;
46934
46971
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46935
- endX = startX + sizeX - endXOffset;
46972
+ endX = startX + sizeX;
46936
46973
  endY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center) - sizeY;
46937
46974
  break;
46938
46975
  case SlideOutType.OutDown:
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.PickSlideDown:
46945
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
46982
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX * 2;
46946
46983
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46947
- endX =
46948
- cx + startNoteRenderer.x + startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.EndBeat);
46984
+ endX = cx + startNoteRenderer.x + startNoteRenderer.width;
46949
46985
  endY = startY + sizeY * 3;
46986
+ if (this._startNote.beat.nextBeat &&
46987
+ this._startNote.beat.nextBeat.voice === this._startNote.beat.voice) {
46988
+ endX =
46989
+ cx +
46990
+ startNoteRenderer.x +
46991
+ startNoteRenderer.getBeatX(this._startNote.beat.nextBeat, BeatXPosition.PreNotes);
46992
+ }
46950
46993
  waves = true;
46951
46994
  break;
46952
46995
  case SlideOutType.PickSlideUp:
46953
- startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right);
46996
+ startX = cx + startNoteRenderer.x + startNoteRenderer.getNoteX(this._startNote, NoteXPosition.Right) + offsetX * 2;
46954
46997
  startY = cy + startNoteRenderer.y + startNoteRenderer.getNoteY(this._startNote, NoteYPosition.Center);
46955
- endX =
46956
- cx + startNoteRenderer.x + startNoteRenderer.getBeatX(this._startNote.beat, BeatXPosition.EndBeat);
46998
+ endX = cx + startNoteRenderer.x + startNoteRenderer.width;
46957
46999
  endY = startY - sizeY * 3;
47000
+ if (this._startNote.beat.nextBeat &&
47001
+ this._startNote.beat.nextBeat.voice === this._startNote.beat.voice) {
47002
+ endX =
47003
+ cx +
47004
+ startNoteRenderer.x +
47005
+ startNoteRenderer.getBeatX(this._startNote.beat.nextBeat, BeatXPosition.PreNotes);
47006
+ }
46958
47007
  waves = true;
46959
47008
  break;
46960
47009
  default:
@@ -52072,8 +52121,8 @@ class CoreSettings {
52072
52121
  // </auto-generated>
52073
52122
  class VersionInfo {
52074
52123
  }
52075
- VersionInfo.version = '1.4.0-alpha.1313';
52076
- VersionInfo.date = '2025-02-20T00:47:36.314Z';
52124
+ VersionInfo.version = '1.4.0-alpha.1322';
52125
+ VersionInfo.date = '2025-02-26T02:15:01.756Z';
52077
52126
 
52078
52127
  var index$4 = /*#__PURE__*/Object.freeze({
52079
52128
  __proto__: null,