@coderline/alphatab 1.3.0-alpha.140 → 1.3.0-alpha.141

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.
@@ -4730,6 +4730,7 @@ declare class AlphaTabApiBase<TSettings> {
4730
4730
  private _previousTick;
4731
4731
  private _playerState;
4732
4732
  private _currentBeat;
4733
+ private _currentBarBounds;
4733
4734
  private _previousStateForCursor;
4734
4735
  private _previousCursorCache;
4735
4736
  private _lastScroll;
@@ -4739,12 +4740,18 @@ declare class AlphaTabApiBase<TSettings> {
4739
4740
  * updates the cursors to highlight the beat at the specified tick position
4740
4741
  * @param tick
4741
4742
  * @param stop
4743
+ * @param shouldScroll whether we should scroll to the bar (if scrolling is active)
4742
4744
  */
4743
4745
  private cursorUpdateTick;
4744
4746
  /**
4745
4747
  * updates the cursors to highlight the specified beat
4746
4748
  */
4747
4749
  private cursorUpdateBeat;
4750
+ /**
4751
+ * Initiates a scroll to the cursor
4752
+ */
4753
+ scrollToCursor(): void;
4754
+ internalScrollToCursor(barBoundings: MasterBarBounds): void;
4748
4755
  private internalCursorUpdateBeat;
4749
4756
  playedBeatChanged: IEventEmitterOfT<Beat>;
4750
4757
  private onPlayedBeatChanged;
@@ -6151,7 +6158,7 @@ declare class StaveGroup {
6151
6158
  paint(cx: number, cy: number, canvas: ICanvas): void;
6152
6159
  paintPartial(cx: number, cy: number, canvas: ICanvas, startIndex: number, count: number): void;
6153
6160
  finalizeGroup(): void;
6154
- private buildBoundingsLookup;
6161
+ buildBoundingsLookup(cx: number, cy: number): void;
6155
6162
  getBarX(index: number): number;
6156
6163
  }
6157
6164
 
@@ -6428,7 +6435,7 @@ declare class TuningContainerGlyph extends RowContainerGlyph {
6428
6435
  }
6429
6436
 
6430
6437
  /**
6431
- * This is the base public class for creating new layouting engines for the score renderer.
6438
+ * This is the base class for creating new layouting engines for the score renderer.
6432
6439
  */
6433
6440
  declare abstract class ScoreLayout {
6434
6441
  private _barRendererLookup;
@@ -6472,6 +6479,9 @@ declare class ScoreRenderer implements IScoreRenderer {
6472
6479
  canvas: ICanvas | null;
6473
6480
  score: Score | null;
6474
6481
  tracks: Track[] | null;
6482
+ /**
6483
+ * @internal
6484
+ */
6475
6485
  layout: ScoreLayout | null;
6476
6486
  settings: Settings;
6477
6487
  boundsLookup: BoundsLookup | null;
package/dist/alphaTab.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
- * alphaTab v1.3.0-alpha.140 (develop, build 140)
2
+ * alphaTab v1.3.0-alpha.141 (develop, build 141)
3
3
  *
4
- * Copyright © 2021, Daniel Kuschny and Contributors, All rights reserved.
4
+ * Copyright © 2022, Daniel Kuschny and Contributors, All rights reserved.
5
5
  *
6
6
  * This Source Code Form is subject to the terms of the Mozilla Public
7
7
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -4585,7 +4585,12 @@
4585
4585
  if (this.masterBars.length !== 0) {
4586
4586
  bar.previousMasterBar = this.masterBars[this.masterBars.length - 1];
4587
4587
  bar.previousMasterBar.nextMasterBar = bar;
4588
- bar.start = bar.previousMasterBar.start + bar.previousMasterBar.calculateDuration();
4588
+ // TODO: this will not work on anacrusis. Correct anacrusis durations are only working
4589
+ // when there are beats with playback positions already computed which requires full finish
4590
+ // chicken-egg problem here. temporarily forcing anacrusis length here to 0
4591
+ bar.start =
4592
+ bar.previousMasterBar.start +
4593
+ (bar.previousMasterBar.isAnacrusis ? 0 : bar.previousMasterBar.calculateDuration());
4589
4594
  }
4590
4595
  // if the group is closed only the next upcoming header can
4591
4596
  // reopen the group in case of a repeat alternative, so we
@@ -14411,7 +14416,7 @@
14411
14416
  this.firstTimeSignatureNumerator = 0;
14412
14417
  this.firstTimeSignatureDenominator = 0;
14413
14418
  this.synthData = [];
14414
- this.division = 0;
14419
+ this.division = MidiUtils.QuarterTime;
14415
14420
  this.eventIndex = 0;
14416
14421
  this.currentTime = 0;
14417
14422
  this.playbackRange = null;
@@ -14921,13 +14926,12 @@
14921
14926
  const samples = new Float32Array(samplesLeft);
14922
14927
  let samplesPos = 0;
14923
14928
  const sampleBuffer = new Uint8Array(2048);
14924
- const testBuffer = new Int16Array((sampleBuffer.length / 2) | 0);
14925
14929
  while (samplesLeft > 0) {
14926
14930
  let samplesToRead = Math.min(samplesLeft, (sampleBuffer.length / 2) | 0);
14927
14931
  reader.read(sampleBuffer, 0, samplesToRead * 2);
14928
14932
  for (let i = 0; i < samplesToRead; i++) {
14929
- testBuffer[i] = (sampleBuffer[i * 2 + 1] << 8) | sampleBuffer[i * 2];
14930
- samples[samplesPos + i] = testBuffer[i] / 32767;
14933
+ const shortSample = TypeConversions.int32ToInt16((sampleBuffer[i * 2 + 1] << 8) | sampleBuffer[i * 2]);
14934
+ samples[samplesPos + i] = shortSample / 32767;
14931
14935
  }
14932
14936
  samplesLeft -= samplesToRead;
14933
14937
  samplesPos += samplesToRead;
@@ -21513,6 +21517,9 @@
21513
21517
  this.canvas = null;
21514
21518
  this.score = null;
21515
21519
  this.tracks = null;
21520
+ /**
21521
+ * @internal
21522
+ */
21516
21523
  this.layout = null;
21517
21524
  this.boundsLookup = null;
21518
21525
  this.width = 0;
@@ -24039,6 +24046,7 @@
24039
24046
  this._previousTick = 0;
24040
24047
  this._playerState = PlayerState.Paused;
24041
24048
  this._currentBeat = null;
24049
+ this._currentBarBounds = null;
24042
24050
  this._previousStateForCursor = PlayerState.Paused;
24043
24051
  this._previousCursorCache = null;
24044
24052
  this._lastScroll = 0;
@@ -24641,7 +24649,7 @@
24641
24649
  this._playerState = PlayerState.Paused;
24642
24650
  // we need to update our position caches if we render a tablature
24643
24651
  this.renderer.postRenderFinished.on(() => {
24644
- this.cursorUpdateTick(this._previousTick, false);
24652
+ this.cursorUpdateTick(this._previousTick, false, this._previousTick > 10);
24645
24653
  });
24646
24654
  if (this.player) {
24647
24655
  this.player.positionChanged.on(e => {
@@ -24668,15 +24676,16 @@
24668
24676
  * updates the cursors to highlight the beat at the specified tick position
24669
24677
  * @param tick
24670
24678
  * @param stop
24679
+ * @param shouldScroll whether we should scroll to the bar (if scrolling is active)
24671
24680
  */
24672
- cursorUpdateTick(tick, stop) {
24681
+ cursorUpdateTick(tick, stop, shouldScroll = false) {
24673
24682
  let cache = this._tickCache;
24674
24683
  if (cache) {
24675
24684
  let tracks = this.tracks;
24676
24685
  if (tracks.length > 0) {
24677
24686
  let beat = cache.findBeat(tracks, tick, this._currentBeat);
24678
24687
  if (beat) {
24679
- this.cursorUpdateBeat(beat, stop);
24688
+ this.cursorUpdateBeat(beat, stop, shouldScroll);
24680
24689
  }
24681
24690
  }
24682
24691
  }
@@ -24684,7 +24693,7 @@
24684
24693
  /**
24685
24694
  * updates the cursors to highlight the specified beat
24686
24695
  */
24687
- cursorUpdateBeat(lookupResult, stop) {
24696
+ cursorUpdateBeat(lookupResult, stop, shouldScroll) {
24688
24697
  const beat = lookupResult.currentBeat;
24689
24698
  const nextBeat = lookupResult.nextBeat;
24690
24699
  const duration = lookupResult.duration;
@@ -24699,9 +24708,6 @@
24699
24708
  let previousBeat = this._currentBeat;
24700
24709
  let previousCache = this._previousCursorCache;
24701
24710
  let previousState = this._previousStateForCursor;
24702
- this._currentBeat = lookupResult;
24703
- this._previousCursorCache = cache;
24704
- this._previousStateForCursor = this._playerState;
24705
24711
  if (beat === (previousBeat === null || previousBeat === void 0 ? void 0 : previousBeat.currentBeat) && cache === previousCache && previousState === this._playerState) {
24706
24712
  return;
24707
24713
  }
@@ -24709,15 +24715,81 @@
24709
24715
  if (!beatBoundings) {
24710
24716
  return;
24711
24717
  }
24718
+ // only if we really found some bounds we remember the beat and cache we used to
24719
+ // actually show the cursor
24720
+ this._currentBeat = lookupResult;
24721
+ this._previousCursorCache = cache;
24722
+ this._previousStateForCursor = this._playerState;
24712
24723
  this.uiFacade.beginInvoke(() => {
24713
- this.internalCursorUpdateBeat(beat, nextBeat, duration, stop, beatsToHighlight, cache, beatBoundings);
24724
+ this.internalCursorUpdateBeat(beat, nextBeat, duration, stop, beatsToHighlight, cache, beatBoundings, shouldScroll);
24714
24725
  });
24715
24726
  }
24716
- internalCursorUpdateBeat(beat, nextBeat, duration, stop, beatsToHighlight, cache, beatBoundings) {
24727
+ /**
24728
+ * Initiates a scroll to the cursor
24729
+ */
24730
+ scrollToCursor() {
24731
+ const barBounds = this._currentBarBounds;
24732
+ if (barBounds) {
24733
+ this.internalScrollToCursor(barBounds);
24734
+ }
24735
+ }
24736
+ internalScrollToCursor(barBoundings) {
24737
+ let scrollElement = this.uiFacade.getScrollContainer();
24738
+ let isVertical = Environment.getLayoutEngineFactory(this.settings.display.layoutMode).vertical;
24739
+ let mode = this.settings.player.scrollMode;
24740
+ if (isVertical) {
24741
+ // when scrolling on the y-axis, we preliminary check if the new beat/bar have
24742
+ // moved on the y-axis
24743
+ let y = barBoundings.realBounds.y + this.settings.player.scrollOffsetY;
24744
+ if (y !== this._lastScroll) {
24745
+ this._lastScroll = y;
24746
+ switch (mode) {
24747
+ case exports.ScrollMode.Continuous:
24748
+ let elementOffset = this.uiFacade.getOffset(scrollElement, this.container);
24749
+ this.uiFacade.scrollToY(scrollElement, elementOffset.y + y, this.settings.player.scrollSpeed);
24750
+ break;
24751
+ case exports.ScrollMode.OffScreen:
24752
+ let elementBottom = scrollElement.scrollTop + this.uiFacade.getOffset(null, scrollElement).h;
24753
+ if (barBoundings.visualBounds.y + barBoundings.visualBounds.h >= elementBottom ||
24754
+ barBoundings.visualBounds.y < scrollElement.scrollTop) {
24755
+ let scrollTop = barBoundings.realBounds.y + this.settings.player.scrollOffsetY;
24756
+ this.uiFacade.scrollToY(scrollElement, scrollTop, this.settings.player.scrollSpeed);
24757
+ }
24758
+ break;
24759
+ }
24760
+ }
24761
+ }
24762
+ else {
24763
+ // when scrolling on the x-axis, we preliminary check if the new bar has
24764
+ // moved on the x-axis
24765
+ let x = barBoundings.visualBounds.x;
24766
+ if (x !== this._lastScroll) {
24767
+ this._lastScroll = x;
24768
+ switch (mode) {
24769
+ case exports.ScrollMode.Continuous:
24770
+ let scrollLeftContinuous = barBoundings.realBounds.x + this.settings.player.scrollOffsetX;
24771
+ this._lastScroll = barBoundings.visualBounds.x;
24772
+ this.uiFacade.scrollToX(scrollElement, scrollLeftContinuous, this.settings.player.scrollSpeed);
24773
+ break;
24774
+ case exports.ScrollMode.OffScreen:
24775
+ let elementRight = scrollElement.scrollLeft + this.uiFacade.getOffset(null, scrollElement).w;
24776
+ if (barBoundings.visualBounds.x + barBoundings.visualBounds.w >= elementRight ||
24777
+ barBoundings.visualBounds.x < scrollElement.scrollLeft) {
24778
+ let scrollLeftOffScreen = barBoundings.realBounds.x + this.settings.player.scrollOffsetX;
24779
+ this._lastScroll = barBoundings.visualBounds.x;
24780
+ this.uiFacade.scrollToX(scrollElement, scrollLeftOffScreen, this.settings.player.scrollSpeed);
24781
+ }
24782
+ break;
24783
+ }
24784
+ }
24785
+ }
24786
+ }
24787
+ internalCursorUpdateBeat(beat, nextBeat, duration, stop, beatsToHighlight, cache, beatBoundings, shouldScroll) {
24717
24788
  let barCursor = this._barCursor;
24718
24789
  let beatCursor = this._beatCursor;
24719
24790
  let barBoundings = beatBoundings.barBounds.masterBarBounds;
24720
24791
  let barBounds = barBoundings.visualBounds;
24792
+ this._currentBarBounds = barBoundings;
24721
24793
  barCursor.setBounds(barBounds.x, barBounds.y, barBounds.w, barBounds.h);
24722
24794
  // move beat to start position immediately
24723
24795
  if (this.settings.player.enableAnimatedBeatCursor) {
@@ -24728,90 +24800,45 @@
24728
24800
  if (this.settings.player.enableElementHighlighting) {
24729
24801
  this.uiFacade.removeHighlights();
24730
24802
  }
24731
- if (this._playerState === PlayerState.Playing || stop) {
24732
- duration /= this.playbackSpeed;
24733
- if (!stop) {
24734
- if (this.settings.player.enableElementHighlighting && beatsToHighlight) {
24735
- for (let highlight of beatsToHighlight) {
24736
- let className = BeatContainerGlyph.getGroupId(highlight);
24737
- this.uiFacade.highlightElements(className, beat.voice.bar.index);
24738
- }
24739
- }
24740
- if (this.settings.player.enableAnimatedBeatCursor) {
24741
- let nextBeatX = barBoundings.visualBounds.x + barBoundings.visualBounds.w;
24742
- // get position of next beat on same stavegroup
24743
- if (nextBeat) {
24744
- // if we are moving within the same bar or to the next bar
24745
- // transition to the next beat, otherwise transition to the end of the bar.
24746
- if ((nextBeat.voice.bar.index === beat.voice.bar.index && nextBeat.index > beat.index) ||
24747
- nextBeat.voice.bar.index === beat.voice.bar.index + 1) {
24748
- let nextBeatBoundings = cache.findBeat(nextBeat);
24749
- if (nextBeatBoundings &&
24750
- nextBeatBoundings.barBounds.masterBarBounds.staveGroupBounds ===
24751
- barBoundings.staveGroupBounds) {
24752
- nextBeatX = nextBeatBoundings.visualBounds.x;
24753
- }
24754
- }
24755
- }
24756
- // we need to put the transition to an own animation frame
24757
- // otherwise the stop animation above is not applied.
24758
- this.uiFacade.beginInvoke(() => {
24759
- beatCursor.transitionToX(duration, nextBeatX);
24760
- });
24761
- }
24762
- }
24763
- if (!this._beatMouseDown && this.settings.player.scrollMode !== exports.ScrollMode.Off) {
24764
- let scrollElement = this.uiFacade.getScrollContainer();
24765
- let isVertical = Environment.getLayoutEngineFactory(this.settings.display.layoutMode).vertical;
24766
- let mode = this.settings.player.scrollMode;
24767
- if (isVertical) {
24768
- // when scrolling on the y-axis, we preliminary check if the new beat/bar have
24769
- // moved on the y-axis
24770
- let y = barBoundings.realBounds.y + this.settings.player.scrollOffsetY;
24771
- if (y !== this._lastScroll) {
24772
- this._lastScroll = y;
24773
- switch (mode) {
24774
- case exports.ScrollMode.Continuous:
24775
- let elementOffset = this.uiFacade.getOffset(scrollElement, this.container);
24776
- this.uiFacade.scrollToY(scrollElement, elementOffset.y + y, this.settings.player.scrollSpeed);
24777
- break;
24778
- case exports.ScrollMode.OffScreen:
24779
- let elementBottom = scrollElement.scrollTop + this.uiFacade.getOffset(null, scrollElement).h;
24780
- if (barBoundings.visualBounds.y + barBoundings.visualBounds.h >= elementBottom ||
24781
- barBoundings.visualBounds.y < scrollElement.scrollTop) {
24782
- let scrollTop = barBoundings.realBounds.y + this.settings.player.scrollOffsetY;
24783
- this.uiFacade.scrollToY(scrollElement, scrollTop, this.settings.player.scrollSpeed);
24784
- }
24785
- break;
24786
- }
24787
- }
24788
- }
24789
- else {
24790
- // when scrolling on the x-axis, we preliminary check if the new bar has
24791
- // moved on the x-axis
24792
- let x = barBoundings.visualBounds.x;
24793
- if (x !== this._lastScroll) {
24794
- this._lastScroll = x;
24795
- switch (mode) {
24796
- case exports.ScrollMode.Continuous:
24797
- let scrollLeftContinuous = barBoundings.realBounds.x + this.settings.player.scrollOffsetX;
24798
- this._lastScroll = barBoundings.visualBounds.x;
24799
- this.uiFacade.scrollToX(scrollElement, scrollLeftContinuous, this.settings.player.scrollSpeed);
24800
- break;
24801
- case exports.ScrollMode.OffScreen:
24802
- let elementRight = scrollElement.scrollLeft + this.uiFacade.getOffset(null, scrollElement).w;
24803
- if (barBoundings.visualBounds.x + barBoundings.visualBounds.w >= elementRight ||
24804
- barBoundings.visualBounds.x < scrollElement.scrollLeft) {
24805
- let scrollLeftOffScreen = barBoundings.realBounds.x + this.settings.player.scrollOffsetX;
24806
- this._lastScroll = barBoundings.visualBounds.x;
24807
- this.uiFacade.scrollToX(scrollElement, scrollLeftOffScreen, this.settings.player.scrollSpeed);
24808
- }
24809
- break;
24803
+ // actively playing? -> animate cursor and highlight items
24804
+ let shouldNotifyBeatChange = false;
24805
+ if (this._playerState === PlayerState.Playing && !stop) {
24806
+ if (this.settings.player.enableElementHighlighting && beatsToHighlight) {
24807
+ for (let highlight of beatsToHighlight) {
24808
+ let className = BeatContainerGlyph.getGroupId(highlight);
24809
+ this.uiFacade.highlightElements(className, beat.voice.bar.index);
24810
+ }
24811
+ }
24812
+ if (this.settings.player.enableAnimatedBeatCursor) {
24813
+ let nextBeatX = barBoundings.visualBounds.x + barBoundings.visualBounds.w;
24814
+ // get position of next beat on same stavegroup
24815
+ if (nextBeat) {
24816
+ // if we are moving within the same bar or to the next bar
24817
+ // transition to the next beat, otherwise transition to the end of the bar.
24818
+ if ((nextBeat.voice.bar.index === beat.voice.bar.index && nextBeat.index > beat.index) ||
24819
+ nextBeat.voice.bar.index === beat.voice.bar.index + 1) {
24820
+ let nextBeatBoundings = cache.findBeat(nextBeat);
24821
+ if (nextBeatBoundings &&
24822
+ nextBeatBoundings.barBounds.masterBarBounds.staveGroupBounds ===
24823
+ barBoundings.staveGroupBounds) {
24824
+ nextBeatX = nextBeatBoundings.visualBounds.x;
24810
24825
  }
24811
24826
  }
24812
24827
  }
24828
+ // we need to put the transition to an own animation frame
24829
+ // otherwise the stop animation above is not applied.
24830
+ this.uiFacade.beginInvoke(() => {
24831
+ beatCursor.transitionToX(duration / this.playbackSpeed, nextBeatX);
24832
+ });
24813
24833
  }
24814
- // trigger an event for others to indicate which beat/bar is played
24834
+ shouldScroll = !stop;
24835
+ shouldNotifyBeatChange = true;
24836
+ }
24837
+ if (shouldScroll && !this._beatMouseDown && this.settings.player.scrollMode !== exports.ScrollMode.Off) {
24838
+ this.internalScrollToCursor(barBoundings);
24839
+ }
24840
+ // trigger an event for others to indicate which beat/bar is played
24841
+ if (shouldNotifyBeatChange) {
24815
24842
  this.onPlayedBeatChanged(beat);
24816
24843
  }
24817
24844
  }
@@ -25118,8 +25145,10 @@
25118
25145
  if (this._isDestroyed) {
25119
25146
  return;
25120
25147
  }
25121
- this.playerPositionChanged.trigger(e);
25122
- this.uiFacade.triggerEvent(this.container, 'playerPositionChanged', e);
25148
+ if (this.score !== null && this.tracks.length > 0) {
25149
+ this.playerPositionChanged.trigger(e);
25150
+ this.uiFacade.triggerEvent(this.container, 'playerPositionChanged', e);
25151
+ }
25123
25152
  }
25124
25153
  onMidiEventsPlayed(e) {
25125
25154
  if (this._isDestroyed) {
@@ -32042,7 +32071,6 @@
32042
32071
  this.paintPartial(cx + this.x, cy + this.y, canvas, 0, this.masterBarsRenderers.length);
32043
32072
  }
32044
32073
  paintPartial(cx, cy, canvas, startIndex, count) {
32045
- this.buildBoundingsLookup(cx, cy);
32046
32074
  for (let i = 0, j = this._allStaves.length; i < j; i++) {
32047
32075
  this._allStaves[i].paint(cx, cy, canvas, startIndex, count);
32048
32076
  }
@@ -32300,7 +32328,7 @@
32300
32328
  }
32301
32329
  }
32302
32330
  /**
32303
- * This is the base public class for creating new layouting engines for the score renderer.
32331
+ * This is the base class for creating new layouting engines for the score renderer.
32304
32332
  */
32305
32333
  class ScoreLayout {
32306
32334
  constructor(renderer) {
@@ -32514,7 +32542,7 @@
32514
32542
  : this.firstBarX;
32515
32543
  e.y = y;
32516
32544
  e.totalWidth = this.width;
32517
- e.totalHeight = this.height;
32545
+ e.totalHeight = y + height;
32518
32546
  e.firstMasterBarIndex = -1;
32519
32547
  e.lastMasterBarIndex = -1;
32520
32548
  this.registerPartial(e, canvas => {
@@ -32529,6 +32557,7 @@
32529
32557
 
32530
32558
  class HorizontalScreenLayoutPartialInfo {
32531
32559
  constructor() {
32560
+ this.x = 0;
32532
32561
  this.width = 0;
32533
32562
  this.masterBars = [];
32534
32563
  }
@@ -32597,6 +32626,7 @@
32597
32626
  let countPerPartial = this.renderer.settings.display.barCountPerPartial;
32598
32627
  let partials = [];
32599
32628
  let currentPartial = new HorizontalScreenLayoutPartialInfo();
32629
+ let renderX = 0;
32600
32630
  while (currentBarIndex <= endBarIndex) {
32601
32631
  let result = this._group.addBars(this.renderer.tracks, currentBarIndex);
32602
32632
  if (result) {
@@ -32606,6 +32636,8 @@
32606
32636
  let previousPartial = partials[partials.length - 1];
32607
32637
  previousPartial.masterBars.push(score.masterBars[currentBarIndex]);
32608
32638
  previousPartial.width += result.width;
32639
+ renderX += result.width;
32640
+ currentPartial.x += renderX;
32609
32641
  }
32610
32642
  else {
32611
32643
  currentPartial.masterBars.push(score.masterBars[currentBarIndex]);
@@ -32613,14 +32645,17 @@
32613
32645
  // no targetPartial here because previous partials already handled this code
32614
32646
  if (currentPartial.masterBars.length >= countPerPartial) {
32615
32647
  if (partials.length === 0) {
32616
- currentPartial.width += this._group.x + this._group.accoladeSpacing;
32648
+ // respect accolade and on first partial
32649
+ currentPartial.width += this._group.accoladeSpacing + this._pagePadding[0];
32617
32650
  }
32651
+ renderX += currentPartial.width;
32618
32652
  partials.push(currentPartial);
32619
32653
  Logger.debug(this.name, 'Finished partial from bar ' +
32620
32654
  currentPartial.masterBars[0].index +
32621
32655
  ' to ' +
32622
32656
  currentPartial.masterBars[currentPartial.masterBars.length - 1].index, null);
32623
32657
  currentPartial = new HorizontalScreenLayoutPartialInfo();
32658
+ currentPartial.x = renderX;
32624
32659
  }
32625
32660
  }
32626
32661
  }
@@ -32629,7 +32664,7 @@
32629
32664
  // don't miss the last partial if not empty
32630
32665
  if (currentPartial.masterBars.length > 0) {
32631
32666
  if (partials.length === 0) {
32632
- currentPartial.width += this._group.x + this._group.accoladeSpacing;
32667
+ currentPartial.width += this._group.accoladeSpacing + this._pagePadding[0];
32633
32668
  }
32634
32669
  partials.push(currentPartial);
32635
32670
  Logger.debug(this.name, 'Finished partial from bar ' +
@@ -32643,7 +32678,7 @@
32643
32678
  currentBarIndex = 0;
32644
32679
  let x = 0;
32645
32680
  for (let i = 0; i < partials.length; i++) {
32646
- let partial = partials[i];
32681
+ const partial = partials[i];
32647
32682
  const e = new RenderFinishedEventArgs();
32648
32683
  e.x = x;
32649
32684
  e.y = 0;
@@ -32654,14 +32689,19 @@
32654
32689
  e.firstMasterBarIndex = partial.masterBars[0].index;
32655
32690
  e.lastMasterBarIndex = partial.masterBars[partial.masterBars.length - 1].index;
32656
32691
  x += partial.width;
32692
+ // pull to local scope for lambda
32657
32693
  const partialBarIndex = currentBarIndex;
32694
+ const partialIndex = i;
32695
+ this._group.buildBoundingsLookup(this._group.x, this._group.y);
32658
32696
  this.registerPartial(e, canvas => {
32659
32697
  canvas.color = this.renderer.settings.display.resources.mainGlyphColor;
32660
32698
  canvas.textAlign = TextAlign.Left;
32661
32699
  let renderX = this._group.getBarX(partial.masterBars[0].index) + this._group.accoladeSpacing;
32662
- if (i === 0) {
32700
+ if (partialIndex === 0) {
32663
32701
  renderX -= this._group.x + this._group.accoladeSpacing;
32664
32702
  }
32703
+ canvas.color = this.renderer.settings.display.resources.mainGlyphColor;
32704
+ canvas.textAlign = TextAlign.Left;
32665
32705
  Logger.debug(this.name, 'Rendering partial from bar ' +
32666
32706
  partial.masterBars[0].index +
32667
32707
  ' to ' +
@@ -32956,6 +32996,7 @@
32956
32996
  args.height = height;
32957
32997
  args.firstMasterBarIndex = group.firstBarIndex;
32958
32998
  args.lastMasterBarIndex = group.lastBarIndex;
32999
+ group.buildBoundingsLookup(0, 0);
32959
33000
  this.registerPartial(args, canvas => {
32960
33001
  this.renderer.canvas.color = this.renderer.settings.display.resources.mainGlyphColor;
32961
33002
  this.renderer.canvas.textAlign = TextAlign.Left;
@@ -40552,8 +40593,8 @@
40552
40593
  // </auto-generated>
40553
40594
  class VersionInfo {
40554
40595
  }
40555
- VersionInfo.version = '1.3.0-alpha.140';
40556
- VersionInfo.date = '2021-12-29T23:06:43.677Z';
40596
+ VersionInfo.version = '1.3.0-alpha.141';
40597
+ VersionInfo.date = '2022-01-09T20:09:00.901Z';
40557
40598
 
40558
40599
  var index$5 = /*#__PURE__*/Object.freeze({
40559
40600
  __proto__: null,