From a64bfa9f420191bb09b3842fda2859549b5b26e9 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Thu, 9 Apr 2026 18:21:34 +0200 Subject: [PATCH 1/4] fix(android): null safety on initial empty render --- .../src/platform/worker/AlphaTabWorkerScoreRenderer.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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': From cf46cca901d4322e85f7f80b6a5fc1e053703198 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Thu, 9 Apr 2026 18:28:39 +0200 Subject: [PATCH 2/4] fix: dots on hidden notes --- .../src/rendering/glyphs/ScoreBeatGlyph.ts | 14 ++-- .../effects-and-annotations/hidden-dots.mxml | 74 ++++++++++++++++++ .../effects-and-annotations/hidden-dots.png | Bin 0 -> 15419 bytes .../features/EffectsAndAnnotations.test.ts | 5 ++ 4 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/hidden-dots.mxml create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/hidden-dots.png 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 0000000000000000000000000000000000000000..d731131b3a16c29a9c2abcca0bfebf5b4b20713a GIT binary patch literal 15419 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 literal 0 HcmV?d00001 diff --git a/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts b/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts index 91452df36..627662c6f 100644 --- a/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts +++ b/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts @@ -119,6 +119,11 @@ describe('EffectsAndAnnotationsTests', () => { await VisualTestHelper.runVisualTest('effects-and-annotations/tuplets.gp'); }); + + 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]; From 264c7cedca9687afe328c374bad8107e197c7101 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Thu, 9 Apr 2026 18:28:50 +0200 Subject: [PATCH 3/4] fix: large tuplet digits --- .../alphatab/src/rendering/LineBarRenderer.ts | 10 ++++++---- .../effects-and-annotations/tuplets-huge.png | Bin 0 -> 10287 bytes .../features/EffectsAndAnnotations.test.ts | 6 ++++++ 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/tuplets-huge.png 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/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 0000000000000000000000000000000000000000..884d778a55ac3ef3a426e02851c35524ef7a77cb GIT binary patch literal 10287 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 { 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'); From 7ce99615cee0b928c61557420bf010677558bbd2 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Thu, 9 Apr 2026 18:36:39 +0200 Subject: [PATCH 4/4] test: fix tests --- packages/alphatab/test/exporter/AlphaTexExporter.test.ts | 9 ++++++--- packages/alphatab/test/exporter/Gp7Exporter.test.ts | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) 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 () => {