Skip to content

Commit cbaca3d

Browse files
committed
fix(alphatex): Wrong instrument articulations for export
1 parent 714fe96 commit cbaca3d

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

src/importer/AlphaTexImporter.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ export class AlphaTexImporter extends ScoreImporter {
187187

188188
private _slurs: Map<string, Note> = new Map<string, Note>();
189189

190+
private _articulationValueToIndex = new Map<number, number>();
191+
190192
private _accidentalMode: AlphaTexAccidentalMode = AlphaTexAccidentalMode.Explicit;
191193

192194
public logErrors: boolean = false;
@@ -380,6 +382,7 @@ export class AlphaTexImporter extends ScoreImporter {
380382
const staff = this._currentTrack.staves[0];
381383
staff.displayTranspositionPitch = 0;
382384
staff.stringTuning.tunings = Tuning.getDefaultTuningFor(6)!.tunings;
385+
this._articulationValueToIndex.clear();
383386

384387
this.beginStaff(staff);
385388

@@ -2579,7 +2582,22 @@ export class AlphaTexImporter extends ScoreImporter {
25792582
note.fret = fret;
25802583
}
25812584
} else if (this._currentStaff.isPercussion) {
2582-
note.percussionArticulation = fret;
2585+
const articulationValue = fret;
2586+
let articulationIndex: number = 0;
2587+
if (this._articulationValueToIndex.has(articulationValue)) {
2588+
articulationIndex = this._articulationValueToIndex.get(articulationValue)!;
2589+
} else {
2590+
articulationIndex = this._currentTrack.percussionArticulations.length;
2591+
const articulation = PercussionMapper.getArticulationByValue(articulationValue);
2592+
if (articulation === null) {
2593+
this.errorMessage(`Unknown articulation value ${articulationValue}`);
2594+
}
2595+
2596+
this._currentTrack.percussionArticulations.push(articulation!);
2597+
this._articulationValueToIndex.set(articulationValue, articulationIndex)!;
2598+
}
2599+
2600+
note.percussionArticulation = articulationIndex;
25832601
} else {
25842602
note.octave = octave;
25852603
note.tone = tone;

test/exporter/Gp7Exporter.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { JsonConverter } from '@src/model/JsonConverter';
88
import { ScoreLoader } from '@src/importer/ScoreLoader';
99
import { ComparisonHelpers } from '@test/model/ComparisonHelpers';
1010
import { AlphaTexImporter } from '@src/importer/AlphaTexImporter';
11+
import { expect } from 'chai';
1112

1213
describe('Gp7ExporterTest', () => {
1314
async function loadScore(name: string): Promise<Score | null> {
@@ -137,6 +138,34 @@ describe('Gp7ExporterTest', () => {
137138
ComparisonHelpers.expectJsonEqual(expectedJson, actualJson, '<alphatex>', ['accidentalmode']);
138139
});
139140

141+
it('alphatex-drumps-to-gp7', () => {
142+
const tex = `\\track "Drums"
143+
\\instrument percussion
144+
\\clef neutral
145+
\\articulation Kick 36
146+
\\articulation Unused 46
147+
Kick.4 42.4 Kick.4 42.4
148+
`;
149+
150+
const importer = new AlphaTexImporter();
151+
importer.initFromString(tex, new Settings());
152+
const expected = importer.readScore();
153+
const exported = exportGp7(expected);
154+
155+
const actual = prepareImporterWithBytes(exported).readScore();
156+
157+
const expectedJson = JsonConverter.scoreToJsObject(expected);
158+
const actualJson = JsonConverter.scoreToJsObject(actual);
159+
160+
ComparisonHelpers.expectJsonEqual(expectedJson, actualJson, '<alphatex>', ['accidentalmode']);
161+
162+
expect(actual.tracks[0].percussionArticulations).to.have.length(2);
163+
expect(actual.tracks[0].staves[0].bars[0].voices[0].beats[0].notes[0].percussionArticulation).to.equal(0)
164+
expect(actual.tracks[0].staves[0].bars[0].voices[0].beats[1].notes[0].percussionArticulation).to.equal(1);
165+
expect(actual.tracks[0].staves[0].bars[0].voices[0].beats[2].notes[0].percussionArticulation).to.equal(0)
166+
expect(actual.tracks[0].staves[0].bars[0].voices[0].beats[3].notes[0].percussionArticulation).to.equal(1);
167+
});
168+
140169
it('gp7-lyrics-null', async () => {
141170
await testRoundTripEqual('guitarpro7/lyrics-null.gp', null);
142171
});

0 commit comments

Comments
 (0)