diff --git a/packages/alphatab/src/platform/worker/AlphaTabWorkerScoreRenderer.ts b/packages/alphatab/src/platform/worker/AlphaTabWorkerScoreRenderer.ts index 92e5b1bd4..720575ad0 100644 --- a/packages/alphatab/src/platform/worker/AlphaTabWorkerScoreRenderer.ts +++ b/packages/alphatab/src/platform/worker/AlphaTabWorkerScoreRenderer.ts @@ -105,8 +105,11 @@ export class AlphaTabWorkerScoreRenderer implements IScoreRenderer { (this.renderFinished as EventEmitterOfT).trigger(data.result); break; case 'alphaTab.postRenderFinished': - this.boundsLookup = BoundsLookup.fromJson(data.boundsLookup, this._api.score!); - this.boundsLookup?.finish(); + const score = this._api.score; + if (score && data.boundsLookup) { + this.boundsLookup = BoundsLookup.fromJson(data.boundsLookup, this._api.score!); + this.boundsLookup?.finish(); + } (this.postRenderFinished as EventEmitter).trigger(); break; case 'alphaTab.error': diff --git a/packages/alphatab/src/rendering/LineBarRenderer.ts b/packages/alphatab/src/rendering/LineBarRenderer.ts index 5c3d11ebf..bfee20a8e 100644 --- a/packages/alphatab/src/rendering/LineBarRenderer.ts +++ b/packages/alphatab/src/rendering/LineBarRenderer.ts @@ -261,8 +261,9 @@ export abstract class LineBarRenderer extends BarRendererBase { s = []; const zero = MusicFontSymbol.Tuplet0 as number; if (num > 10) { - s.push((zero + Math.floor(num / 10)) as MusicFontSymbol); - s.push((zero + (num - 10)) as MusicFontSymbol); + const tens = Math.floor(num / 10); + s.push((zero + tens) as MusicFontSymbol); + s.push((zero + (num - 10 * tens)) as MusicFontSymbol); } else { s.push((zero + num) as MusicFontSymbol); } @@ -270,8 +271,9 @@ export abstract class LineBarRenderer extends BarRendererBase { s.push(MusicFontSymbol.TupletColon); if (den > 10) { - s.push((zero + Math.floor(den / 10)) as MusicFontSymbol); - s.push((zero + (den - 10)) as MusicFontSymbol); + const tens = Math.floor(den / 10); + s.push((zero + tens) as MusicFontSymbol); + s.push((zero + (den - 10 * tens)) as MusicFontSymbol); } else { s.push((zero + den) as MusicFontSymbol); } diff --git a/packages/alphatab/src/rendering/glyphs/ScoreBeatGlyph.ts b/packages/alphatab/src/rendering/glyphs/ScoreBeatGlyph.ts index f7d2329e1..695fd2478 100644 --- a/packages/alphatab/src/rendering/glyphs/ScoreBeatGlyph.ts +++ b/packages/alphatab/src/rendering/glyphs/ScoreBeatGlyph.ts @@ -264,12 +264,14 @@ export class ScoreBeatGlyph extends BeatOnNoteGlyphBase { const group: GlyphGroup = new GlyphGroup(0, 0); group.renderer = this.renderer; for (const note of this.container.beat.notes) { - const g = this._createBeatDot(sr.getNoteSteps(note), group); - g.colorOverride = ElementStyleHelper.noteColor( - sr.resources, - NoteSubElement.StandardNotationEffects, - note - ); + if (note.isVisible) { + const g = this._createBeatDot(sr.getNoteSteps(note), group); + g.colorOverride = ElementStyleHelper.noteColor( + sr.resources, + NoteSubElement.StandardNotationEffects, + note + ); + } } this.addEffect(group); } diff --git a/packages/alphatab/test-data/visual-tests/effects-and-annotations/hidden-dots.mxml b/packages/alphatab/test-data/visual-tests/effects-and-annotations/hidden-dots.mxml new file mode 100644 index 000000000..9fd53015e --- /dev/null +++ b/packages/alphatab/test-data/visual-tests/effects-and-annotations/hidden-dots.mxml @@ -0,0 +1,74 @@ + + + + + + Piano + + Piano + + + + 1 + 1 + 78.7402 + 0 + + + + + + + 480 + + -5 + + + 2 + + G + 2 + + + G + 2 + + + + + F + 4 + + 480 + + 5 + quarter + + none + 2 + + + + + + + F + 4 + + 1440 + + 5 + half + + up + 2 + + + + + + + diff --git a/packages/alphatab/test-data/visual-tests/effects-and-annotations/hidden-dots.png b/packages/alphatab/test-data/visual-tests/effects-and-annotations/hidden-dots.png new file mode 100644 index 000000000..d731131b3 Binary files /dev/null and b/packages/alphatab/test-data/visual-tests/effects-and-annotations/hidden-dots.png differ diff --git a/packages/alphatab/test-data/visual-tests/effects-and-annotations/tuplets-huge.png b/packages/alphatab/test-data/visual-tests/effects-and-annotations/tuplets-huge.png new file mode 100644 index 000000000..884d778a5 Binary files /dev/null and b/packages/alphatab/test-data/visual-tests/effects-and-annotations/tuplets-huge.png differ diff --git a/packages/alphatab/test/exporter/AlphaTexExporter.test.ts b/packages/alphatab/test/exporter/AlphaTexExporter.test.ts index 4faf7e7a2..77f9c86ae 100644 --- a/packages/alphatab/test/exporter/AlphaTexExporter.test.ts +++ b/packages/alphatab/test/exporter/AlphaTexExporter.test.ts @@ -56,10 +56,13 @@ describe('AlphaTexExporterTest', () => { } } - async function testRoundTripFolderEqual(name: string): Promise { + async function testRoundTripFolderEqual(name: string, ignoredFiles?: string[]): Promise { const files: string[] = await TestPlatform.listDirectory(`test-data/${name}`); + const ignoredFilesLookup = new Set(ignoredFiles); for (const file of files.filter(f => !f.endsWith('.png'))) { - await testRoundTripEqual(`${name}/${file}`, null); + if (!ignoredFilesLookup.has(file) && !file.endsWith('.png')) { + await testRoundTripEqual(`${name}/${file}`, null); + } } } @@ -133,7 +136,7 @@ describe('AlphaTexExporterTest', () => { }); it('visual-effects-and-annotations', async () => { - await testRoundTripFolderEqual('visual-tests/effects-and-annotations'); + await testRoundTripFolderEqual('visual-tests/effects-and-annotations', ['hidden-dots.mxml']); }); it('visual-general', async () => { diff --git a/packages/alphatab/test/exporter/Gp7Exporter.test.ts b/packages/alphatab/test/exporter/Gp7Exporter.test.ts index a68cf0334..5c1f95695 100644 --- a/packages/alphatab/test/exporter/Gp7Exporter.test.ts +++ b/packages/alphatab/test/exporter/Gp7Exporter.test.ts @@ -77,7 +77,7 @@ describe('Gp7ExporterTest', () => { }); it('visual-effects-and-annotations', async () => { - await testRoundTripFolderEqual('visual-tests/effects-and-annotations'); + await testRoundTripFolderEqual('visual-tests/effects-and-annotations', ['hidden-dots.mxml']); }); it('visual-general', async () => { diff --git a/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts b/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts index 91452df36..1d096492a 100644 --- a/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts +++ b/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts @@ -119,6 +119,17 @@ describe('EffectsAndAnnotationsTests', () => { await VisualTestHelper.runVisualTest('effects-and-annotations/tuplets.gp'); }); + it('tuplets-huge', async () => { + await VisualTestHelper.runVisualTestTex( + 'C4 {tu 12 27} * 12', + 'test-data/visual-tests/effects-and-annotations/tuplets-huge.png' + ); + }); + + it('hidden-dots', async () => { + await VisualTestHelper.runVisualTest('effects-and-annotations/hidden-dots.mxml'); + }); + it('tuplets-advanced', async () => { await VisualTestHelper.runVisualTest('effects-and-annotations/tuplets-advanced.gp', undefined, o => { o.tracks = [0, 1, 2];