From f5e2fff8a1be5ed6f02054a0f2abaf3c68236476 Mon Sep 17 00:00:00 2001 From: kaizenman <15638776+kaizenman@users.noreply.github.com> Date: Sat, 25 Apr 2026 00:20:26 +0200 Subject: [PATCH 1/2] fix(importer): skip GPIF tempo automations on missing master bars GpifParser._buildModel iterated _masterTrackAutomations and dereferenced score.masterBars[barNumber] without checking that the index was within range. Real-world GP7/8 files (off-by-one indexing, scores edited to fewer bars) reference bar numbers past the masterBars list, producing: TypeError: Cannot read properties of undefined (reading 'tempoAutomations') Skip the automation if the master bar is absent. The fixture test-data/guitarpro8/orphan-tempo-automation.gp has 100 master bars and a tempo automation targeting bar 100 (off-by-one) that previously crashed the importer. --- packages/alphatab/src/importer/GpifParser.ts | 6 +++++- .../guitarpro8/orphan-tempo-automation.gp | Bin 0 -> 31126 bytes .../alphatab/test/importer/Gp8Importer.test.ts | 10 ++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100755 packages/alphatab/test-data/guitarpro8/orphan-tempo-automation.gp diff --git a/packages/alphatab/src/importer/GpifParser.ts b/packages/alphatab/src/importer/GpifParser.ts index b7bd46907..839c89780 100644 --- a/packages/alphatab/src/importer/GpifParser.ts +++ b/packages/alphatab/src/importer/GpifParser.ts @@ -2892,7 +2892,11 @@ export class GpifParser { // build masterbar automations for (const [barNumber, automations] of this._masterTrackAutomations) { - const masterBar: MasterBar = this.score.masterBars[barNumber]; + const masterBar: MasterBar | undefined = this.score.masterBars[barNumber]; + if (!masterBar) { + // automation references a bar that is not in the score's masterBars list + continue; + } for (let i: number = 0, j: number = automations.length; i < j; i++) { const automation: Automation = automations[i]; switch (automation.type) { diff --git a/packages/alphatab/test-data/guitarpro8/orphan-tempo-automation.gp b/packages/alphatab/test-data/guitarpro8/orphan-tempo-automation.gp new file mode 100755 index 0000000000000000000000000000000000000000..76543653b7c83d26f7943239f2bd7c1ed8c13630 GIT binary patch literal 31126 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 E0L_!kUH||9 literal 0 HcmV?d00001 diff --git a/packages/alphatab/test/importer/Gp8Importer.test.ts b/packages/alphatab/test/importer/Gp8Importer.test.ts index 0ef7ffa1d..7f0dac5a6 100644 --- a/packages/alphatab/test/importer/Gp8Importer.test.ts +++ b/packages/alphatab/test/importer/Gp8Importer.test.ts @@ -510,4 +510,14 @@ describe('Gp8ImporterTest', () => { const score = reader.readScore(); GpImporterTestHelper.checkHarmonics(score); }); + + it('orphan-tempo-automation', async () => { + // GPIF tempo automations can reference bar indices that are not + // present in the score's masterBars list (e.g. off-by-one or after + // bar deletion). Should be skipped instead of null-dereferencing. + const reader = await prepareImporterWithFile('guitarpro8/orphan-tempo-automation.gp'); + const score = reader.readScore(); + expect(score.masterBars.length).to.equal(100); + expect(score.tracks.length).to.equal(3); + }); }); From 2206561f6b8044b44cce50636088b70b4797f359 Mon Sep 17 00:00:00 2001 From: kaizenman <15638776+kaizenman@users.noreply.github.com> Date: Tue, 28 Apr 2026 13:37:13 +0200 Subject: [PATCH 2/2] fix(importer): use explicit bounds check for masterBars access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous masterBar lookup used `score.masterBars[barNumber]` with an `| undefined` type and an `if (!masterBar)` guard. That relies on JS array out-of-bounds returning undefined — not C# / Kotlin transpilation compatible, since the indexed access there throws IndexOutOfRangeException / IndexOutOfBoundsException before the undefined-check has a chance to run. Replace with an explicit `barNumber < 0 || barNumber >= length` guard before the access, matching the idiom already used 9 lines above for sustain-pedal markers (GpifParser.ts) and in Gp3To5Importer.ts:508. Addresses review feedback from @Danielku15 on PR #2668. --- packages/alphatab/src/importer/GpifParser.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/alphatab/src/importer/GpifParser.ts b/packages/alphatab/src/importer/GpifParser.ts index 839c89780..f5954de2c 100644 --- a/packages/alphatab/src/importer/GpifParser.ts +++ b/packages/alphatab/src/importer/GpifParser.ts @@ -2892,11 +2892,11 @@ export class GpifParser { // build masterbar automations for (const [barNumber, automations] of this._masterTrackAutomations) { - const masterBar: MasterBar | undefined = this.score.masterBars[barNumber]; - if (!masterBar) { + if (barNumber < 0 || barNumber >= this.score.masterBars.length) { // automation references a bar that is not in the score's masterBars list continue; } + const masterBar: MasterBar = this.score.masterBars[barNumber]; for (let i: number = 0, j: number = automations.length; i < j; i++) { const automation: Automation = automations[i]; switch (automation.type) {