Skip to content

Commit 72512ce

Browse files
authored
Support Guitar Pro 7 track volume (#445)
* Support Guitar Pro 7 track volume * Fixed C# compile error and rounded the volume value * Simplified parser code, fixed Grace Beat test, and added new test and testfile for track volume * Added panning to the import and made a test for it
1 parent 91cfa6a commit 72512ce

File tree

5 files changed

+62
-2
lines changed

5 files changed

+62
-2
lines changed

src/importer/GpifParser.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,9 @@ export class GpifParser {
414414
case 'Transpose':
415415
this.parseTranspose(track, c);
416416
break;
417+
case 'RSE':
418+
this.parseRSE(track, c);
419+
break;
417420
}
418421
}
419422
}
@@ -977,6 +980,40 @@ export class GpifParser {
977980
}
978981
}
979982

983+
private parseRSE(track: Track, node: XmlNode): void {
984+
for (let c of node.childNodes) {
985+
if (c.nodeType === XmlNodeType.Element) {
986+
switch (c.localName) {
987+
case 'ChannelStrip':
988+
this.parseChannelStrip(track, c);
989+
break;
990+
}
991+
}
992+
}
993+
}
994+
995+
private parseChannelStrip(track: Track, node: XmlNode): void {
996+
for (let c of node.childNodes) {
997+
if (c.nodeType === XmlNodeType.Element) {
998+
switch (c.localName) {
999+
case 'Parameters':
1000+
this.parseChannelStripParameters(track, c);
1001+
break;
1002+
}
1003+
}
1004+
}
1005+
}
1006+
1007+
private parseChannelStripParameters(track: Track, node: XmlNode): void {
1008+
if (node.firstChild && node.firstChild.value) {
1009+
let parameters = node.firstChild.value.split(' ');
1010+
if (parameters.length >= 12) {
1011+
track.playbackInfo.balance = Math.floor(parseFloat(parameters[11]) * 16);
1012+
track.playbackInfo.volume = Math.floor(parseFloat(parameters[12]) * 16);
1013+
}
1014+
}
1015+
}
1016+
9801017
//
9811018
// <MasterBars>...</MasterBars>
9821019
//
9.16 KB
Binary file not shown.
9.74 KB
Binary file not shown.

test/audio/MidiFileGenerator.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ describe('MidiFileGeneratorTest', () => {
198198
let info: PlaybackInformation = score.tracks[0].playbackInfo;
199199
let expectedEvents: FlatMidiEvent[] = [
200200
// channel init
201-
new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.VolumeCoarse, 120),
201+
new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.VolumeCoarse, 96),
202202
new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.PanCoarse, 64),
203203
new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.ExpressionControllerCoarse, 127),
204204
new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.RegisteredParameterFine, 0),
@@ -207,7 +207,7 @@ describe('MidiFileGeneratorTest', () => {
207207
new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.DataEntryCoarse, 16),
208208
new ProgramChangeEvent(0, 0, info.primaryChannel, info.program),
209209

210-
new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.VolumeCoarse, 120),
210+
new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.VolumeCoarse, 96),
211211
new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.PanCoarse, 64),
212212
new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.ExpressionControllerCoarse, 127),
213213
new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.RegisteredParameterFine, 0),

test/importer/Gp7Importer.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,4 +870,27 @@ describe('Gp7ImporterTest', () => {
870870
expect(score.tracks[0].staves[0].bars[1].voices[0].beats[3].lyrics).toBe(null);
871871
});
872872

873+
it('track-volume', async () => {
874+
const reader = await prepareGp7ImporterWithFile('guitarpro7/track-volume.gp');
875+
let score: Score = reader.readScore();
876+
877+
expect(score.tracks[0].playbackInfo.volume).toBe(16);
878+
expect(score.tracks[1].playbackInfo.volume).toBe(14);
879+
expect(score.tracks[2].playbackInfo.volume).toBe(12);
880+
expect(score.tracks[3].playbackInfo.volume).toBe(10);
881+
expect(score.tracks[4].playbackInfo.volume).toBe(7);
882+
expect(score.tracks[5].playbackInfo.volume).toBe(3);
883+
expect(score.tracks[6].playbackInfo.volume).toBe(0);
884+
});
885+
886+
it('track-balance', async () => {
887+
const reader = await prepareGp7ImporterWithFile('guitarpro7/track-balance.gp');
888+
let score: Score = reader.readScore();
889+
890+
expect(score.tracks[0].playbackInfo.balance).toBe(0);
891+
expect(score.tracks[1].playbackInfo.balance).toBe(4);
892+
expect(score.tracks[2].playbackInfo.balance).toBe(8);
893+
expect(score.tracks[3].playbackInfo.balance).toBe(12);
894+
expect(score.tracks[4].playbackInfo.balance).toBe(16);
895+
});
873896
});

0 commit comments

Comments
 (0)