Skip to content

Commit 3cbff84

Browse files
Danielku15jordanske
authored andcommitted
Respect lyrics information on beat level if available (CoderLine#429)
1 parent b196f0a commit 3cbff84

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

src/importer/GpifParser.ts

+24-1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export class GpifParser {
9292
private _lyricsByTrack!: Map<string, Lyrics[]>;
9393
private _hasAnacrusis: boolean = false;
9494
private _articulationByName!: Map<string, InstrumentArticulation>;
95+
private _skipApplyLyrics: boolean = false;
9596

9697
public parseXml(xml: string, settings: Settings): void {
9798
this._masterTrackAutomations = new Map<string, Automation[]>();
@@ -110,6 +111,8 @@ export class GpifParser {
110111
this._noteById = new Map<string, Note>();
111112
this._tappedNotes = new Map<string, boolean>();
112113
this._lyricsByTrack = new Map<string, Lyrics[]>();
114+
this._skipApplyLyrics = false;
115+
113116
let dom: XmlDocument;
114117
try {
115118
dom = new XmlDocument(xml);
@@ -120,7 +123,7 @@ export class GpifParser {
120123
this.parseDom(dom);
121124
this.buildModel();
122125
this.score.finish(settings);
123-
if (this._lyricsByTrack.size > 0) {
126+
if (!this._skipApplyLyrics && this._lyricsByTrack.size > 0) {
124127
this._lyricsByTrack.forEach((lyrics, t) => {
125128
let track: Track = this._tracksById.get(t)!;
126129
track.applyLyrics(lyrics);
@@ -1396,12 +1399,32 @@ export class GpifParser {
13961399
break;
13971400
}
13981401
break;
1402+
case 'Lyrics':
1403+
beat.lyrics = this.parseBeatLyrics(c);
1404+
this._skipApplyLyrics = true;
1405+
break;
13991406
}
14001407
}
14011408
}
14021409
this._beatById.set(beatId, beat);
14031410
}
14041411

1412+
private parseBeatLyrics(node: XmlNode): string[] | null {
1413+
const lines: string[] = [];
1414+
1415+
for (let c of node.childNodes) {
1416+
if (c.nodeType === XmlNodeType.Element) {
1417+
switch (c.localName) {
1418+
case 'Line':
1419+
lines.push(c.innerText);
1420+
break;
1421+
}
1422+
}
1423+
}
1424+
1425+
return lines;
1426+
}
1427+
14051428
private parseBeatXProperties(node: XmlNode, beat: Beat): void {
14061429
for (let c of node.childNodes) {
14071430
if (c.nodeType === XmlNodeType.Element) {

test-data/guitarpro7/beat-lyrics.gp

8.79 KB
Binary file not shown.

test/importer/Gp7Importer.test.ts

+14
Original file line numberDiff line numberDiff line change
@@ -856,4 +856,18 @@ describe('Gp7ImporterTest', () => {
856856
);
857857
expect(score.tracks[0].staves[0].bars[4].voices[0].beats[0].notes[0].fret).toEqual(20);
858858
});
859+
860+
it('beat-lyrics', async () => {
861+
const reader = await prepareGp7ImporterWithFile('guitarpro7/beat-lyrics.gp');
862+
let score: Score = reader.readScore();
863+
expect(score.tracks[0].staves[0].bars[0].voices[0].beats[0].lyrics![0]).toBe("This");
864+
expect(score.tracks[0].staves[0].bars[0].voices[0].beats[1].lyrics![0]).toBe("is");
865+
expect(score.tracks[0].staves[0].bars[0].voices[0].beats[2].lyrics![0]).toBe("a");
866+
expect(score.tracks[0].staves[0].bars[0].voices[0].beats[3].lyrics![0]).toBe("test file");
867+
expect(score.tracks[0].staves[0].bars[1].voices[0].beats[0].lyrics![0]).toBe("for");
868+
expect(score.tracks[0].staves[0].bars[1].voices[0].beats[1].lyrics![0]).toBe("lyrics");
869+
expect(score.tracks[0].staves[0].bars[1].voices[0].beats[2].lyrics).toBe(null);
870+
expect(score.tracks[0].staves[0].bars[1].voices[0].beats[3].lyrics).toBe(null);
871+
});
872+
859873
});

0 commit comments

Comments
 (0)